client
var
list/moveKeys = list("NORTH"=0,"EAST"=0,"SOUTH"=0,"WEST"=0)
moving = 0
verb
northDown()
src.moveKeys["NORTH"] = 1
if(!src.moving)
src.moveLoop()
northUp()
src.moveKeys["NORTH"] = 0
eastDown()
src.moveKeys["EAST"] = 1
if(!src.moving)
src.moveLoop()
eastUp()
src.moveKeys["EAST"] = 0
southDown()
src.moveKeys["SOUTH"] = 1
if(!src.moving)
src.moveLoop()
southUp()
src.moveKeys["SOUTH"] = 0
westDown()
src.moveKeys["WEST"] = 1
if(!src.moving)
src.moveLoop()
westUp()
src.moveKeys["WEST"] = 0
proc
moveLoop()
spawn(0)
src.moving = 1
while(src && src.moving)
var/movement = 0
if(src.moveKeys["NORTH"]) movement |= NORTH
if(src.moveKeys["EAST"]) movement |= EAST
if(src.moveKeys["SOUTH"]) movement |= SOUTH
if(src.moveKeys["WEST"]) movement |= WEST
if(movement)
if(!(step(src.mob,movement)))
if(moveKeys["NORTH"])
movement &= ~NORTH
if(!(step(src.mob,movement)))
movement = NORTH
step(src.mob,movement)
if(moveKeys["SOUTH"])
movement &= ~SOUTH
if(!(step(src.mob,movement)))
movement = SOUTH
step(src.mob,movement)
sleep(world.tick_lag)
else
src.moving = 0
return
Problem description:
Not really a problem. It works as intended. More like a question of whether or not this is the best way to go about it. I will eventually have ways of mobs's movement being hindered through various methods (root, stun, etc), but have not implemented those scenarios yet. Before I get too far into things, I would like to know if there's a more robust way of doing this. I drew inspiration from Nadrew's response here: http://www.byond.com/forum/?post=2143237
I'm just here to point out that you can store key presses using bit flags instead of that list, just like you're setting the movement variable using bit flags later in the movement loop.