test: hazards, ladders and one-way platforms
This commit is contained in:
1 parent
207691433c
commit
dd74783ff0
3 files changed
+160
No files matched your search
@@ -0,0 +1,43 @@
|
|||||||
|
from game import constants
|
||||||
|
from tests.support import makeWorld
|
||||||
|
from game.sim.inputCommand import InputCommand
|
||||||
|
|
||||||
|
|
||||||
|
spikeLevel = [
|
||||||
|
" ",
|
||||||
|
" p ",
|
||||||
|
"^^^^^",
|
||||||
|
"XXXXX",
|
||||||
|
]
|
||||||
|
|
||||||
|
safeLevel = [
|
||||||
|
" ",
|
||||||
|
" p ",
|
||||||
|
" ",
|
||||||
|
"XXXXX",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_spikesDamagePlayer():
|
||||||
|
world = makeWorld(spikeLevel)
|
||||||
|
for _ in range(12):
|
||||||
|
world.step(InputCommand())
|
||||||
|
assert world.player.hp <= world.player.maxHp - 2
|
||||||
|
assert world.player.iframes > 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_noHazardKeepsFullHealth():
|
||||||
|
world = makeWorld(safeLevel)
|
||||||
|
for _ in range(12):
|
||||||
|
world.step(InputCommand())
|
||||||
|
assert world.player.hp == world.player.maxHp
|
||||||
|
|
||||||
|
|
||||||
|
def test_iframesPreventDoubleHit():
|
||||||
|
world = makeWorld(spikeLevel)
|
||||||
|
for _ in range(3):
|
||||||
|
world.step(InputCommand())
|
||||||
|
hpAfterFirst = world.player.hp
|
||||||
|
world.step(InputCommand())
|
||||||
|
assert world.player.hp == hpAfterFirst
|
||||||
|
assert world.player.hp < world.player.maxHp
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
|
from game import constants
|
||||||
|
from tests.support import makeWorld
|
||||||
|
from game.sim.inputCommand import InputCommand
|
||||||
|
|
||||||
|
|
||||||
|
ladderLevel = [
|
||||||
|
" H ",
|
||||||
|
" H ",
|
||||||
|
" H ",
|
||||||
|
"XXXXX",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def seatOnLadder(world):
|
||||||
|
world.player.x = 2 * constants.tileSize
|
||||||
|
world.player.y = 2 * constants.tileSize
|
||||||
|
world.player.vy = 0.0
|
||||||
|
|
||||||
|
|
||||||
|
def test_climbLadderReducesHeight():
|
||||||
|
world = makeWorld(ladderLevel)
|
||||||
|
seatOnLadder(world)
|
||||||
|
startY = world.player.y
|
||||||
|
for _ in range(8):
|
||||||
|
world.step(InputCommand(up=True))
|
||||||
|
assert world.player.onLadder
|
||||||
|
assert world.player.y < startY - 6.0
|
||||||
|
|
||||||
|
|
||||||
|
def test_ladderHoverIgnoresGravity():
|
||||||
|
world = makeWorld(ladderLevel)
|
||||||
|
seatOnLadder(world)
|
||||||
|
for _ in range(6):
|
||||||
|
world.step(InputCommand(up=True))
|
||||||
|
restingY = world.player.y
|
||||||
|
for _ in range(6):
|
||||||
|
world.step(InputCommand())
|
||||||
|
assert world.player.y == pytest.approx(restingY, abs=0.5)
|
||||||
|
|
||||||
|
|
||||||
|
def test_leavingLadderTileDropsClimbState():
|
||||||
|
world = makeWorld(ladderLevel)
|
||||||
|
seatOnLadder(world)
|
||||||
|
world.step(InputCommand(up=True))
|
||||||
|
assert world.player.onLadder
|
||||||
|
world.player.x = 0.0
|
||||||
|
world.step(InputCommand())
|
||||||
|
assert not world.player.onLadder
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
|
from game import constants
|
||||||
|
from tests.support import makeWorld
|
||||||
|
from game.sim.inputCommand import InputCommand
|
||||||
|
|
||||||
|
|
||||||
|
def test_landsOnOneWayFromAbove():
|
||||||
|
world = makeWorld([
|
||||||
|
" p ",
|
||||||
|
" ",
|
||||||
|
"======",
|
||||||
|
" ",
|
||||||
|
"XXXXXX",
|
||||||
|
])
|
||||||
|
for _ in range(30):
|
||||||
|
world.step(InputCommand())
|
||||||
|
player = world.player
|
||||||
|
assert player.onGround
|
||||||
|
assert player.bottom == pytest.approx(2 * constants.tileSize)
|
||||||
|
|
||||||
|
|
||||||
|
def test_passesThroughOneWayFromBelow():
|
||||||
|
world = makeWorld([
|
||||||
|
" ",
|
||||||
|
"======",
|
||||||
|
" ",
|
||||||
|
" p ",
|
||||||
|
"XXXXXX",
|
||||||
|
])
|
||||||
|
minY = world.player.y
|
||||||
|
world.step(InputCommand(jump=True, jumpHeld=True))
|
||||||
|
for _ in range(16):
|
||||||
|
world.step(InputCommand(jumpHeld=True))
|
||||||
|
minY = min(minY, world.player.y)
|
||||||
|
assert minY < constants.tileSize
|
||||||
|
|
||||||
|
|
||||||
|
def test_dropThroughOneWay():
|
||||||
|
world = makeWorld([
|
||||||
|
" p ",
|
||||||
|
" ",
|
||||||
|
"======",
|
||||||
|
" ",
|
||||||
|
"XXXXXX",
|
||||||
|
])
|
||||||
|
for _ in range(30):
|
||||||
|
world.step(InputCommand())
|
||||||
|
assert world.player.bottom == pytest.approx(2 * constants.tileSize)
|
||||||
|
for _ in range(30):
|
||||||
|
world.step(InputCommand(down=True, jump=True))
|
||||||
|
assert world.player.bottom == pytest.approx(4 * constants.tileSize)
|
||||||
|
|
||||||
|
|
||||||
|
def test_downWithoutJumpKeepsPlayerOnOneWay():
|
||||||
|
world = makeWorld([
|
||||||
|
" p ",
|
||||||
|
" ",
|
||||||
|
"======",
|
||||||
|
" ",
|
||||||
|
"XXXXXX",
|
||||||
|
])
|
||||||
|
for _ in range(30):
|
||||||
|
world.step(InputCommand())
|
||||||
|
for _ in range(20):
|
||||||
|
world.step(InputCommand(down=True))
|
||||||
|
assert world.player.bottom == pytest.approx(2 * constants.tileSize)
|
||||||
Reference in new issue
Block a user