door manual operation

This commit is contained in:
minjaesong
2022-08-30 14:43:14 +09:00
parent 2e0f55567f
commit b043f0df95

View File

@@ -1,5 +1,6 @@
package net.torvald.terrarum.modulebasegame.gameactors package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.Gdx
import net.torvald.gdx.graphics.Cvec import net.torvald.gdx.graphics.Cvec
import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.spriteanimation.SheetSpriteAnimation
import net.torvald.terrarum.* import net.torvald.terrarum.*
@@ -8,6 +9,7 @@ import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED
import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.gameactors.* import net.torvald.terrarum.gameactors.*
import net.torvald.terrarum.gameitems.mouseInInteractableRange
import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import org.dyn4j.geometry.Vector2 import org.dyn4j.geometry.Vector2
@@ -151,36 +153,39 @@ open class FixtureSwingingDoorBase : FixtureBase, Luminous {
} }
open protected fun closeDoor() { open protected fun closeDoor(doorHandler: Int) {
if (doorState != 0) { if (doorState != 0) {
(sprite!! as SheetSpriteAnimation).currentRow = 0 (sprite!! as SheetSpriteAnimation).currentRow = 0
doorState = 0 doorState = 0
placeActorBlocks() placeActorBlocks()
lastDoorHandler = doorHandler
} }
doorCloseQueued = false doorCloseQueued = false
} }
open protected fun openToRight() { open protected fun openToRight(doorHandler: Int) {
if (doorState != 1) { if (doorState != 1) {
(sprite!! as SheetSpriteAnimation).currentRow = 1 (sprite!! as SheetSpriteAnimation).currentRow = 1
doorState = 1 doorState = 1
placeActorBlocks() placeActorBlocks()
lastDoorHandler = doorHandler
} }
doorCloseQueued = false doorCloseQueued = false
} }
open protected fun openToLeft() { open protected fun openToLeft(doorHandler: Int) {
if (doorState != -1) { if (doorState != -1) {
(sprite!! as SheetSpriteAnimation).currentRow = 2 (sprite!! as SheetSpriteAnimation).currentRow = 2
doorState = -1 doorState = -1
placeActorBlocks() placeActorBlocks()
lastDoorHandler = doorHandler
} }
doorCloseQueued = false doorCloseQueued = false
} }
override fun placeActorBlocks() { override fun placeActorBlocks() {
forEachBlockbox { x, y, ox, oy -> forEachBlockbox { x, y, ox, oy ->
printdbg(this, "placeActorBlocks xy=$x,$y oxy=$ox,$oy") // printdbg(this, "placeActorBlocks xy=$x,$y oxy=$ox,$oy")
val tile = when (doorState) { val tile = when (doorState) {
// CLOSED -- // CLOSED --
@@ -257,11 +262,16 @@ open class FixtureSwingingDoorBase : FixtureBase, Luminous {
private var doorCloseQueueTimer = 0f private var doorCloseQueueTimer = 0f
private var doorCloseQueued = false private var doorCloseQueued = false
private fun queueDoorClosing() { private fun queueDoorClosing(doorHandler: Int) {
doorCloseQueueTimer = 0f doorCloseQueueTimer = 0f
doorCloseQueued = true doorCloseQueued = true
doorCloseQueueHandler = doorHandler
} }
private var oldStateBeforeMouseDown = 0
private var lastDoorHandler = 0 // 0: automatic, 1: manual
private var doorCloseQueueHandler = 0
override fun update(delta: Float) { override fun update(delta: Float) {
super.update(delta) super.update(delta)
@@ -279,14 +289,41 @@ open class FixtureSwingingDoorBase : FixtureBase, Luminous {
if (!flagDespawn && worldBlockPos != null) { if (!flagDespawn && worldBlockPos != null) {
// delayed auto closing // delayed auto closing
if (doorCloseQueued && doorCloseQueueTimer >= doorOpenedHoldLength) { if (doorCloseQueued && doorCloseQueueTimer >= doorOpenedHoldLength) {
closeDoor() closeDoor(doorCloseQueueHandler)
} }
else if (doorCloseQueued) { else if (doorCloseQueued) {
doorCloseQueueTimer += delta doorCloseQueueTimer += delta
} }
// manual opening/closing
if (mouseUp && Gdx.input.isButtonPressed(App.getConfigInt("config_mousesecondary"))) {
INGAME.actorNowPlaying?.let { player ->
mouseInInteractableRange(player) {
// keep opened/closed as long as the mouse is down
if (doorStateTimer != 0f) {
oldStateBeforeMouseDown = doorState
}
if (oldStateBeforeMouseDown == 0) {
if (mouseOnLeftSide())
openToLeft(1)
else if (mouseOnRightSide())
openToRight(1)
}
else {
closeDoor(1)
}
doorStateTimer = 0f
0L
}
}
}
// automatic opening/closing // automatic opening/closing
if (doorStateTimer > doorHoldLength[doorState]!!) { else if (doorStateTimer > doorHoldLength[doorState]!!) {
val actors = INGAME.actorContainerActive.filterIsInstance<ActorWithBody>() val actors = INGAME.actorContainerActive.filterIsInstance<ActorWithBody>()
// auto opening and closing // auto opening and closing
@@ -332,19 +369,20 @@ open class FixtureSwingingDoorBase : FixtureBase, Luminous {
} }
else { else {
if (actor.ontheLeftSideOfDoor() && actor.movingTowardsRight()) { if (actor.ontheLeftSideOfDoor() && actor.movingTowardsRight()) {
openToRight() openToRight(0)
nobodyIsThere = false nobodyIsThere = false
break break
} }
else if (actor.ontheRightSideOfDoor() && actor.movingTowardsLeft()) { else if (actor.ontheRightSideOfDoor() && actor.movingTowardsLeft()) {
openToLeft() openToLeft(0)
nobodyIsThere = false nobodyIsThere = false
break break
} }
} }
} }
if (nobodyIsThere && !doorCloseQueued && doorState != 0) { // close only when the door was automatically opened
queueDoorClosing() if (nobodyIsThere && !doorCloseQueued && doorState != 0 && lastDoorHandler == 0) {
queueDoorClosing(0)
} }
if (oldState != doorState) doorStateTimer = 0f if (oldState != doorState) doorStateTimer = 0f