mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-10 00:43:14 +00:00
/obj/effects is now /obj/effect. /obj/station_objects is now /obj/structure. Did a bit of minor blob work. The Bay 12 body bags were replaced with closets because having two sets of code that do almost the same thing is silly. Changed back a few of the last jobproc edits as the remove from list before assign was a check to see if the mob was fucked up and if it was remove it so we did not check it again as it would still be fucked up. The medbay/tox monkeys names are random once more. More random name monkeys will help with changeling and clean up the observe/mob menus. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2324 316c924e-a436-60f5-8080-3fe189b3f50e
332 lines
8.0 KiB
Plaintext
332 lines
8.0 KiB
Plaintext
/mob/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
|
if(air_group || (height==0)) return 1
|
|
|
|
if(ismob(mover))
|
|
var/mob/moving_mob = mover
|
|
if ((other_mobs && moving_mob.other_mobs))
|
|
return 1
|
|
return (!mover.density || !density || lying)
|
|
else
|
|
return (!mover.density || !density || lying)
|
|
return
|
|
|
|
|
|
/client/North()
|
|
..()
|
|
|
|
/client/South()
|
|
..()
|
|
|
|
/client/West()
|
|
..()
|
|
|
|
/client/East()
|
|
..()
|
|
|
|
/client/Northeast()
|
|
if(istype(mob, /mob/living/carbon))
|
|
mob:swap_hand()
|
|
return
|
|
|
|
/client/Southeast()
|
|
var/obj/item/weapon/W = mob.equipped()
|
|
if (W)
|
|
W.attack_self(mob)
|
|
return
|
|
|
|
/client/Southwest()
|
|
if(!istype(mob, /mob/living/carbon)) return
|
|
if((mob.stat || mob.restrained()) || !(isturf(mob.loc))) return
|
|
mob:toggle_throw_mode()
|
|
return
|
|
|
|
/client/Northwest()
|
|
if(!isrobot(mob))
|
|
mob.drop_item_v()
|
|
return
|
|
|
|
/client/Center()
|
|
if (isobj(mob.loc))
|
|
var/obj/O = mob.loc
|
|
if (mob.canmove)
|
|
return O.relaymove(mob, 16)
|
|
return
|
|
|
|
|
|
/atom/movable/Move(NewLoc, direct)
|
|
if (direct & direct - 1)
|
|
if (direct & 1)
|
|
if (direct & 4)
|
|
if (step(src, NORTH))
|
|
step(src, EAST)
|
|
else
|
|
if (step(src, EAST))
|
|
step(src, NORTH)
|
|
else
|
|
if (direct & 8)
|
|
if (step(src, NORTH))
|
|
step(src, WEST)
|
|
else
|
|
if (step(src, WEST))
|
|
step(src, NORTH)
|
|
else
|
|
if (direct & 2)
|
|
if (direct & 4)
|
|
if (step(src, SOUTH))
|
|
step(src, EAST)
|
|
else
|
|
if (step(src, EAST))
|
|
step(src, SOUTH)
|
|
else
|
|
if (direct & 8)
|
|
if (step(src, SOUTH))
|
|
step(src, WEST)
|
|
else
|
|
if (step(src, WEST))
|
|
step(src, SOUTH)
|
|
else
|
|
. = ..()
|
|
return
|
|
|
|
|
|
/client/proc/Move_object(direct)
|
|
if(mob.control_object.density)
|
|
step(mob.control_object,direct)
|
|
mob.control_object.dir = direct
|
|
else
|
|
mob.control_object.loc = get_step(mob.control_object,direct)
|
|
return
|
|
|
|
/client/Move(n, direct)
|
|
if(mob.control_object) Move_object(direct)
|
|
|
|
if(isobserver(mob)) return mob.Move(n,direct)
|
|
|
|
if(moving) return 0
|
|
|
|
if(world.time < move_delay) return
|
|
|
|
if(!mob) return
|
|
|
|
if(mob.stat==2) return
|
|
|
|
if(isAI(mob)) return AIMove(n,direct,mob)
|
|
|
|
if(mob.monkeyizing) return//This is sota the goto stop mobs from moving var
|
|
|
|
if(mob.incorporeal_move)//Move though walls
|
|
Process_Incorpmove(direct)
|
|
return
|
|
|
|
if(Process_Grab()) return
|
|
if(!mob.canmove) return
|
|
|
|
|
|
if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV))
|
|
if(!mob.Process_Spacemove()) return 0
|
|
|
|
if(isobj(mob.loc) || ismob(mob.loc))//Inside an object, tell it we moved
|
|
var/atom/O = mob.loc
|
|
return O.relaymove(mob, direct)
|
|
|
|
if(isturf(mob.loc))
|
|
|
|
if(mob.restrained())//Why being pulled while cuffed prevents you from moving
|
|
for(var/mob/M in range(mob, 1))
|
|
if(((M.pulling == mob && (!( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, mob.grabbed_by.len)))
|
|
src << "\blue You're restrained! You can't move!"
|
|
return 0
|
|
|
|
move_delay = world.time//set move delay
|
|
switch(mob.m_intent)
|
|
if("run")
|
|
if(mob.drowsyness > 0)
|
|
move_delay += 6
|
|
if(mob.organStructure && mob.organStructure.legs)
|
|
move_delay += mob.organStructure.legs.moveRunDelay
|
|
else
|
|
move_delay += 1
|
|
if("walk")
|
|
if(mob.organStructure && mob.organStructure.legs)
|
|
move_delay += mob.organStructure.legs.moveWalkDelay
|
|
else
|
|
move_delay += 7
|
|
move_delay += mob.movement_delay()
|
|
|
|
//We are now going to move
|
|
moving = 1
|
|
//Something with pulling things
|
|
if(locate(/obj/item/weapon/grab, mob))
|
|
move_delay = max(move_delay, world.time + 7)
|
|
var/list/L = mob.ret_grab()
|
|
if(istype(L, /list))
|
|
if(L.len == 2)
|
|
L -= mob
|
|
var/mob/M = L[1]
|
|
if ((get_dist(mob, M) <= 1 || M.loc == mob.loc))
|
|
var/turf/T = mob.loc
|
|
. = ..()
|
|
if (isturf(M.loc))
|
|
var/diag = get_dir(mob, M)
|
|
if ((diag - 1) & diag)
|
|
else
|
|
diag = null
|
|
if ((get_dist(mob, M) > 1 || diag))
|
|
step(M, get_dir(M.loc, T))
|
|
else
|
|
for(var/mob/M in L)
|
|
M.other_mobs = 1
|
|
if(mob != M)
|
|
M.animate_movement = 3
|
|
for(var/mob/M in L)
|
|
spawn( 0 )
|
|
step(M, direct)
|
|
return
|
|
spawn( 1 )
|
|
M.other_mobs = null
|
|
M.animate_movement = 2
|
|
return
|
|
|
|
else
|
|
if(mob.confused)
|
|
step(mob, pick(cardinal))
|
|
else
|
|
. = ..()
|
|
for(var/obj/effect/speech_bubble/S in range(1, mob))
|
|
if(S.parent == mob)
|
|
S.loc = mob.loc
|
|
moving = 0
|
|
return .
|
|
|
|
return
|
|
|
|
|
|
///Process_Grab()
|
|
///Called by client/Move()
|
|
///Checks to see if you are being grabbed and if so attemps to break it
|
|
/client/proc/Process_Grab()
|
|
if(locate(/obj/item/weapon/grab, locate(/obj/item/weapon/grab, mob.grabbed_by.len)))
|
|
var/list/grabbing = list()
|
|
if(istype(mob.l_hand, /obj/item/weapon/grab))
|
|
var/obj/item/weapon/grab/G = mob.l_hand
|
|
grabbing += G.affecting
|
|
if(istype(mob.r_hand, /obj/item/weapon/grab))
|
|
var/obj/item/weapon/grab/G = mob.r_hand
|
|
grabbing += G.affecting
|
|
for(var/obj/item/weapon/grab/G in mob.grabbed_by)
|
|
if((G.state == 1)&&(!grabbing.Find(G.assailant))) del(G)
|
|
if(G.state == 2)
|
|
move_delay = world.time + 10
|
|
if(!prob(25)) return 1
|
|
mob.visible_message("\red [mob] has broken free of [G.assailant]'s grip!")
|
|
del(G)
|
|
if(G.state == 3)
|
|
move_delay = world.time + 10
|
|
if(!prob(5)) return 1
|
|
mob.visible_message("\red [mob] has broken free of [G.assailant]'s headlock!")
|
|
del(G)
|
|
return 0
|
|
|
|
|
|
///Process_Incorpmove
|
|
///Called by client/Move()
|
|
///Allows mobs to run though walls
|
|
/client/proc/Process_Incorpmove(direct)
|
|
var/turf/mobloc = get_turf(mob)
|
|
switch(mob.incorporeal_move)
|
|
if(1)
|
|
mob.loc = get_step(mob, direct)
|
|
mob.dir = direct
|
|
if(2)
|
|
if(prob(50))
|
|
var/locx
|
|
var/locy
|
|
switch(direct)
|
|
if(NORTH)
|
|
locx = mobloc.x
|
|
locy = (mobloc.y+2)
|
|
if(locy>world.maxy)
|
|
return
|
|
if(SOUTH)
|
|
locx = mobloc.x
|
|
locy = (mobloc.y-2)
|
|
if(locy<1)
|
|
return
|
|
if(EAST)
|
|
locy = mobloc.y
|
|
locx = (mobloc.x+2)
|
|
if(locx>world.maxx)
|
|
return
|
|
if(WEST)
|
|
locy = mobloc.y
|
|
locx = (mobloc.x-2)
|
|
if(locx<1)
|
|
return
|
|
else
|
|
return
|
|
mob.loc = locate(locx,locy,mobloc.z)
|
|
spawn(0)
|
|
var/limit = 2//For only two trailing shadows.
|
|
for(var/turf/T in getline(mobloc, mob.loc))
|
|
spawn(0)
|
|
anim(T,mob,'mob.dmi',,"shadow",,mob.dir)
|
|
limit--
|
|
if(limit<=0) break
|
|
else
|
|
spawn(0)
|
|
anim(mobloc,mob,'mob.dmi',,"shadow",,mob.dir)
|
|
mob.loc = get_step(mob, direct)
|
|
mob.dir = direct
|
|
return 1
|
|
|
|
|
|
///Process_Spacemove
|
|
///Called by /client/Move()
|
|
///For moving in space
|
|
///Return 1 for movement 0 for none
|
|
/mob/proc/Process_Spacemove()
|
|
//First check to see if we can do things
|
|
if(restrained()) return 0
|
|
|
|
var/dense_object = 0
|
|
for(var/turf/simulated/turf in oview(1,src))
|
|
if(istype(turf,/turf/simulated/floor) && !(src.flags & NOGRAV))
|
|
dense_object++
|
|
break
|
|
if((istype(turf,/turf/simulated)) && !(istype(turf,/turf/simulated/floor)))
|
|
dense_object++
|
|
break
|
|
|
|
if(!dense_object && (locate(/obj/structure/lattice) in oview(1, src)))
|
|
dense_object++
|
|
|
|
//Lastly attempt to locate any dense objects we could push off of
|
|
//TODO: If we implement objects drifing in space this needs to really push them
|
|
if(!dense_object)
|
|
for(var/obj/O in oview(1, src))
|
|
if((O) && (O.density))
|
|
dense_object++
|
|
break
|
|
|
|
//Nothing to push off of so end here
|
|
if(!dense_object) return 0
|
|
|
|
//Check to see if we slipped
|
|
if(prob(Process_Spaceslipping(5)))
|
|
src << "\blue <B>You slipped!</B>"
|
|
src.inertia_dir = src.last_move
|
|
step(src, src.inertia_dir)
|
|
return 0
|
|
//If not then we can reset inertia and move
|
|
inertia_dir = 0
|
|
return 1
|
|
|
|
|
|
/mob/proc/Process_Spaceslipping(var/prob_slip = 5)
|
|
//Setup slipage
|
|
//If knocked out we might just hit it and stop. This makes it possible to get dead bodies and such.
|
|
if(stat) prob_slip += 50
|
|
|
|
prob_slip = round(prob_slip)
|
|
return(prob_slip)
|