Port /tg/ move manager, drift and jetpack components. (#27698)

* Port /tg/ move manager, drift and jetpack components.

* don't add go through newtonian movement if not moved to a turf

* various cleans for blood drifts and mob speed

* fix slow meteors

* why on fuck's earth aren't speedbikes vehicles

* style lint

* also wtf

* okay i'm an idiot

* fix meaty ore speed and blood decal double stepping

* fix not unbuckling pulled object occupants

* don't bother dealing with immovable rods just yet

* exclude bubblegum and vetus from move manager for now

* fix issues related to null weightless blood icons

* reset blood icon state properly

* fuck it, we'll deal with mobs when basic mobs happen

* break infinite loop in decal splat
This commit is contained in:
warriorstar-orion
2025-01-22 22:49:58 +00:00
committed by GitHub
parent 3954981ff2
commit 157276d6cb
105 changed files with 2366 additions and 538 deletions
@@ -114,7 +114,7 @@
switch(current_order)
if(IDLE_AGGRESSIVE)
Find_Enemies(around)
walk(src, 0)
GLOB.move_manager.stop_looping(src)
if(FOLLOW_AGGRESSIVE)
Find_Enemies(around)
for(var/mob/living/carbon/C in around)
@@ -131,7 +131,7 @@
return TRUE
Goto(C, 0.5 SECONDS, 1)
if(IDLE_RETALIATE)
walk(src, 0)
GLOB.move_manager.stop_looping(src)
for(var/mob/living/simple_animal/hostile/poison/giant_spider/hunter/infestation_spider/H in around)
if(faction_check_mob(H) && !attack_same && !H.attack_same)
+1 -1
View File
@@ -234,7 +234,7 @@
/obj/effect/beam/i_beam/update_icon_state()
transform = turn(matrix(), dir2angle(dir))
/obj/effect/beam/i_beam/Process_Spacemove(movement_dir)
/obj/effect/beam/i_beam/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/obj/effect/beam/i_beam/process()
@@ -175,7 +175,7 @@
if(target)
playsound(loc, 'sound/voice/zombie_scream.ogg', 70, TRUE)
/mob/living/simple_animal/hostile/spaceinfected/Move(atom/newloc)
/mob/living/simple_animal/hostile/spaceinfected/Move(atom/newloc, direct = 0, glide_size_override = 0, update_dir = TRUE)
if(ischasm(newloc)) // as this place filled with chasms, they shouldn't randomly fall in while wandering around
return FALSE
return ..()
+2
View File
@@ -18,6 +18,8 @@
/////////
var/datum/preferences/prefs = null
var/skip_antag = FALSE //TRUE when a player declines to be included for the selection process of game mode antagonists.
///The visual delay to use for the current client.Move(), mostly used for making a client based move look like it came from some other slower source
var/visual_delay = 0
var/move_delay = 1
var/moving = null
var/area = null
+3 -18
View File
@@ -308,28 +308,13 @@
user.faction -= "carp"
to_chat(user, "<span class='cult'>A sudden calm fills the gnashing void of your mind- you're alone now.</span>")
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0)
if(..())
return TRUE
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
if(istype(wear_suit, /obj/item/clothing/suit/hooded/carp_costume/dragon))
return TRUE
//Do we have a working jetpack?
var/obj/item/tank/jetpack/thrust
if(istype(back, /obj/item/tank/jetpack))
thrust = back
else if(istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
var/obj/item/clothing/suit/space/hardsuit/C = wear_suit
thrust = C.jetpack
else if(ismodcontrol(back))
var/obj/item/mod/control/C = back
thrust = locate(/obj/item/mod/module/jetpack) in C
if(thrust)
if((movement_dir || thrust.stabilizers) && thrust.allow_thrust(0.01, src))
return TRUE
if(dna.species.spec_Process_Spacemove(src))
return TRUE
return FALSE
return ..()
/obj/item/clothing/head/hooded/carp_hood/dragon
name = "space carp hood"
+1 -1
View File
@@ -44,7 +44,7 @@
H.color = COLOR_BLACK
adjustHealth(-maxHealth * 0.0125)
/mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
// Use any nearby blob structures to allow space moves.
for(var/obj/structure/blob/B in range(1, src))
return TRUE
+2 -2
View File
@@ -42,7 +42,7 @@
var/turf/start = pick_edge_loc(startside, level_name_to_num(MAIN_STATION))
forceMove(start)
goal = pick_edge_loc(REVERSE_DIR(startside), level_name_to_num(MAIN_STATION))
walk_towards(src, goal, 1)
GLOB.move_manager.home_onto(src, goal, 1)
/obj/effect/space_dust/Bump(atom/A)
if(QDELETED(src))
@@ -64,7 +64,7 @@
life--
if(life <= 0)
walk(src, 0)
GLOB.move_manager.stop_looping(src)
on_shatter(where)
qdel(src)
+3
View File
@@ -37,3 +37,6 @@
explosion(where, 0, pick(0,1), pick(2,3), 0)
else
new /mob/living/simple_animal/cow(where)
/obj/effect/space_dust/meaty/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
+6
View File
@@ -21,3 +21,9 @@
active_keybindings[linked_bind.binded_to] += list(linked_bind)
return active_keybindings
/client/proc/calculate_move_dir()
. = NONE
for(var/held_key in input_data.keys_held)
if(held_key in movement_kb_dirs)
. |= movement_kb_dirs[held_key]
@@ -290,7 +290,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
// Ghosts have no momentum, being massless ectoplasm
/mob/dead/observer/Process_Spacemove(movement_dir)
/mob/dead/observer/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1
/mob/dead/observer/Move(NewLoc, direct)
@@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -11)
AddElement(/datum/element/strippable, GLOB.strippable_alien_humanoid_items)
/mob/living/carbon/alien/humanoid/Process_Spacemove(check_drift = 0)
/mob/living/carbon/alien/humanoid/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
if(..())
return TRUE
return FALSE
@@ -532,7 +532,7 @@ emp_act
bloody = TRUE
var/turf/location = loc
if(issimulatedturf(location))
add_splatter_floor(location, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null)
add_splatter_floor(location, emittor_intertia = last_movement_dir)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood
+8 -8
View File
@@ -213,8 +213,8 @@
var/current_dir
if(isliving(AM))
current_dir = AM.dir
if(step(AM, t))
step(src, t)
if(AM.Move(get_step(AM.loc, t), t, glide_size))
Move(get_step(loc, t), t)
if(current_dir)
AM.setDir(current_dir)
now_pushing = FALSE
@@ -598,7 +598,7 @@
return
return ..()
/mob/living/Move(atom/newloc, direct, movetime)
/mob/living/Move(atom/newloc, direct = 0, glide_size_override = 0, update_dir = TRUE)
if(buckled && buckled.loc != newloc) //not updating position
if(!buckled.anchored)
return buckled.Move(newloc, direct)
@@ -618,12 +618,12 @@
. = ..()
if(.)
step_count++
pull_pulled(old_loc, pullee, movetime)
pull_pulled(old_loc, pullee, glide_size_override)
if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents) first so we hopefully don't have to call get_turf() so much.
s_active.close(src)
/mob/living/proc/pull_pulled(turf/dest, atom/movable/pullee, movetime)
/mob/living/proc/pull_pulled(turf/dest, atom/movable/pullee, glide_size_override)
if(pulling && pulling == pullee) // we were pulling a thing and didn't lose it during our move.
if(pulling.anchored)
stop_pulling()
@@ -635,7 +635,7 @@
var/mob/living/M = pulling
if(IS_HORIZONTAL(M) && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth))) // So once you reach 50 brute damage you hit 100% chance to leave a blood trail for every tile you're pulled
M.makeTrail(dest)
pulling.Move(dest, get_dir(pulling, dest), movetime) // the pullee tries to reach our previous position
pulling.Move(dest, get_dir(pulling, dest), glide_size_override) // the pullee tries to reach our previous position
if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up
stop_pulling()
@@ -1173,10 +1173,10 @@
return
return ..()
/mob/living/Moved(OldLoc, Dir, Forced = FALSE)
/mob/living/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
. = ..()
for(var/obj/O in src)
O.on_mob_move(Dir, src)
O.on_mob_move(movement_dir, src)
/// Can a mob interact with the apc remotely like a pulse demon, cyborg, or AI?
/mob/living/proc/can_remote_apc_interface(obj/machinery/power/apc/ourapc)
@@ -1,4 +1,4 @@
/mob/living/silicon/robot/Process_Spacemove(movement_dir = 0)
/mob/living/silicon/robot/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
if(ionpulse())
return TRUE
if(..())
@@ -163,13 +163,13 @@
lost_target = FALSE
last_target_location = get_turf(target)
var/dist = get_dist(src, target)
walk_to(src, target, 1, 4)
GLOB.move_manager.move_to(src, target, 1, 4)
if(get_dist(src, target) >= dist)
frustration++
return
if(!lost_target)
walk_to(src, 0)
GLOB.move_manager.stop_looping(src)
lost_target = TRUE
frustration = 0
@@ -97,7 +97,7 @@
oldtarget_name = null
anchored = FALSE
currently_cuffing = FALSE
walk_to(src,0)
GLOB.move_manager.stop_looping(src)
set_path(null)
last_found = world.time
set_weapon()
@@ -216,7 +216,7 @@
if(lasertag_check)
icon_state = "[lasercolor]ed2090"
disabled = TRUE
walk_to(src, 0)
GLOB.move_manager.stop_looping(src)
target = null
addtimer(CALLBACK(src, PROC_REF(unset_disabled)), 10 SECONDS)
return TRUE
@@ -260,7 +260,7 @@
switch(mode)
if(BOT_IDLE) // idle
walk_to(src,0)
GLOB.move_manager.stop_looping(src)
set_path(null)
if(!lasercolor) //lasertag bots don't want to arrest anyone
if(find_new_target())
@@ -271,7 +271,7 @@
if(BOT_HUNT) // hunting for perp
// if can't reach perp for long enough, go idle
if(frustration >= 8)
walk_to(src, 0)
GLOB.move_manager.stop_looping(src)
set_path(null)
back_to_idle()
return
@@ -395,7 +395,7 @@
return 0
/mob/living/simple_animal/bot/ed209/explode()
walk_to(src,0)
GLOB.move_manager.stop_looping(src)
visible_message("<span class='userdanger'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
@@ -110,7 +110,7 @@
switch(mode)
if(BOT_IDLE) // idle
icon_state = "griefsky1"
walk_to(src,0)
GLOB.move_manager.stop_looping(src)
set_path(null)
if(find_new_target())
return // see if any criminals are in range
@@ -120,7 +120,7 @@
icon_state = spin_icon
playsound(loc,'sound/effects/spinsabre.ogg',50, TRUE,-1)
if(frustration >= frustration_number) // general beepsky doesn't give up so easily, jedi scum
walk_to(src,0)
GLOB.move_manager.stop_looping(src)
set_path(null)
back_to_idle()
return
@@ -182,7 +182,7 @@
return FALSE
/mob/living/simple_animal/bot/secbot/griefsky/explode()
walk_to(src,0)
GLOB.move_manager.stop_looping(src)
visible_message("<span class='boldannounceic'>[src] lets out a huge cough as it blows apart!</span>")
var/turf/Tsec = get_turf(src)
new /obj/item/assembly/prox_sensor(Tsec)
@@ -61,7 +61,7 @@
target = null
oldtarget_name = null
anchored = FALSE
walk_to(src, 0)
GLOB.move_manager.stop_looping(src)
last_found = world.time
spam_flag = FALSE
@@ -266,7 +266,7 @@
return
switch(mode)
if(BOT_IDLE) // idle
walk_to(src, 0)
GLOB.move_manager.stop_looping(src)
if(find_new_target())
return
if(!mode && auto_patrol)
@@ -274,7 +274,7 @@
if(BOT_HUNT)
// if can't reach perp for long enough, go idle
if(frustration >= 5) //gives up easier than beepsky
walk_to(src, 0)
GLOB.move_manager.stop_looping(src)
playsound(loc, 'sound/misc/sadtrombone.ogg', 25, TRUE, -1)
back_to_idle()
return
@@ -358,7 +358,7 @@
return FALSE
/mob/living/simple_animal/bot/honkbot/explode() //doesn't drop cardboard nor its assembly, since its a very frail material.
walk_to(src, 0)
GLOB.move_manager.stop_looping(src)
visible_message("<span class='boldannounceic'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
new /obj/item/bikehorn(Tsec)
@@ -120,7 +120,7 @@
target = null
oldtarget_name = null
anchored = FALSE
walk_to(src,0)
GLOB.move_manager.stop_looping(src)
set_path(null)
last_found = world.time
@@ -315,7 +315,7 @@
switch(mode)
if(BOT_IDLE) // idle
walk_to(src, 0)
GLOB.move_manager.stop_looping(src)
set_path(null)
if(find_new_target()) // see if any criminals are in range
return
@@ -326,7 +326,7 @@
// if can't reach perp for long enough, go idle
if(frustration >= 8)
playsound(loc, 'sound/machines/buzz-two.ogg', 25, FALSE)
walk_to(src, 0)
GLOB.move_manager.stop_looping(src)
set_path(null)
back_to_idle()
return
@@ -441,7 +441,7 @@
/mob/living/simple_animal/bot/secbot/explode()
walk_to(src,0)
GLOB.move_manager.stop_looping(src)
visible_message("<span class='userdanger'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/obj/item/secbot_assembly/Sa = new /obj/item/secbot_assembly(Tsec)
@@ -89,7 +89,7 @@
saved_turf = current_turf
switch(mode)
if(BOT_IDLE)
walk_to(src,0)
GLOB.move_manager.stop_looping(src)
set_path(null)
if(find_new_target())
return
@@ -98,7 +98,7 @@
if(BOT_HUNT)
if(frustration >= 8)
walk_to(src,0)
GLOB.move_manager.stop_looping(src)
set_path(null)
back_to_idle()
return
@@ -165,7 +165,7 @@
if(!QDELETED(src))
if(depotarea)
depotarea.list_remove(src, depotarea.guard_list)
walk_to(src,0)
GLOB.move_manager.stop_looping(src)
visible_message("<span class='userdanger'>[src] blows apart!</span>")
do_sparks(3, 1, src)
new /obj/effect/decal/cleanable/blood/oil(loc)
@@ -195,7 +195,7 @@
/mob/living/simple_animal/bot/ed209/syndicate/speak()
return
/mob/living/simple_animal/bot/ed209/syndicate/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/bot/ed209/syndicate/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1
/mob/living/simple_animal/bot/ed209/syndicate/start_patrol()
@@ -318,7 +318,7 @@
Bring those who still cling to this world of illusion back to the master so they may know Truth.</B>"
/mob/living/simple_animal/hostile/construct/harvester/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/construct/harvester/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
@@ -157,7 +157,7 @@
turns_since_scan++
if(turns_since_scan > 5)
walk(src, 0)
GLOB.move_manager.stop_looping(src)
turns_since_scan = 0
if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc)))
movement_target = null
@@ -172,7 +172,7 @@
break
if(movement_target)
stop_automated_movement = TRUE
walk(src, movement_target, 0, 3)
GLOB.move_manager.move_to(src, movement_target, 0, 3)
/mob/living/simple_animal/pet/cat/proc_cat
name = "Proc"
@@ -534,7 +534,7 @@
minbodytemp = TCMB
maxbodytemp = T0C + 40
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1 //Void puppies can navigate space.
//LISA! SQUEEEEEEEEE~
@@ -41,7 +41,7 @@
if(istype(L))
faction += "\ref[L]"
/mob/living/simple_animal/hostile/scarybat/Process_Spacemove(check_drift = 0)
/mob/living/simple_animal/hostile/scarybat/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return ..() //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/scarybat/AttackingTarget()
@@ -36,7 +36,7 @@
gold_core_spawnable = HOSTILE_SPAWN
footstep_type = FOOTSTEP_MOB_CLAW
/mob/living/simple_animal/hostile/bear/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/bear/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE //No drifting in space for space bears!
/mob/living/simple_animal/hostile/bear/black
@@ -56,7 +56,7 @@
var/static/beehometypecache = typecacheof(/obj/structure/beebox)
var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics)
/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/mob/living/simple_animal/hostile/poison/bees/Initialize(mapload)
@@ -92,7 +92,7 @@
base_dead_overlay.appearance_flags = RESET_COLOR
add_overlay(base_dead_overlay)
/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/carp/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/carp/AttackingTarget()
@@ -34,7 +34,7 @@
/mob/living/simple_animal/hostile/deathsquid/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/deathsquid/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1 //copypasta from carp code
/mob/living/simple_animal/hostile/deathsquid/ex_act(severity)
@@ -45,7 +45,7 @@
/obj/effect/gibspawner/generic,
/obj/effect/gibspawner/generic)
/mob/living/simple_animal/hostile/drakehound_breacher/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/drakehound_breacher/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/mob/living/simple_animal/hostile/drakehound_breacher/ListTargetsLazy()
@@ -30,5 +30,5 @@
gold_core_spawnable = HOSTILE_SPAWN
footstep_type = FOOTSTEP_MOB_SHOE
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1
@@ -422,7 +422,7 @@ Difficulty: Medium
if(!swooping)
..()
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1
/obj/effect/temp_visual/lava_warning
@@ -188,7 +188,7 @@ Difficulty: Medium
var/armor = M.run_armor_check(limb_to_hit, LASER)
M.apply_damage(70 - ((health / maxHealth) * 20), BURN, limb_to_hit, armor)
/mob/living/simple_animal/hostile/megafauna/legion/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/megafauna/legion/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1
/mob/living/simple_animal/hostile/megafauna/legion/adjustHealth(amount, updating_health = TRUE)
@@ -49,7 +49,7 @@
/obj/effect/gibspawner/generic,
/obj/effect/gibspawner/generic)
/mob/living/simple_animal/hostile/pirate/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/pirate/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/mob/living/simple_animal/hostile/pirate/ListTargetsLazy()
@@ -43,7 +43,7 @@
if(!has_gravity(T))
new /obj/effect/particle_effect/ion_trails(T, _dir)
/mob/living/simple_animal/hostile/malf_drone/Process_Spacemove(check_drift = 0)
/mob/living/simple_animal/hostile/malf_drone/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1
/mob/living/simple_animal/hostile/malf_drone/ListTargets()
@@ -85,7 +85,7 @@
icon_living = "koi[koinum]"
icon_dead = "koi[koinum]-dead"
/mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(movement_dir)
/mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/mob/living/simple_animal/hostile/retaliate/carp/koi/honk
@@ -37,7 +37,7 @@
initial_traits = list(TRAIT_FLYING)
/mob/living/simple_animal/hostile/retaliate/ghost/Process_Spacemove(check_drift = 0)
/mob/living/simple_animal/hostile/retaliate/ghost/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1
/mob/living/simple_animal/hostile/retaliate/ghost/Life(seconds, times_fired)
@@ -92,7 +92,7 @@
deathmessage = null
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/retaliate/skeleton/warden/Process_Spacemove(movement_dir)
/mob/living/simple_animal/hostile/retaliate/skeleton/warden/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/mob/living/simple_animal/hostile/skeleton/angered_warden
@@ -113,7 +113,7 @@
loot = list(/obj/effect/decal/remains/human, /obj/item/clothing/head/warden, /obj/item/card/sec_shuttle_ruin)
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/skeleton/angered_warden/Process_Spacemove(movement_dir)
/mob/living/simple_animal/hostile/skeleton/angered_warden/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/mob/living/simple_animal/hostile/retaliate/zombie
@@ -283,7 +283,7 @@
alert_on_shield_breach = TRUE
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatequartermaster, /obj/effect/decal/cleanable/blood/innards, /obj/effect/decal/cleanable/blood, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic)
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE // he should be able to chase us in space
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize(mapload)
@@ -334,7 +334,7 @@
alert_on_timeout = FALSE // So random fauna doesn't make depot explode.
loot = list() // Explodes, doesn't drop loot.
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/death()
@@ -357,7 +357,7 @@
/obj/effect/gibspawner/generic,
/obj/effect/gibspawner/generic)
/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/mob/living/simple_animal/hostile/syndicate/ranged
@@ -384,7 +384,7 @@
/obj/effect/gibspawner/generic)
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/mob/living/simple_animal/hostile/syndicate/ranged/space/autogib
@@ -257,7 +257,7 @@
busy = SPINNING_COCOON
visible_message("<span class='notice'>[src] begins to secrete a sticky substance around [cocoon_target].</span>")
stop_automated_movement = TRUE
walk(src,0)
GLOB.move_manager.stop_looping(src)
if(do_after(src, 40, target = cocoon_target.loc))
if(busy == SPINNING_COCOON)
if(cocoon_target && isturf(cocoon_target.loc) && get_dist(src,cocoon_target) <= 1)
@@ -150,7 +150,7 @@
new_area.Entered(src)
else
frustration++
walk_to(src, entry_vent, 1)
GLOB.move_manager.move_to(src, entry_vent, 1)
if(frustration > 2)
entry_vent = null
else if(prob(33))
@@ -165,7 +165,7 @@
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
if(!v.welded)
entry_vent = v
walk_to(src, entry_vent, 1)
GLOB.move_manager.move_to(src, entry_vent, 1)
break
@@ -48,7 +48,7 @@
new /obj/item/organ/internal/body_egg/terror_eggs(L)
if(!ckey)
LoseTarget()
walk_away(src,L,2,1)
GLOB.move_manager.move_away(src,L,2,1)
/proc/IsTSInfected(mob/living/carbon/C) // Terror AI requires this
if(C.get_int_organ(/obj/item/organ/internal/body_egg))
@@ -40,7 +40,7 @@
else
..()
/mob/living/simple_animal/shade/Process_Spacemove()
/mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/mob/living/simple_animal/shade/holy
@@ -167,7 +167,7 @@
/mob/living/simple_animal/Destroy()
/// We need to clear the reference to where we're walking to properly GC
walk_to(src, 0)
GLOB.move_manager.stop_looping(src)
QDEL_NULL(pcollar)
for(var/datum/action/innate/hide/hide in actions)
hide.Remove(src)
@@ -627,7 +627,7 @@
/mob/living/simple_animal/Login()
..()
walk(src, 0) // if mob is moving under ai control, then stop AI movement
GLOB.move_manager.stop_looping(src) // if mob is moving under ai control, then stop AI movement
/mob/living/simple_animal/proc/npc_safe(mob/user)
return FALSE
@@ -223,7 +223,7 @@
Atkcool = TRUE
addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS)
/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0)
/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 2
/mob/living/simple_animal/slime/get_status_tab_items()
+13 -7
View File
@@ -47,6 +47,7 @@
affecting.grabbed_by += src
RegisterSignal(affecting, COMSIG_MOVABLE_MOVED, PROC_REF(grab_moved))
RegisterSignal(assailant, COMSIG_MOVABLE_MOVED, PROC_REF(pull_grabbed))
RegisterSignal(assailant, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, PROC_REF(on_update_glide_size))
hud = new /atom/movable/screen/grab(src)
hud.icon_state = "reinforce"
@@ -74,13 +75,21 @@
affecting.grabbed_by -= src
affecting = null
if(assailant)
UnregisterSignal(assailant, COMSIG_MOVABLE_MOVED)
UnregisterSignal(assailant, list(
COMSIG_MOVABLE_MOVED,
COMSIG_MOVABLE_UPDATE_GLIDE_SIZE,
))
if(assailant.client)
assailant.client.screen -= hud
assailant = null
QDEL_NULL(hud)
return ..()
/obj/item/grab/proc/on_update_glide_size(mob/living/grabber, new_size)
if(affecting && grabber == assailant && affecting != assailant)
affecting.set_glide_size(new_size)
/obj/item/grab/proc/pull_grabbed(mob/user, turf/old_turf, direct, forced)
SIGNAL_HANDLER
if(assailant.moving_diagonally == FIRST_DIAG_STEP) //we dont want to do anything in the middle of diagonal step
@@ -88,11 +97,8 @@
if(!assailant.Adjacent(old_turf))
qdel(src)
return
var/list/grab_states_not_moving = list(GRAB_KILL, GRAB_NECK) //states of grab when we dont need affecting to be moved by himself
var/assailant_glide_speed = TICKS2DS(world.icon_size / assailant.glide_size)
if(state in grab_states_not_moving)
affecting.glide_for(assailant_glide_speed)
else if(get_turf(affecting) != old_turf)
if(get_turf(affecting) != old_turf)
var/possible_dest = list()
var/list/mobs_do_not_move = list() // those are mobs we shouldnt move while we're going to new position
var/list/dest_1_sort = list() // just better dest to be picked first
@@ -131,7 +137,7 @@
if(get_turf(affecting) == dest)
success_move = TRUE
continue
if(affecting.Move(dest, get_dir(affecting, dest), assailant_glide_speed))
if(affecting.Move(dest, get_dir(affecting, dest), glide_size))
success_move = TRUE
break
continue
+134 -72
View File
@@ -47,7 +47,7 @@
#define CONFUSION_MAX 80 SECONDS
/client/Move(n, direct)
/client/Move(new_loc, direct)
if(world.time < move_delay)
return
@@ -59,7 +59,7 @@
if(!mob || !mob.loc)
return 0
if(!n || !direct) // why did we never check this before?
if(!new_loc || !direct) // why did we never check this before?
return FALSE
if(mob.notransform)
@@ -72,7 +72,7 @@
return Move_object(direct)
if(!isliving(mob))
return mob.Move(n, direct)
return mob.Move(new_loc, direct)
if(mob.stat == DEAD)
mob.ghostize()
@@ -91,7 +91,7 @@
if(mob.remote_control) //we're controlling something, our movement is relayed to it
return mob.remote_control.relaymove(mob, direct)
if(is_ai(mob))
if(is_ai(mob))
var/mob/living/silicon/ai/ai = mob
var/mob/camera/eye/ai/eye = ai.eyeobj
if(istype(eye) && !istype(ai.remote_control))
@@ -122,6 +122,9 @@
if(!mob.Process_Spacemove(direct))
return 0
if(SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_PRE_MOVE, args) & COMSIG_MOB_CLIENT_BLOCK_PRE_MOVE)
return FALSE
if(mob.restrained()) // Why being pulled while cuffed prevents you from moving
for(var/mob/M in orange(1, mob))
if(M.pulling == mob)
@@ -132,20 +135,28 @@
else
M.stop_pulling()
var/delay = mob.movement_delay()
if(old_move_delay + world.tick_lag > world.time)
move_delay = old_move_delay
else
move_delay = world.time
mob.last_movement = world.time
delay = TICKS2DS(-round(-(DS2TICKS(delay)))) //Rounded to the next tick in equivalent ds
// We are now going to move
var/add_delay = mob.movement_delay()
if(locate(/obj/item/grab, mob))
if(!isalienhunter(mob)) // i hate grab code
delay += 7
add_delay += 7
var/new_glide_size = DELAY_TO_GLIDE_SIZE(add_delay * ((NSCOMPONENT(direct) && EWCOMPONENT(direct)) ? sqrt(2) : 1))
mob.set_glide_size(new_glide_size) // set it now in case of pulled objects
//If the move was recent, count using old_move_delay
//We want fractional behavior and all
if(old_move_delay + world.tick_lag > world.time)
//Yes this makes smooth movement stutter if add_delay is too fractional
//Yes this is better then the alternative
move_delay = old_move_delay
else
move_delay = world.time
//Basically an optional override for our glide size
//Sometimes you want to look like you're moving with a delay you don't actually have yet
visual_delay = 0
if(istype(living_mob))
var/newdir = NONE
@@ -158,7 +169,7 @@
newdir = angle2dir(dir2angle(direct) + pick(45, -45))
if(newdir)
direct = newdir
n = get_step(mob, direct)
new_loc = get_step(mob, direct)
mob.last_movement_dir = direct
@@ -166,18 +177,26 @@
if(mob.pulling)
prev_pulling_loc = mob.pulling.loc
if(!(direct & (direct - 1))) // cardinal direction
. = mob.SelfMove(n, direct, delay)
else // diagonal movements take longer
var/diag_delay = delay * SQRT_2
. = mob.SelfMove(n, direct, diag_delay)
if(mob.loc == n)
. = ..()
if(mob.loc == new_loc)
mob.last_movement = world.time
if(IS_DIR_DIAGONAL(direct))
// only incur the extra delay if the move was *actually* diagonal
// There would be a bit of visual jank if we try to walk diagonally next to a wall
// and the move ends up being cardinal, rather than diagonal,
// but that's better than it being jank on every *successful* diagonal move.
delay = diag_delay
move_delay += delay
add_delay *= sqrt(2)
var/after_glide = 0
if(visual_delay)
after_glide = visual_delay
else
after_glide = DELAY_TO_GLIDE_SIZE(add_delay)
mob.set_glide_size(after_glide)
move_delay += add_delay
if(mob.pulledby)
mob.pulledby.stop_pulling()
@@ -193,9 +212,6 @@
#undef CONFUSION_MAX
/mob/proc/SelfMove(turf/n, direct, movetime)
return Move(n, direct, movetime)
///Process_Grab()
///Called by client/Move()
///Checks to see if you are being grabbed and if so attemps to break it
@@ -303,46 +319,76 @@
return TRUE
///Process_Spacemove
///Called by /client/Move()
///For moving in space
///Return 1 for movement 0 for none
/mob/Process_Spacemove(movement_dir = 0)
/**
* Handles mob/living movement in space (or no gravity)
*
* Called by /client/Move()
*
* return TRUE for movement or FALSE for none
*/
/mob/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
if(..())
return 1
var/atom/movable/backup = get_spacemove_backup(movement_dir)
if(backup)
if(istype(backup) && movement_dir && !backup.anchored)
var/opposite_dir = turn(movement_dir, 180)
if(backup.newtonian_move(opposite_dir)) //You're pushing off something movable, so it moves
to_chat(src, "<span class='notice'>You push off of [backup] to propel yourself.</span>")
return 1
return 0
return TRUE
/mob/get_spacemove_backup(movement_dir)
for(var/A in orange(1, get_turf(src)))
if(isarea(A))
// TODO: if(buckled) may belong here
var/atom/movable/backup = get_spacemove_backup(movement_dir, continuous_move)
if(!backup)
return FALSE
if(continuous_move || !istype(backup) || !movement_dir || backup.anchored)
return TRUE
var/opposite_dir = turn(movement_dir, 180)
if(backup.newtonian_move(opposite_dir)) //You're pushing off something movable, so it moves
to_chat(src, "<span class='notice'>You push off of [backup] to propel yourself.</span>")
return TRUE
/**
* Finds a target near a mob that is viable for pushing off when moving.
* Takes the intended movement direction as input, alongside if the context is checking if we're allowed to continue drifting
*/
/mob/get_spacemove_backup(moving_direction, continuous_move)
for(var/atom/pushover as anything in range(1, get_turf(src)))
if(pushover == src)
continue
else if(isturf(A))
var/turf/turf = A
if(isarea(pushover))
continue
if(isturf(pushover))
var/turf/turf = pushover
if(isspaceturf(turf))
continue
if(!turf.density && !mob_negates_gravity())
continue
return A
else
var/atom/movable/AM = A
if(AM == buckled) //Kind of unnecessary but let's just be sure
continue
if(!AM.CanPass(src) || AM.density)
if(AM.anchored)
return AM
if(pulling == AM)
continue
if(get_turf(AM) == get_step(get_turf(src), movement_dir)) // No pushing off objects in front of you, while simultaneously pushing them fowards to go faster in space.
continue
. = AM
return pushover
var/atom/movable/rebound = pushover
if(rebound == buckled)
continue
if(ismob(rebound))
var/mob/lover = rebound
if(lover.buckled)
continue
var/pass_allowed = rebound.CanPass(src, get_dir(rebound, src))
if(!rebound.density && pass_allowed)
continue
//Sometime this tick, this pushed off something. Doesn't count as a valid pushoff target
if(rebound.last_pushoff == world.time)
continue
if(continuous_move && !pass_allowed)
var/datum/move_loop/move/rebound_engine = GLOB.move_manager.processing_on(rebound, SSspacedrift)
// If you're moving toward it and you're both going the same direction, stop
if(moving_direction == get_dir(src, pushover) && rebound_engine && moving_direction == rebound_engine.direction)
continue
else if(!pass_allowed)
if(moving_direction == get_dir(src, pushover)) // Can't push "off" of something that you're walking into
continue
if(rebound.anchored)
return rebound
if(pulling == rebound)
continue
return rebound
/mob/proc/mob_has_gravity(turf/T)
return has_gravity(src, T)
@@ -350,35 +396,51 @@
/mob/proc/mob_negates_gravity()
return 0
/mob/proc/Move_Pulled(atom/A)
if(HAS_TRAIT(src, TRAIT_CANNOT_PULL) || restrained() || !pulling)
return
if(pulling.anchored || pulling.move_resist > move_force || !pulling.Adjacent(src))
/atom/movable/proc/Move_Pulled(atom/moving_atom)
if(!pulling)
return FALSE
if(pulling.anchored || pulling.move_resist > move_force || !pulling.Adjacent(src, src, pulling))
stop_pulling()
return
return FALSE
if(isliving(pulling))
var/mob/living/L = pulling
if(L.buckled && L.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it
var/mob/living/pulling_mob = pulling
if(pulling_mob.buckled && pulling_mob.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it
stop_pulling()
return
if(A == loc && pulling.density)
return FALSE
if(moving_atom == loc && pulling.density)
return FALSE
var/move_dir = get_dir(pulling.loc, moving_atom)
if(!Process_Spacemove(move_dir))
return FALSE
if(!move_dir)
return FALSE
pulling.Move(get_step(pulling.loc, move_dir), move_dir, glide_size)
return TRUE
/mob/living/Move_Pulled(atom/moving_atom)
. = ..()
if(!. || !isliving(moving_atom))
return
if(!Process_Spacemove(get_dir(pulling.loc, A)))
if(!Process_Spacemove(get_dir(pulling.loc, moving_atom)))
return
if(src in pulling.contents)
return
var/target_turf = get_step(pulling, get_dir(pulling.loc, A))
var/target_turf = get_step(pulling, get_dir(pulling.loc, moving_atom))
if(get_dist(target_turf, loc) > 1) // Make sure the turf we are trying to pull to is adjacent to the user.
return // We do not use Adjacent() here because it checks if there are dense objects in the way, making it impossible to move an object to the side if we're blocked on both sides.
var/move_dir = get_dir(pulling.loc, moving_atom)
if(ismob(pulling))
var/mob/M = pulling
var/atom/movable/t = M.pulling
M.stop_pulling()
. = step(pulling, get_dir(pulling.loc, A)) // we set the return value to step here, if we don't having someone buckled in to a chair and being pulled won't let them be unbuckeled
// we set the return value to step here, if we don't having someone
// buckled in to a chair and being pulled won't let them be unbuckeled
. = pulling.Move(get_step(pulling.loc, moving_atom), move_dir, glide_size)
if(M)
M.start_pulling(t)
else
. = step(pulling, get_dir(pulling.loc, A))
. = pulling.Move(get_step(pulling.loc, moving_atom), move_dir, glide_size)
/mob/proc/update_gravity(has_gravity)
return
-9
View File
@@ -87,8 +87,6 @@
var/emp_proof = FALSE
/// List of overlays the mod has. Needs to be cut onremoval / module deactivation
var/list/mod_overlays = list()
/// Is the jetpack on so we should make ion effects?
var/jetpack_active = FALSE
/// Cham option for when the cham module is installed.
var/datum/action/item_action/chameleon_change/modsuit/chameleon_action
/// Is the control unit disquised?
@@ -241,13 +239,6 @@
if(slot == ITEM_SLOT_BACK)
return TRUE
/obj/item/mod/control/on_mob_move(direction, mob/user)
if(!jetpack_active || !isturf(user.loc))
return
var/turf/T = get_step(src, REVERSE_DIR(direction))
if(!has_gravity(T))
new /obj/effect/particle_effect/ion_trails(T, direction)
/obj/item/mod/control/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
. = ..()
if(!wearer || old_loc != wearer || loc == wearer)
+3 -3
View File
@@ -106,7 +106,7 @@
if(!mod.active || mod.activating || !mod.get_charge())
to_chat(mod.wearer, "<span class='warning'>Module is unpowered!</span>")
return FALSE
if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE)
if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED, mod.wearer) & MOD_ABORT_USE)
return FALSE
if(module_type == MODULE_ACTIVE)
if(mod.selected_module && !mod.selected_module.on_deactivation(display_message = FALSE))
@@ -157,7 +157,7 @@
else if(display_message)
to_chat(mod.wearer, "<span class='notice'>[src] deactivated.</span>")
//mod.wearer.update_clothing(mod.slot_flags)
SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED)
SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED, mod.wearer)
mod.update_mod_overlays()
return TRUE
@@ -169,7 +169,7 @@
if(!check_power(use_power_cost))
to_chat(mod.wearer, "<span class='warning'>Module costs too much power to use!</span>")
return FALSE
if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE)
if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED, mod.wearer) & MOD_ABORT_USE)
return FALSE
COOLDOWN_START(src, cooldown_timer, cooldown_time)
//addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/mob, update_clothing), mod.slot_flags), cooldown_time+1) //need to run it a bit after the cooldown starts to avoid conflicts
+31 -20
View File
@@ -128,40 +128,51 @@
overlay_state_inactive = "module_jetpack"
overlay_state_active = "module_jetpack_on"
/// Do we stop the wearer from gliding in space.
var/stabilizers = FALSE
var/stabilize = FALSE
var/thrust_callback
/obj/item/mod/module/jetpack/proc/set_stabilizers(new_stabilizers)
if(stabilizers == new_stabilizers)
return
stabilizers = new_stabilizers
/obj/item/mod/module/jetpack/Initialize(mapload)
. = ..()
thrust_callback = CALLBACK(src, PROC_REF(allow_thrust))
configure_jetpack(stabilize)
/obj/item/mod/module/jetpack/Destroy()
thrust_callback = null
return ..()
/**
* configures/re-configures the jetpack component
*
* Arguments
* stabilize - Should this jetpack be stabalized
*/
/obj/item/mod/module/jetpack/proc/configure_jetpack(stabilize)
src.stabilize = stabilize
AddComponent( \
/datum/component/jetpack, \
src.stabilize, \
COMSIG_MODULE_TRIGGERED, \
COMSIG_MODULE_DEACTIVATED, \
MOD_ABORT_USE, \
thrust_callback, \
/datum/effect_system/trail_follow/ion/grav_allowed \
)
/obj/item/mod/module/jetpack/get_configuration()
. = ..()
.["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilizers)
.["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilize)
/obj/item/mod/module/jetpack/configure_edit(key, value)
switch(key)
if("stabilizers")
set_stabilizers(value)
configure_jetpack(value)
/obj/item/mod/module/jetpack/proc/allow_thrust()
if(!active)
return
if(!drain_power(use_power_cost))
return FALSE
return TRUE
/obj/item/mod/module/jetpack/proc/get_user()
return mod.wearer
/obj/item/mod/module/jetpack/on_activation()
. = ..()
mod.jetpack_active = TRUE
/obj/item/mod/module/jetpack/on_deactivation(display_message, deleting)
. = ..()
mod.jetpack_active = FALSE
/obj/item/mod/module/jetpack/advanced
name = "MOD advanced ion jetpack module"
desc = "An improvement on the previous model of electric thrusters. This one achieves better efficency through \
@@ -107,7 +107,7 @@ GLOBAL_VAR_INIT(global_singulo_id, 1)
B.remove(C)
qdel(B)
/obj/singularity/Process_Spacemove() //The singularity stops drifting for no man!
/obj/singularity/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) //The singularity stops drifting for no man!
return 0
/obj/singularity/blob_act(obj/structure/blob/B)
@@ -137,7 +137,7 @@
// MORE POWER
movement_beam(move_target, 1 SECONDS)
sleep(0.5 SECONDS)
walk_towards(src, move_target, 0, 10)
GLOB.move_manager.home_onto(src, move_target, 0, 10)
/obj/singularity/energy_ball/proc/on_atom_entered(datum/source, atom/movable/entered)
var/mob/living/living_entered = entered
+1 -1
View File
@@ -326,7 +326,7 @@
picked_mob.bullet_act(src, def_zone)
qdel(src)
/obj/item/projectile/Process_Spacemove(movement_dir = 0)
/obj/item/projectile/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1 //Bullets don't drift in space
/obj/item/projectile/process()
@@ -77,23 +77,14 @@
/obj/item/reagent_containers/spray/proc/spray(atom/A)
var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
D.create_reagents(amount_per_transfer_from_this)
reagents.trans_to(D, amount_per_transfer_from_this, 1/spray_currentrange)
D.icon += mix_color_from_reagents(D.reagents.reagent_list)
for(var/i in 1 to spray_currentrange)
if(!step_towards(D, A) && i != 1)
qdel(D)
return
D.reagents.reaction(get_turf(D))
for(var/atom/T in get_turf(D))
D.reagents.reaction(T)
sleep(3)
if(QDELETED(D))
return
qdel(D)
var/obj/effect/decal/chempuff/chem_puff = new /obj/effect/decal/chempuff(get_turf(src))
chem_puff.create_reagents(amount_per_transfer_from_this)
reagents.trans_to(chem_puff, amount_per_transfer_from_this, 1/spray_currentrange)
chem_puff.icon += mix_color_from_reagents(chem_puff.reagents.reagent_list)
var/datum/move_loop/our_loop = GLOB.move_manager.move_towards_legacy(chem_puff, A, 3 DECISECONDS, timeout = spray_currentrange * 3 DECISECONDS, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY)
chem_puff.RegisterSignal(our_loop, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/obj/effect/decal/chempuff, loop_ended))
chem_puff.RegisterSignal(our_loop, COMSIG_MOVELOOP_POSTPROCESS, TYPE_PROC_REF(/obj/effect/decal/chempuff, check_move))
/obj/item/reagent_containers/spray/attack_self__legacy__attackchain(mob/user)
+11 -10
View File
@@ -87,9 +87,9 @@
blood_volume = max(blood_volume - amt, 0)
if(isturf(loc)) //Blood loss still happens in locker, floor stays clean
if(amt >= 10)
add_splatter_floor(loc, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null)
add_splatter_floor(loc)
else
add_splatter_floor(loc, 1, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null)
add_splatter_floor(loc, 1)
/mob/living/carbon/human/bleed(amt)
amt *= physiology.bleed_mod
@@ -108,7 +108,7 @@
blood_volume = max(blood_volume - amt, 0)
if(prob(10 * amt)) // +5% chance per internal bleeding site that we'll cough up blood on a given tick.
custom_emote(EMOTE_VISIBLE, "coughs up blood!")
add_splatter_floor(loc, 1, emittor_intertia = inertia_next_move > world.time ? last_movement_dir : null)
add_splatter_floor(loc, 1)
return 1
else if(amt >= 1 && prob(5 * amt)) // +2.5% chance per internal bleeding site that we'll cough up blood on a given tick. Must be bleeding internally in more than one place to have a chance at this.
vomit(0, 1)
@@ -256,7 +256,7 @@
. += list("O-", "O+")
//to add a splatter of blood or other mob liquid.
/mob/living/proc/add_splatter_floor(turf/T, small_drip, shift_x, shift_y, emittor_intertia)
/mob/living/proc/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
if((get_blood_id() != "blood") && (get_blood_id() != "slimejelly"))//is it blood or welding fuel?
return
if(!T)
@@ -264,13 +264,14 @@
var/list/temp_blood_DNA
var/list/b_data = get_blood_data(get_blood_id())
var/datum/move_loop/move/move_loop = GLOB.move_manager.processing_on(src, SSspacedrift)
if(small_drip)
// Only a certain number of drips (or one large splatter) can be on a given turf.
var/obj/effect/decal/cleanable/blood/drip/drop = locate() in T
if(drop)
if(emittor_intertia)
drop.newtonian_move(emittor_intertia)
if(move_loop)
drop.newtonian_move(move_loop.direction, instant = TRUE)
if(drop.drips < 5)
drop.drips++
var/image/I = image(drop.icon, drop.random_icon_states)
@@ -295,8 +296,8 @@
else
drop.basecolor = "#A10808"
drop.update_icon()
if(emittor_intertia)
drop.newtonian_move(emittor_intertia)
if(move_loop)
drop.newtonian_move(move_loop.direction, instant = TRUE)
return
// Find a blood decal or create a new one.
@@ -318,8 +319,8 @@
if(shift_x || shift_y)
B.off_floor = TRUE
B.layer = BELOW_MOB_LAYER //So the blood lands ontop of things like posters, windows, etc.
if(emittor_intertia)
B.newtonian_move(emittor_intertia)
if(move_loop)
B.newtonian_move(move_loop.direction, instant = TRUE)
/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip, shift_x, shift_y, emittor_intertia)
if(!(NO_BLOOD in dna.species.species_traits))
@@ -320,10 +320,10 @@
if(isobj(H.shoes))
var/thingy = H.shoes
if(H.drop_item_to_ground(H.shoes))
walk_away(thingy,H,15,2)
GLOB.move_manager.move_away(thingy, H, 15, 2)
spawn(20)
if(thingy)
walk(thingy,0)
GLOB.move_manager.stop_looping(thingy)
/obj/item/organ/internal/honktumor/cursed
unremovable = TRUE
+27 -39
View File
@@ -1,50 +1,38 @@
/obj/vehicle/space/speedbike
/obj/tgvehicle/speedbike
name = "Speedbike"
icon = 'icons/obj/bike.dmi'
icon_state = "speedbike_blue"
layer = MOB_LAYER - 0.1
vehicle_move_delay = 0
var/overlay_state = "cover_blue"
var/mutable_appearance/overlay
layer = LYING_MOB_LAYER
var/cover_iconstate = "cover_blue"
/obj/vehicle/space/speedbike/Initialize(mapload)
/obj/tgvehicle/speedbike/Initialize(mapload)
. = ..()
overlay = mutable_appearance(icon, overlay_state, ABOVE_MOB_LAYER)
add_overlay(overlay)
add_overlay(image(icon, cover_iconstate, ABOVE_MOB_LAYER))
AddElement(/datum/element/ridable, /datum/component/riding/vehicle/speedbike)
/obj/vehicle/space/speedbike/Move(newloc,move_dir)
/obj/tgvehicle/speedbike/Move(newloc,move_dir)
if(has_buckled_mobs())
new /obj/effect/temp_visual/dir_setting/speedbike_trail(loc)
. = ..()
/obj/vehicle/space/speedbike/handle_vehicle_layer()
switch(dir)
if(NORTH,SOUTH)
pixel_x = -16
pixel_y = -16
if(EAST,WEST)
pixel_x = -18
pixel_y = 0
/obj/vehicle/space/speedbike/handle_vehicle_offsets()
if(has_buckled_mobs())
for(var/m in buckled_mobs)
var/mob/living/buckled_mob = m
buckled_mob.setDir(dir)
switch(dir)
if(NORTH)
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = -8
if(SOUTH)
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 4
if(EAST)
buckled_mob.pixel_x = -10
buckled_mob.pixel_y = 5
if(WEST)
buckled_mob.pixel_x = 10
buckled_mob.pixel_y = 5
/obj/vehicle/space/speedbike/red
/obj/tgvehicle/speedbike/red
icon_state = "speedbike_red"
overlay_state = "cover_red"
cover_iconstate = "cover_red"
/datum/component/riding/vehicle/speedbike
vehicle_move_delay = 1
override_allow_spacemove = TRUE
ride_check_flags = RIDER_NEEDS_LEGS | RIDER_NEEDS_ARMS | UNBUCKLE_DISABLED_RIDER
/datum/component/riding/vehicle/speedbike/handle_specials()
. = ..()
set_vehicle_dir_layer(SOUTH, OBJ_LAYER)
set_vehicle_dir_layer(NORTH, ABOVE_MOB_LAYER)
set_vehicle_dir_layer(EAST, OBJ_LAYER)
set_vehicle_dir_layer(WEST, OBJ_LAYER)
set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, -8), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(-10, 5), TEXT_WEST = list(10, 5)))
set_vehicle_dir_offsets(NORTH, -16, -16)
set_vehicle_dir_offsets(SOUTH, -16, -16)
set_vehicle_dir_offsets(EAST, -18, 0)
set_vehicle_dir_offsets(WEST, -18, 0)
+2 -2
View File
@@ -229,7 +229,7 @@
return //write specifics for different vehicles
/obj/vehicle/Process_Spacemove(direction)
/obj/vehicle/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
if(has_gravity(src))
return TRUE
@@ -245,7 +245,7 @@
pressure_resistance = INFINITY
spaceworthy = TRUE
/obj/vehicle/space/Process_Spacemove(direction)
/obj/vehicle/space/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/obj/vehicle/zap_act(power, zap_flags)