diff --git a/core/src/tdt4240/netrunner/game/GameController.kt b/core/src/tdt4240/netrunner/game/GameController.kt index 06f7412a9ee03ec6243af7fd4e0c3cf897cb258e..0ad54042f84cedce1ef22d666423bc385fb023c2 100644 --- a/core/src/tdt4240/netrunner/game/GameController.kt +++ b/core/src/tdt4240/netrunner/game/GameController.kt @@ -11,11 +11,18 @@ import tdt4240.netrunner.model.response.EntityData import tdt4240.netrunner.model.response.StatusCode import tdt4240.netrunner.model.response.StatusResponse import tdt4240.netrunner.model.util.gsonImpl +<<<<<<< core/src/tdt4240/netrunner/game/GameController.kt import tdt4240.netrunner.view.controllers.CameraController import tdt4240.netrunner.view.controllers.GroundRenderer import tdt4240.netrunner.view.controllers.ParallaxRenderer import tdt4240.netrunner.view.controllers.PlatformRenderer import tdt4240.netrunner.view.controllers.PlayerRenderer +import tdt4240.netrunner.view.GameScreen +import tdt4240.netrunner.view.controllers.* +======= + + +>>>>>>> core/src/tdt4240/netrunner/game/GameController.kt /** * Client game processor @@ -42,6 +49,7 @@ class GameController(val game: Netrunner) { addController(PlatformRenderer(this@GameController, this)) addController(CameraController(this@GameController, this)) + addController(PowerUpRenderer(this@GameController, this)) } fun joinGame(username: String, playerColor: PlayerColor) { diff --git a/core/src/tdt4240/netrunner/view/controllers/PowerUpRenderer.kt b/core/src/tdt4240/netrunner/view/controllers/PowerUpRenderer.kt new file mode 100644 index 0000000000000000000000000000000000000000..02e4a4314e0fbacd6890c11f603bb36c9431af41 --- /dev/null +++ b/core/src/tdt4240/netrunner/view/controllers/PowerUpRenderer.kt @@ -0,0 +1,31 @@ +package tdt4240.netrunner.view.controllers + +import com.badlogic.gdx.graphics.Texture +import tdt4240.netrunner.game.GameController +import tdt4240.netrunner.model.game.EcsController +import tdt4240.netrunner.model.game.EcsEngine +import tdt4240.netrunner.model.game.components.dynamic.PositionComponent +import tdt4240.netrunner.model.game.components.living.PlayerComponent +import tdt4240.netrunner.model.game.components.powerups.PowerupComponent + +class PowerUpRenderer(val gController: GameController, engine: EcsEngine) : EcsController(engine) { + private val texture = Texture("powerup.png") + + + override fun render() { + gController.game.batch.begin() + val powerups = super.ecs.getEntitiesByComponent(PowerupComponent::class.java) + for (powerup in powerups){ + powerup.getComponent(PositionComponent::class.java).also{ pos -> + if (pos == null){ + throw RuntimeException("Misconfiguration; this should never throw.") + } + gController.game.apply { + batch.draw(texture, pos.pos.x, pos.pos.y, PowerupComponent.WIDTH, PowerupComponent.HEIGHT) + } + + } + } + gController.game.batch.end() + } +} \ No newline at end of file diff --git a/model/src/main/kotlin/tdt4240/netrunner/model/game/components/powerups/PowerupComponent.kt b/model/src/main/kotlin/tdt4240/netrunner/model/game/components/powerups/PowerupComponent.kt new file mode 100644 index 0000000000000000000000000000000000000000..2e8efd31a0c7538a86f008f283539487a8e1079d --- /dev/null +++ b/model/src/main/kotlin/tdt4240/netrunner/model/game/components/powerups/PowerupComponent.kt @@ -0,0 +1,13 @@ +package tdt4240.netrunner.model.game.components.powerups + +import tdt4240.netrunner.model.game.components.Component +import java.lang.reflect.Modifier + +class PowerupComponent (val speedModifier: Float, var consumed: Boolean = false) : Component { + override val componentName: String = this::class.java.name + + companion object{ + const val WIDTH = 60f + const val HEIGHT = 60f + } +} \ No newline at end of file diff --git a/model/src/main/kotlin/tdt4240/netrunner/model/game/factories/PowerupFactory.kt b/model/src/main/kotlin/tdt4240/netrunner/model/game/factories/PowerupFactory.kt new file mode 100644 index 0000000000000000000000000000000000000000..cec42500995797f76b54efc28d1c2c08e8d53e2d --- /dev/null +++ b/model/src/main/kotlin/tdt4240/netrunner/model/game/factories/PowerupFactory.kt @@ -0,0 +1,32 @@ +package tdt4240.netrunner.model.game.factories + +import tdt4240.netrunner.model.game.Entity +import tdt4240.netrunner.model.game.components.dynamic.PositionComponent +import tdt4240.netrunner.model.game.components.dynamic.VelocityComponent +import tdt4240.netrunner.model.game.components.living.LivingComponent +import tdt4240.netrunner.model.game.components.living.PlayerComponent +import tdt4240.netrunner.model.game.components.powerups.PowerupComponent +import tdt4240.netrunner.model.game.data.PlayerColor +import tdt4240.netrunner.model.util.Vec2f +import java.lang.reflect.Modifier + +class PowerupFactory { + lateinit var pos:Vec2f + var speedModifier:Float = 0f + + fun withPos(pos:Vec2f) = this.also { + this.pos = pos + } + + fun withSpeedModifier(speedModifier:Float) = this.also { + this.speedModifier = speedModifier + } + + + fun build() : Entity { + return Entity(hashSetOf( + PositionComponent(pos), + PowerupComponent(speedModifier) + )) + } +} \ No newline at end of file diff --git a/server/src/main/java/tdt4240/netrunner/game/WorldGen.kt b/server/src/main/java/tdt4240/netrunner/game/WorldGen.kt index 5c08f64a527fad9bd4d485941af13b5ff84af763..f23d067db0cffca571f20327d6e9655fc695fbb6 100644 --- a/server/src/main/java/tdt4240/netrunner/game/WorldGen.kt +++ b/server/src/main/java/tdt4240/netrunner/game/WorldGen.kt @@ -4,23 +4,39 @@ import tdt4240.netrunner.model.game.Entity import tdt4240.netrunner.model.game.components.level.GroundComponent import tdt4240.netrunner.model.game.components.living.PlayerComponent import tdt4240.netrunner.model.game.factories.GroundFactory -import tdt4240.netrunner.model.game.factories.PlatformFactory +import tdt4240.netrunner.model.game.factories.PowerupFactory import tdt4240.netrunner.model.util.Vec2f import tdt4240.netrunner.server.game.GameRoom -import java.util.Random +import java.util.* import kotlin.math.roundToInt class WorldGen(val room: GameRoom) { - private val rand = Random() - fun genGround(length: Int) : List<Entity> { + fun genWorld(length: Int) : List<Entity> { + val entities = mutableListOf<Entity>() + val randSpeed = 0.5f + val random = Random() + fun rand(from: Int, to: Int) : Int { + return random.nextInt(to - from) + from + } + val randNum = rand(0,1) + if(randNum == 0){ + val randSpeed = 1.5f + } + for (i in -3..(length / GroundComponent.MAX_WIDTH).roundToInt() + 2) { entities.add(GroundFactory() .withStartPos(Vec2f(i * GroundComponent.MAX_WIDTH, BASE_HEIGHT)) .withEndPos(Vec2f((i + 1) * GroundComponent.MAX_WIDTH, BASE_HEIGHT)) .build() ) + + //entities.add(PowerupFactory() + // .withPos(entities[entities.size-1].getComponent(GroundComponent::class.java)!!.startPos) + //.withSpeedModifier(randSpeed) //TODO fix random speed + //.build() + //) } var x = 500f @@ -35,6 +51,11 @@ class WorldGen(val room: GameRoom) { x += rand.nextInt(200, 5000) } + entities.add(PowerupFactory() + .withPos(Vec2f(140f, 300f)) + .withSpeedModifier(randSpeed) //TODO fix random speed + .build() + ) return entities } diff --git a/server/src/main/java/tdt4240/netrunner/game/controllers/powerupSpeedController.kt b/server/src/main/java/tdt4240/netrunner/game/controllers/powerupSpeedController.kt new file mode 100644 index 0000000000000000000000000000000000000000..ea7b8ff4e0b836d79ca55a5de156c6e68ddc0e62 --- /dev/null +++ b/server/src/main/java/tdt4240/netrunner/game/controllers/powerupSpeedController.kt @@ -0,0 +1,58 @@ +package tdt4240.netrunner.game.controllers + +import tdt4240.netrunner.model.game.EcsController +import tdt4240.netrunner.model.game.EcsEngine +import tdt4240.netrunner.model.game.components.dynamic.PositionComponent +import tdt4240.netrunner.model.game.components.dynamic.VelocityComponent +import tdt4240.netrunner.model.game.components.living.PlayerComponent +import tdt4240.netrunner.model.game.components.powerups.PowerupComponent + +class powerupSpeedController(ecs: EcsEngine) : EcsController(ecs) { + override fun tick(delta: Double) { + + super.tick(delta) + + val players = super.ecs.getEntitiesByComponent(PlayerComponent::class.java) + val powerups = super.ecs.getEntitiesByComponent(PowerupComponent::class.java) + + val PLAYER_HEIGHT = 125f //TODO fix + val PLAYER_WIDTH = 100f + + + for (player in players){ + for (powerup in powerups){ + val powerupComponent = powerup.getComponent(PowerupComponent::class.java)!! + println(powerupComponent.consumed) + if(powerupComponent.consumed){ + continue + } + player.getComponent(PositionComponent::class.java).also { pos -> + powerup.getComponent(PositionComponent::class.java).also { powerupPos -> + if (pos == null || powerupPos == null) { + throw RuntimeException("Misconfiguration") + } + powerupComponent.consumed = false + if ( + !(pos.pos.x + PLAYER_WIDTH < powerupPos.pos.x + || pos.pos.x > powerupPos.pos.x + PowerupComponent.WIDTH + || pos.pos.y + PLAYER_HEIGHT < powerupPos.pos.y + || pos.pos.y > powerupPos.pos.y + PowerupComponent.HEIGHT) + + ){ + val playerVelocity = player.getComponent(VelocityComponent::class.java)!! + + powerupComponent.consumed = true + playerVelocity.velocity *= powerupComponent.speedModifier + //TODO add timeout functionality + } + } + + } + } + } + super.ecs.entities.removeIf{entity-> + val component = entity.getComponent(PowerupComponent::class.java) + component?.consumed ?: false + } + } +} diff --git a/server/src/main/java/tdt4240/netrunner/server/game/GameRoom.kt b/server/src/main/java/tdt4240/netrunner/server/game/GameRoom.kt index 2a77bc33dc45ce7a2b54a82e2a21fb315ea57afe..926784b7fd1ac7314502684a7fbb80dbc527dbe6 100644 --- a/server/src/main/java/tdt4240/netrunner/server/game/GameRoom.kt +++ b/server/src/main/java/tdt4240/netrunner/server/game/GameRoom.kt @@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory import tdt4240.netrunner.game.WorldGen import tdt4240.netrunner.game.controllers.GravityController import tdt4240.netrunner.game.controllers.MovementController +import tdt4240.netrunner.game.controllers.powerupSpeedController import tdt4240.netrunner.model.game.EcsEngine import tdt4240.netrunner.model.game.Entity import tdt4240.netrunner.model.game.components.dynamic.VelocityComponent @@ -32,7 +33,7 @@ class GameRoom(val socketRoomID: String, val server: SocketIoServer, val control val createdAt = System.currentTimeMillis() val players = ConcurrentHashMap<String, Entity>() val ecs = EcsEngine().also { - it.entities.addAll(gen.genGround(STANDARD_FIELD_LENGTH)) + it.entities.addAll(gen.genWorld(STANDARD_FIELD_LENGTH)) } var started = false private set @@ -42,6 +43,7 @@ class GameRoom(val socketRoomID: String, val server: SocketIoServer, val control init { ecs.addController(MovementController(ecs)) ecs.addController(GravityController(ecs)) + ecs.addController(powerupSpeedController(ecs)) logger.info("New room created. ID: ${socketRoomID}") }