mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2026-08-29 23:57:10 +01:00
Merge branch 'master' into pr/784
This commit is contained in:
@@ -1,21 +1,21 @@
|
||||
/datum/gear/accessories/ring
|
||||
/datum/gear/accessory/ring
|
||||
slot = ITEM_SLOT_ACCESSORY
|
||||
|
||||
/datum/gear/accessories/ring/goldring
|
||||
/datum/gear/accessory/ring/goldring
|
||||
name = "A gold ring"
|
||||
path = /obj/item/clothing/accessory/ring
|
||||
cost = 2
|
||||
|
||||
/datum/gear/accessories/ring/silverring
|
||||
/datum/gear/accessory/ring/silverring
|
||||
name = "A silver ring"
|
||||
path = /obj/item/clothing/accessory/ring/silver
|
||||
cost = 2
|
||||
|
||||
/datum/gear/accessories/ring/diamondring
|
||||
/datum/gear/accessory/ring/diamondring
|
||||
name = "A diamond ring"
|
||||
path = /obj/item/clothing/accessory/ring/diamond
|
||||
cost = 4
|
||||
|
||||
/datum/gear/accessories/ring/customring
|
||||
/datum/gear/accessory/ring/customring
|
||||
name = "A ring, renameable"
|
||||
path = /obj/item/clothing/accessory/ring/custom
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
if(camera)
|
||||
camera.remove_target_ui()
|
||||
camera.forceMove(user)
|
||||
teleport_now.UpdateButtonIcon()
|
||||
teleport_now.UpdateButtons()
|
||||
|
||||
/obj/item/clothing/suit/space/chronos/proc/chronowalk(atom/location)
|
||||
var/mob/living/carbon/human/user = src.loc
|
||||
@@ -122,7 +122,7 @@
|
||||
if(camera)
|
||||
camera.remove_target_ui()
|
||||
|
||||
teleport_now.UpdateButtonIcon()
|
||||
teleport_now.UpdateButtons()
|
||||
|
||||
user.ExtinguishMob()
|
||||
|
||||
@@ -135,12 +135,12 @@
|
||||
user.Stun(INFINITY)
|
||||
|
||||
animate(user, color = "#00ccee", time = 3)
|
||||
phase_timer_id = addtimer(CALLBACK(src, .proc/phase_2, user, to_turf, phase_in_ds), 3, TIMER_STOPPABLE)
|
||||
phase_timer_id = addtimer(CALLBACK(src, PROC_REF(phase_2), user, to_turf, phase_in_ds), 3, TIMER_STOPPABLE)
|
||||
|
||||
/obj/item/clothing/suit/space/chronos/proc/phase_2(mob/living/carbon/human/user, turf/to_turf, phase_in_ds)
|
||||
if(teleporting && activated && user)
|
||||
animate(user, alpha = 0, time = 2)
|
||||
phase_timer_id = addtimer(CALLBACK(src, .proc/phase_3, user, to_turf, phase_in_ds), 2, TIMER_STOPPABLE)
|
||||
phase_timer_id = addtimer(CALLBACK(src, PROC_REF(phase_3), user, to_turf, phase_in_ds), 2, TIMER_STOPPABLE)
|
||||
else
|
||||
finish_chronowalk(user, to_turf)
|
||||
|
||||
@@ -148,14 +148,14 @@
|
||||
if(teleporting && activated && user)
|
||||
user.forceMove(to_turf)
|
||||
animate(user, alpha = 255, time = phase_in_ds)
|
||||
phase_timer_id = addtimer(CALLBACK(src, .proc/phase_4, user, to_turf), phase_in_ds, TIMER_STOPPABLE)
|
||||
phase_timer_id = addtimer(CALLBACK(src, PROC_REF(phase_4), user, to_turf), phase_in_ds, TIMER_STOPPABLE)
|
||||
else
|
||||
finish_chronowalk(user, to_turf)
|
||||
|
||||
/obj/item/clothing/suit/space/chronos/proc/phase_4(mob/living/carbon/human/user, turf/to_turf)
|
||||
if(teleporting && activated && user)
|
||||
animate(user, color = "#ffffff", time = 3)
|
||||
phase_timer_id = addtimer(CALLBACK(src, .proc/finish_chronowalk, user, to_turf), 3, TIMER_STOPPABLE)
|
||||
phase_timer_id = addtimer(CALLBACK(src, PROC_REF(finish_chronowalk), user, to_turf), 3, TIMER_STOPPABLE)
|
||||
else
|
||||
finish_chronowalk(user, to_turf)
|
||||
|
||||
|
||||
@@ -108,9 +108,9 @@
|
||||
if(prob(explodioprobemp))
|
||||
playsound(src.loc, 'sound/effects/fuse.ogg', 60, 1, 10)
|
||||
visible_message("<span class ='warning'>The power module on the [src] begins to smoke, glowing with an alarming warmth! Get away from it, now!")
|
||||
addtimer(CALLBACK(src, .proc/detonate),50)
|
||||
addtimer(CALLBACK(src, PROC_REF(detonate)),50)
|
||||
else
|
||||
addtimer(CALLBACK(src, .proc/revivemessage), rebootdelay)
|
||||
addtimer(CALLBACK(src, PROC_REF(revivemessage)), rebootdelay)
|
||||
return
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/powerarmor/proc/revivemessage() //we use this proc to add a timer, so we can have it take a while to boot
|
||||
|
||||
@@ -86,3 +86,99 @@
|
||||
set_pin_data(IC_INPUT, 1, 0)
|
||||
set_pin_data(IC_INPUT, 2, 0)
|
||||
..()
|
||||
|
||||
/obj/item/integrated_circuit/input/quick_button
|
||||
name = "quick button"
|
||||
desc = "A button that can be used to quickly activate a pin."
|
||||
extended_desc = "This circuit adds a button to the assembly that can be easily accessed while the machine is being held. \
|
||||
<br>\"grant access to\" can be used to grant access to this button to internal pAIs or MMIs."
|
||||
can_be_asked_input = FALSE // Does not summon an input box.
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
inputs = list(
|
||||
"grant access to" = IC_PINTYPE_REF,
|
||||
"button name" = IC_PINTYPE_STRING,
|
||||
"button style" = IC_PINTYPE_STRING
|
||||
)
|
||||
activators = list("on pressed" = IC_PINTYPE_PULSE_OUT)
|
||||
var/static/list/button_styles = list("blank","one","two","three","four","five","plus","minus","exclamation","question","cross","info","heart","skull","brain","brain_damage","injection","blood","shield","reaction","network","power","radioactive","electricity","magnetism","scan","repair","id","wireless","say","sleep","bomb")
|
||||
var/datum/action/circuit_action/circuit
|
||||
|
||||
/obj/item/integrated_circuit/input/quick_button/Initialize(mapload)
|
||||
. = ..()
|
||||
extended_desc += "<br>Possible button styles: "
|
||||
extended_desc += english_list(button_styles)
|
||||
circuit = new(src)
|
||||
update_button_style()
|
||||
RegisterSignal(circuit, COMSIG_ACTION_TRIGGER, PROC_REF(on_action_trigger))
|
||||
|
||||
/obj/item/integrated_circuit/input/quick_button/Destroy()
|
||||
UnregisterSignal(circuit, COMSIG_ACTION_TRIGGER)
|
||||
QDEL_NULL(circuit)
|
||||
. = ..()
|
||||
|
||||
/obj/item/integrated_circuit/input/quick_button/Moved(atom/OldLoc, Dir)
|
||||
. = ..()
|
||||
if(istype(loc, /obj/item/electronic_assembly))
|
||||
update_button_owner()
|
||||
else if(circuit.owner)
|
||||
circuit.Remove(circuit.owner)
|
||||
|
||||
/obj/item/integrated_circuit/input/quick_button/on_data_written()
|
||||
update_button_style()
|
||||
update_button_owner()
|
||||
|
||||
/obj/item/integrated_circuit/input/quick_button/ext_moved(oldLoc, dir)
|
||||
update_button_owner()
|
||||
|
||||
/obj/item/integrated_circuit/input/quick_button/proc/update_button_style()
|
||||
var/button_name = get_pin_data(IC_INPUT, 2)
|
||||
var/button_style = get_pin_data(IC_INPUT, 3)
|
||||
circuit.name = button_name ? button_name : "Quick button"
|
||||
circuit.button_icon_state = (button_style in button_styles) ? "nanite_[button_style]" : "nanite_power"
|
||||
circuit.UpdateButtons()
|
||||
|
||||
/obj/item/integrated_circuit/input/quick_button/proc/update_button_owner()
|
||||
var/obj/item/user_container = get_pin_data(IC_INPUT, 1)
|
||||
var/mob/user
|
||||
if(istype(user_container, /obj/item/mmi))
|
||||
var/obj/item/mmi/mmi = user_container
|
||||
if(!istype(mmi.loc, /obj/item/integrated_circuit/input/mmi_tank)) // Must be inside an MMI tank.
|
||||
return
|
||||
|
||||
var/obj/item/integrated_circuit/input/mmi_tank/mmi_tank = mmi.loc
|
||||
if(!(mmi_tank.assembly != assembly)) // The MMI must be in the same assembly as the button.
|
||||
return
|
||||
|
||||
if(!mmi.brainmob) // How did we get here?
|
||||
return
|
||||
|
||||
user = mmi.brainmob
|
||||
else if (istype(user_container, /obj/item/paicard))
|
||||
var/obj/item/paicard/paicard = user_container
|
||||
if(!istype(paicard.loc, /obj/item/integrated_circuit/input/pAI_connector)) // Must be a pAI connector.
|
||||
return
|
||||
|
||||
var/obj/item/integrated_circuit/input/pAI_connector/pai_connector = paicard.loc
|
||||
if(!(pai_connector.assembly != assembly)) // The pAI connector must be in the same assembly as the button.
|
||||
return
|
||||
|
||||
if(!paicard.pai) // Please, don't do this, have a mob.
|
||||
return
|
||||
user = paicard.pai
|
||||
else if(ismob(assembly.loc)) // Last priority, the location, which means you SHOULD be holding it to gain the button.
|
||||
user = assembly.loc
|
||||
else if(circuit.owner) // If you're none of these, we take the button back and give it to nobody.
|
||||
circuit.Remove(circuit.owner)
|
||||
return
|
||||
circuit.Grant(user)
|
||||
|
||||
/obj/item/integrated_circuit/input/quick_button/proc/on_action_trigger(datum/action/circuit_action, obj/item/source)
|
||||
var/button_name = get_pin_data(IC_INPUT, 2)
|
||||
to_chat(circuit.owner, span_notice("You press the button labeled '[button_name ? button_name : "Quick button"]'."))
|
||||
assembly.balloon_alert(circuit.owner, "activated!")
|
||||
activate_pin(1)
|
||||
|
||||
/datum/action/circuit_action
|
||||
name = "Quick button"
|
||||
icon_icon = 'icons/mob/actions/actions_items.dmi'
|
||||
button_icon_state = "nanite_power"
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
/obj/item/crusher_trophy/brokentech/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
|
||||
. = ..()
|
||||
if(cooldowntime < world.time)
|
||||
INVOKE_ASYNC(src, .proc/invokesmoke, user)
|
||||
INVOKE_ASYNC(src, PROC_REF(invokesmoke), user)
|
||||
|
||||
/obj/item/crusher_trophy/brokentech/proc/invokesmoke(mob/living/user)
|
||||
cooldown = world.time + cooldowntime
|
||||
@@ -207,7 +207,7 @@
|
||||
D.fire()
|
||||
charged = FALSE
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src, .proc/Recharge), charge_time)
|
||||
addtimer(CALLBACK(src, PROC_REF(Recharge)), charge_time)
|
||||
return
|
||||
if(proximity_flag && isliving(target))
|
||||
var/mob/living/L = target
|
||||
@@ -374,7 +374,7 @@
|
||||
if(!QDELETED(target))
|
||||
var/obj/item/crusher_trophy/T = t
|
||||
T.on_melee_hit(target, user)
|
||||
if(!QDELETED(C) && !QDELETED(target))
|
||||
if(C && !QDELING(C) && !QDELETED(target)) // C can be 0 here, and QDELETED will runtime if that's the case.
|
||||
C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did
|
||||
|
||||
/obj/item/melee/zweihander/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
|
||||
@@ -397,7 +397,7 @@
|
||||
D.fire()
|
||||
charged = FALSE
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src, .proc/Recharge), charge_time)
|
||||
addtimer(CALLBACK(src, PROC_REF(Recharge)), charge_time)
|
||||
return
|
||||
if(proximity_flag && isliving(target))
|
||||
var/mob/living/L = target
|
||||
@@ -410,18 +410,18 @@
|
||||
var/obj/item/crusher_trophy/T = t
|
||||
T.on_mark_detonation(target, user)
|
||||
if(!QDELETED(L))
|
||||
if(!QDELETED(C))
|
||||
if(C && !QDELING(C)) // C can be 0 here, and QDELETED will runtime if that's the case.
|
||||
C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did
|
||||
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
|
||||
var/backstab_dir = get_dir(user, L)
|
||||
var/def_check = L.getarmor(type = "bomb")
|
||||
if((user.dir & backstab_dir) && (L.dir & backstab_dir))
|
||||
if(!QDELETED(C))
|
||||
if(C && !QDELING(C)) // See above.
|
||||
C.total_damage += detonation_damage + backstab_bonus //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item
|
||||
L.apply_damage(detonation_damage + backstab_bonus, BRUTE, blocked = def_check)
|
||||
playsound(user, 'sound/weapons/kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
|
||||
else
|
||||
if(!QDELETED(C))
|
||||
if(C && !QDELING(C)) // See above.
|
||||
C.total_damage += detonation_damage
|
||||
L.apply_damage(detonation_damage, BRUTE, blocked = def_check)
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
|
||||
/obj/item/gun/ballistic/revolver/doublebarrel/super/attack_self(mob/living/user)
|
||||
if(toggled)
|
||||
return 0
|
||||
return FALSE
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -121,10 +121,10 @@
|
||||
if(toggled)
|
||||
charge_tick++
|
||||
if(charge_tick < recharge_rate)
|
||||
return 0
|
||||
return FALSE
|
||||
charge_tick = 0
|
||||
chambered.newshot()
|
||||
return 1
|
||||
return TRUE
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -226,8 +226,8 @@
|
||||
|
||||
/obj/item/crucible/Initialize(mapload)
|
||||
. = ..()
|
||||
RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/wield)
|
||||
RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/unwield)
|
||||
RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(wield))
|
||||
RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(unwield))
|
||||
|
||||
/obj/item/crucible/ComponentInitialize()
|
||||
. = ..()
|
||||
@@ -637,7 +637,7 @@
|
||||
/obj/item/clothing/accessory/lavawalk/ComponentInitialize()
|
||||
. = ..()
|
||||
lavawalk = new(src)
|
||||
RegisterSignal(lavawalk, COMSIG_ACTION_TRIGGER, .proc/activate)
|
||||
RegisterSignal(lavawalk, COMSIG_ACTION_TRIGGER, PROC_REF(activate))
|
||||
|
||||
/obj/item/clothing/accessory/lavawalk/Destroy()
|
||||
. = ..()
|
||||
@@ -664,7 +664,8 @@
|
||||
desc = "Become immune to lava for a brief period of time."
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS
|
||||
cooldown_time = 2 MINUTES //two full minutes
|
||||
use_target_appearance = TRUE
|
||||
icon_icon = 'icons/obj/clothing/accessories.dmi'
|
||||
button_icon_state = "gold"
|
||||
|
||||
/obj/item/clothing/accessory/lavawalk/proc/activate(datum/action/cooldown/lavawalk/action, obj/item/clothing/accessory/lavawalk/item)
|
||||
var/mob/living/L = usr
|
||||
@@ -673,7 +674,7 @@
|
||||
L.balloon_alert(L, "activated")
|
||||
ADD_TRAIT(L, TRAIT_ASHSTORM_IMMUNE, src)
|
||||
ADD_TRAIT(L, TRAIT_LAVA_IMMUNE, src)
|
||||
timer = addtimer(CALLBACK(src, .proc/reset_user, L), effectduration)
|
||||
timer = addtimer(CALLBACK(src, PROC_REF(reset_user), L), effectduration, TIMER_STOPPABLE)
|
||||
action.StartCooldown()
|
||||
|
||||
/obj/item/clothing/accessory/lavawalk/proc/reset_user(mob/living/user)
|
||||
@@ -681,7 +682,7 @@
|
||||
REMOVE_TRAIT(user, TRAIT_LAVA_IMMUNE, src)
|
||||
to_chat(user, span_boldwarning("\The [src]'s glow dims."))
|
||||
user.balloon_alert(user, "wore off")
|
||||
QDEL_NULL(timer)
|
||||
deltimer(timer)
|
||||
|
||||
//Nerfing those on the chest because too OP yada yada
|
||||
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/damaged
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
I.icon_state = state
|
||||
M.vis_contents += I
|
||||
animate(I, alpha = 255, time = 5, easing = BOUNCE_EASING, pixel_y = 10)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, /proc/finish_flick, M, I), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(finish_flick), M, I), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME)
|
||||
|
||||
/proc/finish_flick(mob/M, I)
|
||||
M.vis_contents -= I
|
||||
|
||||
@@ -25,29 +25,3 @@
|
||||
hud_used.thirst.icon_state = "hydration3"
|
||||
if(0 to THIRST_LEVEL_PARCHED)
|
||||
hud_used.thirst.icon_state = "hydration4"
|
||||
|
||||
//It's here so it doesn't make a big mess on randomverbs.dm,
|
||||
//also because of this you can proccall it, why would you if you have smite?
|
||||
/mob/living/proc/pregoodbye(C)
|
||||
if(isanimal(C))
|
||||
var/mob/living/simple_animal/D = C
|
||||
D.toggle_ai(AI_OFF)
|
||||
AllImmobility(900, TRUE, TRUE) // Complete 15 minutes of stun, hopefully they shouldn't take that long
|
||||
playsound(C, "modular_sand/sound/effects/admin_punish/changetheworld.ogg", 100, FALSE)
|
||||
say("Change the world")
|
||||
stoplag(20)
|
||||
playsound(C, "modular_sand/sound/effects/admin_punish/myfinalmessage.ogg", 100, FALSE)
|
||||
say("My final message")
|
||||
stoplag(20)
|
||||
playsound(C, "modular_sand/sound/effects/admin_punish/goodbye.ogg", 100, FALSE)
|
||||
say("Goodbye.")
|
||||
stoplag(20)
|
||||
playsound(C, "modular_sand/sound/effects/admin_punish/endjingle.ogg", 100, FALSE)
|
||||
goodbye()
|
||||
|
||||
/mob/living/proc/goodbye() //this must be separate because it's a loop!
|
||||
while(alpha >= 10)
|
||||
alpha = alpha - 7
|
||||
stoplag(1)
|
||||
stoplag(2)
|
||||
Destroy()
|
||||
|
||||
@@ -34,3 +34,27 @@
|
||||
mob_size = MOB_SIZE_HUMAN
|
||||
if(1.21 to INFINITY)
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
|
||||
// It's here so it doesn't make a big mess on randomverbs.dm,
|
||||
// also because of this you can proccall it, why would you if you have smite?
|
||||
// This code was bad. For future reference, stoplag() and sleep() are very different and not at all interchangeable.
|
||||
// You can also use animate() to cleanly animate variables like alpha.
|
||||
// Finally, NEVER call Destroy() directly.
|
||||
/mob/living/proc/goodbye()
|
||||
set waitfor = FALSE
|
||||
if(isanimal(src))
|
||||
var/mob/living/simple_animal/simple_animal = src
|
||||
simple_animal.toggle_ai(AI_OFF)
|
||||
AllImmobility(INFINITY, TRUE, TRUE)
|
||||
playsound(src, "modular_sand/sound/effects/admin_punish/changetheworld.ogg", 100, FALSE)
|
||||
say("Change the world")
|
||||
sleep(20)
|
||||
playsound(src, "modular_sand/sound/effects/admin_punish/myfinalmessage.ogg", 100, FALSE)
|
||||
say("My final message")
|
||||
sleep(20)
|
||||
playsound(src, "modular_sand/sound/effects/admin_punish/goodbye.ogg", 100, FALSE)
|
||||
say("Goodbye.")
|
||||
sleep(20)
|
||||
playsound(src, "modular_sand/sound/effects/admin_punish/endjingle.ogg", 100, FALSE)
|
||||
animate(src, alpha = 10, 3.5 SECONDS)
|
||||
QDEL_IN(src, 2)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
QDEL_NULL(builtInCamera)
|
||||
|
||||
/mob/living/silicon/robot/modules/roleplay/binarycheck()
|
||||
return 0 //Roleplay borgs aren't truly borgs
|
||||
return FALSE //Roleplay borgs aren't truly borgs
|
||||
|
||||
/// Allows "cyborg" players to change gender at will
|
||||
/mob/living/silicon/robot/verb/toggle_gender()
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
/obj/item/stack/sheet/rglass/cyborg,
|
||||
/obj/item/stack/rods/cyborg,
|
||||
/obj/item/stack/tile/plasteel/cyborg,
|
||||
/obj/item/destTagger/borg,
|
||||
/obj/item/dest_tagger/borg,
|
||||
/obj/item/stack/cable_coil/cyborg,
|
||||
/obj/item/restraints/handcuffs/cable/zipties,
|
||||
/obj/item/stack/medical/gauze/cyborg,
|
||||
@@ -81,7 +81,7 @@
|
||||
"BootyNukie" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "bootynukie"), // SPLURT Addon (Hyper Port)
|
||||
"BootyGorlex" = image(icon = 'modular_splurt/icons/mob/robots.dmi', icon_state = "bootygorlex") // SPLURT Addon (Hyper Port)
|
||||
))
|
||||
var/syndiejack_icon = show_radial_menu(R, R , syndicatejack_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE)
|
||||
var/syndiejack_icon = show_radial_menu(R, R , syndicatejack_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), R), radius = 42, require_near = TRUE)
|
||||
switch(syndiejack_icon)
|
||||
if("Saboteur")
|
||||
cyborg_base_icon = "synd_engi"
|
||||
|
||||
@@ -294,10 +294,10 @@
|
||||
return
|
||||
|
||||
if(patient && path.len == 0 && (get_dist(src,patient) > 1))
|
||||
path = get_path_to(src, get_turf(patient), /turf/proc/Distance_cardinal, 0, 30,id=access_card)
|
||||
path = get_path_to(src, get_turf(patient), 0, 30,id=access_card)
|
||||
mode = BOT_MOVING
|
||||
if(!path.len) //try to get closer if you can't reach the patient directly
|
||||
path = get_path_to(src, get_turf(patient), /turf/proc/Distance_cardinal, 0, 30,1,id=access_card)
|
||||
path = get_path_to(src, get_turf(patient), 0, 30,1,id=access_card)
|
||||
if(!path.len) //Do not chase a patient we cannot reach.
|
||||
soft_reset()
|
||||
|
||||
|
||||
@@ -36,13 +36,13 @@ Removes slaughterlings (because they are bullshit), instead replacing them with
|
||||
blood_warp()
|
||||
bloodsmacks()
|
||||
if(prob(25))
|
||||
INVOKE_ASYNC(src, .proc/blood_spray)
|
||||
INVOKE_ASYNC(src, .proc/bloodsmacks)
|
||||
INVOKE_ASYNC(src, PROC_REF(blood_spray))
|
||||
INVOKE_ASYNC(src, PROC_REF(bloodsmacks))
|
||||
else
|
||||
if(health > maxHealth/2 && !client)
|
||||
INVOKE_ASYNC(src, .proc/charge)
|
||||
INVOKE_ASYNC(src, PROC_REF(charge))
|
||||
else
|
||||
INVOKE_ASYNC(src, .proc/triple_charge)
|
||||
INVOKE_ASYNC(src, PROC_REF(triple_charge))
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/charge()
|
||||
bloodsmacks()
|
||||
@@ -71,7 +71,7 @@ Removes slaughterlings (because they are bullshit), instead replacing them with
|
||||
mobcount++
|
||||
if(mobcount)
|
||||
var/hand = rand(0,1)
|
||||
INVOKE_ASYNC(src, .proc/bloodsmack, T, hand)
|
||||
INVOKE_ASYNC(src, PROC_REF(bloodsmack), T, hand)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness)
|
||||
if(handedness)
|
||||
|
||||
@@ -86,7 +86,7 @@ Difficulty: Medium
|
||||
var/range = 20
|
||||
var/list/turfs = list()
|
||||
turfs = line_target(0, range, at)
|
||||
INVOKE_ASYNC(src, .proc/fire_line, turfs)
|
||||
INVOKE_ASYNC(src, PROC_REF(fire_line), turfs)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/glaurung/OpenFire()
|
||||
if(swooping)
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
for(var/mob/living/simple_animal/hostile/megafauna/H in around)
|
||||
if(faction_check_mob(H) && !attack_same && !H.attack_same)
|
||||
H.enemies |= enemies
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
. = ..()
|
||||
|
||||
+23
-23
@@ -68,57 +68,57 @@
|
||||
switch(anger_modifier)
|
||||
if(0 to 25)
|
||||
if(prob(50))
|
||||
INVOKE_ASYNC(src, .proc/plasmashot, target)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmashot), target)
|
||||
if(prob(80))
|
||||
sleep(6)
|
||||
INVOKE_ASYNC(src, .proc/plasmashot, target)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmashot), target)
|
||||
if(prob(50))
|
||||
sleep(6)
|
||||
INVOKE_ASYNC(src, .proc/plasmashot, target)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmashot), target)
|
||||
else
|
||||
animate(src, color = "#ff0000", time = 3)
|
||||
sleep(4)
|
||||
INVOKE_ASYNC(src, .proc/shockwave, src.dir, 7, 2.5)
|
||||
INVOKE_ASYNC(src, PROC_REF(shockwave), src.dir, 7, 2.5)
|
||||
if(25 to 50)
|
||||
if(prob(60))
|
||||
special = TRUE
|
||||
INVOKE_ASYNC(src, .proc/plasmaburst, target, FALSE)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmaburst), target, FALSE)
|
||||
sleep(6)
|
||||
INVOKE_ASYNC(src, .proc/plasmaburst, target, TRUE)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmaburst), target, TRUE)
|
||||
if(prob(50))
|
||||
sleep(6)
|
||||
INVOKE_ASYNC(src, .proc/plasmashot, target, FALSE)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmashot), target, FALSE)
|
||||
if(prob(50))
|
||||
sleep(6)
|
||||
INVOKE_ASYNC(src, .proc/plasmashot, target, FALSE)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmashot), target, FALSE)
|
||||
special = FALSE
|
||||
else
|
||||
special = TRUE
|
||||
animate(src, color = "#ff0000", time = 3)
|
||||
sleep(4)
|
||||
INVOKE_ASYNC(src, .proc/shockwave, WEST, 10, TRUE)
|
||||
INVOKE_ASYNC(src, .proc/shockwave, EAST, 10, TRUE)
|
||||
INVOKE_ASYNC(src, PROC_REF(shockwave), WEST, 10, TRUE)
|
||||
INVOKE_ASYNC(src, PROC_REF(shockwave), EAST, 10, TRUE)
|
||||
sleep(7)
|
||||
INVOKE_ASYNC(src, .proc/shockwave, NORTH, 10, TRUE)
|
||||
INVOKE_ASYNC(src, .proc/shockwave, SOUTH, 10, TRUE)
|
||||
INVOKE_ASYNC(src, PROC_REF(shockwave), NORTH, 10, TRUE)
|
||||
INVOKE_ASYNC(src, PROC_REF(shockwave), SOUTH, 10, TRUE)
|
||||
animate(src, color = initial(color), time = 5)
|
||||
special = FALSE
|
||||
if(50 to INFINITY)
|
||||
if(prob(75))
|
||||
if(prob(60))
|
||||
INVOKE_ASYNC(src, .proc/plasmaburst, target)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmaburst), target)
|
||||
special = TRUE
|
||||
animate(src, color = "#ff0000", time = 3)
|
||||
sleep(5)
|
||||
INVOKE_ASYNC(src, .proc/shockwave, src.dir, 15)
|
||||
INVOKE_ASYNC(src, PROC_REF(shockwave), src.dir, 15)
|
||||
if(prob(60))
|
||||
sleep(5)
|
||||
INVOKE_ASYNC(src, .proc/plasmaburst, target)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmaburst), target)
|
||||
sleep(5)
|
||||
INVOKE_ASYNC(src, .proc/plasmaburst, target)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmaburst), target)
|
||||
if(prob(50))
|
||||
sleep(5)
|
||||
INVOKE_ASYNC(src, .proc/plasmaburst, target)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmaburst), target)
|
||||
animate(src, color = initial(color), time = 3)
|
||||
special = FALSE
|
||||
else
|
||||
@@ -129,11 +129,11 @@
|
||||
animate(src, color = "#ff0000", time = 3)
|
||||
special = TRUE
|
||||
sleep(3)
|
||||
INVOKE_ASYNC(src, .proc/plasmaburst, left, TRUE)
|
||||
INVOKE_ASYNC(src, .proc/plasmaburst, right, FALSE)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmaburst), left, TRUE)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmaburst), right, FALSE)
|
||||
sleep(3)
|
||||
INVOKE_ASYNC(src, .proc/plasmashot, up, FALSE)
|
||||
INVOKE_ASYNC(src, .proc/plasmashot, down, FALSE)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmashot), up, FALSE)
|
||||
INVOKE_ASYNC(src, PROC_REF(plasmashot), down, FALSE)
|
||||
sleep(10)
|
||||
animate(src, color = initial(color), time = 3)
|
||||
special = FALSE
|
||||
@@ -142,13 +142,13 @@
|
||||
sleep(3)
|
||||
special = TRUE
|
||||
for(var/dire in GLOB.cardinals)
|
||||
INVOKE_ASYNC(src, .proc/shockwave, dire, 7, TRUE, 3)
|
||||
INVOKE_ASYNC(src, PROC_REF(shockwave), dire, 7, TRUE, 3)
|
||||
sleep(6)
|
||||
animate(src, color = initial(color), time = 3)
|
||||
special = FALSE
|
||||
else
|
||||
special = TRUE
|
||||
INVOKE_ASYNC(src, .proc/ultishockwave, 7, 5)
|
||||
INVOKE_ASYNC(src, PROC_REF(ultishockwave), 7, 5)
|
||||
sleep(10)
|
||||
special = FALSE
|
||||
|
||||
|
||||
@@ -229,7 +229,7 @@ Difficulty: Medium
|
||||
if(passed == 1)
|
||||
visible_message(span_danger("[src] dodged the projectile!"), span_userdanger("You dodge the projectile!"))
|
||||
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 300, 1)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -303,8 +303,8 @@ Difficulty: Medium
|
||||
..()
|
||||
|
||||
//Immune to explosions when spinning or charging
|
||||
/mob/living/simple_animal/hostile/megafauna/sif/ex_act(severity, target)
|
||||
return 0
|
||||
/mob/living/simple_animal/hostile/megafauna/sif/ex_act(severity, target, origin)
|
||||
return FALSE
|
||||
|
||||
//stop spinning if you lose the target
|
||||
/mob/living/simple_animal/hostile/megafauna/sif/LoseTarget()
|
||||
|
||||
+2
-2
@@ -116,7 +116,7 @@
|
||||
new /obj/effect/temp_visual/dir_setting/bloodsplatter/candy(T, get_dir(T, target))
|
||||
T = get_step(T, dir_to_target)
|
||||
sleep(1)
|
||||
addtimer(CALLBACK(src, .proc/blood_charge_2, dir_to_target, 0), 5)
|
||||
addtimer(CALLBACK(src, PROC_REF(blood_charge_2), dir_to_target, 0), 5)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/elite/candy/proc/bloodytrap(mob/target)
|
||||
playsound(src,'sound/magic/Blind.ogg', 200, 1)
|
||||
@@ -229,7 +229,7 @@
|
||||
//L.Paralyze(20)
|
||||
L.Stun(20) //substituting this for the Paralyze from the line above, because we don't have tg paralysis stuff
|
||||
L.adjustBruteLoss(50)
|
||||
addtimer(CALLBACK(src, .proc/blood_charge_2, move_dir, (times_ran + 1)), 2)
|
||||
addtimer(CALLBACK(src, PROC_REF(blood_charge_2), move_dir, (times_ran + 1)), 2)
|
||||
|
||||
/obj/effect/temp_visual/dir_setting/bloodsplatter/candy
|
||||
duration = 10
|
||||
|
||||
+2
-2
@@ -114,7 +114,7 @@
|
||||
/mob/living/simple_animal/hostile/asteroid/elite/drakeling/proc/lava_around()
|
||||
ranged_cooldown = world.time + 50
|
||||
for(var/d in GLOB.cardinals)
|
||||
INVOKE_ASYNC(src, .proc/lava_wall, d, 5)
|
||||
INVOKE_ASYNC(src, PROC_REF(lava_wall), d, 5)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/elite/drakeling/proc/fire_spew()
|
||||
ranged_cooldown = world.time + 25
|
||||
@@ -129,7 +129,7 @@
|
||||
visible_message(span_boldwarning("[src] violently puffs smoke!They're going to make a fire moat!"))
|
||||
sleep(5)
|
||||
for(var/d in GLOB.alldirs)
|
||||
INVOKE_ASYNC(src, .proc/fire_wall, d, 10)
|
||||
INVOKE_ASYNC(src, PROC_REF(fire_wall), d, 10)
|
||||
|
||||
// Drakeling helpers
|
||||
|
||||
|
||||
@@ -208,6 +208,7 @@
|
||||
overheat_time = 27
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/kinetic/premium/byoka)
|
||||
max_mod_capacity = 300
|
||||
has_empty_icon = FALSE
|
||||
|
||||
/obj/item/ammo_casing/energy/kinetic/premium/byoka
|
||||
projectile_type = /obj/item/projectile/kinetic/premium/byoka
|
||||
|
||||
@@ -7,10 +7,8 @@
|
||||
return FALSE
|
||||
|
||||
//Micro is on a table.
|
||||
var/turf/steppyspot = target.loc
|
||||
for(var/thing in steppyspot.contents)
|
||||
if(istype(thing, /obj/structure/table))
|
||||
return TRUE
|
||||
if(locate(/obj/structure/table) in target.loc)
|
||||
return TRUE
|
||||
|
||||
//Both small.
|
||||
if(get_size(user) <= RESIZE_A_TINYMICRO && get_size(target) <= RESIZE_A_TINYMICRO)
|
||||
@@ -48,10 +46,8 @@
|
||||
return FALSE
|
||||
|
||||
//If on a table, don't
|
||||
var/turf/steppyspot = target.loc
|
||||
for(var/thing in steppyspot.contents)
|
||||
if(istype(thing, /obj/structure/table))
|
||||
return TRUE
|
||||
if(locate(/obj/structure/table) in target.loc)
|
||||
return TRUE
|
||||
|
||||
//Both small
|
||||
if(get_size(user) <= RESIZE_A_TINYMICRO && get_size(target) <= RESIZE_A_TINYMICRO)
|
||||
@@ -66,7 +62,7 @@
|
||||
user.forceMove(target.loc)
|
||||
user.sizediffStamLoss(target)
|
||||
user.add_movespeed_modifier(/datum/movespeed_modifier/stomp, TRUE) //Full stop
|
||||
addtimer(CALLBACK(user, /mob/.proc/remove_movespeed_modifier, MOVESPEED_ID_STOMP, TRUE), 3) //0.3 seconds
|
||||
addtimer(CALLBACK(user, TYPE_PROC_REF(/mob, remove_movespeed_modifier), MOVESPEED_ID_STOMP, TRUE), 3) //0.3 seconds
|
||||
if(iscarbon(user))
|
||||
if(istype(user) && user.dna.features["taur"] == "Naga" || user.dna.features["taur"] == "Tentacle")
|
||||
target.visible_message(span_danger("[src] carefully rolls their tail over [target]!"), span_danger("[src]'s huge tail rolls over you!"))
|
||||
@@ -81,7 +77,7 @@
|
||||
user.sizediffBruteloss(target)
|
||||
playsound(loc, 'sound/misc/splort.ogg', 50, 1)
|
||||
user.add_movespeed_modifier(/datum/movespeed_modifier/stomp, TRUE)
|
||||
addtimer(CALLBACK(user, /mob/.proc/remove_movespeed_modifier, MOVESPEED_ID_STOMP, TRUE), 10) //1 second
|
||||
addtimer(CALLBACK(user, TYPE_PROC_REF(/mob, remove_movespeed_modifier), MOVESPEED_ID_STOMP, TRUE), 10) //1 second
|
||||
//user.Stun(20)
|
||||
if(iscarbon(user))
|
||||
if(istype(user) && (user.dna.features["taur"] == "Naga" || user.dna.features["taur"] == "Tentacle"))
|
||||
@@ -96,7 +92,7 @@
|
||||
user.sizediffStamLoss(target)
|
||||
user.sizediffStun(target)
|
||||
user.add_movespeed_modifier(/datum/movespeed_modifier/stomp, TRUE)
|
||||
addtimer(CALLBACK(user, /mob/.proc/remove_movespeed_modifier, MOVESPEED_ID_STOMP, TRUE), 7)//About 3/4th a second
|
||||
addtimer(CALLBACK(user, TYPE_PROC_REF(/mob, remove_movespeed_modifier), MOVESPEED_ID_STOMP, TRUE), 7)//About 3/4th a second
|
||||
if(iscarbon(user))
|
||||
var/feetCover = (user.wear_suit && (user.wear_suit.body_parts_covered & FEET)) || (user.w_uniform && (user.w_uniform.body_parts_covered & FEET) || (user.shoes && (user.shoes.body_parts_covered & FEET)))
|
||||
if(feetCover)
|
||||
@@ -158,8 +154,8 @@
|
||||
/*
|
||||
/mob/living/proc/sizeinteractioncheck(mob/living/target)
|
||||
if(abs(get_effective_size()/target.get_effective_size())>=2.0 && get_effective_size()>target.get_effective_size())
|
||||
return 0
|
||||
return FALSE
|
||||
else
|
||||
return 1
|
||||
return TRUE
|
||||
*/
|
||||
//Clothes coming off at different sizes, and health/speed/stam changes as well
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
if((0 - INFINITY) to RESIZE_NORMAL)
|
||||
new_size = RESIZE_MICRO
|
||||
living.update_size(new_size)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/projectile/sizelaser/growthray/on_hit(atom/target, blocked = 0 )
|
||||
if(isliving(target))
|
||||
@@ -55,7 +55,7 @@
|
||||
if((0 - INFINITY) to RESIZE_MICRO)
|
||||
new_size = RESIZE_MICRO
|
||||
living.update_size(new_size)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/ammo_casing/energy/laser/growthray
|
||||
projectile_type = /obj/item/projectile/sizelaser/growthray
|
||||
|
||||
@@ -78,8 +78,8 @@
|
||||
for(var/mob/living/simple_animal/hostile/asteroid/elite/candy/C in view(15))
|
||||
candylist += C
|
||||
if(candylist.len)
|
||||
INVOKE_ASYNC(src, /obj/machinery/door/airlock/titanium/doomed/locked.proc/close)
|
||||
addtimer(CALLBACK(src, .proc/bolt), 5)
|
||||
INVOKE_ASYNC(src, TYPE_PROC_REF(/obj/machinery/door/airlock/titanium/doomed/locked, close))
|
||||
addtimer(CALLBACK(src, PROC_REF(bolt)), 5)
|
||||
|
||||
/obj/machinery/door/airlock/titanium/doomed/locked/process()
|
||||
. = ..()
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
/obj/effect/wrath/Initialize(mapload)
|
||||
. = ..()
|
||||
megalist = list("Cockblock", "Cockblock", "Cockblock") //cockblock just to be sure that no one goes through the wrath wall in the 10 minute grace period
|
||||
addtimer(CALLBACK(src, .proc/updatemegalist), 6000) //10 minutes delay so that all megafauna can spawn and etc.
|
||||
addtimer(CALLBACK(src, PROC_REF(updatemegalist)), 6000) //10 minutes delay so that all megafauna can spawn and etc.
|
||||
|
||||
/obj/effect/wrath/proc/updatemegalist()
|
||||
megalist = list()
|
||||
|
||||
@@ -22,4 +22,7 @@
|
||||
. = new /datum/tgs_message_content("Restarting.")
|
||||
to_chat(world, span_boldwarning("Server restart - Initialized by [sender.friendly_name] on Discord."))
|
||||
send2adminchat("Server", "[sender.friendly_name] forced a restart.")
|
||||
addtimer(CALLBACK(src, world.TgsEndProcess()), 1 SECONDS)
|
||||
addtimer(CALLBACK(src, PROC_REF(DoEndProcess)), 1 SECONDS)
|
||||
|
||||
/datum/tgs_chat_command/proc/DoEndProcess()
|
||||
world.TgsEndProcess()
|
||||
|
||||
Reference in New Issue
Block a user