From 400746b88a6a480e0eb1145b495072785e2a218c Mon Sep 17 00:00:00 2001 From: josua Date: Tue, 2 Jun 2020 11:30:03 +1000 Subject: [PATCH] Sync workspace with server --- .classpath | 2 +- .gitignore | 0 .project | 0 .settings/org.eclipse.jdt.core.prefs | 0 layer.bdf | Bin 0 -> 348 bytes resources/sound/explosion.ogg | Bin resources/sound/gun0.ogg | Bin resources/sound/gun1.ogg | Bin resources/sound/gun2.ogg | Bin resources/sound/gun3.ogg | Bin resources/sound/gun4.ogg | Bin resources/sound/gun5.ogg | Bin resources/sound/gun6.ogg | Bin resources/sound/gun7.ogg | Bin resources/sound/gun8.ogg | Bin resources/sound/gun9.ogg | Bin resources/sound/hit0.ogg | Bin resources/sound/hit1.ogg | Bin resources/sound/hit2.ogg | Bin resources/texmap.old.png | Bin resources/texmap.png | Bin 96530 -> 107326 bytes resources/texmap.xcf | Bin 231399 -> 275768 bytes settings.bdf | Bin 87 -> 106 bytes src/projectzombie/Main.java | 16 ++ src/projectzombie/audio/AudioEngine.java | 0 src/projectzombie/audio/AudioObject.java | 0 src/projectzombie/audio/AudioRandom.java | 0 src/projectzombie/audio/AudioSources.java | 0 src/projectzombie/display/Camera.java | 3 + src/projectzombie/display/DisplayRender.java | 6 +- .../display/DisplayRenderUI.java | 0 .../display/DisplayStatsEventHandler.java | 0 src/projectzombie/display/DisplayWindow.java | 8 +- .../display/bossbar/BossBars.java | 18 +- .../display/bossbar/IBossBar.java | 0 .../lighting/ChunkLightingCollection.java | 0 .../display/lighting/ChunkLightingTemp.java | 0 .../display/lighting/DynamicLighting.java | 0 .../display/lighting/TileLighting.java | 40 ++-- .../transparent/ITransparentObject.java | 0 .../transparent/TransparentObject.java | 0 .../transparent/TransparentObjects.java | 0 src/projectzombie/entity/Entity.java | 197 ++++++++++++++---- src/projectzombie/entity/EntityAlive.java | 0 src/projectzombie/entity/EntityBoss.java | 91 ++++++-- src/projectzombie/entity/EntityBullet.java | 53 ++++- src/projectzombie/entity/EntityDummy.java | 4 + .../entity/EntityEventHandler.java | 0 src/projectzombie/entity/EntityExplosion.java | 27 +++ src/projectzombie/entity/EntityFlare.java | 7 +- .../entity/EntityGrapplingHook.java | 31 ++- src/projectzombie/entity/EntityHeight.java | 0 src/projectzombie/entity/EntityInventory.java | 0 src/projectzombie/entity/EntityItem.java | 76 ++++++- .../entity/EntityKillWithParticles.java | 6 + src/projectzombie/entity/EntityParticle.java | 10 +- src/projectzombie/entity/EntityTnt.java | 40 +++- src/projectzombie/entity/EntityVertical.java | 24 ++- src/projectzombie/entity/EntityZombie.java | 138 ++++++++++-- .../entity/EntityZombieArmored.java | 7 +- .../entity/particle/ParticleBlood.java | 14 +- .../entity/particle/ParticleBreak.java | 128 +++++++++++- .../entity/particle/ParticleLava.java | 5 + .../entity/particle/ParticleSmoke.java | 6 + .../entity/particle/ParticleSpark.java | 5 + .../entity/particle/ParticleWater.java | 11 +- .../entity/player/EntityPlayer.java | 128 +++++++++--- src/projectzombie/init/Entities.java | 41 +++- src/projectzombie/init/Items.java | 52 ++++- src/projectzombie/init/LayerGenerators.java | 46 ++++ src/projectzombie/init/Layers.java | 27 +-- src/projectzombie/init/Resources.java | 0 src/projectzombie/init/Sounds.java | 0 src/projectzombie/init/Textures.java | 81 ++++--- src/projectzombie/init/Tiles.java | 78 +++++-- .../input/CursorEnterCallback.java | 0 .../input/CursorPosCallback.java | 0 src/projectzombie/input/GameInput.java | 0 src/projectzombie/input/InputMode.java | 0 src/projectzombie/input/JoystickCallback.java | 0 src/projectzombie/input/KeyCallback.java | 0 src/projectzombie/input/KeyCharCallback.java | 0 .../input/MouseButtonCallback.java | 0 .../input/ScrollWheelCallback.java | 0 src/projectzombie/input/types/Input.java | 0 src/projectzombie/input/types/InputGUI.java | 0 src/projectzombie/input/types/InputGame.java | 5 +- src/projectzombie/inventory/IInventory.java | 0 src/projectzombie/inventory/Inventory.java | 38 +++- src/projectzombie/items/Item.java | 13 +- src/projectzombie/items/ItemAmmo.java | 3 +- .../items/ItemDefenceUpgrade.java | 9 +- src/projectzombie/items/ItemEmpty.java | 6 +- src/projectzombie/items/ItemFlare.java | 11 +- .../items/ItemGrapplingHook.java | 13 +- src/projectzombie/items/ItemGunUpgrade.java | 9 +- src/projectzombie/items/ItemHealthPotion.java | 21 +- src/projectzombie/items/ItemLantern.java | 16 +- src/projectzombie/items/ItemRock.java | 27 +++ src/projectzombie/items/ItemSpawn.java | 25 +++ src/projectzombie/items/ItemTnt.java | 11 +- .../items/spawner/ItemSpawnZombie.java | 23 ++ src/projectzombie/mainloop/MainloopEnd.java | 0 .../mainloop/MainloopEventHandler.java | 0 .../mainloop/MainloopHelpers.java | 2 +- .../mainloop/MainloopIterator.java | 0 src/projectzombie/menu/Menu.java | 1 + src/projectzombie/menu/MenuDeath.java | 9 +- src/projectzombie/menu/MenuGame.java | 0 src/projectzombie/menu/MenuGamePause.java | 59 ++++++ src/projectzombie/menu/MenuMain.java | 1 + src/projectzombie/menu/MenuSettings.java | 37 ++++ src/projectzombie/menu/gui/Alignment.java | 0 src/projectzombie/menu/gui/Button.java | 0 src/projectzombie/menu/gui/ButtonGroup.java | 0 src/projectzombie/menu/gui/GUI.java | 0 src/projectzombie/menu/gui/GUIComponent.java | 0 src/projectzombie/menu/gui/GUIContainer.java | 0 src/projectzombie/menu/gui/GUISelectable.java | 0 .../menu/gui/GUISelectableDirection.java | 0 src/projectzombie/menu/gui/Label.java | 0 src/projectzombie/menu/gui/Overlay.java | 0 .../menu/gui/components/ButtonBasic.java | 0 .../menu/gui/components/ButtonCallback.java | 0 .../menu/gui/components/ButtonGroupPause.java | 4 - .../menu/gui/components/ButtonSetting.java | 0 .../menu/gui/components/GUIBackToMenu.java | 0 .../menu/gui/components/LabelMain.java | 0 .../menu/gui/components/LabelPause.java | 0 .../gui/components/OverlayBackground.java | 0 src/projectzombie/resources/Resource.java | 0 src/projectzombie/settings/Cheats.java | 0 src/projectzombie/settings/Environment.java | 6 + .../settings/SettingQuality.java | 5 + src/projectzombie/settings/Settings.java | 22 ++ src/projectzombie/text/Text.java | 0 src/projectzombie/tiles/Tile.java | 12 +- src/projectzombie/tiles/TileBossPortal.java | 13 +- .../tiles/TileBulletBreakable.java | 6 + src/projectzombie/tiles/TileChest.java | 11 +- src/projectzombie/tiles/TileDirt.java | 4 +- src/projectzombie/tiles/TileFire.java | 16 -- src/projectzombie/tiles/TileFlat.java | 3 +- src/projectzombie/tiles/TileFlatFaded.java | 4 +- src/projectzombie/tiles/TileGrass.java | 4 +- src/projectzombie/tiles/TileLadder.java | 4 +- src/projectzombie/tiles/TileLadderUp.java | 11 +- src/projectzombie/tiles/TileLantern.java | 6 +- src/projectzombie/tiles/TileLava.java | 6 +- src/projectzombie/tiles/TileLavaFlow.java | 5 +- src/projectzombie/tiles/TilePortalDown.java | 11 +- src/projectzombie/tiles/TileRock.java | 25 ++- src/projectzombie/tiles/TileSand.java | 4 +- src/projectzombie/tiles/TileStone.java | 4 +- src/projectzombie/tiles/TileTree.java | 11 +- src/projectzombie/tiles/TileVertical.java | 7 +- src/projectzombie/tiles/TileVoid.java | 3 +- src/projectzombie/tiles/TileWall.java | 11 +- .../tiles/TileWallUnbreakable.java | 3 +- src/projectzombie/tiles/TileWater.java | 5 +- src/projectzombie/tiles/TileWaterFlow.java | 6 +- src/projectzombie/time/GameTimer.java | 6 +- src/projectzombie/time/NoSleep.java | 0 src/projectzombie/util/gl/GlHelpers.java | 0 src/projectzombie/util/gl/VerticalRender.java | 4 + .../gl/texture/AnimationEventHandler.java | 0 .../util/gl/texture/AnimationReference.java | 7 +- .../util/gl/texture/IHasTexture.java | 0 .../util/gl/texture/Texture.java | 3 +- .../util/gl/texture/TextureMap.java | 0 .../util/gl/texture/TextureReference.java | 0 .../gl/texture/TextureReferenceEmpty.java | 0 .../gl/texture/TextureReferenceRandom.java | 0 src/projectzombie/util/math/ColorRange.java | 0 src/projectzombie/util/math/ItemStack.java | 25 ++- src/projectzombie/util/math/MathHelpers.java | 0 src/projectzombie/util/math/NamedList.java | 54 +++++ src/projectzombie/util/math/TileState.java | 0 src/projectzombie/util/math/astar/AStar.java | 184 ++++++++++++++++ .../util/math/astar/AStarSearch.java | 6 + .../util/math/astar/AStarSearcher.java | 50 +++++ src/projectzombie/util/math/map/IMap2D.java | 0 src/projectzombie/util/math/map/Map2D.java | 4 + .../util/math/map/Map2DElement.java | 0 .../util/math/random/OpenSimplexNoise.java | 0 .../util/math/random/RandomHelpers.java | 0 .../util/math/range/Range2i.java | 0 .../util/math/range/Range3i.java | 0 .../util/math/range/Range4i.java | 0 src/projectzombie/util/math/vec/Vec2d.java | 42 +++- src/projectzombie/util/math/vec/Vec2i.java | 42 +++- src/projectzombie/util/math/vec/Vec3d.java | 43 +++- src/projectzombie/util/math/vec/Vec3i.java | 43 +++- src/projectzombie/util/math/vec/Vec4d.java | 44 +++- src/projectzombie/util/math/vec/Vec4i.java | 44 +++- src/projectzombie/world/World.java | 96 ++++++++- src/projectzombie/world/chunk/Chunk.java | 148 ++++++++++++- src/projectzombie/world/chunk/ChunkEmpty.java | 23 +- .../world/chunk/ChunkEventHandler.java | 0 src/projectzombie/world/layer/Layer.java | 95 +++++++-- .../world/layer/layergen/LayerGen.java | 5 +- .../layer/layergen/LayerGenBossArena.java | 6 +- .../world/layer/layergen/LayerGenCaves.java | 4 +- .../world/layer/layergen/LayerGenEarth.java | 28 +-- .../layer/layergen/LayerGenLavaCaves.java | 4 +- .../layergen/LayerGenRememberPlayerPos.java | 0 .../layer/layergen/PortalSpawnrates.java | 0 207 files changed, 2540 insertions(+), 467 deletions(-) mode change 100644 => 100755 .classpath mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .project mode change 100644 => 100755 .settings/org.eclipse.jdt.core.prefs create mode 100644 layer.bdf mode change 100644 => 100755 resources/sound/explosion.ogg mode change 100644 => 100755 resources/sound/gun0.ogg mode change 100644 => 100755 resources/sound/gun1.ogg mode change 100644 => 100755 resources/sound/gun2.ogg mode change 100644 => 100755 resources/sound/gun3.ogg mode change 100644 => 100755 resources/sound/gun4.ogg mode change 100644 => 100755 resources/sound/gun5.ogg mode change 100644 => 100755 resources/sound/gun6.ogg mode change 100644 => 100755 resources/sound/gun7.ogg mode change 100644 => 100755 resources/sound/gun8.ogg mode change 100644 => 100755 resources/sound/gun9.ogg mode change 100644 => 100755 resources/sound/hit0.ogg mode change 100644 => 100755 resources/sound/hit1.ogg mode change 100644 => 100755 resources/sound/hit2.ogg mode change 100644 => 100755 resources/texmap.old.png mode change 100644 => 100755 resources/texmap.png mode change 100644 => 100755 resources/texmap.xcf mode change 100644 => 100755 settings.bdf mode change 100644 => 100755 src/projectzombie/Main.java mode change 100644 => 100755 src/projectzombie/audio/AudioEngine.java mode change 100644 => 100755 src/projectzombie/audio/AudioObject.java mode change 100644 => 100755 src/projectzombie/audio/AudioRandom.java mode change 100644 => 100755 src/projectzombie/audio/AudioSources.java mode change 100644 => 100755 src/projectzombie/display/Camera.java mode change 100644 => 100755 src/projectzombie/display/DisplayRender.java mode change 100644 => 100755 src/projectzombie/display/DisplayRenderUI.java mode change 100644 => 100755 src/projectzombie/display/DisplayStatsEventHandler.java mode change 100644 => 100755 src/projectzombie/display/DisplayWindow.java mode change 100644 => 100755 src/projectzombie/display/bossbar/BossBars.java mode change 100644 => 100755 src/projectzombie/display/bossbar/IBossBar.java mode change 100644 => 100755 src/projectzombie/display/lighting/ChunkLightingCollection.java mode change 100644 => 100755 src/projectzombie/display/lighting/ChunkLightingTemp.java mode change 100644 => 100755 src/projectzombie/display/lighting/DynamicLighting.java mode change 100644 => 100755 src/projectzombie/display/lighting/TileLighting.java mode change 100644 => 100755 src/projectzombie/display/transparent/ITransparentObject.java mode change 100644 => 100755 src/projectzombie/display/transparent/TransparentObject.java mode change 100644 => 100755 src/projectzombie/display/transparent/TransparentObjects.java mode change 100644 => 100755 src/projectzombie/entity/Entity.java mode change 100644 => 100755 src/projectzombie/entity/EntityAlive.java mode change 100644 => 100755 src/projectzombie/entity/EntityBoss.java mode change 100644 => 100755 src/projectzombie/entity/EntityBullet.java mode change 100644 => 100755 src/projectzombie/entity/EntityDummy.java mode change 100644 => 100755 src/projectzombie/entity/EntityEventHandler.java mode change 100644 => 100755 src/projectzombie/entity/EntityExplosion.java mode change 100644 => 100755 src/projectzombie/entity/EntityFlare.java mode change 100644 => 100755 src/projectzombie/entity/EntityGrapplingHook.java mode change 100644 => 100755 src/projectzombie/entity/EntityHeight.java mode change 100644 => 100755 src/projectzombie/entity/EntityInventory.java mode change 100644 => 100755 src/projectzombie/entity/EntityItem.java create mode 100755 src/projectzombie/entity/EntityKillWithParticles.java mode change 100644 => 100755 src/projectzombie/entity/EntityParticle.java mode change 100644 => 100755 src/projectzombie/entity/EntityTnt.java mode change 100644 => 100755 src/projectzombie/entity/EntityVertical.java mode change 100644 => 100755 src/projectzombie/entity/EntityZombie.java mode change 100644 => 100755 src/projectzombie/entity/EntityZombieArmored.java mode change 100644 => 100755 src/projectzombie/entity/particle/ParticleBlood.java mode change 100644 => 100755 src/projectzombie/entity/particle/ParticleBreak.java mode change 100644 => 100755 src/projectzombie/entity/particle/ParticleLava.java mode change 100644 => 100755 src/projectzombie/entity/particle/ParticleSmoke.java mode change 100644 => 100755 src/projectzombie/entity/particle/ParticleSpark.java mode change 100644 => 100755 src/projectzombie/entity/particle/ParticleWater.java mode change 100644 => 100755 src/projectzombie/entity/player/EntityPlayer.java mode change 100644 => 100755 src/projectzombie/init/Entities.java mode change 100644 => 100755 src/projectzombie/init/Items.java create mode 100755 src/projectzombie/init/LayerGenerators.java mode change 100644 => 100755 src/projectzombie/init/Layers.java mode change 100644 => 100755 src/projectzombie/init/Resources.java mode change 100644 => 100755 src/projectzombie/init/Sounds.java mode change 100644 => 100755 src/projectzombie/init/Textures.java mode change 100644 => 100755 src/projectzombie/init/Tiles.java mode change 100644 => 100755 src/projectzombie/input/CursorEnterCallback.java mode change 100644 => 100755 src/projectzombie/input/CursorPosCallback.java mode change 100644 => 100755 src/projectzombie/input/GameInput.java mode change 100644 => 100755 src/projectzombie/input/InputMode.java mode change 100644 => 100755 src/projectzombie/input/JoystickCallback.java mode change 100644 => 100755 src/projectzombie/input/KeyCallback.java mode change 100644 => 100755 src/projectzombie/input/KeyCharCallback.java mode change 100644 => 100755 src/projectzombie/input/MouseButtonCallback.java mode change 100644 => 100755 src/projectzombie/input/ScrollWheelCallback.java mode change 100644 => 100755 src/projectzombie/input/types/Input.java mode change 100644 => 100755 src/projectzombie/input/types/InputGUI.java mode change 100644 => 100755 src/projectzombie/input/types/InputGame.java mode change 100644 => 100755 src/projectzombie/inventory/IInventory.java mode change 100644 => 100755 src/projectzombie/inventory/Inventory.java mode change 100644 => 100755 src/projectzombie/items/Item.java mode change 100644 => 100755 src/projectzombie/items/ItemAmmo.java mode change 100644 => 100755 src/projectzombie/items/ItemDefenceUpgrade.java mode change 100644 => 100755 src/projectzombie/items/ItemEmpty.java mode change 100644 => 100755 src/projectzombie/items/ItemFlare.java mode change 100644 => 100755 src/projectzombie/items/ItemGrapplingHook.java mode change 100644 => 100755 src/projectzombie/items/ItemGunUpgrade.java mode change 100644 => 100755 src/projectzombie/items/ItemHealthPotion.java mode change 100644 => 100755 src/projectzombie/items/ItemLantern.java create mode 100755 src/projectzombie/items/ItemRock.java create mode 100755 src/projectzombie/items/ItemSpawn.java mode change 100644 => 100755 src/projectzombie/items/ItemTnt.java create mode 100755 src/projectzombie/items/spawner/ItemSpawnZombie.java mode change 100644 => 100755 src/projectzombie/mainloop/MainloopEnd.java mode change 100644 => 100755 src/projectzombie/mainloop/MainloopEventHandler.java mode change 100644 => 100755 src/projectzombie/mainloop/MainloopHelpers.java mode change 100644 => 100755 src/projectzombie/mainloop/MainloopIterator.java mode change 100644 => 100755 src/projectzombie/menu/Menu.java mode change 100644 => 100755 src/projectzombie/menu/MenuDeath.java mode change 100644 => 100755 src/projectzombie/menu/MenuGame.java mode change 100644 => 100755 src/projectzombie/menu/MenuGamePause.java mode change 100644 => 100755 src/projectzombie/menu/MenuMain.java mode change 100644 => 100755 src/projectzombie/menu/MenuSettings.java mode change 100644 => 100755 src/projectzombie/menu/gui/Alignment.java mode change 100644 => 100755 src/projectzombie/menu/gui/Button.java mode change 100644 => 100755 src/projectzombie/menu/gui/ButtonGroup.java mode change 100644 => 100755 src/projectzombie/menu/gui/GUI.java mode change 100644 => 100755 src/projectzombie/menu/gui/GUIComponent.java mode change 100644 => 100755 src/projectzombie/menu/gui/GUIContainer.java mode change 100644 => 100755 src/projectzombie/menu/gui/GUISelectable.java mode change 100644 => 100755 src/projectzombie/menu/gui/GUISelectableDirection.java mode change 100644 => 100755 src/projectzombie/menu/gui/Label.java mode change 100644 => 100755 src/projectzombie/menu/gui/Overlay.java mode change 100644 => 100755 src/projectzombie/menu/gui/components/ButtonBasic.java mode change 100644 => 100755 src/projectzombie/menu/gui/components/ButtonCallback.java mode change 100644 => 100755 src/projectzombie/menu/gui/components/ButtonGroupPause.java mode change 100644 => 100755 src/projectzombie/menu/gui/components/ButtonSetting.java mode change 100644 => 100755 src/projectzombie/menu/gui/components/GUIBackToMenu.java mode change 100644 => 100755 src/projectzombie/menu/gui/components/LabelMain.java mode change 100644 => 100755 src/projectzombie/menu/gui/components/LabelPause.java mode change 100644 => 100755 src/projectzombie/menu/gui/components/OverlayBackground.java mode change 100644 => 100755 src/projectzombie/resources/Resource.java mode change 100644 => 100755 src/projectzombie/settings/Cheats.java mode change 100644 => 100755 src/projectzombie/settings/Environment.java create mode 100755 src/projectzombie/settings/SettingQuality.java mode change 100644 => 100755 src/projectzombie/settings/Settings.java mode change 100644 => 100755 src/projectzombie/text/Text.java mode change 100644 => 100755 src/projectzombie/tiles/Tile.java mode change 100644 => 100755 src/projectzombie/tiles/TileBossPortal.java create mode 100755 src/projectzombie/tiles/TileBulletBreakable.java mode change 100644 => 100755 src/projectzombie/tiles/TileChest.java mode change 100644 => 100755 src/projectzombie/tiles/TileDirt.java delete mode 100644 src/projectzombie/tiles/TileFire.java mode change 100644 => 100755 src/projectzombie/tiles/TileFlat.java mode change 100644 => 100755 src/projectzombie/tiles/TileFlatFaded.java mode change 100644 => 100755 src/projectzombie/tiles/TileGrass.java mode change 100644 => 100755 src/projectzombie/tiles/TileLadder.java mode change 100644 => 100755 src/projectzombie/tiles/TileLadderUp.java mode change 100644 => 100755 src/projectzombie/tiles/TileLantern.java mode change 100644 => 100755 src/projectzombie/tiles/TileLava.java mode change 100644 => 100755 src/projectzombie/tiles/TileLavaFlow.java mode change 100644 => 100755 src/projectzombie/tiles/TilePortalDown.java mode change 100644 => 100755 src/projectzombie/tiles/TileRock.java mode change 100644 => 100755 src/projectzombie/tiles/TileSand.java mode change 100644 => 100755 src/projectzombie/tiles/TileStone.java mode change 100644 => 100755 src/projectzombie/tiles/TileTree.java mode change 100644 => 100755 src/projectzombie/tiles/TileVertical.java mode change 100644 => 100755 src/projectzombie/tiles/TileVoid.java mode change 100644 => 100755 src/projectzombie/tiles/TileWall.java mode change 100644 => 100755 src/projectzombie/tiles/TileWallUnbreakable.java mode change 100644 => 100755 src/projectzombie/tiles/TileWater.java mode change 100644 => 100755 src/projectzombie/tiles/TileWaterFlow.java mode change 100644 => 100755 src/projectzombie/time/GameTimer.java mode change 100644 => 100755 src/projectzombie/time/NoSleep.java mode change 100644 => 100755 src/projectzombie/util/gl/GlHelpers.java mode change 100644 => 100755 src/projectzombie/util/gl/VerticalRender.java mode change 100644 => 100755 src/projectzombie/util/gl/texture/AnimationEventHandler.java mode change 100644 => 100755 src/projectzombie/util/gl/texture/AnimationReference.java mode change 100644 => 100755 src/projectzombie/util/gl/texture/IHasTexture.java mode change 100644 => 100755 src/projectzombie/util/gl/texture/Texture.java mode change 100644 => 100755 src/projectzombie/util/gl/texture/TextureMap.java mode change 100644 => 100755 src/projectzombie/util/gl/texture/TextureReference.java mode change 100644 => 100755 src/projectzombie/util/gl/texture/TextureReferenceEmpty.java mode change 100644 => 100755 src/projectzombie/util/gl/texture/TextureReferenceRandom.java mode change 100644 => 100755 src/projectzombie/util/math/ColorRange.java mode change 100644 => 100755 src/projectzombie/util/math/ItemStack.java mode change 100644 => 100755 src/projectzombie/util/math/MathHelpers.java create mode 100755 src/projectzombie/util/math/NamedList.java mode change 100644 => 100755 src/projectzombie/util/math/TileState.java create mode 100755 src/projectzombie/util/math/astar/AStar.java create mode 100755 src/projectzombie/util/math/astar/AStarSearch.java create mode 100755 src/projectzombie/util/math/astar/AStarSearcher.java mode change 100644 => 100755 src/projectzombie/util/math/map/IMap2D.java mode change 100644 => 100755 src/projectzombie/util/math/map/Map2D.java mode change 100644 => 100755 src/projectzombie/util/math/map/Map2DElement.java mode change 100644 => 100755 src/projectzombie/util/math/random/OpenSimplexNoise.java mode change 100644 => 100755 src/projectzombie/util/math/random/RandomHelpers.java mode change 100644 => 100755 src/projectzombie/util/math/range/Range2i.java mode change 100644 => 100755 src/projectzombie/util/math/range/Range3i.java mode change 100644 => 100755 src/projectzombie/util/math/range/Range4i.java mode change 100644 => 100755 src/projectzombie/util/math/vec/Vec2d.java mode change 100644 => 100755 src/projectzombie/util/math/vec/Vec2i.java mode change 100644 => 100755 src/projectzombie/util/math/vec/Vec3d.java mode change 100644 => 100755 src/projectzombie/util/math/vec/Vec3i.java mode change 100644 => 100755 src/projectzombie/util/math/vec/Vec4d.java mode change 100644 => 100755 src/projectzombie/util/math/vec/Vec4i.java mode change 100644 => 100755 src/projectzombie/world/World.java mode change 100644 => 100755 src/projectzombie/world/chunk/Chunk.java mode change 100644 => 100755 src/projectzombie/world/chunk/ChunkEmpty.java mode change 100644 => 100755 src/projectzombie/world/chunk/ChunkEventHandler.java mode change 100644 => 100755 src/projectzombie/world/layer/Layer.java mode change 100644 => 100755 src/projectzombie/world/layer/layergen/LayerGen.java mode change 100644 => 100755 src/projectzombie/world/layer/layergen/LayerGenBossArena.java mode change 100644 => 100755 src/projectzombie/world/layer/layergen/LayerGenCaves.java mode change 100644 => 100755 src/projectzombie/world/layer/layergen/LayerGenEarth.java mode change 100644 => 100755 src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java mode change 100644 => 100755 src/projectzombie/world/layer/layergen/LayerGenRememberPlayerPos.java mode change 100644 => 100755 src/projectzombie/world/layer/layergen/PortalSpawnrates.java diff --git a/.classpath b/.classpath old mode 100644 new mode 100755 index 324a40d..a78e5fc --- a/.classpath +++ b/.classpath @@ -2,11 +2,11 @@ - + diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.project b/.project old mode 100644 new mode 100755 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs old mode 100644 new mode 100755 diff --git a/layer.bdf b/layer.bdf new file mode 100644 index 0000000000000000000000000000000000000000..1ccd40617bd80084703d18cfcb7c7701aed9b3d7 GIT binary patch literal 348 zcmb=J^Ef3TA>s5%e;-d@#!V5Dk_rvF>Kl!=u9(r-7}&>rqW2k#=QEMzO`(NGzL~o> zY}~!wLhwXlBlj+qE&KSbYwFb}9G=pdB<1Z_l_l5p@ucL^%9{?4B_%dWp5J6!bZhNb z;d=s!Hp;s`_O$edU;iyEw7u}Pu~JXElleT(%N5_4A`%RJ**?wuWf6Gx0h6W=t5BT6 z)g~sM84a9oa{R)6vu8N@1eiIo2)0SCocU5xHKEqSjZ5Y|@O`v-w36 z>KIc#EL*aSQQ6ScPJOG6DSM=5dR3;}GL7t{xGFy_mAbo94?adun#nDe(!|BWz`%TG GLK*-WeU+U6 literal 0 HcmV?d00001 diff --git a/resources/sound/explosion.ogg b/resources/sound/explosion.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/gun0.ogg b/resources/sound/gun0.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/gun1.ogg b/resources/sound/gun1.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/gun2.ogg b/resources/sound/gun2.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/gun3.ogg b/resources/sound/gun3.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/gun4.ogg b/resources/sound/gun4.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/gun5.ogg b/resources/sound/gun5.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/gun6.ogg b/resources/sound/gun6.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/gun7.ogg b/resources/sound/gun7.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/gun8.ogg b/resources/sound/gun8.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/gun9.ogg b/resources/sound/gun9.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/hit0.ogg b/resources/sound/hit0.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/hit1.ogg b/resources/sound/hit1.ogg old mode 100644 new mode 100755 diff --git a/resources/sound/hit2.ogg b/resources/sound/hit2.ogg old mode 100644 new mode 100755 diff --git a/resources/texmap.old.png b/resources/texmap.old.png old mode 100644 new mode 100755 diff --git a/resources/texmap.png b/resources/texmap.png old mode 100644 new mode 100755 index 8e10a0068e71a14ad2ea142af3c532897e7419e8..e59b0bfded7c3c6a70636c551c6275410d9c4152 GIT binary patch literal 107326 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

g1CP<6?3eTN{|}n^SDj^HUM>5hSN@0hp8vaU zi4TY2K(GKmjw((Sp$V+t7k=0qHvXIniX>Bg0x_5Tmow@Tmpywun7L)lY{Znm{n z`>(N8e|yt-QQE#Jl-ZZX!%&WalY={f!S3g?^h@ji{1Dug;NP@V%uvlia>B#_>0spR-9WiQLW;S+E(uOb&ojzrP}^uVaU8&^L+RH z=#=Yw8S0#j{wWsKUsw2@&ma@ceYAgH?1ZGf@Zezcs}~m+`~P~d^3;F-&}a2p?E5;HdzJJ)AL*RTVYskJblS9O7q+eSczJ92 z*FOviORnty^=Eh4Tb(`Mq$8~#|J%=af%Sm!WQRBGjMrD z&)FWm@UwLFr>sqf`sOqomrv)X5)5aSl@1AQwwv~!csqO!#hMucG{pLjAA^*AIy|5CZRkUIGA-|^w#0wYv{X3gBkh6qRlBp{22(#Yi|qMI)Cn_X6voa`~f9F$~)36_Gc%Rvak~|N1C? ziDauxAY*TcfSIFH$jMbbx&@C|wr|W7{`dcPzrnr76CWSnsKU1=Q*3{O=*p@COdFrF zzZchMSYZ24mf^r8X1Thi^V$A_^&Ow>j0!$EFSxH*_-H=khx7!?2hOioFxBNuT`d2v zHl<*X?#AbHmtI`CksY#(!)%-B=UF^#F@HBN|DCj{_|Mb&-=}Zvtrqv2W7D~6RTuN$ z%l3bR?-ZTZ<+cdmR(i0oUCxO^hjF*Zv%ev8$wdJlU&r{lk3HO z_T=?`JFu{nsdc&e?helO{yzPi7q@Bdmc4%eB`ZVp(+}dM3%ad7Q?a?kTtDzxupB)sn&T?qBojzw7tEsM|EFVC$Jb|4-)IOiswE z`SW4(Rk!E$KTpTko$`42?RI|n_U|{fc^>bP0l+XkKAp#O) literal 96530 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%0D;IyTPm5_;yj7*5ZL52JGirGq< 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 delta 9 Qcmc}_pWwjAIMGoI01iI_d;kCd diff --git a/src/projectzombie/Main.java b/src/projectzombie/Main.java old mode 100644 new mode 100755 index 10b61eb..b58aa8e --- a/src/projectzombie/Main.java +++ b/src/projectzombie/Main.java @@ -2,18 +2,24 @@ package projectzombie; import java.util.Random; +import bdf.file.BdfCompressedFileManager; import mainloop.manager.MainloopManager; import projectzombie.audio.AudioEngine; import projectzombie.audio.AudioSources; +import projectzombie.display.Camera; import projectzombie.display.DisplayStatsEventHandler; import projectzombie.display.DisplayWindow; import projectzombie.display.bossbar.BossBars; import projectzombie.entity.EntityEventHandler; import projectzombie.entity.player.EntityPlayer; +import projectzombie.init.Entities; +import projectzombie.init.Items; +import projectzombie.init.LayerGenerators; import projectzombie.init.Layers; import projectzombie.init.Resources; import projectzombie.init.Sounds; import projectzombie.init.Textures; +import projectzombie.init.Tiles; import projectzombie.input.JoystickCallback; import projectzombie.input.KeyCallback; import projectzombie.mainloop.MainloopEventHandler; @@ -46,6 +52,11 @@ public class Main Layers.init(rand.nextLong()); player = new EntityPlayer(); GameTimer.resetTime(); + + /*BdfCompressedFileManager bdf = new BdfCompressedFileManager("./layer.bdf"); + Main.world = new World(); + Main.world.BdfClassLoad(bdf);*/ + BossBars.clear(); } @@ -56,6 +67,11 @@ public class Main Cheats.init(args); Settings.init(); + Items.init(); + Entities.init(); + Tiles.init(); + LayerGenerators.init(); + // Load the resources Resources.loadResources(); diff --git a/src/projectzombie/audio/AudioEngine.java b/src/projectzombie/audio/AudioEngine.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/audio/AudioObject.java b/src/projectzombie/audio/AudioObject.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/audio/AudioRandom.java b/src/projectzombie/audio/AudioRandom.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/audio/AudioSources.java b/src/projectzombie/audio/AudioSources.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/display/Camera.java b/src/projectzombie/display/Camera.java old mode 100644 new mode 100755 index c5ee36a..bfdde10 --- a/src/projectzombie/display/Camera.java +++ b/src/projectzombie/display/Camera.java @@ -10,6 +10,7 @@ public class Camera public Vec2d angle; public int renderDistance; public double cameraDistance; + public double distanceFromPlayer; public static Camera camera; @@ -20,5 +21,7 @@ public class Camera cameraDistance, new Vec2d(Math.toRadians(angle.x), Math.toRadians(-angle.y)))); this.cameraDistance = cameraDistance; this.renderDistance = renderDistance; + + this.distanceFromPlayer = 10; } } diff --git a/src/projectzombie/display/DisplayRender.java b/src/projectzombie/display/DisplayRender.java old mode 100644 new mode 100755 index 117118a..921b3fd --- a/src/projectzombie/display/DisplayRender.java +++ b/src/projectzombie/display/DisplayRender.java @@ -24,6 +24,7 @@ import projectzombie.util.gl.GlHelpers; import projectzombie.util.math.vec.Vec2d; import projectzombie.util.math.vec.Vec3d; import projectzombie.world.chunk.Chunk; +import projectzombie.world.chunk.ChunkEventHandler; public class DisplayRender { @@ -59,6 +60,7 @@ public class DisplayRender // Push the matrix GlHelpers.pushMatrix(); + if(ChunkEventHandler.loaded) { // Set matrix mode glMatrixMode(GL_MODELVIEW); @@ -104,9 +106,9 @@ public class DisplayRender // Render the sorted transparent objects TransparentObjects.render(camera); - - GlHelpers.popMatrix(); } + + GlHelpers.popMatrix(); } // Render the user interface diff --git a/src/projectzombie/display/DisplayRenderUI.java b/src/projectzombie/display/DisplayRenderUI.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/display/DisplayStatsEventHandler.java b/src/projectzombie/display/DisplayStatsEventHandler.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/display/DisplayWindow.java b/src/projectzombie/display/DisplayWindow.java old mode 100644 new mode 100755 index 852f591..1a54b16 --- a/src/projectzombie/display/DisplayWindow.java +++ b/src/projectzombie/display/DisplayWindow.java @@ -1,5 +1,9 @@ package projectzombie.display; +import static org.lwjgl.glfw.GLFW.GLFW_DOUBLEBUFFER; +import static org.lwjgl.glfw.GLFW.GLFW_FALSE; +import static org.lwjgl.glfw.GLFW.glfwWindowHint; + import java.nio.IntBuffer; import org.lwjgl.BufferUtils; @@ -64,7 +68,9 @@ public class DisplayWindow implements IMainloopTask this.height = h.get()*4; // Set the window hint - GLFW.glfwWindowHint(GLFW.GLFW_VISIBLE, GLFW.GLFW_FALSE); + GLFW.glfwWindowHint(GLFW.GLFW_SAMPLES, 0); + GLFW.glfwWindowHint(GLFW.GLFW_SCALE_TO_MONITOR, 1); + GLFW.glfwWindowHint(GLFW.GLFW_VISIBLE, 0); GLFW.glfwWindowHint(GLFW.GLFW_VERSION_MAJOR, 3); GLFW.glfwWindowHint(GLFW.GLFW_VERSION_MINOR, 3); diff --git a/src/projectzombie/display/bossbar/BossBars.java b/src/projectzombie/display/bossbar/BossBars.java old mode 100644 new mode 100755 index 38b78d5..6045df3 --- a/src/projectzombie/display/bossbar/BossBars.java +++ b/src/projectzombie/display/bossbar/BossBars.java @@ -24,6 +24,8 @@ public class BossBars TextureReference health_bg = Textures.UI_HEALTH_BG; ArrayList toRemove = new ArrayList(); + double s = GlHelpers.getScale() / 10.0; + // Render the boss bars int i = 0; for(IBossBar bossbar : bossbars) @@ -32,15 +34,15 @@ public class BossBars double a = 1 - (bossbar.getHealth() / max_health); GlHelpers.begin(); - health_bg.texCoord(0, 1); GlHelpers.vertex2(-4, 8.5 - i); - health_bg.texCoord(0, 0); GlHelpers.vertex2(-4, 9.0 - i); - health_bg.texCoord(1, 0); GlHelpers.vertex2(4, 9.0 - i); - health_bg.texCoord(1, 1); GlHelpers.vertex2(4, 8.5 - i); + health_bg.texCoord(0, 1); GlHelpers.vertex2(-4*s, 8.5*s - i); + health_bg.texCoord(0, 0); GlHelpers.vertex2(-4*s, 9.0*s - i); + health_bg.texCoord(1, 0); GlHelpers.vertex2(4*s, 9.0*s - i); + health_bg.texCoord(1, 1); GlHelpers.vertex2(4*s, 8.5*s - i); - health_fg.texCoord(0, 1); GlHelpers.vertex2(-4, 8.5 - i); - health_fg.texCoord(0, 0); GlHelpers.vertex2(-4, 9.0 - i); - health_fg.texCoord(1-a, 0); GlHelpers.vertex2(4-a*8, 9.0 - i); - health_fg.texCoord(1-a, 1); GlHelpers.vertex2(4-a*8, 8.5 - i); + health_fg.texCoord(0, 1); GlHelpers.vertex2(-4*s, 8.5*s - i); + health_fg.texCoord(0, 0); GlHelpers.vertex2(-4*s, 9.0*s - i); + health_fg.texCoord(1-a, 0); GlHelpers.vertex2(4*s-a*8*s, 9.0*s - i); + health_fg.texCoord(1-a, 1); GlHelpers.vertex2(4*s-a*8*s, 8.5*s - i); GlHelpers.end(); i += 1; diff --git a/src/projectzombie/display/bossbar/IBossBar.java b/src/projectzombie/display/bossbar/IBossBar.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/display/lighting/ChunkLightingCollection.java b/src/projectzombie/display/lighting/ChunkLightingCollection.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/display/lighting/ChunkLightingTemp.java b/src/projectzombie/display/lighting/ChunkLightingTemp.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/display/lighting/DynamicLighting.java b/src/projectzombie/display/lighting/DynamicLighting.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/display/lighting/TileLighting.java b/src/projectzombie/display/lighting/TileLighting.java old mode 100644 new mode 100755 index 81d9f38..63e2645 --- a/src/projectzombie/display/lighting/TileLighting.java +++ b/src/projectzombie/display/lighting/TileLighting.java @@ -20,6 +20,7 @@ public class TileLighting implements IMainloopTask public static void update() { + if(Camera.camera == null) return; if(!ChunkEventHandler.loaded) return; Layer layer = Main.world.getLayer(); EntityPlayer player = Main.player; @@ -55,6 +56,11 @@ public class TileLighting implements IMainloopTask MainloopHelpers.loopAsync(0, range.maxValue(), (it) -> { + + if(!ChunkEventHandler.loaded) { + return; + } + Vec4i upto = Vec4i.fromId(range, it); Vec2i cpos = new Vec2i( @@ -140,12 +146,20 @@ public class TileLighting implements IMainloopTask // Set the light level if(daylightMode) { - if(tile_f.tile.passNaturalLight && tile_b.tile.passNaturalLight && it == 1) { + if(tile_f.tile.passNaturalLight && tile_b.tile.passNaturalLight && it != 0) { return; } if(light <= chunk_t.getDaylightLevel(lid)) return; chunk_t.setDaylightLevel(light, lid); } else { + if((tile_f.tile.emitsLight || tile_b.tile.emitsLight) && it == 1) { + double light_external = MathHelpers.biggest( + tile_f.tile.getLightLevel(tile_f, lpos), + tile_b.tile.getLightLevel(tile_b, lpos)); + if(light_external >= light) { + return; + }; + } if(light <= chunk_t.getLightLevel(lid)) return; chunk_t.setLightLevel(light, lid); } @@ -163,30 +177,6 @@ public class TileLighting implements IMainloopTask new Vec2i(lpos.x, lpos.y-1) }; - int samechunk = 0; - - for(Vec2i position : positions) { - Vec2i new_cpos = Layer.getChunkPosFromPos(position); - if(new_cpos.equal(chunk.c_pos)) { - samechunk += 1; - } - } - - if(samechunk == 4) { - double neighbour_light = 0; - for(Vec2i position : positions) { - TileState tf = chunk.getFrontTile(position); - TileState tb = chunk.getBackTile(position); - neighbour_light = MathHelpers.smallest(MathHelpers.biggest( - tb.tile.getLightLevel(tb, position), - tf.tile.getLightLevel(tf, position)), - neighbour_light); - } - if(neighbour_light > light) { - return; - } - } - // Add the light to all the adjacent positions for(Vec2i position : positions) { addLightToTiles(chunks, layer, position, it + 1, light - dissipation, daylightMode); diff --git a/src/projectzombie/display/transparent/ITransparentObject.java b/src/projectzombie/display/transparent/ITransparentObject.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/display/transparent/TransparentObject.java b/src/projectzombie/display/transparent/TransparentObject.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/display/transparent/TransparentObjects.java b/src/projectzombie/display/transparent/TransparentObjects.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/entity/Entity.java b/src/projectzombie/entity/Entity.java old mode 100644 new mode 100755 index e843997..997e8b9 --- a/src/projectzombie/entity/Entity.java +++ b/src/projectzombie/entity/Entity.java @@ -1,7 +1,13 @@ package projectzombie.entity; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.Random; +import bdf.classes.IBdfClassManager; +import bdf.types.BdfArray; +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; import mainloop.task.IMainloopTask; import projectzombie.Main; import projectzombie.display.Camera; @@ -14,17 +20,16 @@ import projectzombie.util.math.TileState; import projectzombie.util.math.vec.Vec2d; import projectzombie.util.math.vec.Vec2i; import projectzombie.world.chunk.Chunk; +import projectzombie.world.chunk.ChunkEventHandler; import projectzombie.world.layer.Layer; -public class Entity implements ITransparentObject +public class Entity implements ITransparentObject, IBdfClassManager { public Vec2d pos; - public double angle = 0; public boolean opaqueTile = true; public double hitbox = 1; public boolean isSolid = false; public Chunk chunk; - private double speed = 1; private TileState tile_front; private TileState tile_back; public boolean crossUnWalkable = true; @@ -34,18 +39,123 @@ public class Entity implements ITransparentObject public int stepOnTileCooldown = 0; + protected double getTilesLightDissipation() { + if(chunk == null) return 0; + TileState tsf = chunk.getFrontTile(pos.toInt()); + TileState tsb = chunk.getBackTile(pos.toInt()); + return MathHelpers.biggest( + tsf.tile.getLightDissipation(tsf), + tsb.tile.getLightDissipation(tsb)); + } + + protected double getLightWithHeight(double light) { + double height = 1; + if(this instanceof EntityHeight) { + height *= ((EntityHeight)this).getHeight(); + } + return light - (this.getTilesLightDissipation() * Math.abs(height)); + } + + public int getID() { + for(int i=0;i ec = Entities.entities.get(i); + if(ec == this.getClass()) { + return i; + } + } + return -1; + } + + public static Entity loadEntity(BdfObject bdf) + { + try + { + // Load the entity id + BdfNamedList nl = bdf.getNamedList(); + int id = nl.get("id").getInteger(); + + // Send back null if the id is out of range + if(id < 0 || id >= Entities.entities.size()) { + System.out.println("Warning: Invalid ID detected: " + id); + return null; + } + + // Get the class and the constructor + Class ecl = Entities.entities.get(id); + Constructor econ = ecl.getConstructor(BdfObject.class); + + // Send back the new entity + return econ.newInstance(bdf); + } + + catch( + NoSuchMethodException | + SecurityException | + InstantiationException | + IllegalAccessException | + IllegalArgumentException | + InvocationTargetException e) + { + e.printStackTrace(); + + // Send null if there was an issue + return null; + } + } + public Entity(Vec2d pos) { - // Add this entity to the list of entities - Entities.entities.add(this); - // Store the specified values this.pos = pos; } + public Entity(BdfObject bdf) { + this.BdfClassLoad(bdf); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + BdfNamedList nl = bdf.getNamedList(); + BdfArray e = nl.get("e").getArray(); + pos = new Vec2d(e.get(0)); + opaqueTile = e.get(1).getBoolean(); + hitbox = e.get(2).getDouble(); + isSolid = e.get(3).getBoolean(); + crossUnWalkable = e.get(4).getBoolean(); + goThroughSolid = e.get(5).getBoolean(); + emitsLight = e.get(6).getBoolean(); + stepOnTileCooldown = e.get(7).getInteger(); + } + + @Override + public void BdfClassSave(BdfObject bdf) + { + // Get the ID and return if its invalid (entity can't be saved) + int id = getID(); + if(id == -1) return; + + BdfNamedList nl = bdf.getNamedList(); + nl.set("id", BdfObject.withInteger(getID())); + + BdfObject pos_bdf = new BdfObject(); + pos.BdfClassSave(pos_bdf); + + BdfArray e = new BdfArray(); + nl.set("e", BdfObject.withArray(e)); + + e.add(pos_bdf); + e.add(BdfObject.withBoolean(opaqueTile)); + e.add(BdfObject.withDouble(hitbox)); + e.add(BdfObject.withBoolean(isSolid)); + e.add(BdfObject.withBoolean(crossUnWalkable)); + e.add(BdfObject.withBoolean(goThroughSolid)); + e.add(BdfObject.withBoolean(emitsLight)); + e.add(BdfObject.withInteger(stepOnTileCooldown)); + } + public void tick(Chunk chunk, Layer layer) { - speed = 1; - angle = MathHelpers.mod(angle, 360); + //speed = 1; + //angle = MathHelpers.mod(angle, 360); Vec2i tpos = new Vec2i(MathHelpers.floor(pos.x)+0, MathHelpers.floor(pos.y)+0); if(chunk == null) chunk = layer.getChunk(pos); this.chunk = chunk; @@ -56,15 +166,23 @@ public class Entity implements ITransparentObject stepOnTileCooldown -= 1; } - if(this.isSolid) - { - this.addSlowness(tile_back.tile.slowness); - this.addSlowness(tile_front.tile.slowness); - } + moveAwayFromSolidEntities(layer); } - public void addSlowness(double amount) { - speed *= (1 - amount); + protected void moveAwayFromSolidEntities(Layer layer) + { + if(!goThroughSolid) + { + for(Entity e : layer.getNearbyEntities(pos, hitbox)) + { + if(e.isSolid && e != this) { + double angle = Math.toDegrees(Math.atan2( + pos.y - e.pos.y, + pos.x - e.pos.x)); + moveTowards(angle + 180, 0.1); + } + } + } } public void render(Vec2d pos, Camera camera) { @@ -91,19 +209,17 @@ public class Entity implements ITransparentObject return this.opaqueTile; } - public void moveForward(double speed) { - this.moveTowards(0, speed); - } - - public void moveBackward(double speed) { - this.moveTowards(0, -speed); - } - public void moveTowards(double angle, double speed) { + if(chunk == null) { + chunk = Main.world.getLayer().getChunk(pos); + } + // Calculate the new position - speed *= this.speed; - Vec2d pos = this.pos.add(MathHelpers.moveTowards2(speed, Math.toRadians(this.angle + angle))); + speed *= 1 - MathHelpers.biggest( + chunk.getFrontTile(pos.toInt()).tile.slowness, + chunk.getBackTile(pos.toInt()).tile.slowness); + Vec2d pos = this.pos.add(MathHelpers.moveTowards2(speed, Math.toRadians(angle))); // Check if the new position is legal if(this.moveIsLegal(new Vec2d(this.pos.x, pos.y))) this.pos.y = pos.y; @@ -113,16 +229,20 @@ public class Entity implements ITransparentObject if(this.isSolid) activateSteppedOnTile(); } - public void moveForward() { - this.moveForward(0.1); - } - - public void moveBackward() { - this.moveBackward(0.1); - } - - public void moveTowards(double angle) { - moveTowards(angle, 0.1); + public void moveInVector(Vec2d vec, double speed) + { + // Calculate the new position + speed *= 1 - MathHelpers.biggest( + chunk.getFrontTile(pos.toInt()).tile.slowness, + chunk.getBackTile(pos.toInt()).tile.slowness); + Vec2d pos = vec.multiply(speed).add(this.pos); + + // Check if the new position is legal + if(this.moveIsLegal(new Vec2d(this.pos.x, pos.y))) this.pos.y = pos.y; + if(this.moveIsLegal(new Vec2d(pos.x, this.pos.y))) this.pos.x = pos.x; + + // Activate stepped on tiles if the entity is "solid" + if(this.isSolid) activateSteppedOnTile(); } public void kill() { @@ -168,7 +288,6 @@ public class Entity implements ITransparentObject // Is this entity solid if(!goThroughSolid || !crossUnWalkable) { - // Check the tile the player is standing on Vec2i tpos = new Vec2i(MathHelpers.floor(pos.x)+0, MathHelpers.floor(pos.y)+0); @@ -236,8 +355,12 @@ public class Entity implements ITransparentObject @Override public void MainLoopUpdate() { + if(!ChunkEventHandler.loaded) + return; + if(chunk == null) + chunk = Main.world.getLayer().getChunk(pos); if(Main.menu.doGameloop) { - moveTowards(Math.toRadians(angle) + 180, a[0]/100.0); + moveTowards(angle, a[0]/100.0); a[0] -= a[0] / 100.0; } } diff --git a/src/projectzombie/entity/EntityAlive.java b/src/projectzombie/entity/EntityAlive.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/entity/EntityBoss.java b/src/projectzombie/entity/EntityBoss.java old mode 100644 new mode 100755 index a6eedb6..0957449 --- a/src/projectzombie/entity/EntityBoss.java +++ b/src/projectzombie/entity/EntityBoss.java @@ -1,5 +1,9 @@ package projectzombie.entity; +import java.util.Random; + +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; import projectzombie.Main; import projectzombie.display.Camera; import projectzombie.display.bossbar.BossBars; @@ -19,7 +23,7 @@ import projectzombie.util.math.vec.Vec3d; import projectzombie.world.chunk.Chunk; import projectzombie.world.layer.Layer; -public class EntityBoss extends EntityVertical implements IBossBar +public class EntityBoss extends EntityVertical implements IBossBar, EntityKillWithParticles { private boolean moving = false; private boolean firing = false; @@ -27,10 +31,55 @@ public class EntityBoss extends EntityVertical implements IBossBar private double health = max_health; private int bullet_frequency = 0; private int spawn_frequency = 0; + private double time = 0; private OpenSimplexNoise noise_gun; private OpenSimplexNoise noise_walk; private OpenSimplexNoise noise_spawn; + protected OpenSimplexNoise noise_target_x; + protected OpenSimplexNoise noise_target_y; + + private long seed; + + public EntityBoss(BdfObject bdf) { + super(bdf, TextureReference.EMPTY, new Vec2d(4, 4)); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + super.BdfClassLoad(bdf); + + BdfNamedList nl = bdf.getNamedList(); + health = nl.get("health").getDouble(); + bullet_frequency = nl.get("bullet_freq").getInteger(); + spawn_frequency = nl.get("spawn_frq").getInteger(); + + this.isSolid = true; + this.goThroughSolid = false; + this.crossUnWalkable = false; + this.hitbox = 2; + + long seed = nl.get("seed").getLong(); + Random rand = new Random(seed); + this.noise_gun = new OpenSimplexNoise(rand.nextLong()); + this.noise_walk = new OpenSimplexNoise(rand.nextLong()); + this.noise_spawn = new OpenSimplexNoise(rand.nextLong()); + this.noise_target_x = new OpenSimplexNoise(rand.nextLong()); + this.noise_target_y = new OpenSimplexNoise(rand.nextLong()); + + BossBars.register(this); + } + + @Override + public void BdfClassSave(BdfObject bdf) { + super.BdfClassSave(bdf); + + BdfNamedList nl = bdf.getNamedList(); + nl.set("health", BdfObject.withDouble(health)); + nl.set("bullet_freq", BdfObject.withInteger(bullet_frequency)); + nl.set("spawn_freq", BdfObject.withInteger(spawn_frequency)); + nl.set("seed", BdfObject.withLong(seed)); + } public EntityBoss(Vec2d pos) { super(pos, TextureReference.EMPTY, new Vec2d(4, 4)); @@ -38,11 +87,15 @@ public class EntityBoss extends EntityVertical implements IBossBar this.isSolid = true; this.goThroughSolid = false; this.crossUnWalkable = false; - this.hitbox = 1; + this.hitbox = 2; + long seed = rand.nextLong(); + Random rand = new Random(seed); this.noise_gun = new OpenSimplexNoise(rand.nextLong()); this.noise_walk = new OpenSimplexNoise(rand.nextLong()); this.noise_spawn = new OpenSimplexNoise(rand.nextLong()); + this.noise_target_x = new OpenSimplexNoise(rand.nextLong()); + this.noise_target_y = new OpenSimplexNoise(rand.nextLong()); BossBars.register(this); } @@ -51,8 +104,12 @@ public class EntityBoss extends EntityVertical implements IBossBar public void tick(Chunk chunk, Layer layer) { super.tick(chunk, layer); - double angle = Math.atan2(pos.x - Main.player.pos.x, pos.y - Main.player.pos.y); - this.angle = Math.toDegrees(angle) + 180; + double angle = Math.atan2( + pos.x - Main.player.pos.x + noise_target_x.eval( + time*2, Main.player.pos.x/25, Main.player.pos.y/25)*10, + pos.y - Main.player.pos.y + noise_target_y.eval( + time*2, Main.player.pos.y/25, Main.player.pos.y/25)*10); + angle = Math.toDegrees(angle) + 180; if(this.noise_spawn.eval(GameTimer.getTime() / 500.0, 0) > 0.2) { if(spawn_frequency == 0) { @@ -77,7 +134,7 @@ public class EntityBoss extends EntityVertical implements IBossBar if(bullet_frequency == 0) { - Vec2d gun_offset = MathHelpers.moveTowards2(1, Math.toRadians(90 + this.angle)); + Vec2d gun_offset = MathHelpers.moveTowards2(1, Math.toRadians(90)); Vec3d pos1 = new Vec3d(pos.x + gun_offset.x, pos.y + gun_offset.y, 1); double distance_1 = pos1.distance(new Vec3d(pos.x, pos.y, pos1.z)); @@ -90,9 +147,9 @@ public class EntityBoss extends EntityVertical implements IBossBar double angle2_0 = Math.toDegrees(Math.atan2(pos2.x - Main.player.pos.x, pos2.y - Main.player.pos.y)) + 180; double angle2_1 = Math.toDegrees(Math.atan2(distance_2, pos2.z - 1)) - 90; - layer.spawnEntity(new EntityBullet(pos.add(gun_offset), this, angle1_0, 20, 5, 1000 + layer.spawnEntity(new EntityBullet(pos.add(gun_offset), this, angle1_0, 20, 1000 ).withHeight(angle1_1, pos1.z)); - layer.spawnEntity(new EntityBullet(pos.subtract(gun_offset), this, angle2_0, 20, 5, 1000 + layer.spawnEntity(new EntityBullet(pos.subtract(gun_offset), this, angle2_0, 20, 1000 ).withHeight(angle2_1, pos2.z)); bullet_frequency = 10; } @@ -109,13 +166,16 @@ public class EntityBoss extends EntityVertical implements IBossBar } if(this.noise_walk.eval(GameTimer.getTime() / 500.0, 0) > -0.4) { - this.moveForward(); + this.moveTowards(angle); this.moving = true; } else { this.moving = false; } + + // Increase time + time += 0.001; } @Override @@ -186,21 +246,10 @@ public class EntityBoss extends EntityVertical implements IBossBar return health >= 0; } - @Override public void moveTowards(double angle) { this.moveTowards(angle, 0.02); } - @Override - public void moveBackward() { - this.moveBackward(0.02); - } - - @Override - public void moveForward() { - this.moveForward(0.02); - } - @Override public void onDeath(Layer layer) { IBossBar.super.onDeath(layer); @@ -229,4 +278,8 @@ public class EntityBoss extends EntityVertical implements IBossBar @Override public void push(double amount, double angle) { } + + @Override + protected void moveAwayFromSolidEntities(Layer layer) { + } } diff --git a/src/projectzombie/entity/EntityBullet.java b/src/projectzombie/entity/EntityBullet.java old mode 100644 new mode 100755 index d526a84..afdf87b --- a/src/projectzombie/entity/EntityBullet.java +++ b/src/projectzombie/entity/EntityBullet.java @@ -1,9 +1,13 @@ package projectzombie.entity; +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; import projectzombie.display.Camera; import projectzombie.entity.particle.ParticleBlood; import projectzombie.init.Sounds; +import projectzombie.settings.SettingQuality; import projectzombie.tiles.Tile; +import projectzombie.tiles.TileBulletBreakable; import projectzombie.util.gl.GlHelpers; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.random.RandomHelpers; @@ -19,20 +23,49 @@ public class EntityBullet extends EntityParticle private Entity parent; private double damage; - private int breakchance; private double height = 0.2; private double height_angle = 0; + private double angle = 0; private Vec3d velocity; - public EntityBullet(Vec2d pos, Entity parent, double angle, double damage, int breakchance, int despawn_time) { - super(pos, 0.2, 0.4); + public EntityBullet(BdfObject bdf) { + super(bdf); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + super.BdfClassLoad(bdf); + + BdfNamedList nl = bdf.getNamedList(); + time = nl.get("time").getInteger(); + damage = nl.get("damage").getDouble(); + height = nl.get("height").getDouble(); + height_angle = nl.get("angle_h").getDouble(); + angle = nl.get("angle").getDouble(); + velocity = new Vec3d(nl.get("velocity")); + } + + @Override + public void BdfClassSave(BdfObject bdf) { + super.BdfClassSave(bdf); + + BdfNamedList nl = bdf.getNamedList(); + nl.set("time", BdfObject.withInteger(time)); + nl.set("damage", BdfObject.withDouble(damage)); + nl.set("height", BdfObject.withDouble(height)); + nl.set("angle_h", BdfObject.withDouble(height_angle)); + nl.set("angle", BdfObject.withDouble(angle)); + velocity.BdfClassSave(nl.get("velocity")); + } + + public EntityBullet(Vec2d pos, Entity parent, double angle, double damage, int despawn_time) { + super(pos, 0.2, despawn_time); // Store some specified values this.angle = angle; this.parent = parent; this.damage = damage; - this.breakchance = breakchance; this.time = despawn_time; // Calculate the velocity vector @@ -86,7 +119,8 @@ public class EntityBullet extends EntityParticle if(pos.squareDistance(new Vec2d(tpos.x + 0.5, tpos.y + 0.5)) < tile_f.tileHitbox) { // Break the block - if(RandomHelpers.randrange(rand, breakchance) == 0) { + if(tile_f instanceof TileBulletBreakable && RandomHelpers.randrange(rand, + ((TileBulletBreakable)tile_f).getBulletBreakChance()) == 0) { chunk.breakFrontTile(tpos); } @@ -97,7 +131,8 @@ public class EntityBullet extends EntityParticle if(pos.squareDistance(new Vec2d(tpos.x + 0.5, tpos.y + 0.5)) < tile_b.tileHitbox) { // Break the block - if(RandomHelpers.randrange(rand, breakchance) == 0) { + if(tile_f instanceof TileBulletBreakable && RandomHelpers.randrange(rand, + ((TileBulletBreakable)tile_f).getBulletBreakChance()) == 0) { chunk.breakBackTile(tpos); } @@ -120,8 +155,10 @@ public class EntityBullet extends EntityParticle e.push(1, angle); // Spawn some blood particles - for(int i=0;i= 8) { ea.setHeight(0); - Main.world.setLayer(Layers.getLayer(layerId)); + Main.world.setLayer(layerId); + + if(layer.layergen.destroyOnLeave) { + Main.world.removeLayer(layerId); + } if(entity instanceof EntityPlayer) { diff --git a/src/projectzombie/entity/EntityHeight.java b/src/projectzombie/entity/EntityHeight.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/entity/EntityInventory.java b/src/projectzombie/entity/EntityInventory.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/entity/EntityItem.java b/src/projectzombie/entity/EntityItem.java old mode 100644 new mode 100755 index 0b9c089..69c4b09 --- a/src/projectzombie/entity/EntityItem.java +++ b/src/projectzombie/entity/EntityItem.java @@ -1,6 +1,9 @@ package projectzombie.entity; +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; import projectzombie.display.Camera; +import projectzombie.init.Textures; import projectzombie.util.gl.GlHelpers; import projectzombie.util.gl.texture.TextureReference; import projectzombie.util.math.ItemStack; @@ -14,21 +17,65 @@ public class EntityItem extends EntityVertical private ItemStack stack; private double height = 0; private double height_speed; - private int pickup_time = 100; + private int pickup_time = 200; + private long age = 0; + + public double angle; + + public EntityItem(BdfObject bdf) { + super(bdf, TextureReference.EMPTY, new Vec2d(0.5, 0.5)); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + super.BdfClassLoad(bdf); + + BdfNamedList nl = bdf.getNamedList(); + stack = new ItemStack(nl.get("stack")); + height = nl.get("height").getDouble(); + height_speed = nl.get("speed_h").getDouble(); + pickup_time = nl.get("pickup").getInteger(); + age = nl.get("age").getLong(); + angle = nl.get("angle").getDouble(); + + tex = stack.item.texture; + } + + @Override + public void BdfClassSave(BdfObject bdf) { + super.BdfClassSave(bdf); + + BdfNamedList nl = bdf.getNamedList(); + stack.BdfClassSave(nl.get("stack")); + nl.set("height", BdfObject.withDouble(height)); + nl.set("speed_h", BdfObject.withDouble(height_speed)); + nl.set("pickup", BdfObject.withInteger(pickup_time)); + nl.set("age", BdfObject.withLong(age)); + nl.set("angle", BdfObject.withDouble(angle)); + } public EntityItem(Vec2d pos, ItemStack stack) { super(pos, stack.item.texture, new Vec2d(0.5, 0.5)); + this.emitsLight = true; this.opaqueTile = true; this.stack = stack; this.angle = RandomHelpers.randrange(rand, 360); height_speed = RandomHelpers.randrange(rand, 10000) / 200000.0; } + @Override + public double getLightLevel() { + if(this.stack.isEmpty()) return 0; + return getLightWithHeight(this.stack.item.getLightLevel()); + } + @Override public void tick(Chunk chunk, Layer layer) { super.tick(chunk, layer); + age += 1; + height += height_speed; height_speed -= 0.001; @@ -42,7 +89,30 @@ public class EntityItem extends EntityVertical } else { - moveForward(0.01); + moveTowards(angle, 0.01); + } + + // Merge nearby stacks + for(Entity e : layer.getNearbyEntities(pos, 1)) + { + if(e instanceof EntityItem && e != this) { + EntityItem ei = (EntityItem) e; + + if( + ei.stack.meta == this.stack.meta && + ei.stack.item == this.stack.item && + ei.age > this.age + ) { + this.pickup_time = 200; + this.stack.count += ei.stack.count; + this.pos = new Vec2d( + ei.pos.x / 2 + this.pos.x / 2, + ei.pos.y / 2 + this.pos.y / 2); + this.height = ei.height / 2 + this.height / 2; + this.height_speed = ei.height_speed / 2 + this.height_speed / 2; + ei.kill(); + } + } } if(pickup_time == 0) @@ -68,7 +138,7 @@ public class EntityItem extends EntityVertical public void render(Vec2d pos, Camera camera, TextureReference tex, Vec2d size) { GlHelpers.pushMatrix(); GlHelpers.translate3(0, 0, height); - super.render(pos, camera, tex, size); + super.render(pos, camera, stack.item.texture, size); GlHelpers.popMatrix(); } } diff --git a/src/projectzombie/entity/EntityKillWithParticles.java b/src/projectzombie/entity/EntityKillWithParticles.java new file mode 100755 index 0000000..4913b19 --- /dev/null +++ b/src/projectzombie/entity/EntityKillWithParticles.java @@ -0,0 +1,6 @@ +package projectzombie.entity; + +public interface EntityKillWithParticles +{ + public void killWithParticles(); +} diff --git a/src/projectzombie/entity/EntityParticle.java b/src/projectzombie/entity/EntityParticle.java old mode 100644 new mode 100755 index 0ccfc12..054e7bb --- a/src/projectzombie/entity/EntityParticle.java +++ b/src/projectzombie/entity/EntityParticle.java @@ -1,7 +1,9 @@ package projectzombie.entity; +import bdf.types.BdfObject; import projectzombie.Main; import projectzombie.display.Camera; +import projectzombie.settings.SettingQuality; import projectzombie.util.gl.GlHelpers; import projectzombie.util.math.vec.Vec2d; import projectzombie.world.chunk.Chunk; @@ -9,9 +11,15 @@ import projectzombie.world.layer.Layer; public class EntityParticle extends Entity { + public static SettingQuality MODE = SettingQuality.FANCY; + private double height; private double size; + public EntityParticle(BdfObject bdf) { + super(bdf); + } + public EntityParticle(Vec2d pos, double size, double height) { super(pos); @@ -34,7 +42,7 @@ public class EntityParticle extends Entity super.tick(chunk, layer); // Kill the particle if the player can't see it to reduce lag - if(Main.player.pos.squareDistance(pos) > 32) this.kill(); + if(Main.player.pos.squareDistance(pos) > Camera.camera.renderDistance * 16) this.kill(); } @Override diff --git a/src/projectzombie/entity/EntityTnt.java b/src/projectzombie/entity/EntityTnt.java old mode 100644 new mode 100755 index 94fac57..3b31eb5 --- a/src/projectzombie/entity/EntityTnt.java +++ b/src/projectzombie/entity/EntityTnt.java @@ -1,5 +1,7 @@ package projectzombie.entity; +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; import projectzombie.display.Camera; import projectzombie.entity.particle.ParticleSpark; import projectzombie.init.Textures; @@ -18,6 +20,38 @@ public class EntityTnt extends EntityVertical private int explode_radius; private double explode_damage; + public EntityTnt(BdfObject bdf) { + super(bdf, Textures.ENTITY_TNT, new Vec2d(0.5, 0.5)); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + super.BdfClassLoad(bdf); + + BdfNamedList nl = bdf.getNamedList(); + height = nl.get("height").getDouble(); + velocity = new Vec3d(nl.get("velocity")); + + BdfNamedList explode = nl.get("explosion").getNamedList(); + explode_time = explode.get("time").getInteger(); + explode_radius = explode.get("radius").getInteger(); + explode_damage = explode.get("damage").getDouble(); + } + + @Override + public void BdfClassSave(BdfObject bdf) { + super.BdfClassSave(bdf); + + BdfNamedList nl = bdf.getNamedList(); + nl.set("height", BdfObject.withDouble(height)); + velocity.BdfClassSave(nl.get("velocity")); + + BdfNamedList explode = nl.get("explosion").getNamedList(); + explode.set("time", BdfObject.withInteger(explode_time)); + explode.set("radius", BdfObject.withInteger(explode_radius)); + explode.set("damage", BdfObject.withDouble(explode_damage)); + } + public EntityTnt(Vec2d pos, double angle, int explode_radius, double explode_damage) { super(pos, Textures.ENTITY_TNT, new Vec2d(0.5, 0.5)); @@ -93,7 +127,11 @@ public class EntityTnt extends EntityVertical @Override public double getLightLevel() { - return (1 - (this.height * (1/12.0))) * rand.nextDouble(); + return getLightWithHeight(1 - (this.height * (1/12.0))) * ( rand.nextDouble() / 10.0 + 0.9 ); + } + + @Override + protected void moveAwayFromSolidEntities(Layer layer) { } } diff --git a/src/projectzombie/entity/EntityVertical.java b/src/projectzombie/entity/EntityVertical.java old mode 100644 new mode 100755 index b818e30..0f9a806 --- a/src/projectzombie/entity/EntityVertical.java +++ b/src/projectzombie/entity/EntityVertical.java @@ -1,18 +1,27 @@ package projectzombie.entity; +import bdf.types.BdfObject; import projectzombie.display.Camera; +import projectzombie.entity.particle.ParticleBreak; import projectzombie.util.gl.GlHelpers; import projectzombie.util.gl.VerticalRender; +import projectzombie.util.gl.texture.IHasTexture; import projectzombie.util.gl.texture.TextureReference; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.vec.Vec2d; import projectzombie.util.math.vec.Vec2i; import projectzombie.util.math.vec.Vec3d; -public class EntityVertical extends Entity +public class EntityVertical extends Entity implements IHasTexture { - private TextureReference tex; - private Vec2d size; + public TextureReference tex; + public Vec2d size; + + public EntityVertical(BdfObject bdf, TextureReference tex, Vec2d size) { + super(bdf); + this.size = size; + this.tex = tex; + } public EntityVertical(Vec2d pos, TextureReference tex, Vec2d size) { super(pos); @@ -37,4 +46,13 @@ public class EntityVertical extends Entity this.render(pos, camera, tex, size); GlHelpers.color4(1, 1, 1, 1); } + + @Override + public TextureReference getTexture() { + return tex; + } + + public void killWithParticles() { + ParticleBreak.spawnParticles(chunk, pos, this); + } } diff --git a/src/projectzombie/entity/EntityZombie.java b/src/projectzombie/entity/EntityZombie.java old mode 100644 new mode 100755 index 26e3844..ccd929f --- a/src/projectzombie/entity/EntityZombie.java +++ b/src/projectzombie/entity/EntityZombie.java @@ -1,27 +1,94 @@ package projectzombie.entity; +import java.util.Random; + +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; import projectzombie.Main; import projectzombie.init.Textures; +import projectzombie.util.gl.texture.TextureReference; +import projectzombie.util.math.astar.AStar; +import projectzombie.util.math.astar.AStarSearcher; import projectzombie.util.math.random.OpenSimplexNoise; import projectzombie.util.math.vec.Vec2d; +import projectzombie.util.math.vec.Vec2i; import projectzombie.world.chunk.Chunk; import projectzombie.world.layer.Layer; -public class EntityZombie extends EntityVertical implements EntityAlive +public class EntityZombie extends EntityVertical implements EntityAlive, EntityKillWithParticles { protected OpenSimplexNoise noise_movement; protected OpenSimplexNoise noise_gun_fire; protected OpenSimplexNoise noise_gun_angle; protected OpenSimplexNoise noise_target_x; protected OpenSimplexNoise noise_target_y; + + protected long seed; + protected double time; protected double health_max = 100; protected double health = health_max; protected int gun_interval = 0; protected int gun_level = 0; + + private Vec2i walk_direction; + private int walk_scan_cooldown = 0; + private boolean can_see_player = false; + private int walking_for = 0; + private static final Vec2d size = new Vec2d(1, 1); + + public EntityZombie(BdfObject bdf) { + super(bdf, Textures.ENTITY_ZOMBIE_F, size); + + // Set some settings + hitbox = 0.5; + isSolid = true; + goThroughSolid = false; + crossUnWalkable = false; + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + super.BdfClassLoad(bdf); + + BdfNamedList nl = bdf.getNamedList(); + health_max = nl.get("max_health").getDouble(); + health = nl.get("health").getDouble(); + gun_interval = nl.get("gun_interval").getInteger(); + gun_level = nl.get("gun_level").getInteger(); + seed = nl.get("seed").getLong(); + + + Random rand = new Random(seed); + + noise_movement = new OpenSimplexNoise(rand.nextLong()); + noise_gun_fire = new OpenSimplexNoise(rand.nextLong()); + noise_gun_angle = new OpenSimplexNoise(rand.nextLong()); + noise_target_x = new OpenSimplexNoise(rand.nextLong()); + noise_target_y = new OpenSimplexNoise(rand.nextLong()); + } + + @Override + public void BdfClassSave(BdfObject bdf) { + super.BdfClassSave(bdf); + + BdfNamedList nl = bdf.getNamedList(); + nl.set("max_health", BdfObject.withDouble(health_max)); + nl.set("health", BdfObject.withDouble(health)); + nl.set("gun_interval", BdfObject.withInteger(gun_interval)); + nl.set("gun_level", BdfObject.withInteger(gun_level)); + nl.set("seed", BdfObject.withLong(seed)); + + + } + public EntityZombie(Vec2d pos) { - super(pos, Textures.ENTITY_ZOMBIE, new Vec2d(1, 1)); + super(pos, Textures.ENTITY_ZOMBIE_F, size); + + seed = rand.nextLong(); + Random rand = new Random(seed); + noise_movement = new OpenSimplexNoise(rand.nextLong()); noise_gun_fire = new OpenSimplexNoise(rand.nextLong()); noise_gun_angle = new OpenSimplexNoise(rand.nextLong()); @@ -40,21 +107,48 @@ public class EntityZombie extends EntityVertical implements EntityAlive public void tick(Chunk chunk, Layer layer) { super.tick(chunk, layer); - // Get the player targeted area - Vec2d target = new Vec2d( - Main.player.pos.x + noise_target_x.eval(time*5, Main.player.pos.x/10, Main.player.pos.y/10)*10, - Main.player.pos.y + noise_target_y.eval(time*5, Main.player.pos.x/10, Main.player.pos.y/10)*10); + //System.out.println(walk_direction != null ? (walk_direction.x + ", " + walk_direction.y + ": " + pos.toInt().x + ", " + pos.toInt().y) : "null"); - // Get the angle between the player and the zombie - double angle_walk = Math.atan2(pos.x - target.x, pos.y - target.y); - double angle_fire = Math.atan2(pos.x - Main.player.pos.x, pos.y - Main.player.pos.y); + if(walk_direction == null) { + walk_scan_cooldown -= 1; + } - // Move forward towards the player - this.angle = Math.toDegrees(angle_walk) + 180; - this.moveForward(); - - if(noise_gun_fire.eval(time, 0) > 0 && !Main.player.dead && !Main.player.in_animation) + if( + (walk_direction != null && pos.toInt().equal(walk_direction) && + pos.squareDistance(Main.player.pos) > 2) || + walk_scan_cooldown < 1 || walking_for > 200) { + AStar astar = new AStar(pos.toInt(), 16, new AStarSearcher(layer, crossUnWalkable)); + Vec2i path[] = astar.getPath(Main.player.pos.toInt()); + + walk_scan_cooldown = 100; + walking_for = 0; + + if(path != null && path.length > 1) { + walk_direction = path[1]; + } else { + walk_direction = Main.player.pos.toInt(); + } + + can_see_player = (path != null); + } + + // Walk towards the player + if(walk_direction != null) + { + double angle = Math.toDegrees(Math.atan2( + walk_direction.x - (this.pos.x - 0.5) + noise_target_x.eval(time, pos.x/10, pos.y/10), + walk_direction.y - (this.pos.y - 0.5) + noise_target_y.eval(time, pos.x/10, pos.y/10))); + this.moveTowards(angle); + + walking_for += 1; + } + + if(can_see_player && noise_gun_fire.eval(time, 0) > 0 && !Main.player.dead && !Main.player.in_animation) + { + // Get the angle between the player and the zombie + double angle_fire = Math.atan2(pos.x - Main.player.pos.x, pos.y - Main.player.pos.y); + gun_interval += 1; gun_interval %= 10; @@ -66,8 +160,7 @@ public class EntityZombie extends EntityVertical implements EntityAlive // Fire the gun int d = (int)(1 + gun_level / 5.0); - int b = (int)(1 - gun_level / 5.0); - layer.spawnEntity(new EntityBullet(pos.copy(), this, angle_gun, 20*d*d, 5*b*b, 60)); + layer.spawnEntity(new EntityBullet(pos.copy(), this, angle_gun, 20*d*d, 60)); } } @@ -76,13 +169,16 @@ public class EntityZombie extends EntityVertical implements EntityAlive } @Override - public void moveForward() { - this.moveForward(0.06); + public TextureReference getTexture() { + return Textures.ENTITY_ZOMBIE_F; } - @Override - public void moveBackward() { - super.moveBackward(0.06); + public void moveInVector(Vec2d vec) { + super.moveInVector(vec, 0.06); + } + + public void moveTowards(double angle) { + super.moveTowards(angle, 0.06); } @Override diff --git a/src/projectzombie/entity/EntityZombieArmored.java b/src/projectzombie/entity/EntityZombieArmored.java old mode 100644 new mode 100755 index 66b4923..e339e93 --- a/src/projectzombie/entity/EntityZombieArmored.java +++ b/src/projectzombie/entity/EntityZombieArmored.java @@ -1,5 +1,6 @@ package projectzombie.entity; +import bdf.types.BdfObject; import projectzombie.display.Camera; import projectzombie.init.Textures; import projectzombie.util.gl.texture.TextureReference; @@ -7,7 +8,9 @@ import projectzombie.util.math.vec.Vec2d; public class EntityZombieArmored extends EntityZombie { - + public EntityZombieArmored(BdfObject bdf) { + super(bdf); + } public EntityZombieArmored(Vec2d pos) { super(pos); @@ -20,7 +23,7 @@ public class EntityZombieArmored extends EntityZombie @Override public void render(Vec2d pos, Camera camera, TextureReference tex, Vec2d size) { - super.render(pos, camera, Textures.ENTITY_ZOMBIE_ARMORED, new Vec2d(1, 1)); + super.render(pos, camera, Textures.ENTITY_ZOMBIE_F_ARMORED, size); } @Override diff --git a/src/projectzombie/entity/particle/ParticleBlood.java b/src/projectzombie/entity/particle/ParticleBlood.java old mode 100644 new mode 100755 index 0ff3edb..2100890 --- a/src/projectzombie/entity/particle/ParticleBlood.java +++ b/src/projectzombie/entity/particle/ParticleBlood.java @@ -4,6 +4,7 @@ import java.util.Random; import projectzombie.display.Camera; import projectzombie.entity.EntityParticle; +import projectzombie.settings.SettingQuality; import projectzombie.util.gl.GlHelpers; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.random.RandomHelpers; @@ -19,17 +20,18 @@ public class ParticleBlood extends EntityParticle private double time = 1000; private double height = 0; private Vec3d velocity; - private double angle_height; public ParticleBlood(Random rand, Vec2d pos, double angle) { super(pos, rand.nextDouble() / 5, 0); - this.angle = angle + RandomHelpers.randrange(rand, -100, 100); - this.angle_height = RandomHelpers.randrange(rand, 9000, 18000) / 100; + angle += RandomHelpers.randrange(rand, -100, 100); + double angle_height = RandomHelpers.randrange(rand, 9000, 18000) / 100; this.height = rand.nextDouble(); r_color = RandomHelpers.randrange(rand, 200, 800) / 1000.0; velocity = MathHelpers.moveTowards3(0.1, - new Vec2d(Math.toRadians(this.angle), Math.toRadians(angle_height))); + new Vec2d(Math.toRadians(angle), Math.toRadians(angle_height))); + + time = RandomHelpers.randrange(rand, 800, 1200); } @Override @@ -55,6 +57,10 @@ public class ParticleBlood extends EntityParticle // Should this particle too old; destroy it if(time < 0) chunk.killEntity(this); + + if(MODE == SettingQuality.OFF) { + kill(); + } } @Override diff --git a/src/projectzombie/entity/particle/ParticleBreak.java b/src/projectzombie/entity/particle/ParticleBreak.java old mode 100644 new mode 100755 index 840c755..c9762e7 --- a/src/projectzombie/entity/particle/ParticleBreak.java +++ b/src/projectzombie/entity/particle/ParticleBreak.java @@ -2,8 +2,13 @@ package projectzombie.entity.particle; import projectzombie.Main; import projectzombie.display.Camera; +import projectzombie.entity.Entity; +import projectzombie.entity.EntityParticle; import projectzombie.entity.EntityVertical; +import projectzombie.settings.SettingQuality; +import projectzombie.tiles.TileVertical; import projectzombie.util.gl.GlHelpers; +import projectzombie.util.gl.texture.AnimationReference; import projectzombie.util.gl.texture.IHasTexture; import projectzombie.util.gl.texture.TextureReference; import projectzombie.util.math.MathHelpers; @@ -19,13 +24,73 @@ public class ParticleBreak extends EntityVertical { private double height = 0; private Vec3d velocity; - private int time = 1000; + private int time = 0; + private boolean landed = false; + + public static void spawnParticles(Chunk chunk, Vec2d pos, Entity e) + { + if(EntityParticle.MODE == SettingQuality.OFF) { + return; + } + + int height = 1; + + if(e instanceof EntityVertical) { + height = MathHelpers.floor(((EntityVertical)e).size.y); + } + + for(int i=0;i<50 * height;i++) { + chunk.spawnEntity(new ParticleBreak(pos.copy(), e)); + } + } + + public static void spawnParticles(Chunk chunk, Vec2d pos, TileState s) + { + if(EntityParticle.MODE == SettingQuality.OFF) { + return; + } + + int height = 1; + + if(s.tile instanceof TileVertical) { + height = MathHelpers.floor(((TileVertical)s.tile).size.y); + } + + for(int i=0;i<50 * height;i++) { + chunk.spawnEntity(new ParticleBreak(pos.copy(), s)); + } + } private static TextureReference getTexture(TileState ts) { if(ts.tile instanceof IHasTexture) { TextureReference tex = ((IHasTexture)ts.tile).getTexture(); + + if(tex instanceof AnimationReference) { + tex = ((AnimationReference)tex).c; + } + + int px = RandomHelpers.randrange(rand, tex.start_x, tex.end_x - 2); + int py = RandomHelpers.randrange(rand, tex.start_y, tex.end_y - 2); + return tex.getTextureReference(px, px + 2, py, py + 2); + } + + else { + return TextureReference.EMPTY; + } + } + + private static TextureReference getTexture(Entity entity) + { + if(entity instanceof IHasTexture) + { + TextureReference tex = ((IHasTexture)entity).getTexture(); + + if(tex instanceof AnimationReference) { + tex = ((AnimationReference)tex).c; + } + int px = RandomHelpers.randrange(rand, tex.start_x, tex.end_x - 2); int py = RandomHelpers.randrange(rand, tex.start_y, tex.end_y - 2); return tex.getTextureReference(px, px + 2, py, py + 2); @@ -37,14 +102,51 @@ public class ParticleBreak extends EntityVertical } public ParticleBreak(Vec2d pos, TileState ts) { - super(pos, getTexture(ts), new Vec2d(1/4.0, 1/4.0)); - this.opaqueTile = ts.tile.opaqueTile; - this.angle = RandomHelpers.randrange(rand, 360); + super(pos, getTexture(ts), new Vec2d(1/8.0, 1/8.0)); + double angle = RandomHelpers.randrange(rand, 360); + + if(EntityParticle.MODE == SettingQuality.FANCY) { + this.opaqueTile = ts.tile.opaqueTile; + } else { + this.opaqueTile = false; + } + + if(ts.tile instanceof TileVertical) { + TileVertical ts_v = (TileVertical) ts.tile; + + height = RandomHelpers.randrange(rand, 0, MathHelpers.floor(ts_v.size.y)); + } Vec2d side_v = MathHelpers.moveTowards2(0.01, Math.toRadians(angle)); velocity = new Vec3d( side_v.x, side_v.y, RandomHelpers.randrange(rand, 10000) / 200000.0); + + time = RandomHelpers.randrange(rand, 800, 1200); + } + + public ParticleBreak(Vec2d pos, Entity entity) { + super(pos, getTexture(entity), new Vec2d(1/8.0, 1/8.0)); + double angle = RandomHelpers.randrange(rand, 360); + + if(EntityParticle.MODE == SettingQuality.FANCY) { + this.opaqueTile = entity.opaqueTile; + } else { + this.opaqueTile = false; + } + + if(entity instanceof EntityVertical) { + EntityVertical entity_v = (EntityVertical) entity; + + height = RandomHelpers.randrange(rand, 0, MathHelpers.floor(entity_v.size.y)); + } + + Vec2d side_v = MathHelpers.moveTowards2(0.01, Math.toRadians(angle)); + velocity = new Vec3d( + side_v.x, side_v.y, + RandomHelpers.randrange(rand, 10000) / 200000.0); + + time = RandomHelpers.randrange(rand, 500, 1500); } @Override @@ -58,10 +160,18 @@ public class ParticleBreak extends EntityVertical time -= 1; - height += velocity.z; - velocity.z -= MathHelpers.FallSpeed; + if(!landed) { + height += velocity.z; + velocity.z -= MathHelpers.FallSpeed; + } - if(height < -1) { + if(height < 0) { + height = 0; + velocity = velocity.multiply(0); + landed = true; + } + + if(time < 0) { kill(); } @@ -69,6 +179,10 @@ public class ParticleBreak extends EntityVertical pos.x += velocity.x; pos.y += velocity.y; } + + if(EntityParticle.MODE == SettingQuality.OFF) { + kill(); + } } @Override diff --git a/src/projectzombie/entity/particle/ParticleLava.java b/src/projectzombie/entity/particle/ParticleLava.java old mode 100644 new mode 100755 index 9c5159f..7ee2126 --- a/src/projectzombie/entity/particle/ParticleLava.java +++ b/src/projectzombie/entity/particle/ParticleLava.java @@ -4,6 +4,7 @@ import java.util.Random; import projectzombie.display.Camera; import projectzombie.entity.EntityParticle; +import projectzombie.settings.SettingQuality; import projectzombie.util.gl.GlHelpers; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.random.RandomHelpers; @@ -40,6 +41,10 @@ public class ParticleLava extends EntityParticle if(height < -1) { kill(); } + + if(MODE == SettingQuality.OFF) { + kill(); + } } @Override diff --git a/src/projectzombie/entity/particle/ParticleSmoke.java b/src/projectzombie/entity/particle/ParticleSmoke.java old mode 100644 new mode 100755 index c830bf7..1faa4da --- a/src/projectzombie/entity/particle/ParticleSmoke.java +++ b/src/projectzombie/entity/particle/ParticleSmoke.java @@ -2,8 +2,10 @@ package projectzombie.entity.particle; import projectzombie.Main; import projectzombie.display.Camera; +import projectzombie.entity.EntityParticle; import projectzombie.entity.EntityVertical; import projectzombie.init.Textures; +import projectzombie.settings.SettingQuality; import projectzombie.util.gl.GlHelpers; import projectzombie.util.math.random.RandomHelpers; import projectzombie.util.math.vec.Vec2d; @@ -48,6 +50,10 @@ public class ParticleSmoke extends EntityVertical height += height_speed; opacity -= disappear_speed; + + if(EntityParticle.MODE == SettingQuality.OFF) { + kill(); + } } } diff --git a/src/projectzombie/entity/particle/ParticleSpark.java b/src/projectzombie/entity/particle/ParticleSpark.java old mode 100644 new mode 100755 index 08e0ea3..993d541 --- a/src/projectzombie/entity/particle/ParticleSpark.java +++ b/src/projectzombie/entity/particle/ParticleSpark.java @@ -2,6 +2,7 @@ package projectzombie.entity.particle; import projectzombie.display.Camera; import projectzombie.entity.EntityParticle; +import projectzombie.settings.SettingQuality; import projectzombie.util.gl.GlHelpers; import projectzombie.util.math.vec.Vec2d; import projectzombie.world.chunk.Chunk; @@ -30,6 +31,10 @@ public class ParticleSpark extends EntityParticle // Destroy this particle kill(); } + + if(MODE == SettingQuality.OFF) { + kill(); + } } @Override diff --git a/src/projectzombie/entity/particle/ParticleWater.java b/src/projectzombie/entity/particle/ParticleWater.java old mode 100644 new mode 100755 index cf119c6..04054a8 --- a/src/projectzombie/entity/particle/ParticleWater.java +++ b/src/projectzombie/entity/particle/ParticleWater.java @@ -2,6 +2,7 @@ package projectzombie.entity.particle; import projectzombie.display.Camera; import projectzombie.entity.EntityParticle; +import projectzombie.settings.SettingQuality; import projectzombie.util.gl.GlHelpers; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.random.RandomHelpers; @@ -20,7 +21,7 @@ public class ParticleWater extends EntityParticle super(pos, rand.nextDouble()/5, 0); // Set the velocity - velocity = MathHelpers.moveTowards3(0.1, new Vec2d(Math.toRadians( + velocity = MathHelpers.moveTowards3(0.05, new Vec2d(Math.toRadians( RandomHelpers.randrange(rand, 360)), Math.toRadians(RandomHelpers.randrange(rand, 0, 45)))); } @@ -38,6 +39,10 @@ public class ParticleWater extends EntityParticle if(height < 0) { kill(); } + + if(MODE == SettingQuality.OFF) { + kill(); + } } @Override @@ -46,9 +51,9 @@ public class ParticleWater extends EntityParticle GlHelpers.translate3(0, 0, height); Vec3d light = chunk.getRGBLightLevel(new Vec2i( MathHelpers.floor(pos.x), MathHelpers.floor(pos.y))); - GlHelpers.color4(0, 0, light.z, 0.4); + GlHelpers.color3(light.x * 0.2, light.y * 0.2, light.z * 0.6); super.render(pos, camera); - GlHelpers.color4(1, 1, 1, 1); + GlHelpers.color3(1, 1, 1); GlHelpers.popMatrix(); } diff --git a/src/projectzombie/entity/player/EntityPlayer.java b/src/projectzombie/entity/player/EntityPlayer.java old mode 100644 new mode 100755 index 62b9585..bb8e417 --- a/src/projectzombie/entity/player/EntityPlayer.java +++ b/src/projectzombie/entity/player/EntityPlayer.java @@ -1,15 +1,22 @@ package projectzombie.entity.player; +import java.io.FileOutputStream; +import java.util.zip.DeflaterOutputStream; + +import bdf.types.BdfIndent; +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; import mainloop.task.IMainloopTask; import projectzombie.Main; import projectzombie.display.Camera; -import projectzombie.entity.Entity; import projectzombie.entity.EntityAlive; import projectzombie.entity.EntityBullet; import projectzombie.entity.EntityHeight; import projectzombie.entity.EntityInventory; import projectzombie.entity.EntityItem; import projectzombie.entity.EntityVertical; +import projectzombie.entity.particle.ParticleBreak; +import projectzombie.init.Items; import projectzombie.init.Textures; import projectzombie.inventory.Inventory; import projectzombie.menu.MenuDeath; @@ -20,7 +27,10 @@ import projectzombie.util.math.ItemStack; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.vec.Vec2d; import projectzombie.util.math.vec.Vec2i; +import projectzombie.util.math.vec.Vec3d; +import projectzombie.world.World; import projectzombie.world.chunk.Chunk; +import projectzombie.world.chunk.ChunkEventHandler; import projectzombie.world.layer.Layer; public class EntityPlayer extends EntityVertical implements EntityAlive, EntityInventory, EntityHeight @@ -32,6 +42,9 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI public boolean GUN = false; public boolean moving = false; + public TextureReference PLAYER_MOVING = Textures.ENTITY_PLAYER_B_W_MOVING; + public TextureReference PLAYER_STILL = Textures.ENTITY_PLAYER_B_W_STILL; + public double height = 0; private int bullet_frequency = 0; @@ -48,8 +61,45 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI public int defence_level = 0; public int gun_level = 0; + public double angle; + public double speed; + private static final Vec2d size = new Vec2d(1, 1); + public EntityPlayer(BdfObject bdf) { + super(bdf, TextureReference.EMPTY, size); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + super.BdfClassLoad(bdf); + BdfNamedList nl = bdf.getNamedList(); + height = nl.get("height").getDouble(); + bullet_frequency = nl.get("bullet_frequency").getInteger(); + health = nl.get("health").getDouble(); + dead = nl.get("dead").getBoolean(); + inventory = new Inventory(nl.get("inventory")); + ammo = nl.get("ammo").getInteger(); + defence_level = nl.get("defence_level").getInteger(); + gun_level = nl.get("gun_level").getInteger(); + angle = nl.get("angle").getDouble(); + } + + @Override + public void BdfClassSave(BdfObject bdf) { + super.BdfClassSave(bdf); + BdfNamedList nl = bdf.getNamedList(); + nl.set("height", BdfObject.withDouble(height)); + nl.set("bullet_frequency", BdfObject.withInteger(bullet_frequency)); + nl.set("health", BdfObject.withDouble(health)); + nl.set("dead", BdfObject.withBoolean(dead)); + inventory.BdfClassSave(nl.get("inventory")); + nl.set("ammo", BdfObject.withInteger(ammo)); + nl.set("defence_level", BdfObject.withInteger(defence_level)); + nl.set("gun_level", BdfObject.withInteger(gun_level)); + nl.set("angle", BdfObject.withDouble(angle)); + } + public EntityPlayer() { super(new Vec2d(0, 0), TextureReference.EMPTY, size); @@ -61,24 +111,48 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI goThroughSolid = false; crossUnWalkable = false; emitsLight = true; + speed = 0.1; // Create the inventory inventory = new Inventory(6); + + inventory.setItem(new ItemStack(Items.LANTERN, 99, (byte)0), 2); + inventory.setItem(new ItemStack(Items.SPAWN_ZOMBIE, 99, (byte)0), 3); } @Override - public double getLightLevel() { - return 1; + public double getLightLevel() + { + if(Main.menu.playerEmitsLight) { + return getLightWithHeight(1); + } + + ItemStack item = inventory.getItem(inventory_hand); + + if(!item.isEmpty()) { + return getLightWithHeight(item.item.getLightLevel()); + } + + return 0; + } + + @Override + public TextureReference getTexture() { + return PLAYER_STILL; } @Override public void tick(Chunk chunk, Layer layer) { + chunk = layer.getChunk(pos); + if(dead) return; // Handle player deaths if(health <= 0) { + ParticleBreak.spawnParticles(chunk, pos, this); + if(Cheats.god_mode) { this.resetHealth(); } @@ -105,6 +179,8 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI } }); } + + return; } // Is the player dead or in an animation @@ -116,23 +192,23 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI // Rotate left if(MOVE_LEFT) { this.angle -= 1; - this.angle = MathHelpers.mod(this.angle, 360); } // Rotate right if(MOVE_RIGHT) { this.angle += 1; - this.angle = MathHelpers.mod(this.angle, 360); } + this.angle = MathHelpers.mod(this.angle, 360); + // Move forward if(MOVE_FORWARD) { - this.moveForward(); + this.moveTowards(this.angle); } // Move backward if(MOVE_BACKWARD) { - this.moveBackward(); + this.moveTowards(this.angle + 180); } // Use the gun @@ -145,9 +221,13 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI public void kill() { // Is god mode inactive; kill the player - if(!Cheats.god_mode) { - dead = true; + if(Cheats.god_mode) { + return; } + + ParticleBreak.spawnParticles(chunk, pos, this); + + dead = true; } @Override @@ -156,14 +236,8 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI super.moveTowards(angle, speed); } - @Override - public void moveForward() { - this.moveForward(0.08); - } - - @Override - public void moveBackward(double speed) { - super.moveBackward(0.08); + public void moveTowards(double angle) { + this.moveTowards(angle, 0.08); } @Override @@ -172,21 +246,26 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI // Don't render if the player is dead if(dead) return; + // Don't render if the chunk isnt loaded + if(!ChunkEventHandler.loaded) { + return; + } + // Translation GlHelpers.pushMatrix(); GlHelpers.translate3(0, 0, height); // Set the colour due to the lighting - double light = chunk.getDynamicLightLevel(new Vec2i( + Vec3d light = chunk.getRGBLightLevel(new Vec2i( MathHelpers.floor(pos.x), MathHelpers.floor(pos.y))); - GlHelpers.color3(light, light, light); + GlHelpers.color3(light.x, light.y, light.z); // Moving if(MOVE_BACKWARD || MOVE_FORWARD || moving) - super.render(pos, camera, Textures.ENTITY_PLAYER_MOVING, size); + super.render(pos, camera, PLAYER_MOVING, size); // Standing still - else super.render(pos, camera, Textures.ENTITY_PLAYER_STILL, size); + else super.render(pos, camera, PLAYER_STILL, size); // Pop the matrix GlHelpers.popMatrix(); @@ -207,9 +286,8 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI // Summon bullets at this angle relative to the player int d = (int)(1 + gun_level / 4.0); - int b = (int)(1 + gun_level / 4.0); Main.world.getLayer().spawnEntity(new EntityBullet(pos.copy(), this, angle + this.angle, - 20*d*d, 5/b, 60).withHeight(0, height)); + 20*d*d, 60).withHeight(0, height)); } } @@ -219,7 +297,7 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI ItemStack is = inventory.getItem(inventory_hand); if(!is.isEmpty()) { - is.item.onAction(is, Main.world.getLayer(), chunk, this); + is.item.onPlayerAction(is, Main.world.getLayer(), chunk, this); } } @@ -271,7 +349,7 @@ public class EntityPlayer extends EntityVertical implements EntityAlive, EntityI if(!i.isEmpty()) { - Entity e = new EntityItem(pos.copy(), new ItemStack(i.item, 1, i.meta)); + EntityItem e = new EntityItem(pos.copy(), new ItemStack(i.item, 1, i.meta)); e.angle = angle; Main.world.getLayer().spawnEntity(e); i.count -= 1; diff --git a/src/projectzombie/init/Entities.java b/src/projectzombie/init/Entities.java old mode 100644 new mode 100755 index 3d1ef97..d5b9223 --- a/src/projectzombie/init/Entities.java +++ b/src/projectzombie/init/Entities.java @@ -2,9 +2,48 @@ package projectzombie.init; import java.util.ArrayList; +import bdf.types.BdfObject; import projectzombie.entity.Entity; +import projectzombie.entity.EntityBoss; +import projectzombie.entity.EntityBullet; +import projectzombie.entity.EntityDummy; +import projectzombie.entity.EntityExplosion; +import projectzombie.entity.EntityFlare; +import projectzombie.entity.EntityGrapplingHook; +import projectzombie.entity.EntityItem; +import projectzombie.entity.EntityTnt; +import projectzombie.entity.EntityZombie; +import projectzombie.entity.EntityZombieArmored; +import projectzombie.entity.player.EntityPlayer; public class Entities { - public static final ArrayList entities = new ArrayList(); + public static final ArrayList> entities = new ArrayList<>(); + + private static void register(Class e) + { + try { + e.getConstructor(BdfObject.class); + } catch (NoSuchMethodException | SecurityException err) { + err.printStackTrace(); + System.exit(1); + } + + entities.add(e); + } + + public static void init() + { + register(EntityZombie.class); + register(EntityZombieArmored.class); + register(EntityTnt.class); + register(EntityItem.class); + register(EntityGrapplingHook.class); + register(EntityFlare.class); + register(EntityExplosion.class); + register(EntityDummy.class); + register(EntityBullet.class); + register(EntityBoss.class); + register(EntityPlayer.class); + } } diff --git a/src/projectzombie/init/Items.java b/src/projectzombie/init/Items.java old mode 100644 new mode 100755 index 6c6e324..51b7570 --- a/src/projectzombie/init/Items.java +++ b/src/projectzombie/init/Items.java @@ -1,5 +1,7 @@ package projectzombie.init; +import java.util.ArrayList; + import projectzombie.items.Item; import projectzombie.items.ItemAmmo; import projectzombie.items.ItemDefenceUpgrade; @@ -9,17 +11,49 @@ import projectzombie.items.ItemGrapplingHook; import projectzombie.items.ItemGunUpgrade; import projectzombie.items.ItemHealthPotion; import projectzombie.items.ItemLantern; +import projectzombie.items.ItemRock; import projectzombie.items.ItemTnt; +import projectzombie.items.spawner.ItemSpawnZombie; public class Items { - public static final Item AMMO = new ItemAmmo("ammo"); - public static final Item DEFENCE_UPGRADE = new ItemDefenceUpgrade("defence_upgrade"); - public static final Item GUN_UPGRADE = new ItemGunUpgrade("gun_upgrade"); - public static final Item HEALTH_POTION = new ItemHealthPotion("health_potion"); - public static final Item EMPTY = new ItemEmpty("empty"); - public static final Item TNT = new ItemTnt("tnt"); - public static final Item LANTERN = new ItemLantern("lantern"); - public static final Item FLARE = new ItemFlare("flare"); - public static final Item GRAPPLING_HOOK = new ItemGrapplingHook("grappling_hook"); + public static ArrayList items = new ArrayList(); + + private static void register(Item item) { + item.id = items.size(); + items.add(item); + } + + public static void init() + { + register(EMPTY); + + register(AMMO); + register(DEFENCE_UPGRADE); + register(GUN_UPGRADE); + register(HEALTH_POTION); + register(TNT); + register(LANTERN); + register(FLARE); + register(GRAPPLING_HOOK); + + register(SPAWN_ZOMBIE); + register(ROCK); + + register(AMMO); + } + + public static final Item AMMO = new ItemAmmo(); + public static final Item DEFENCE_UPGRADE = new ItemDefenceUpgrade(); + public static final Item GUN_UPGRADE = new ItemGunUpgrade(); + public static final Item HEALTH_POTION = new ItemHealthPotion(); + public static final Item EMPTY = new ItemEmpty(); + public static final Item TNT = new ItemTnt(); + public static final Item LANTERN = new ItemLantern(); + public static final Item FLARE = new ItemFlare(); + public static final Item GRAPPLING_HOOK = new ItemGrapplingHook(); + + public static final Item SPAWN_ZOMBIE = new ItemSpawnZombie(); + + public static final Item ROCK = new ItemRock(); } diff --git a/src/projectzombie/init/LayerGenerators.java b/src/projectzombie/init/LayerGenerators.java new file mode 100755 index 0000000..7c74c50 --- /dev/null +++ b/src/projectzombie/init/LayerGenerators.java @@ -0,0 +1,46 @@ +package projectzombie.init; + +import java.util.ArrayList; + +import projectzombie.world.layer.layergen.LayerGen; +import projectzombie.world.layer.layergen.LayerGenBossArena; +import projectzombie.world.layer.layergen.LayerGenCaves; +import projectzombie.world.layer.layergen.LayerGenEarth; +import projectzombie.world.layer.layergen.LayerGenLavaCaves; + +public class LayerGenerators +{ + private static final ArrayList lgens = new ArrayList(); + + private static void register(LayerGen lg) { + lg.id = lgens.size(); + lgens.add(lg); + } + + public static void init() + { + register(EARTH); + register(CAVES); + register(LAVA_CAVES); + register(BOSS_ARENA); + } + + public static LayerGen loadFromID(int id) { + return lgens.get(id); + } + + public static int getLGID(LayerGen lg) { + for(int i=0;i id_layers = new ArrayList(); - public static void init(long seed) { // Create all the layers - EARTH = new Layer(new Random(seed), new LayerGenEarth(), 0); - CAVES = new Layer(new Random(seed), new LayerGenCaves(), 1); - LAVA_CAVES = new Layer(new Random(seed), new LayerGenLavaCaves(), 2); - - // Setup all the id-able layers - id_layers = new ArrayList(); - id_layers.add(EARTH); - id_layers.add(CAVES); - id_layers.add(LAVA_CAVES); + EARTH = new Layer(new Random(seed), LayerGenerators.EARTH); + CAVES = new Layer(new Random(seed), LayerGenerators.CAVES); + LAVA_CAVES = new Layer(new Random(seed), LayerGenerators.LAVA_CAVES); // Create the world and set the earth as the default layer Main.world = new World(); - Main.world.setLayer(EARTH); - } - - public static Layer getLayer(int id) { - return id_layers.get(id); + Main.world.addLayer(EARTH); + Main.world.addLayer(CAVES); + Main.world.addLayer(LAVA_CAVES); + Main.world.setLayer(0); } public static Layer EARTH; diff --git a/src/projectzombie/init/Resources.java b/src/projectzombie/init/Resources.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/init/Sounds.java b/src/projectzombie/init/Sounds.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/init/Textures.java b/src/projectzombie/init/Textures.java old mode 100644 new mode 100755 index 2c406d4..c167a39 --- a/src/projectzombie/init/Textures.java +++ b/src/projectzombie/init/Textures.java @@ -97,37 +97,70 @@ public class Textures public static final TextureReference ITEM_GUN_UPGRADE = texmap.getTextureReference(0, 1, 4, 5); public static final TextureReference ITEM_DEFENCE_UPGRADE = texmap.getTextureReference(1, 2, 4, 5); - // Fire - public static final TextureReference TILE_FIRE_0 = texmap.getTextureReference(0, 1, 1, 2); - public static final TextureReference TILE_FIRE_1 = texmap.getTextureReference(1, 2, 1, 2); - public static final TextureReference TILE_FIRE_2 = texmap.getTextureReference(2, 3, 1, 2); - public static final TextureReference TILE_FIRE_3 = texmap.getTextureReference(3, 4, 1, 2); - public static final TextureReference TILE_FIRE = new AnimationReference( - 8, TILE_FIRE_0, TILE_FIRE_1, TILE_FIRE_2, TILE_FIRE_3); + public static final TextureReference ITEM_ROCK = texmap.getTextureReference(0, 1, 3, 4); - // Player - public static final TextureReference ENTITY_PLAYER_STILL = texmap.getTextureReference(0, 1, 2, 3); - public static final TextureReference ENTITY_PLAYER_MOVING = new AnimationReference(10, - texmap.getTextureReference(0, 1, 2, 3), - texmap.getTextureReference(1, 2, 2, 3), - texmap.getTextureReference(2, 3, 2, 3), - texmap.getTextureReference(3, 4, 2, 3) + // Player Back White Varient + public static final TextureReference ENTITY_PLAYER_B_W_STILL = texmap.getTextureReference(28, 29, 0, 1); + public static final TextureReference ENTITY_PLAYER_B_W_MOVING = new AnimationReference(10, + texmap.getTextureReference(28, 29, 0, 1), + texmap.getTextureReference(29, 30, 0, 1), + texmap.getTextureReference(30, 31, 0, 1), + texmap.getTextureReference(31, 32, 0, 1) + ); + + // Player Front White Varient + public static final TextureReference ENTITY_PLAYER_F_W_STILL = texmap.getTextureReference(28, 29, 1, 2); + public static final TextureReference ENTITY_PLAYER_F_W_MOVING = new AnimationReference(10, + texmap.getTextureReference(28, 29, 1, 2), + texmap.getTextureReference(29, 30, 1, 2), + texmap.getTextureReference(30, 31, 1, 2), + texmap.getTextureReference(31, 32, 1, 2) + ); + + // Player Back Black Varient + public static final TextureReference ENTITY_PLAYER_B_B_STILL = texmap.getTextureReference(28, 29, 2, 3); + public static final TextureReference ENTITY_PLAYER_B_B_MOVING = new AnimationReference(10, + texmap.getTextureReference(28, 29, 2, 3), + texmap.getTextureReference(29, 30, 2, 3), + texmap.getTextureReference(30, 31, 2, 3), + texmap.getTextureReference(31, 32, 2, 3) + ); + + // Player Front Black Varient + public static final TextureReference ENTITY_PLAYER_F_B_STILL = texmap.getTextureReference(28, 29, 3, 4); + public static final TextureReference ENTITY_PLAYER_F_B_MOVING = new AnimationReference(10, + texmap.getTextureReference(28, 29, 3, 4), + texmap.getTextureReference(29, 30, 3, 4), + texmap.getTextureReference(30, 31, 3, 4), + texmap.getTextureReference(31, 32, 3, 4) ); // Zombie - public static final TextureReference ENTITY_ZOMBIE = new AnimationReference(10, - texmap.getTextureReference(0, 1, 3, 4), - texmap.getTextureReference(1, 2, 3, 4), - texmap.getTextureReference(2, 3, 3, 4), - texmap.getTextureReference(3, 4, 3, 4) + public static final TextureReference ENTITY_ZOMBIE_B = new AnimationReference(10, + texmap.getTextureReference(28, 29, 4, 5), + texmap.getTextureReference(29, 30, 4, 5), + texmap.getTextureReference(30, 31, 4, 5), + texmap.getTextureReference(31, 32, 4, 5) + ); + public static final TextureReference ENTITY_ZOMBIE_F = new AnimationReference(10, + texmap.getTextureReference(28, 29, 5, 6), + texmap.getTextureReference(29, 30, 5, 6), + texmap.getTextureReference(30, 31, 5, 6), + texmap.getTextureReference(31, 32, 5, 6) ); // Zombie Bomber - public static final TextureReference ENTITY_ZOMBIE_ARMORED = new AnimationReference(10, - texmap.getTextureReference(2, 3, 15, 16), - texmap.getTextureReference(3, 4, 15, 16), - texmap.getTextureReference(4, 5, 15, 16), - texmap.getTextureReference(5, 6, 15, 16) + public static final TextureReference ENTITY_ZOMBIE_B_ARMORED = new AnimationReference(10, + texmap.getTextureReference(28, 29, 6, 7), + texmap.getTextureReference(29, 30, 6, 7), + texmap.getTextureReference(30, 31, 6, 7), + texmap.getTextureReference(31, 32, 6, 7) + ); + public static final TextureReference ENTITY_ZOMBIE_F_ARMORED = new AnimationReference(10, + texmap.getTextureReference(28, 29, 7, 8), + texmap.getTextureReference(29, 30, 7, 8), + texmap.getTextureReference(30, 31, 7, 8), + texmap.getTextureReference(31, 32, 7, 8) ); // Water diff --git a/src/projectzombie/init/Tiles.java b/src/projectzombie/init/Tiles.java old mode 100644 new mode 100755 index 408a640..39a76a8 --- a/src/projectzombie/init/Tiles.java +++ b/src/projectzombie/init/Tiles.java @@ -1,10 +1,11 @@ package projectzombie.init; +import java.util.ArrayList; + import projectzombie.tiles.Tile; import projectzombie.tiles.TileBossPortal; import projectzombie.tiles.TileChest; import projectzombie.tiles.TileDirt; -import projectzombie.tiles.TileFire; import projectzombie.tiles.TileGrass; import projectzombie.tiles.TileLadder; import projectzombie.tiles.TileLadderUp; @@ -24,24 +25,59 @@ import projectzombie.tiles.TileWaterFlow; public class Tiles { - public static final Tile GRASS = new TileGrass("grass"); - public static final Tile FIRE = new TileFire("fire"); - public static final Tile SAND = new TileSand("sand"); - public static final Tile STONE = new TileStone("stone"); - public static final Tile DIRT = new TileDirt("dirt"); - public static final Tile TREE = new TileTree("tree"); - public static final Tile VOID = new TileVoid("void"); - public static final Tile ROCK = new TileRock("rock"); - public static final Tile LAVA = new TileLava("lava"); - public static final Tile WATER = new TileWater("water"); - public static final Tile LAVA_FLOW = new TileLavaFlow("lava_flow"); - public static final Tile WATER_FLOW = new TileWaterFlow("water_flow"); - public static final Tile LADDER = new TileLadder("ladder"); - public static final Tile PORTAL_DOWN = new TilePortalDown("portal_down"); - public static final Tile WALL = new TileWall("wall"); - public static final Tile LADDER_UP = new TileLadderUp("ladder_up"); - public static final Tile CHEST = new TileChest("chest"); - public static final Tile LANTERN = new TileLantern("lantern"); - public static final Tile WALL_UNBREAKABLE = new TileWallUnbreakable("wall_unbreakable"); - public static final Tile BOSS_PORTAL = new TileBossPortal("boss_portal"); + public static ArrayList tiles = new ArrayList(); + + private static void register(Tile tile) + { + int id = tiles.size(); + + if(id > Short.MAX_VALUE) { + throw new RuntimeException("Too many tiles registered. Maximum tiles: " + Short.MAX_VALUE); + } + + tile.id = (short)id; + tiles.add(tile); + } + + public static void init() { + register(VOID); + register(GRASS); + register(SAND); + register(STONE); + register(DIRT); + register(TREE); + register(ROCK); + register(LAVA); + register(WATER); + register(LAVA_FLOW); + register(WATER_FLOW); + register(LADDER); + register(PORTAL_DOWN); + register(WALL); + register(LADDER_UP); + register(CHEST); + register(LANTERN); + register(WALL_UNBREAKABLE); + register(BOSS_PORTAL); + } + + public static final Tile GRASS = new TileGrass(); + public static final Tile SAND = new TileSand(); + public static final Tile STONE = new TileStone(); + public static final Tile DIRT = new TileDirt(); + public static final Tile TREE = new TileTree(); + public static final Tile VOID = new TileVoid(); + public static final Tile ROCK = new TileRock(); + public static final Tile LAVA = new TileLava(); + public static final Tile WATER = new TileWater(); + public static final Tile LAVA_FLOW = new TileLavaFlow(); + public static final Tile WATER_FLOW = new TileWaterFlow(); + public static final Tile LADDER = new TileLadder(); + public static final Tile PORTAL_DOWN = new TilePortalDown(); + public static final Tile WALL = new TileWall(); + public static final Tile LADDER_UP = new TileLadderUp(); + public static final Tile CHEST = new TileChest(); + public static final Tile LANTERN = new TileLantern(); + public static final Tile WALL_UNBREAKABLE = new TileWallUnbreakable(); + public static final Tile BOSS_PORTAL = new TileBossPortal(); } diff --git a/src/projectzombie/input/CursorEnterCallback.java b/src/projectzombie/input/CursorEnterCallback.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/input/CursorPosCallback.java b/src/projectzombie/input/CursorPosCallback.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/input/GameInput.java b/src/projectzombie/input/GameInput.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/input/InputMode.java b/src/projectzombie/input/InputMode.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/input/JoystickCallback.java b/src/projectzombie/input/JoystickCallback.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/input/KeyCallback.java b/src/projectzombie/input/KeyCallback.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/input/KeyCharCallback.java b/src/projectzombie/input/KeyCharCallback.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/input/MouseButtonCallback.java b/src/projectzombie/input/MouseButtonCallback.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/input/ScrollWheelCallback.java b/src/projectzombie/input/ScrollWheelCallback.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/input/types/Input.java b/src/projectzombie/input/types/Input.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/input/types/InputGUI.java b/src/projectzombie/input/types/InputGUI.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/input/types/InputGame.java b/src/projectzombie/input/types/InputGame.java old mode 100644 new mode 100755 index 3a7ac5a..074d58b --- a/src/projectzombie/input/types/InputGame.java +++ b/src/projectzombie/input/types/InputGame.java @@ -4,6 +4,7 @@ import projectzombie.Main; import projectzombie.menu.MenuGamePause; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.vec.Vec2d; +import projectzombie.world.chunk.ChunkEventHandler; public class InputGame implements Input { @@ -14,7 +15,9 @@ public class InputGame implements Input if(state) { // Move the player in the left sticks angle - Main.player.moveTowards(angle); + if(ChunkEventHandler.loaded) { + Main.player.moveTowards(angle + Main.player.angle); + } // Set the players moving to true Main.player.moving = true; diff --git a/src/projectzombie/inventory/IInventory.java b/src/projectzombie/inventory/IInventory.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/inventory/Inventory.java b/src/projectzombie/inventory/Inventory.java old mode 100644 new mode 100755 index 6f53f8d..a06a9e3 --- a/src/projectzombie/inventory/Inventory.java +++ b/src/projectzombie/inventory/Inventory.java @@ -1,8 +1,12 @@ package projectzombie.inventory; +import bdf.classes.IBdfClassManager; +import bdf.types.BdfArray; +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; import projectzombie.util.math.ItemStack; -public class Inventory implements IInventory +public class Inventory implements IInventory, IBdfClassManager { protected ItemStack[] items; @@ -43,5 +47,37 @@ public class Inventory implements IInventory items[slot] = ItemStack.EMPTY; return stack; } + + @Override + public void BdfClassLoad(BdfObject bdf) + { + BdfNamedList nl = bdf.getNamedList(); + items = new ItemStack[nl.get("size").getInteger()]; + + BdfArray array = nl.get("items").getArray(); + + for(int i=0;i start + 8) { + if(System.currentTimeMillis() > start + 5) { tasks.remove(0); } } diff --git a/src/projectzombie/mainloop/MainloopIterator.java b/src/projectzombie/mainloop/MainloopIterator.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/Menu.java b/src/projectzombie/menu/Menu.java old mode 100644 new mode 100755 index a3913f6..5f3742e --- a/src/projectzombie/menu/Menu.java +++ b/src/projectzombie/menu/Menu.java @@ -8,6 +8,7 @@ public abstract class Menu public boolean doGameRender; public boolean keepMouse = true; public boolean showIngameGUI = true; + public boolean playerEmitsLight = false; public Input input; public abstract void render(); diff --git a/src/projectzombie/menu/MenuDeath.java b/src/projectzombie/menu/MenuDeath.java old mode 100644 new mode 100755 index bf7bb2e..fbe6dbb --- a/src/projectzombie/menu/MenuDeath.java +++ b/src/projectzombie/menu/MenuDeath.java @@ -1,8 +1,10 @@ package projectzombie.menu; +import projectzombie.Main; import projectzombie.input.types.InputGUI; import projectzombie.menu.gui.ButtonGroup; import projectzombie.menu.gui.GUI; +import projectzombie.menu.gui.components.ButtonBasic; import projectzombie.menu.gui.components.ButtonGroupPause; import projectzombie.menu.gui.components.LabelPause; import projectzombie.menu.gui.components.OverlayBackground; @@ -20,9 +22,14 @@ public class MenuDeath extends Menu this.input = new InputGUI(this.gui); gui.add(new OverlayBackground()); - gui.add(new LabelPause("You Died!")); + gui.add(new LabelPause("You were slain")); ButtonGroup group = new ButtonGroupPause(); + + group.add(new ButtonBasic("Quit", button -> { + Main.menu = new MenuMain(); + })); + gui.setSelected(group.get(0)); gui.add(group); } diff --git a/src/projectzombie/menu/MenuGame.java b/src/projectzombie/menu/MenuGame.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/MenuGamePause.java b/src/projectzombie/menu/MenuGamePause.java old mode 100644 new mode 100755 index 8e30e44..44453c0 --- a/src/projectzombie/menu/MenuGamePause.java +++ b/src/projectzombie/menu/MenuGamePause.java @@ -1,9 +1,16 @@ package projectzombie.menu; +import java.io.FileOutputStream; +import java.util.zip.DeflaterOutputStream; + +import bdf.types.BdfIndent; +import bdf.types.BdfObject; import projectzombie.Main; import projectzombie.input.types.InputGUI; +import projectzombie.menu.gui.Button; import projectzombie.menu.gui.ButtonGroup; import projectzombie.menu.gui.GUI; +import projectzombie.menu.gui.components.ButtonBasic; import projectzombie.menu.gui.components.ButtonGroupPause; import projectzombie.menu.gui.components.GUIBackToMenu; import projectzombie.menu.gui.components.LabelPause; @@ -25,6 +32,11 @@ public class MenuGamePause extends Menu gui.add(new LabelPause("Game Paused")); ButtonGroup group = new ButtonGroupPause(); + + group.add(new ButtonBasic("Save And Exit", button -> { + saveAndQuit(); + })); + gui.setSelected(group.get(0)); gui.add(group); } @@ -33,4 +45,51 @@ public class MenuGamePause extends Menu public void render() { gui.render(); } + + public void saveAndQuit() + { + long now, cur = 0; + + BdfObject bdf = new BdfObject(); + + now = System.currentTimeMillis(); + Main.world.BdfClassSave(bdf); + cur = System.currentTimeMillis(); + System.out.println("Time for BdfClassSave: " + (cur - now)); + now = cur; + + System.out.println("Size on file: " + bdf.serialize().length()); + //System.out.println(bdf.serializeHumanReadable()); + + try { + + /* + + FileOutputStream os = new FileOutputStream("./layer.hbdf"); + os.write(bdf.serializeHumanReadable(new BdfIndent("\t", "\n")).getBytes()); + os.close(); + + cur = System.currentTimeMillis(); + System.out.println("Time for HBDF: " + (cur - now)); + now = cur; + + */ + + FileOutputStream os2 = new FileOutputStream("./layer.bdf"); + DeflaterOutputStream dos = new DeflaterOutputStream(os2); + dos.write(bdf.serialize().getBytes()); + dos.close(); + os2.close(); + + cur = System.currentTimeMillis(); + System.out.println("Time for BDF: " + (cur - now)); + now = cur; + } + + catch(Exception e) { + e.printStackTrace(); + } + + Main.menu = new MenuMain(); + } } diff --git a/src/projectzombie/menu/MenuMain.java b/src/projectzombie/menu/MenuMain.java old mode 100644 new mode 100755 index 048a305..cf48022 --- a/src/projectzombie/menu/MenuMain.java +++ b/src/projectzombie/menu/MenuMain.java @@ -16,6 +16,7 @@ public class MenuMain extends Menu this.doGameRender = true; this.keepMouse = false; this.showIngameGUI = false; + this.playerEmitsLight = true; this.gui = new GUI(); this.input = new InputGUI(gui); diff --git a/src/projectzombie/menu/MenuSettings.java b/src/projectzombie/menu/MenuSettings.java old mode 100644 new mode 100755 index 9558222..baef517 --- a/src/projectzombie/menu/MenuSettings.java +++ b/src/projectzombie/menu/MenuSettings.java @@ -2,6 +2,7 @@ package projectzombie.menu; import projectzombie.Main; import projectzombie.display.DisplayRenderUI; +import projectzombie.entity.EntityParticle; import projectzombie.input.types.InputGUI; import projectzombie.menu.gui.Button; import projectzombie.menu.gui.ButtonGroup; @@ -12,6 +13,7 @@ import projectzombie.menu.gui.components.ButtonBasic; import projectzombie.menu.gui.components.ButtonSetting; import projectzombie.menu.gui.components.GUIBackToMenu; import projectzombie.menu.gui.components.OverlayBackground; +import projectzombie.settings.SettingQuality; import projectzombie.util.math.vec.Vec2d; import projectzombie.world.chunk.Chunk; @@ -20,6 +22,12 @@ public class MenuSettings extends Menu private GUI gui; private Menu menuOld; + private String qualitySettingToString(SettingQuality sq) { + return sq == SettingQuality.OFF ? "Off" : + sq == SettingQuality.FAST ? "Fast" : + sq == SettingQuality.FANCY ? "Fancy" : null; + } + public MenuSettings(Menu menuOld) { this.menuOld = menuOld; @@ -27,6 +35,7 @@ public class MenuSettings extends Menu doGameloop = false; doGameRender = menuOld.doGameRender; showIngameGUI = menuOld.showIngameGUI; + playerEmitsLight = menuOld.playerEmitsLight; keepMouse = false; ButtonGroup group = new ButtonGroup(); @@ -60,6 +69,34 @@ public class MenuSettings extends Menu button.setText("GUI Scale: " + DisplayRenderUI.guiScale); })); + group.add(new ButtonSetting("Particles: " + qualitySettingToString(EntityParticle.MODE), button -> { + + switch(EntityParticle.MODE) { + + case OFF: { + EntityParticle.MODE = SettingQuality.FAST; + break; + } + + case FAST: { + EntityParticle.MODE = SettingQuality.FANCY; + break; + } + + case FANCY: { + EntityParticle.MODE = SettingQuality.OFF; + break; + } + + default: { + break; + } + + } + + button.setText("Particles: " + qualitySettingToString(EntityParticle.MODE)); + })); + /*group.add(new ButtonSetting("Dynamic Lighting: " + (LightingManager.lightingMode == 0 ? "Fast" : "Fancy"), button -> { diff --git a/src/projectzombie/menu/gui/Alignment.java b/src/projectzombie/menu/gui/Alignment.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/Button.java b/src/projectzombie/menu/gui/Button.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/ButtonGroup.java b/src/projectzombie/menu/gui/ButtonGroup.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/GUI.java b/src/projectzombie/menu/gui/GUI.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/GUIComponent.java b/src/projectzombie/menu/gui/GUIComponent.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/GUIContainer.java b/src/projectzombie/menu/gui/GUIContainer.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/GUISelectable.java b/src/projectzombie/menu/gui/GUISelectable.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/GUISelectableDirection.java b/src/projectzombie/menu/gui/GUISelectableDirection.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/Label.java b/src/projectzombie/menu/gui/Label.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/Overlay.java b/src/projectzombie/menu/gui/Overlay.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/components/ButtonBasic.java b/src/projectzombie/menu/gui/components/ButtonBasic.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/components/ButtonCallback.java b/src/projectzombie/menu/gui/components/ButtonCallback.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/components/ButtonGroupPause.java b/src/projectzombie/menu/gui/components/ButtonGroupPause.java old mode 100644 new mode 100755 index 9d62d87..a4385fe --- a/src/projectzombie/menu/gui/components/ButtonGroupPause.java +++ b/src/projectzombie/menu/gui/components/ButtonGroupPause.java @@ -14,10 +14,6 @@ public class ButtonGroupPause extends ButtonGroup Main.menu.input.mousePos(new Vec2d(0, 0)); Main.menu = new MenuSettings(Main.menu); })); - - add(new ButtonBasic("Quit", button -> { - Main.menu = new MenuMain(); - })); setPos(new Vec2d(0, -2)); } diff --git a/src/projectzombie/menu/gui/components/ButtonSetting.java b/src/projectzombie/menu/gui/components/ButtonSetting.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/components/GUIBackToMenu.java b/src/projectzombie/menu/gui/components/GUIBackToMenu.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/components/LabelMain.java b/src/projectzombie/menu/gui/components/LabelMain.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/components/LabelPause.java b/src/projectzombie/menu/gui/components/LabelPause.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/menu/gui/components/OverlayBackground.java b/src/projectzombie/menu/gui/components/OverlayBackground.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/resources/Resource.java b/src/projectzombie/resources/Resource.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/settings/Cheats.java b/src/projectzombie/settings/Cheats.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/settings/Environment.java b/src/projectzombie/settings/Environment.java old mode 100644 new mode 100755 index c34dcf5..e745d03 --- a/src/projectzombie/settings/Environment.java +++ b/src/projectzombie/settings/Environment.java @@ -1,5 +1,7 @@ package projectzombie.settings; +import projectzombie.world.chunk.Chunk; + public class Environment { public static String gdir = "."; @@ -15,6 +17,10 @@ public class Environment gdir = split[1]; } } + + if(arg.startsWith("--show-chunks")) { + Chunk.SHOW_CHUNKS = true; + } } } } diff --git a/src/projectzombie/settings/SettingQuality.java b/src/projectzombie/settings/SettingQuality.java new file mode 100755 index 0000000..2a112c9 --- /dev/null +++ b/src/projectzombie/settings/SettingQuality.java @@ -0,0 +1,5 @@ +package projectzombie.settings; + +public enum SettingQuality { + OFF, FAST, FANCY +} diff --git a/src/projectzombie/settings/Settings.java b/src/projectzombie/settings/Settings.java old mode 100644 new mode 100755 index 5055443..c557b44 --- a/src/projectzombie/settings/Settings.java +++ b/src/projectzombie/settings/Settings.java @@ -7,6 +7,7 @@ import bdf.types.BdfNamedList; import bdf.types.BdfObject; import bdf.types.BdfTypes; import projectzombie.display.DisplayRenderUI; +import projectzombie.entity.EntityParticle; import projectzombie.world.chunk.Chunk; public class Settings implements IBdfClassManager @@ -41,6 +42,23 @@ public class Settings implements IBdfClassManager } else { DisplayRenderUI.guiScale = 2; } + + switch(nl.get("particles").getByte()) { + + case 0: + EntityParticle.MODE = SettingQuality.FANCY; + break; + case 1: + EntityParticle.MODE = SettingQuality.FAST; + break; + case 2: + EntityParticle.MODE = SettingQuality.OFF; + break; + default: + EntityParticle.MODE = SettingQuality.FANCY; + break; + + } } @Override @@ -50,6 +68,10 @@ public class Settings implements IBdfClassManager nl.set("show_fps", BdfObject.withBoolean(DisplayRenderUI.showFPS)); nl.set("show_pos", BdfObject.withBoolean(DisplayRenderUI.showPos)); nl.set("gui_scale", BdfObject.withInteger(DisplayRenderUI.guiScale)); + nl.set("particles", BdfObject.withByte((byte)( + EntityParticle.MODE == SettingQuality.FANCY ? 0 : + EntityParticle.MODE == SettingQuality.FAST ? 1 : + EntityParticle.MODE == SettingQuality.OFF ? 2 : 0))); } public static void init() { diff --git a/src/projectzombie/text/Text.java b/src/projectzombie/text/Text.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/tiles/Tile.java b/src/projectzombie/tiles/Tile.java old mode 100644 new mode 100755 index c4ea391..edeee39 --- a/src/projectzombie/tiles/Tile.java +++ b/src/projectzombie/tiles/Tile.java @@ -12,7 +12,7 @@ import projectzombie.world.layer.Layer; public class Tile implements ITransparentObject { - private String id; + public short id; public boolean opaqueTile = false; public boolean tileSolid = false; public boolean tileWalkable = true; @@ -20,17 +20,9 @@ public class Tile implements ITransparentObject public double slowness = 0; public boolean unbreakable = false; protected double light_dissipation = 1/8.0; - public boolean emitsLight = true; + public boolean emitsLight = false; public boolean passNaturalLight = true; - public Tile(String id) { - this.id = id; - } - - public String getID() { - return this.id; - } - @Override public void render(Vec2d pos, Camera camera, TileState state) { } diff --git a/src/projectzombie/tiles/TileBossPortal.java b/src/projectzombie/tiles/TileBossPortal.java old mode 100644 new mode 100755 index d3135b0..dfa261e --- a/src/projectzombie/tiles/TileBossPortal.java +++ b/src/projectzombie/tiles/TileBossPortal.java @@ -7,6 +7,7 @@ import projectzombie.Main; import projectzombie.entity.Entity; import projectzombie.entity.particle.ParticleBreak; import projectzombie.entity.player.EntityPlayer; +import projectzombie.init.LayerGenerators; import projectzombie.init.Textures; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.TileState; @@ -20,8 +21,8 @@ public class TileBossPortal extends TileVertical { private static Random rand = new Random(); - public TileBossPortal(String id) { - super(id, Textures.TILE_BOSS_PORTAL, new Vec2d(2, 2)); + public TileBossPortal() { + super(Textures.TILE_BOSS_PORTAL, new Vec2d(2, 2)); this.emitsLight = true; this.opaqueTile = true; @@ -46,11 +47,13 @@ public class TileBossPortal extends TileVertical ep.height = 5; // Create the boss arena - LayerGenBossArena layergen = new LayerGenBossArena(); + LayerGenBossArena layergen = (LayerGenBossArena) LayerGenerators.BOSS_ARENA; layergen.spawnPlayer(ep); layer.setFrontTile(TileState.EMPTY, tpos); - layer.spawnEntity(new ParticleBreak(new Vec2d(tpos.x+0.5, tpos.y+0.5), state)); - Main.world.setLayer(new Layer(rand, layergen, rand.nextInt())); + ParticleBreak.spawnParticles(layer.getChunk(tpos), size, state); + + int id = Main.world.addLayer(new Layer(rand, layergen)); + Main.world.setLayer(id); // Do the arena falling animation Main.mainloop.register(new IMainloopTask() diff --git a/src/projectzombie/tiles/TileBulletBreakable.java b/src/projectzombie/tiles/TileBulletBreakable.java new file mode 100755 index 0000000..cf122c8 --- /dev/null +++ b/src/projectzombie/tiles/TileBulletBreakable.java @@ -0,0 +1,6 @@ +package projectzombie.tiles; + +public interface TileBulletBreakable +{ + public int getBulletBreakChance(); +} diff --git a/src/projectzombie/tiles/TileChest.java b/src/projectzombie/tiles/TileChest.java old mode 100644 new mode 100755 index 653a10d..94a9a03 --- a/src/projectzombie/tiles/TileChest.java +++ b/src/projectzombie/tiles/TileChest.java @@ -15,13 +15,13 @@ import projectzombie.util.math.vec.Vec2i; import projectzombie.world.chunk.Chunk; import projectzombie.world.layer.Layer; -public class TileChest extends TileVertical +public class TileChest extends TileVertical implements TileBulletBreakable { public static final short CHEST_CAVES = 1; public static final short CHEST_LAVA_CAVES = 2; - public TileChest(String id) { - super(id, Textures.TILE_CHEST, new Vec2d(1, 1)); + public TileChest() { + super(Textures.TILE_CHEST, new Vec2d(1, 1)); this.tileSolid = true; this.opaqueTile = true; @@ -110,5 +110,10 @@ public class TileChest extends TileVertical layer.breakFrontTile(tpos); } + + @Override + public int getBulletBreakChance() { + return 25; + } } diff --git a/src/projectzombie/tiles/TileDirt.java b/src/projectzombie/tiles/TileDirt.java old mode 100644 new mode 100755 index 77a18f9..16a74d6 --- a/src/projectzombie/tiles/TileDirt.java +++ b/src/projectzombie/tiles/TileDirt.java @@ -5,8 +5,8 @@ import projectzombie.init.Textures; public class TileDirt extends TileFlatFaded { - public TileDirt(String id) { - super(id, Textures.TILE_DIRT); + public TileDirt() { + super(Textures.TILE_DIRT); } } \ No newline at end of file diff --git a/src/projectzombie/tiles/TileFire.java b/src/projectzombie/tiles/TileFire.java deleted file mode 100644 index 55c4df4..0000000 --- a/src/projectzombie/tiles/TileFire.java +++ /dev/null @@ -1,16 +0,0 @@ -package projectzombie.tiles; - -import projectzombie.init.Textures; -import projectzombie.util.math.vec.Vec2d; - -public class TileFire extends TileVertical -{ - - public TileFire(String id) { - super(id, Textures.TILE_FIRE, new Vec2d(1, 6)); - - // Set some settings - this.opaqueTile = true; - } - -} diff --git a/src/projectzombie/tiles/TileFlat.java b/src/projectzombie/tiles/TileFlat.java old mode 100644 new mode 100755 index 2a73589..96e1e42 --- a/src/projectzombie/tiles/TileFlat.java +++ b/src/projectzombie/tiles/TileFlat.java @@ -14,8 +14,7 @@ public class TileFlat extends Tile implements IHasTexture protected boolean rotates = false; private static final Vec3d default_tile_color = new Vec3d(1, 1, 1); - public TileFlat(String id, TextureReference tex) { - super(id); + public TileFlat(TextureReference tex) { this.tex = tex; } diff --git a/src/projectzombie/tiles/TileFlatFaded.java b/src/projectzombie/tiles/TileFlatFaded.java old mode 100644 new mode 100755 index 9e2dee8..bacec17 --- a/src/projectzombie/tiles/TileFlatFaded.java +++ b/src/projectzombie/tiles/TileFlatFaded.java @@ -9,8 +9,8 @@ import projectzombie.util.math.vec.Vec3d; public class TileFlatFaded extends TileFlat { - public TileFlatFaded(String id, TextureReference tex) { - super(id, tex); + public TileFlatFaded(TextureReference tex) { + super(tex); } @Override diff --git a/src/projectzombie/tiles/TileGrass.java b/src/projectzombie/tiles/TileGrass.java old mode 100644 new mode 100755 index b716948..5a8f21f --- a/src/projectzombie/tiles/TileGrass.java +++ b/src/projectzombie/tiles/TileGrass.java @@ -5,8 +5,8 @@ import projectzombie.init.Textures; public class TileGrass extends TileFlat { - public TileGrass(String id) { - super(id, Textures.TILE_GRASS); + public TileGrass() { + super(Textures.TILE_GRASS); } } diff --git a/src/projectzombie/tiles/TileLadder.java b/src/projectzombie/tiles/TileLadder.java old mode 100644 new mode 100755 index 7deadd4..8326c37 --- a/src/projectzombie/tiles/TileLadder.java +++ b/src/projectzombie/tiles/TileLadder.java @@ -8,8 +8,8 @@ import projectzombie.util.math.vec.Vec2i; public class TileLadder extends TileVertical { - public TileLadder(String id) { - super(id, Textures.TILE_LADDER, new Vec2d(1, 1)); + public TileLadder() { + super(Textures.TILE_LADDER, new Vec2d(1, 1)); this.opaqueTile = true; this.tileSolid = true; diff --git a/src/projectzombie/tiles/TileLadderUp.java b/src/projectzombie/tiles/TileLadderUp.java old mode 100644 new mode 100755 index e01c6ff..55500da --- a/src/projectzombie/tiles/TileLadderUp.java +++ b/src/projectzombie/tiles/TileLadderUp.java @@ -4,7 +4,6 @@ import mainloop.task.IMainloopTask; import projectzombie.Main; import projectzombie.entity.Entity; import projectzombie.entity.player.EntityPlayer; -import projectzombie.init.Layers; import projectzombie.init.Textures; import projectzombie.mainloop.MainloopEventHandler; import projectzombie.util.math.TileState; @@ -15,8 +14,8 @@ import projectzombie.world.layer.Layer; public class TileLadderUp extends TileVertical { - public TileLadderUp(String id) { - super(id, Textures.TILE_LADDER_UP, new Vec2d(1, 16)); + public TileLadderUp() { + super(Textures.TILE_LADDER_UP, new Vec2d(1, 16)); this.opaqueTile = true; this.tileSolid = true; @@ -60,8 +59,12 @@ public class TileLadderUp extends TileVertical if(player.height >= 6 && movingPlayer == 0) { movingPlayer = 1; - Main.world.setLayer(Layers.getLayer(state.meta)); + Main.world.setLayer(state.meta); player.height = -1; + + if(layer.layergen.destroyOnLeave) { + Main.world.removeLayer(state.meta); + } } else if(movingPlayer == 1 && ChunkEventHandler.loaded) diff --git a/src/projectzombie/tiles/TileLantern.java b/src/projectzombie/tiles/TileLantern.java old mode 100644 new mode 100755 index defb996..eb58a39 --- a/src/projectzombie/tiles/TileLantern.java +++ b/src/projectzombie/tiles/TileLantern.java @@ -13,8 +13,8 @@ import projectzombie.world.layer.Layer; public class TileLantern extends TileVertical { - public TileLantern(String id) { - super(id, Textures.TILE_LANTERN, new Vec2d(1, 1)); + public TileLantern() { + super(Textures.TILE_LANTERN, new Vec2d(1, 1)); this.emitsLight = true; this.opaqueTile = true; @@ -22,7 +22,7 @@ public class TileLantern extends TileVertical @Override public double getLightLevel(TileState state, Vec2i pos) { - return 0.8; + return 1; } @Override diff --git a/src/projectzombie/tiles/TileLava.java b/src/projectzombie/tiles/TileLava.java old mode 100644 new mode 100755 index ed53275..0875189 --- a/src/projectzombie/tiles/TileLava.java +++ b/src/projectzombie/tiles/TileLava.java @@ -17,11 +17,13 @@ public class TileLava extends TileFlat { private Random rand = new Random(); - public TileLava(String id) { - super(id, Textures.TILE_LAVA); + public TileLava() { + super(Textures.TILE_LAVA); + this.slowness = 0.5; this.tileWalkable = false; this.emitsLight = true; + this.unbreakable = true; } @Override diff --git a/src/projectzombie/tiles/TileLavaFlow.java b/src/projectzombie/tiles/TileLavaFlow.java old mode 100644 new mode 100755 index 0108f2a..a5ec609 --- a/src/projectzombie/tiles/TileLavaFlow.java +++ b/src/projectzombie/tiles/TileLavaFlow.java @@ -17,10 +17,11 @@ public class TileLavaFlow extends TileFlat { private Random rand = new Random(); - public TileLavaFlow(String id) { - super(id, Textures.TILE_LAVA_FLOW); + public TileLavaFlow() { + super(Textures.TILE_LAVA_FLOW); this.emitsLight = true; + this.unbreakable = true; } @Override diff --git a/src/projectzombie/tiles/TilePortalDown.java b/src/projectzombie/tiles/TilePortalDown.java old mode 100644 new mode 100755 index f8e3d13..4641d00 --- a/src/projectzombie/tiles/TilePortalDown.java +++ b/src/projectzombie/tiles/TilePortalDown.java @@ -4,7 +4,6 @@ import mainloop.task.IMainloopTask; import projectzombie.Main; import projectzombie.entity.Entity; import projectzombie.entity.player.EntityPlayer; -import projectzombie.init.Layers; import projectzombie.init.Textures; import projectzombie.mainloop.MainloopEventHandler; import projectzombie.util.math.TileState; @@ -15,8 +14,8 @@ import projectzombie.world.layer.Layer; public class TilePortalDown extends TileFlat { - public TilePortalDown(String id) { - super(id, Textures.TILE_PORTAL); + public TilePortalDown() { + super(Textures.TILE_PORTAL); this.unbreakable = true; } @@ -57,8 +56,12 @@ public class TilePortalDown extends TileFlat if(player.height < -1 && movingPlayer == 0) { movingPlayer = 1; - Main.world.setLayer(Layers.getLayer(state.meta)); + Main.world.setLayer(state.meta); player.height = 6; + + if(layer.layergen.destroyOnLeave) { + Main.world.removeLayer(state.meta); + } } else if(ChunkEventHandler.loaded && movingPlayer == 1) diff --git a/src/projectzombie/tiles/TileRock.java b/src/projectzombie/tiles/TileRock.java old mode 100644 new mode 100755 index 89d0df9..9585c95 --- a/src/projectzombie/tiles/TileRock.java +++ b/src/projectzombie/tiles/TileRock.java @@ -1,14 +1,20 @@ package projectzombie.tiles; +import projectzombie.entity.Entity; +import projectzombie.entity.EntityItem; +import projectzombie.init.Items; import projectzombie.init.Textures; +import projectzombie.util.math.ItemStack; import projectzombie.util.math.TileState; import projectzombie.util.math.vec.Vec2d; +import projectzombie.util.math.vec.Vec2i; +import projectzombie.world.layer.Layer; -public class TileRock extends TileVertical +public class TileRock extends TileVertical implements TileBulletBreakable { - public TileRock(String id) { - super(id, Textures.TILE_ROCK, new Vec2d(1, 1)); + public TileRock() { + super(Textures.TILE_ROCK, new Vec2d(1, 1)); // Set some settings this.opaqueTile = true; @@ -21,4 +27,17 @@ public class TileRock extends TileVertical return 1/8.0; } + @Override + public void onActivated(Layer layer, Vec2i tpos, Entity entity, TileState state) { + super.onActivated(layer, tpos, entity, state); + + layer.breakFrontTile(tpos); + layer.spawnEntity(new EntityItem(new Vec2d(tpos.x + 0.5, tpos.y + 0.5), new ItemStack(Items.ROCK, 1, (byte)0))); + } + + @Override + public int getBulletBreakChance() { + return 15; + } + } diff --git a/src/projectzombie/tiles/TileSand.java b/src/projectzombie/tiles/TileSand.java old mode 100644 new mode 100755 index 63e8326..8f8b83e --- a/src/projectzombie/tiles/TileSand.java +++ b/src/projectzombie/tiles/TileSand.java @@ -5,8 +5,8 @@ import projectzombie.init.Textures; public class TileSand extends TileFlat { - public TileSand(String id) { - super(id, Textures.TILE_SAND); + public TileSand() { + super(Textures.TILE_SAND); } } \ No newline at end of file diff --git a/src/projectzombie/tiles/TileStone.java b/src/projectzombie/tiles/TileStone.java old mode 100644 new mode 100755 index 235170d..233564b --- a/src/projectzombie/tiles/TileStone.java +++ b/src/projectzombie/tiles/TileStone.java @@ -5,8 +5,8 @@ import projectzombie.init.Textures; public class TileStone extends TileFlatFaded { - public TileStone(String id) { - super(id, Textures.TILE_STONE); + public TileStone() { + super(Textures.TILE_STONE); } } diff --git a/src/projectzombie/tiles/TileTree.java b/src/projectzombie/tiles/TileTree.java old mode 100644 new mode 100755 index f305073..bb76bf7 --- a/src/projectzombie/tiles/TileTree.java +++ b/src/projectzombie/tiles/TileTree.java @@ -4,10 +4,10 @@ import projectzombie.init.Textures; import projectzombie.util.math.TileState; import projectzombie.util.math.vec.Vec2d; -public class TileTree extends TileVertical +public class TileTree extends TileVertical implements TileBulletBreakable { - public TileTree(String id) { - super(id, Textures.TILE_TREE, new Vec2d(1, 4)); + public TileTree() { + super(Textures.TILE_TREE, new Vec2d(1, 4)); // Set some settings this.opaqueTile = true; @@ -20,6 +20,9 @@ public class TileTree extends TileVertical return 1/8.0; } - + @Override + public int getBulletBreakChance() { + return 35; + } } diff --git a/src/projectzombie/tiles/TileVertical.java b/src/projectzombie/tiles/TileVertical.java old mode 100644 new mode 100755 index 0051ce3..488d39d --- a/src/projectzombie/tiles/TileVertical.java +++ b/src/projectzombie/tiles/TileVertical.java @@ -10,11 +10,10 @@ import projectzombie.util.math.vec.Vec2d; public class TileVertical extends Tile implements IHasTexture { - private TextureReference tex; - private Vec2d size; + public final TextureReference tex; + public final Vec2d size; - public TileVertical(String id, TextureReference tex, Vec2d size) { - super(id); + public TileVertical(TextureReference tex, Vec2d size) { // Store some variables this.tex = tex; diff --git a/src/projectzombie/tiles/TileVoid.java b/src/projectzombie/tiles/TileVoid.java old mode 100644 new mode 100755 index 6aed8a4..45c1f7c --- a/src/projectzombie/tiles/TileVoid.java +++ b/src/projectzombie/tiles/TileVoid.java @@ -2,8 +2,7 @@ package projectzombie.tiles; public class TileVoid extends Tile { - public TileVoid(String id) { - super(id); + public TileVoid() { // Set some settings this.tileSolid = false; diff --git a/src/projectzombie/tiles/TileWall.java b/src/projectzombie/tiles/TileWall.java old mode 100644 new mode 100755 index eda5c48..8150a9f --- a/src/projectzombie/tiles/TileWall.java +++ b/src/projectzombie/tiles/TileWall.java @@ -1,19 +1,24 @@ package projectzombie.tiles; import projectzombie.init.Textures; +import projectzombie.util.math.TileState; public class TileWall extends TileFlat { - public TileWall(String id) { - super(id, Textures.TILE_WALL); + public TileWall() { + super(Textures.TILE_WALL); this.tileWalkable = false; this.tileSolid = true; this.tileHitbox = 1; - this.light_dissipation = 1/2.0; this.passNaturalLight = false; } + @Override + public double getLightDissipation(TileState state) { + return 1/2.0; + } + } diff --git a/src/projectzombie/tiles/TileWallUnbreakable.java b/src/projectzombie/tiles/TileWallUnbreakable.java old mode 100644 new mode 100755 index 550a162..272f92e --- a/src/projectzombie/tiles/TileWallUnbreakable.java +++ b/src/projectzombie/tiles/TileWallUnbreakable.java @@ -3,8 +3,7 @@ package projectzombie.tiles; public class TileWallUnbreakable extends TileWall { - public TileWallUnbreakable(String id) { - super(id); + public TileWallUnbreakable() { this.unbreakable = true; } diff --git a/src/projectzombie/tiles/TileWater.java b/src/projectzombie/tiles/TileWater.java old mode 100644 new mode 100755 index aa052f3..500a06a --- a/src/projectzombie/tiles/TileWater.java +++ b/src/projectzombie/tiles/TileWater.java @@ -14,10 +14,11 @@ import projectzombie.world.layer.Layer; public class TileWater extends TileFlat { - public TileWater(String id) { - super(id, Textures.TILE_WATER); + public TileWater() { + super(Textures.TILE_WATER); this.slowness = 0.5; this.rotates = true; + this.unbreakable = true; } @Override diff --git a/src/projectzombie/tiles/TileWaterFlow.java b/src/projectzombie/tiles/TileWaterFlow.java old mode 100644 new mode 100755 index 41fd180..258a9a2 --- a/src/projectzombie/tiles/TileWaterFlow.java +++ b/src/projectzombie/tiles/TileWaterFlow.java @@ -9,8 +9,10 @@ import projectzombie.util.math.vec.Vec2d; public class TileWaterFlow extends TileFlat { - public TileWaterFlow(String id) { - super(id, Textures.TILE_WATER_FLOW); + public TileWaterFlow() { + super(Textures.TILE_WATER_FLOW); + + this.unbreakable = true; } @Override diff --git a/src/projectzombie/time/GameTimer.java b/src/projectzombie/time/GameTimer.java old mode 100644 new mode 100755 index 7d427ec..c47819b --- a/src/projectzombie/time/GameTimer.java +++ b/src/projectzombie/time/GameTimer.java @@ -7,11 +7,14 @@ public class GameTimer implements IMainloopTask { private static long time; - public static long getTime() { return time; } + public static void setTime(long v) { + time = v; + } + public static void forceTimeUpdate(int amount) { time += amount; } @@ -30,6 +33,7 @@ public class GameTimer implements IMainloopTask public void MainLoopUpdate() { if(Main.menu.doGameloop) { time += 1; + //time = 40000; } } diff --git a/src/projectzombie/time/NoSleep.java b/src/projectzombie/time/NoSleep.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/gl/GlHelpers.java b/src/projectzombie/util/gl/GlHelpers.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/gl/VerticalRender.java b/src/projectzombie/util/gl/VerticalRender.java old mode 100644 new mode 100755 index e9463bf..6e75079 --- a/src/projectzombie/util/gl/VerticalRender.java +++ b/src/projectzombie/util/gl/VerticalRender.java @@ -8,6 +8,10 @@ public class VerticalRender { public static void render(Vec2d pos, Camera camera, TextureReference tex, Vec2d size) { + if(tex == null) { + return; + } + double w = size.x/2.0; double h = size.y; diff --git a/src/projectzombie/util/gl/texture/AnimationEventHandler.java b/src/projectzombie/util/gl/texture/AnimationEventHandler.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/gl/texture/AnimationReference.java b/src/projectzombie/util/gl/texture/AnimationReference.java old mode 100644 new mode 100755 index 4206636..2fd16ab --- a/src/projectzombie/util/gl/texture/AnimationReference.java +++ b/src/projectzombie/util/gl/texture/AnimationReference.java @@ -8,7 +8,7 @@ public class AnimationReference extends TextureReference private TextureReference[] references; private int upto = 0; private int speed; - private TextureReference c; + public TextureReference c; public AnimationReference(int speed, TextureReference ... references) { @@ -43,5 +43,10 @@ public class AnimationReference extends TextureReference public int getMaxY() { return c.getMaxY(); } + + @Override + public TextureReference getTextureReference(int start_x, int end_x, int start_y, int end_y) { + return c.getTextureReference(start_x, end_x, start_y, end_y); + } } diff --git a/src/projectzombie/util/gl/texture/IHasTexture.java b/src/projectzombie/util/gl/texture/IHasTexture.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/gl/texture/Texture.java b/src/projectzombie/util/gl/texture/Texture.java old mode 100644 new mode 100755 index be8939b..796de7a --- a/src/projectzombie/util/gl/texture/Texture.java +++ b/src/projectzombie/util/gl/texture/Texture.java @@ -23,7 +23,8 @@ public class Texture // Load the texture with STBImage this.texture = STBImage.stbi_load_from_memory( tex.getByteBuffer(), - width, height, channels, STBImage.STBI_rgb_alpha); + width, height, channels, + STBImage.STBI_rgb_alpha); // Check for a failure String failure = STBImage.stbi_failure_reason(); diff --git a/src/projectzombie/util/gl/texture/TextureMap.java b/src/projectzombie/util/gl/texture/TextureMap.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/gl/texture/TextureReference.java b/src/projectzombie/util/gl/texture/TextureReference.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/gl/texture/TextureReferenceEmpty.java b/src/projectzombie/util/gl/texture/TextureReferenceEmpty.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/gl/texture/TextureReferenceRandom.java b/src/projectzombie/util/gl/texture/TextureReferenceRandom.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/math/ColorRange.java b/src/projectzombie/util/math/ColorRange.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/math/ItemStack.java b/src/projectzombie/util/math/ItemStack.java old mode 100644 new mode 100755 index 7003df9..01a79de --- a/src/projectzombie/util/math/ItemStack.java +++ b/src/projectzombie/util/math/ItemStack.java @@ -1,9 +1,12 @@ package projectzombie.util.math; +import bdf.classes.IBdfClassManager; +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; import projectzombie.init.Items; import projectzombie.items.Item; -public class ItemStack +public class ItemStack implements IBdfClassManager { public short meta; public Item item; @@ -33,4 +36,24 @@ public class ItemStack if(other.meta != meta) return false; return true; } + + @Override + public void BdfClassLoad(BdfObject bdf) { + BdfNamedList nl = bdf.getNamedList(); + meta = nl.get("meta").getShort(); + count = nl.get("count").getInteger(); + item = Items.items.get(nl.get("item").getInteger()); + } + + @Override + public void BdfClassSave(BdfObject bdf) { + BdfNamedList nl = bdf.getNamedList(); + nl.set("meta", BdfObject.withShort(meta)); + nl.set("count", BdfObject.withInteger(count)); + nl.set("item", BdfObject.withInteger(item.id)); + } + + public ItemStack(BdfObject bdf) { + BdfClassLoad(bdf); + } } diff --git a/src/projectzombie/util/math/MathHelpers.java b/src/projectzombie/util/math/MathHelpers.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/math/NamedList.java b/src/projectzombie/util/math/NamedList.java new file mode 100755 index 0000000..cfc4fad --- /dev/null +++ b/src/projectzombie/util/math/NamedList.java @@ -0,0 +1,54 @@ +package projectzombie.util.math; + +import java.util.ArrayList; + +class NamedListObject { + String id; + T object; + + public NamedListObject(String id, T object) { + this.object = object; + this.id = id; + } +} + +public class NamedList +{ + private ArrayList> objects; + + public T get(String id) + { + for(NamedListObject o : objects) { + if(o.id.contentEquals(id)) { + return o.object; + } + } + + return null; + } + + public void set(String id, T object) + { + for(NamedListObject o : objects) { + if(o.id.contentEquals(id)) { + o.object = object; + return; + } + } + + objects.add(new NamedListObject(id, object)); + } + + public T remove(String id) + { + for(int i=0;i o = objects.get(i); + if(o.id.contentEquals(id)) { + objects.remove(i); + return o.object; + } + } + + return null; + } +} diff --git a/src/projectzombie/util/math/TileState.java b/src/projectzombie/util/math/TileState.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/math/astar/AStar.java b/src/projectzombie/util/math/astar/AStar.java new file mode 100755 index 0000000..c4ba841 --- /dev/null +++ b/src/projectzombie/util/math/astar/AStar.java @@ -0,0 +1,184 @@ +package projectzombie.util.math.astar; +import java.util.ArrayList; +import java.util.List; + +import projectzombie.util.math.vec.Vec2i; + +class Node +{ + int x, y; + int g, h; + Node parent; + + public Node(Node parent, int x, int y, int g, int h) { + this.parent = parent; + this.x = x; + this.y = y; + this.g = g; + this.h = h; + } +} + +public class AStar +{ + AStarSearch search; + + Vec2i start; + Vec2i goal; + int radius; + + List open; + List closed; + + Node now; + Node found; + + public AStar(Vec2i start, int radius, AStarSearch search) + { + this.search = search; + this.start = start; + this.radius = radius; + } + + public Vec2i[] getPath(Vec2i goal) + { + // Goal out of range + if(this.posOutOfRange(goal.x, goal.y)) { + return null; + } + + // Start is a wall + if(search.getWeight(start.x, start.y) == 100) { + return null; + } + + this.goal = goal; + this.open = new ArrayList(); + this.closed = new ArrayList(); + + now = new Node(null, start.x, start.y, 0, 0); + closed.add(now); + + addNeighboursToList(); + + while(open.size() > 0) + { + // Found the goal + if(found != null) + { + Node n = found; + + ArrayList path = new ArrayList(); + + while(n != null) { + path.add(new Vec2i(n.x, n.y)); + n = n.parent; + } + + Vec2i[] path2 = new Vec2i[path.size()]; + + for(int i=0;i nodes, int x, int y) { + for(Node n : nodes) { + if(n.x == x && n.y == y) { + return true; + } + } + return false; + } + + private boolean posOutOfRange(int x, int y) { + return ( + x > start.x + radius || + x < start.x - radius || + y > start.y + radius || + y < start.y - radius); + } + + private void addNeighboursToList() + { + int neighbours[] = { + 1, 0, + -1, 0, + 0, 1, + 0, -1 + }; + + for(int i=0;i 0 || tsb.tile.tileHitbox > 0) { + return 100; + } + + if(tsf.tile.slowness > 0 || tsb.tile.slowness > 0) { + return (int)(MathHelpers.biggest(tsf.tile.slowness, tsb.tile.slowness) * 100); + } + + return 0; + } + +} diff --git a/src/projectzombie/util/math/map/IMap2D.java b/src/projectzombie/util/math/map/IMap2D.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/math/map/Map2D.java b/src/projectzombie/util/math/map/Map2D.java old mode 100644 new mode 100755 index b8050be..a428eca --- a/src/projectzombie/util/math/map/Map2D.java +++ b/src/projectzombie/util/math/map/Map2D.java @@ -112,6 +112,10 @@ public class Map2D implements Iterable> // Return false if nothing was found return false; } + + public int size() { + return elements.size(); + } @Override public Iterator> iterator() { diff --git a/src/projectzombie/util/math/map/Map2DElement.java b/src/projectzombie/util/math/map/Map2DElement.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/math/random/OpenSimplexNoise.java b/src/projectzombie/util/math/random/OpenSimplexNoise.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/math/random/RandomHelpers.java b/src/projectzombie/util/math/random/RandomHelpers.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/math/range/Range2i.java b/src/projectzombie/util/math/range/Range2i.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/math/range/Range3i.java b/src/projectzombie/util/math/range/Range3i.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/math/range/Range4i.java b/src/projectzombie/util/math/range/Range4i.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/util/math/vec/Vec2d.java b/src/projectzombie/util/math/vec/Vec2d.java old mode 100644 new mode 100755 index bebdbcb..e068d9a --- a/src/projectzombie/util/math/vec/Vec2d.java +++ b/src/projectzombie/util/math/vec/Vec2d.java @@ -1,8 +1,10 @@ package projectzombie.util.math.vec; +import bdf.classes.IBdfClassManager; +import bdf.types.BdfObject; import projectzombie.util.math.MathHelpers; -public class Vec2d +public class Vec2d implements IBdfClassManager { public double x; public double y; @@ -41,6 +43,22 @@ public class Vec2d return new Vec2d(this.x / other.x, this.y / other.y); } + public Vec2d add(double v) { + return new Vec2d(this.x + v, this.y + v); + } + + public Vec2d subtract(double v) { + return new Vec2d(this.x - v, this.y - v); + } + + public Vec2d multiply(double v) { + return new Vec2d(this.x * v, this.y * v); + } + + public Vec2d divide(double v) { + return new Vec2d(this.x / v, this.y / v); + } + public Vec2d copy() { return new Vec2d(x, y); } @@ -51,4 +69,26 @@ public class Vec2d double dy = MathHelpers.positive(other.y - y); return MathHelpers.biggest(dx, dy); } + + public Vec2i toInt() { + return new Vec2i(MathHelpers.floor(x), MathHelpers.floor(y)); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + double array[] = bdf.getDoubleArray(); + if(array.length < 2) return; + x = array[0]; + y = array[1]; + } + + @Override + public void BdfClassSave(BdfObject bdf) { + double array[] = {x, y}; + bdf.setDoubleArray(array); + } + + public Vec2d(BdfObject bdf) { + this.BdfClassLoad(bdf); + } } diff --git a/src/projectzombie/util/math/vec/Vec2i.java b/src/projectzombie/util/math/vec/Vec2i.java old mode 100644 new mode 100755 index 62e3ab9..995dd31 --- a/src/projectzombie/util/math/vec/Vec2i.java +++ b/src/projectzombie/util/math/vec/Vec2i.java @@ -1,9 +1,11 @@ package projectzombie.util.math.vec; +import bdf.classes.IBdfClassManager; +import bdf.types.BdfObject; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.range.Range2i; -public class Vec2i +public class Vec2i implements IBdfClassManager { public int x; public int y; @@ -67,6 +69,22 @@ public class Vec2i return new Vec2i(this.x / other.x, this.y / other.y); } + public Vec2i add(int v) { + return new Vec2i(this.x + v, this.y + v); + } + + public Vec2i subtract(int v) { + return new Vec2i(this.x - v, this.y - v); + } + + public Vec2i multiply(int v) { + return new Vec2i(this.x * v, this.y * v); + } + + public Vec2i divide(int v) { + return new Vec2i(this.x / v, this.y / v); + } + public Vec2i copy() { return new Vec2i(x, y); } @@ -77,4 +95,26 @@ public class Vec2i int dy = MathHelpers.positive(other.y - y); return MathHelpers.biggest(dx, dy); } + + public Vec2d toDouble() { + return new Vec2d(x, y); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + int array[] = bdf.getIntegerArray(); + if(array.length < 2) return; + x = array[0]; + y = array[1]; + } + + @Override + public void BdfClassSave(BdfObject bdf) { + int array[] = {x, y}; + bdf.setIntegerArray(array); + } + + public Vec2i(BdfObject bdf) { + this.BdfClassLoad(bdf); + } } diff --git a/src/projectzombie/util/math/vec/Vec3d.java b/src/projectzombie/util/math/vec/Vec3d.java old mode 100644 new mode 100755 index c2dd58e..e6d3bdd --- a/src/projectzombie/util/math/vec/Vec3d.java +++ b/src/projectzombie/util/math/vec/Vec3d.java @@ -1,8 +1,10 @@ package projectzombie.util.math.vec; +import bdf.classes.IBdfClassManager; +import bdf.types.BdfObject; import projectzombie.util.math.MathHelpers; -public class Vec3d +public class Vec3d implements IBdfClassManager { public double x; public double y; @@ -43,6 +45,22 @@ public class Vec3d return new Vec3d(this.x / other.x, this.y / other.y, this.z / other.z); } + public Vec3d add(double v) { + return new Vec3d(this.x + v, this.y + v, this.z + v); + } + + public Vec3d subtract(double v) { + return new Vec3d(this.x - v, this.y - v, this.z - v); + } + + public Vec3d multiply(double v) { + return new Vec3d(this.x * v, this.y * v, this.z * v); + } + + public Vec3d divide(double v) { + return new Vec3d(this.x / v, this.y / v, this.z / v); + } + public Vec3d copy() { return new Vec3d(x, y, z); } @@ -57,4 +75,27 @@ public class Vec3d if(dy > dz) return dy; else return dz; } + + public Vec3i toInt() { + return new Vec3i(MathHelpers.floor(x), MathHelpers.floor(y), MathHelpers.floor(z)); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + double array[] = bdf.getDoubleArray(); + if(array.length < 3) return; + x = array[0]; + y = array[1]; + z = array[2]; + } + + @Override + public void BdfClassSave(BdfObject bdf) { + double array[] = {x, y, z}; + bdf.setDoubleArray(array); + } + + public Vec3d(BdfObject bdf) { + this.BdfClassLoad(bdf); + } } diff --git a/src/projectzombie/util/math/vec/Vec3i.java b/src/projectzombie/util/math/vec/Vec3i.java old mode 100644 new mode 100755 index b1eca5c..646a459 --- a/src/projectzombie/util/math/vec/Vec3i.java +++ b/src/projectzombie/util/math/vec/Vec3i.java @@ -1,9 +1,11 @@ package projectzombie.util.math.vec; +import bdf.classes.IBdfClassManager; +import bdf.types.BdfObject; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.range.Range3i; -public class Vec3i +public class Vec3i implements IBdfClassManager { public int x; public int y; @@ -75,6 +77,22 @@ public class Vec3i return new Vec3i(this.x / other.x, this.y / other.y, this.z / other.z); } + public Vec3i add(int v) { + return new Vec3i(this.x + v, this.y + v, this.z + v); + } + + public Vec3i subtract(int v) { + return new Vec3i(this.x - v, this.y - v, this.z - v); + } + + public Vec3i multiply(int v) { + return new Vec3i(this.x * v, this.y * v, this.z * v); + } + + public Vec3i divide(int v) { + return new Vec3i(this.x / v, this.y / v, this.z / v); + } + public Vec3i copy() { return new Vec3i(x, y, z); } @@ -89,4 +107,27 @@ public class Vec3i if(dy > dz) return dy; else return dz; } + + public Vec3d toDouble() { + return new Vec3d(x, y, z); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + int array[] = bdf.getIntegerArray(); + if(array.length < 3) return; + x = array[0]; + y = array[1]; + z = array[2]; + } + + @Override + public void BdfClassSave(BdfObject bdf) { + int array[] = {x, y, z}; + bdf.setIntegerArray(array); + } + + public Vec3i(BdfObject bdf) { + this.BdfClassLoad(bdf); + } } diff --git a/src/projectzombie/util/math/vec/Vec4d.java b/src/projectzombie/util/math/vec/Vec4d.java old mode 100644 new mode 100755 index 028fb79..09f4038 --- a/src/projectzombie/util/math/vec/Vec4d.java +++ b/src/projectzombie/util/math/vec/Vec4d.java @@ -1,8 +1,10 @@ package projectzombie.util.math.vec; +import bdf.classes.IBdfClassManager; +import bdf.types.BdfObject; import projectzombie.util.math.MathHelpers; -public class Vec4d +public class Vec4d implements IBdfClassManager { public double x; public double y; @@ -49,6 +51,22 @@ public class Vec4d return new Vec4d(this.x / other.x, this.y / other.y, this.z / other.z, this.m / other.m); } + public Vec4d add(double v) { + return new Vec4d(this.x + v, this.y + v, this.z + v, this.m + v); + } + + public Vec4d subtract(double v) { + return new Vec4d(this.x - v, this.y - v, this.z - v, this.m - v); + } + + public Vec4d multiply(double v) { + return new Vec4d(this.x * v, this.y * v, this.z * v, this.m * v); + } + + public Vec4d divide(double v) { + return new Vec4d(this.x / v, this.y / v, this.z / v, this.m / v); + } + public Vec4d copy() { return new Vec4d(x, y, z, m); } @@ -65,4 +83,28 @@ public class Vec4d if(dz > dm) return dz; else return dm; } + + public Vec4i toInt() { + return new Vec4i(MathHelpers.floor(x), MathHelpers.floor(y), MathHelpers.floor(z), MathHelpers.floor(m)); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + double array[] = bdf.getDoubleArray(); + if(array.length < 4) return; + x = array[0]; + y = array[1]; + z = array[2]; + m = array[3]; + } + + @Override + public void BdfClassSave(BdfObject bdf) { + double array[] = {x, y, z, m}; + bdf.setDoubleArray(array); + } + + public Vec4d(BdfObject bdf) { + this.BdfClassLoad(bdf); + } } diff --git a/src/projectzombie/util/math/vec/Vec4i.java b/src/projectzombie/util/math/vec/Vec4i.java old mode 100644 new mode 100755 index 0ac8125..d44a3fc --- a/src/projectzombie/util/math/vec/Vec4i.java +++ b/src/projectzombie/util/math/vec/Vec4i.java @@ -1,9 +1,11 @@ package projectzombie.util.math.vec; +import bdf.classes.IBdfClassManager; +import bdf.types.BdfObject; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.range.Range4i; -public class Vec4i { +public class Vec4i implements IBdfClassManager { public int x; public int y; public int z; @@ -86,6 +88,22 @@ public class Vec4i { return new Vec4i(this.x / other.x, this.y / other.y, this.z / other.z, this.m / other.m); } + public Vec4i add(int v) { + return new Vec4i(this.x + v, this.y + v, this.z + v, this.m + v); + } + + public Vec4i subtract(int v) { + return new Vec4i(this.x - v, this.y - v, this.z - v, this.m - v); + } + + public Vec4i multiply(int v) { + return new Vec4i(this.x * v, this.y * v, this.z * v, this.m * v); + } + + public Vec4i divide(int v) { + return new Vec4i(this.x / v, this.y / v, this.z / v, this.m / v); + } + public Vec4i copy() { return new Vec4i(x, y, z, m); } @@ -102,4 +120,28 @@ public class Vec4i { if(dz > dm) return dz; else return dm; } + + public Vec4d toDouble() { + return new Vec4d(x, y, z, m); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + int array[] = bdf.getIntegerArray(); + if(array.length < 4) return; + x = array[0]; + y = array[1]; + z = array[2]; + m = array[3]; + } + + @Override + public void BdfClassSave(BdfObject bdf) { + int array[] = {x, y, z, m}; + bdf.setIntegerArray(array); + } + + public Vec4i(BdfObject bdf) { + this.BdfClassLoad(bdf); + } } diff --git a/src/projectzombie/world/World.java b/src/projectzombie/world/World.java old mode 100644 new mode 100755 index 099a0f7..956fd80 --- a/src/projectzombie/world/World.java +++ b/src/projectzombie/world/World.java @@ -1,31 +1,111 @@ package projectzombie.world; +import java.util.ArrayList; + +import bdf.classes.IBdfClassManager; +import bdf.types.BdfArray; +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; +import projectzombie.Main; import projectzombie.display.Camera; +import projectzombie.entity.player.EntityPlayer; +import projectzombie.time.GameTimer; import projectzombie.world.chunk.ChunkEventHandler; import projectzombie.world.layer.Layer; -public class World +public class World implements IBdfClassManager { - private Layer layer; + private Layer loaded; + private ArrayList layers = new ArrayList(); public void render(Camera camera) { - layer.render(camera); + loaded.render(camera); } public void tickEntities() { - layer.tickEntities(); + loaded.tickEntities(); } public void spawnRandomEntities() { - layer.spawnRandomEntities(); + loaded.spawnRandomEntities(); } - public void setLayer(Layer layer) { + public void setLayer(int id) { ChunkEventHandler.loaded = false; - this.layer = layer; + this.loaded = layers.get(id); + } + + public void removeLayer(int id) { + layers.remove(id); + } + + public int addLayer(Layer layer) { + int id = layers.size(); + layers.add(layer); + layer.id = id; + return id; } public Layer getLayer() { - return layer; + return loaded; + } + + @Override + public void BdfClassLoad(BdfObject bdf) + { + BdfNamedList nl = bdf.getNamedList(); + + // Get the layers and the loaded layer + BdfArray layers_bdf = nl.get("layers").getArray(); + + for(BdfObject o : layers_bdf) { + layers.add(new Layer(o)); + } + + int loaded_id = nl.get("loaded").getInteger(); + setLayer(loaded_id); + + // Load the player data + BdfArray players = nl.get("players").getArray(); + Main.player = new EntityPlayer(players.get(0)); + + // Set the games time + GameTimer.setTime(nl.get("time").getLong()); + } + + @Override + public void BdfClassSave(BdfObject bdf) + { + BdfNamedList nl = bdf.getNamedList(); + + // Get the current loaded layer + int loaded_id = -1; + for(int i=0;i getNearbyEntities(Vec2d pos, double distance) @@ -399,7 +523,11 @@ public class Chunk } // Tick the tile - ts.tile.tickRandomly(layer, this, ts, pos); + ts.tile.tickRandomly( + layer, + this, + ts, + pos); } } diff --git a/src/projectzombie/world/chunk/ChunkEmpty.java b/src/projectzombie/world/chunk/ChunkEmpty.java old mode 100644 new mode 100755 index 1a759e5..9de7a54 --- a/src/projectzombie/world/chunk/ChunkEmpty.java +++ b/src/projectzombie/world/chunk/ChunkEmpty.java @@ -1,19 +1,40 @@ package projectzombie.world.chunk; import java.util.ArrayList; +import java.util.Random; +import bdf.types.BdfObject; import projectzombie.display.Camera; import projectzombie.entity.Entity; import projectzombie.util.math.TileState; import projectzombie.util.math.vec.Vec2d; import projectzombie.util.math.vec.Vec2i; +import projectzombie.util.math.vec.Vec3d; public class ChunkEmpty extends Chunk { public ChunkEmpty() { - super(null, null, null); + super(null, null, (Random)null); + } + + @Override + public void BdfClassLoad(BdfObject bdf) { + } + + @Override + public void BdfClassSave(BdfObject bdf) { + } + + @Override + public Vec3d getRGBLightLevel(int id) { + return new Vec3d(0, 0, 0); } + @Override + public Vec3d getRGBLightLevel(Vec2i tpos) { + return new Vec3d(0, 0, 0); + } + @Override public void render(Camera camera) {} diff --git a/src/projectzombie/world/chunk/ChunkEventHandler.java b/src/projectzombie/world/chunk/ChunkEventHandler.java old mode 100644 new mode 100755 diff --git a/src/projectzombie/world/layer/Layer.java b/src/projectzombie/world/layer/Layer.java old mode 100644 new mode 100755 index cc42864..963c78b --- a/src/projectzombie/world/layer/Layer.java +++ b/src/projectzombie/world/layer/Layer.java @@ -3,9 +3,14 @@ package projectzombie.world.layer; import java.util.ArrayList; import java.util.Random; +import bdf.classes.IBdfClassManager; +import bdf.types.BdfArray; +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; import projectzombie.Main; import projectzombie.display.Camera; import projectzombie.entity.Entity; +import projectzombie.init.LayerGenerators; import projectzombie.util.math.MathHelpers; import projectzombie.util.math.TileState; import projectzombie.util.math.map.Map2D; @@ -15,24 +20,29 @@ import projectzombie.util.math.vec.Vec2i; import projectzombie.world.chunk.Chunk; import projectzombie.world.layer.layergen.LayerGen; -public class Layer +public class Layer implements IBdfClassManager { public Map2D chunks; private Map2D dirty_chunks; public LayerGen layergen; private Random rand; - private long seed; + public long lseed; + public long seed; public int id; - public Layer(Random rand, LayerGen layergen, int id) + public Layer(Random rand, LayerGen layergen) { // Create the array of tiles this.layergen = layergen; - this.seed = rand.nextLong(); this.rand = new Random(); + this.seed = rand.nextLong(); + this.lseed = this.rand.nextLong(); this.chunks = new Map2D(layergen); this.dirty_chunks = new Map2D(layergen); - this.id = id; + } + + public Layer(BdfObject bdf) { + BdfClassLoad(bdf); } public void render(Camera camera) @@ -106,6 +116,15 @@ public class Layer return chunks.get(c_pos).getBackTile(pos); } + public TileState getFrontTile(Vec2i pos) + { + // Get the chunk pos + Vec2i c_pos = getChunkPosFromPos(pos); + + // Get the chunks front tile + return chunks.get(c_pos).getFrontTile(pos); + } + public void breakBackTile(Vec2i pos) { getChunk(pos).breakBackTile(pos); } @@ -178,15 +197,6 @@ public class Layer chunks.get(c_pos).setDaylightLevel(light, pos); } - public TileState getFrontTile(Vec2i pos) - { - // Get the chunk pos - Vec2i c_pos = getChunkPosFromPos(pos); - - // Get the chunks front tile - return chunks.get(c_pos).getFrontTile(pos); - } - public void spawnEntity(Entity entity) { // Get the chunk pos @@ -211,7 +221,7 @@ public class Layer // Create and generate the chunk Chunk chunk = new Chunk(this, pos, rand); chunks.set(pos, chunk); - layergen.generateChunk(chunk, this, seed, new Random(cseed), pos); + layergen.generateChunk(chunk, this, new Random(cseed), pos); chunk.dirty = false; } } @@ -265,4 +275,59 @@ public class Layer // Send back the list of nearby entities return entities; } + + @Override + public void BdfClassLoad(BdfObject bdf) + { + BdfNamedList nl = bdf.getNamedList(); + + this.layergen = LayerGenerators.loadFromID(nl.get("lgen").getInteger()); + this.dirty_chunks = new Map2D(layergen); + this.chunks = new Map2D(layergen); + this.seed = nl.get("seed").getLong(); + this.lseed = nl.get("lseed").getLong(); + this.id = nl.get("id").getInteger(); + this.rand = new Random(); + + BdfArray bdf_chunks = nl.get("chunks").getArray(); + + for(BdfObject bdf_chunk : bdf_chunks) { + BdfNamedList chunk_nl = bdf_chunk.getNamedList(); + Vec2i cpos = new Vec2i(chunk_nl.get("pos")); + Chunk chunk = new Chunk(this, cpos, chunk_nl.get("chunk")); + dirty_chunks.set(cpos, chunk); + } + } + + @Override + public void BdfClassSave(BdfObject bdf) + { + BdfNamedList nl = bdf.getNamedList(); + + nl.set("lseed", BdfObject.withLong(lseed)); + nl.set("seed", BdfObject.withLong(seed)); + nl.set("id", BdfObject.withInteger(id)); + nl.set("lgen", BdfObject.withInteger(LayerGenerators.getLGID(this.layergen))); + + BdfArray bdf_chunks = nl.get("chunks").getArray(); + + for(Map2DElement chunk : dirty_chunks) { + BdfNamedList chunk_nl = new BdfNamedList(); + chunk.pos.BdfClassSave(chunk_nl.get("pos")); + chunk.o.BdfClassSave(chunk_nl.get("chunk")); + bdf_chunks.add(BdfObject.withNamedList(chunk_nl)); + } + + for(Map2DElement chunk : chunks) { + if(dirty_chunks.contains(chunk.pos)) + continue; + if(!chunk.o.dirty) + continue; + + BdfNamedList chunk_nl = new BdfNamedList(); + chunk.pos.BdfClassSave(chunk_nl.get("pos")); + chunk.o.BdfClassSave(chunk_nl.get("chunk")); + bdf_chunks.add(BdfObject.withNamedList(chunk_nl)); + } + } } diff --git a/src/projectzombie/world/layer/layergen/LayerGen.java b/src/projectzombie/world/layer/layergen/LayerGen.java old mode 100644 new mode 100755 index 12a9313..9905c2d --- a/src/projectzombie/world/layer/layergen/LayerGen.java +++ b/src/projectzombie/world/layer/layergen/LayerGen.java @@ -11,7 +11,10 @@ import projectzombie.world.layer.Layer; public abstract class LayerGen implements IMap2D { - public abstract void generateChunk(Chunk chunk, Layer layer, long seed, Random rand, Vec2i pos); + public int id; + public boolean destroyOnLeave = false; + + public abstract void generateChunk(Chunk chunk, Layer layer, Random rand, Vec2i pos); public abstract void spawnEntities(Layer layer, Random rand); public abstract TileState getTileDestroyed(); public abstract ColorRange getLightLevel(); diff --git a/src/projectzombie/world/layer/layergen/LayerGenBossArena.java b/src/projectzombie/world/layer/layergen/LayerGenBossArena.java old mode 100644 new mode 100755 index 85a1b29..e770f81 --- a/src/projectzombie/world/layer/layergen/LayerGenBossArena.java +++ b/src/projectzombie/world/layer/layergen/LayerGenBossArena.java @@ -21,9 +21,13 @@ public class LayerGenBossArena extends LayerGen implements LayerGenRememberPlaye private final int size = 10; private Vec2d player_pos = new Vec2d(0, 0); private Random rand = new Random(); + + public LayerGenBossArena() { + this.destroyOnLeave = true; + } @Override - public void generateChunk(Chunk chunk, Layer layer, long seed, Random rand, Vec2i pos) + public void generateChunk(Chunk chunk, Layer layer, Random rand, Vec2i pos) { // Fill with stone for(int i=0;i= 40) { if(rand.nextDouble() > 0.9) chunk.setFrontTile(new TileState(Tiles.TREE, (short)RandomHelpers.randrange(rand, Short.MAX_VALUE)), pos); else if(rand.nextDouble() > 0.99) chunk.setFrontTile(new TileState(Tiles.ROCK, @@ -81,7 +77,7 @@ public class LayerGenEarth extends LayerGen @Override public void spawnEntities(Layer layer, Random rand) { - if(rand.nextDouble() > 0.98) + if(rand.nextDouble() > 0.98 && getEarthLight() < -0.3) { Entity zombie = new EntityZombie(new Vec2d( RandomHelpers.randrange(rand, (int)Main.player.pos.x - 128, (int)Main.player.pos.x + 128), @@ -97,10 +93,14 @@ public class LayerGenEarth extends LayerGen return Tiles.DIRT.getDefaultState(); } + private double getEarthLight() { + return Math.sin(GameTimer.getTime() / 7200.0); + } + @Override public ColorRange getLightLevel() { - double light = Math.sin(GameTimer.getTime() / 7200.0); + double light = getEarthLight(); ColorRange daylightRange = new ColorRange( new Vec3d(60/255.0, 74/255.0, 68/255.0), diff --git a/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java b/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java old mode 100644 new mode 100755 index 8615619..ec5a918 --- a/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java +++ b/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java @@ -20,7 +20,7 @@ public class LayerGenLavaCaves extends LayerGen { @Override - public void generateChunk(Chunk chunk, Layer layer, long seed, Random rand, Vec2i pos) + public void generateChunk(Chunk chunk, Layer layer, Random rand, Vec2i pos) { // Make sure the random generated is the same if(PortalSpawnrates.WorldCavePortal(rand)) { @@ -45,7 +45,7 @@ public class LayerGenLavaCaves extends LayerGen } // Get some noise generators - OpenSimplexNoise noisegen_n = new OpenSimplexNoise(new Random(seed + layer.id).nextLong()); + OpenSimplexNoise noisegen_n = new OpenSimplexNoise(new Random(layer.lseed).nextLong()); // Loop over the chunk for(int x=0;x