[fugitives.len] [fugitives.len == 1 ? "fugitive" : "fugitives"] took refuge on [station_name()]!"
-
- for(var/datum/antagonist/fugitive/antag in fugitives)
- if(antag.owner)
- result += "
[printplayer(antag.owner)]"
-
- return result.Join("
")
diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm
index a33e3e75df13..be343bb8bc6e 100644
--- a/code/modules/antagonists/fugitive/fugitive_outfits.dm
+++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm
@@ -84,12 +84,12 @@
W.registered_name = H.real_name
W.update_label()
-/datum/outfit/russiancorpse/hunter
+/datum/outfit/frontier/hunter
name = "Frontiersman Corpse (Hunter)"
ears = /obj/item/radio/headset
r_hand = /obj/item/gun/ballistic/rifle/boltaction
-/datum/outfit/russiancorpse/hunter/pre_equip(mob/living/carbon/human/H)
+/datum/outfit/frontier/hunter/pre_equip(mob/living/carbon/human/H)
if(prob(50))
head = /obj/item/clothing/head/trapper
@@ -152,7 +152,3 @@
ears = /obj/item/radio/headset
id = /obj/item/card/id
r_hand = /obj/item/storage/firstaid/regular
-
- backpack_contents = list(
- /obj/item/bountytrap = 4
- )
diff --git a/code/modules/antagonists/fugitive/fugitive_ship.dm b/code/modules/antagonists/fugitive/fugitive_ship.dm
deleted file mode 100644
index 26d8f42e94b9..000000000000
--- a/code/modules/antagonists/fugitive/fugitive_ship.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-//works similar to the experiment machine (experiment.dm) except it just holds more and more prisoners
-
-/obj/machinery/fugitive_capture
- name = "bluespace capture machine"
- desc = "Much, MUCH bigger on the inside to transport prisoners safely."
- icon = 'icons/obj/machines/research.dmi'
- icon_state = "bluespace-prison"
- density = TRUE
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //ha ha no getting out!!
-
-/obj/machinery/fugitive_capture/examine(mob/user)
- . = ..()
- . += "
Add a prisoner by dragging them into the machine."
-
-/obj/machinery/fugitive_capture/MouseDrop_T(mob/target, mob/user)
- var/mob/living/fugitive_hunter = user
- if(!isliving(fugitive_hunter))
- return
- if(HAS_TRAIT(fugitive_hunter, TRAIT_UI_BLOCKED) || !Adjacent(fugitive_hunter) || !target.Adjacent(fugitive_hunter) || !ishuman(target))
- return
- var/mob/living/carbon/human/fugitive = target
- var/datum/antagonist/fugitive/fug_antag = fugitive.mind.has_antag_datum(/datum/antagonist/fugitive)
- if(!fug_antag)
- to_chat(fugitive_hunter, "
This is not a wanted fugitive!")
- return
- if(do_after(fugitive_hunter, 50, target = fugitive))
- add_prisoner(fugitive, fug_antag)
-
-/obj/machinery/fugitive_capture/proc/add_prisoner(mob/living/carbon/human/fugitive, datum/antagonist/fugitive/antag)
- fugitive.forceMove(src)
- antag.is_captured = TRUE
- to_chat(fugitive, "
You are thrown into a vast void of bluespace, and as you fall further into oblivion the comparatively small entrance to reality gets smaller and smaller until you cannot see it anymore. You have failed to avoid capture.")
- fugitive.ghostize(TRUE) //so they cannot suicide, round end stuff.
-
-/obj/structure/closet/crate/eva
- name = "EVA crate"
-
-/obj/structure/closet/crate/eva/PopulateContents()
- ..()
- for(var/i in 1 to 3)
- new /obj/item/clothing/suit/space/eva(src)
- for(var/i in 1 to 3)
- new /obj/item/clothing/head/helmet/space/eva(src)
- for(var/i in 1 to 3)
- new /obj/item/clothing/mask/breath(src)
- for(var/i in 1 to 3)
- new /obj/item/tank/internals/oxygen(src)
diff --git a/code/modules/antagonists/fugitive/hunter.dm b/code/modules/antagonists/fugitive/hunter.dm
deleted file mode 100644
index 090b243e5310..000000000000
--- a/code/modules/antagonists/fugitive/hunter.dm
+++ /dev/null
@@ -1,172 +0,0 @@
-//The hunters!!
-/datum/antagonist/fugitive_hunter
- name = "Fugitive Hunter"
- roundend_category = "Fugitive"
- silent = TRUE //greet called by the spawn
- show_in_antagpanel = FALSE
- prevent_roundtype_conversion = FALSE
- antag_hud_type = ANTAG_HUD_FUGITIVE
- antag_hud_name = "fugitive_hunter"
- var/datum/team/fugitive_hunters/hunter_team
- var/backstory = "error"
-
-/datum/antagonist/fugitive_hunter/apply_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- add_antag_hud(antag_hud_type, antag_hud_name, M)
-
-/datum/antagonist/fugitive_hunter/remove_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- remove_antag_hud(antag_hud_type, M)
-
-/datum/antagonist/fugitive_hunter/on_gain()
- forge_objectives()
- . = ..()
-
-/datum/antagonist/fugitive_hunter/proc/forge_objectives() //this isn't an actual objective because it's about round end rosters
- var/datum/objective/capture = new /datum/objective
- capture.owner = owner
- capture.explanation_text = "Capture the fugitives in the station and put them into the bluespace capture machine on your ship."
- objectives += capture
-
-/datum/antagonist/fugitive_hunter/greet()
- switch(backstory)
- if("space cop")
- to_chat(owner, "
Justice has arrived. I am a member of the Spacepol!")
- to_chat(owner, "
The criminals should be on the station, we have special huds implanted to recognize them.")
- to_chat(owner, "
As we have lost pretty much all power over these damned lawless megacorporations, it's a mystery if their security will cooperate with us.")
- if("russian")
- to_chat(src, "
Ay blyat. I am a space-russian smuggler! We were mid-flight when our cargo was beamed off our ship!")
- to_chat(src, "
We were hailed by a man in a green uniform, promising the safe return of our goods in exchange for a favor:")
- to_chat(src, "
There is a local station housing fugitives that the man is after, he wants them returned; dead or alive.")
- to_chat(src, "
We will not be able to make ends meet without our cargo, so we must do as he says and capture them.")
-
- to_chat(owner, "
You are not an antagonist in that you may kill whomever you please, but you can do anything to ensure the capture of the fugitives, even if that means going through the station.")
- owner.announce_objectives()
-
-/datum/antagonist/fugitive_hunter/create_team(datum/team/fugitive_hunters/new_team)
- if(!new_team)
- for(var/datum/antagonist/fugitive_hunter/H in GLOB.antagonists)
- if(!H.owner)
- continue
- if(H.hunter_team)
- hunter_team = H.hunter_team
- return
- hunter_team = new /datum/team/fugitive_hunters
- hunter_team.backstory = backstory
- hunter_team.update_objectives()
- return
- if(!istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- hunter_team = new_team
-
-/datum/antagonist/fugitive_hunter/get_team()
- return hunter_team
-
-/datum/team/fugitive_hunters
- var/backstory = "error"
-
-/datum/team/fugitive_hunters/proc/update_objectives(initial = FALSE)
- objectives = list()
- var/datum/objective/O = new()
- O.team = src
- objectives += O
-
-/datum/team/fugitive_hunters/proc/assemble_fugitive_results()
- var/list/fugitives_counted = list()
- var/list/fugitives_dead = list()
- var/list/fugitives_captured = list()
- for(var/datum/antagonist/fugitive/A in GLOB.antagonists)
- if(!A.owner)
- continue
- fugitives_counted += A
- if(A.owner.current.stat == DEAD)
- fugitives_dead += A
- if(A.is_captured)
- fugitives_captured += A
- . = list(fugitives_counted, fugitives_dead, fugitives_captured) //okay, check out how cool this is.
-
-/datum/team/fugitive_hunters/proc/all_hunters_dead()
- var/dead_boys = 0
- for(var/I in members)
- var/datum/mind/hunter_mind = I
- if(!(ishuman(hunter_mind.current) || (hunter_mind.current.stat == DEAD)))
- dead_boys++
- return dead_boys >= members.len
-
-/datum/team/fugitive_hunters/proc/get_result()
- var/list/fugitive_results = assemble_fugitive_results()
- var/list/fugitives_counted = fugitive_results[1]
- var/list/fugitives_dead = fugitive_results[2]
- var/list/fugitives_captured = fugitive_results[3]
- var/hunters_dead = all_hunters_dead()
- //this gets a little confusing so follow the comments if it helps
- if(!fugitives_counted.len)
- return
- if(fugitives_captured.len)//any captured
- if(fugitives_captured.len == fugitives_counted.len)//if the hunters captured all the fugitives, there's a couple special wins
- if(!fugitives_dead)//specifically all of the fugitives alive
- return FUGITIVE_RESULT_BADASS_HUNTER
- else if(hunters_dead)//specifically all of the hunters died (while capturing all the fugitives)
- return FUGITIVE_RESULT_POSTMORTEM_HUNTER
- else//no special conditional wins, so just the normal major victory
- return FUGITIVE_RESULT_MAJOR_HUNTER
- else if(!hunters_dead)//so some amount captured, and the hunters survived.
- return FUGITIVE_RESULT_HUNTER_VICTORY
- else//so some amount captured, but NO survivors.
- return FUGITIVE_RESULT_MINOR_HUNTER
- else//from here on out, hunters lost because they did not capture any fugitive dead or alive. there are different levels of getting beat though:
- if(!fugitives_dead)//all fugitives survived
- return FUGITIVE_RESULT_MAJOR_FUGITIVE
- else if(fugitives_dead < fugitives_counted)//at least ANY fugitive lived
- return FUGITIVE_RESULT_FUGITIVE_VICTORY
- else if(!hunters_dead)//all fugitives died, but none were taken in by the hunters. minor win
- return FUGITIVE_RESULT_MINOR_FUGITIVE
- else//all fugitives died, all hunters died, nobody brought back. seems weird to not give fugitives a victory if they managed to kill the hunters but literally no progress to either goal should lead to a nobody wins situation
- return FUGITIVE_RESULT_STALEMATE
-
-/datum/team/fugitive_hunters/roundend_report() //shows the number of fugitives, but not if they won in case there is no security
- if(!members.len)
- return
-
- var/list/result = list()
-
- result += "
...And [members.len] [backstory]s tried to hunt them down!"
-
- for(var/datum/mind/M in members)
- result += "[printplayer(M)]"
-
- switch(get_result())
- if(FUGITIVE_RESULT_BADASS_HUNTER)//use defines
- result += "Badass [capitalize(backstory)] Victory!"
- result += "The [backstory]s managed to capture every fugitive, alive!"
- if(FUGITIVE_RESULT_POSTMORTEM_HUNTER)
- result += "Postmortem [capitalize(backstory)] Victory!"
- result += "The [backstory]s managed to capture every fugitive, but all of them died! Spooky!"
- if(FUGITIVE_RESULT_MAJOR_HUNTER)
- result += "Major [capitalize(backstory)] Victory"
- result += "The [backstory]s managed to capture every fugitive, dead or alive."
- if(FUGITIVE_RESULT_HUNTER_VICTORY)
- result += "[capitalize(backstory)] Victory"
- result += "The [backstory]s managed to capture a fugitive, dead or alive."
- if(FUGITIVE_RESULT_MINOR_HUNTER)
- result += "Minor [capitalize(backstory)] Victory"
- result += "All the [backstory]s died, but managed to capture a fugitive, dead or alive."
- if(FUGITIVE_RESULT_STALEMATE)
- result += "Bloody Stalemate"
- result += "Everyone died, and no fugitives were recovered!"
- if(FUGITIVE_RESULT_MINOR_FUGITIVE)
- result += "Minor Fugitive Victory"
- result += "All the fugitives died, but none were recovered!"
- if(FUGITIVE_RESULT_FUGITIVE_VICTORY)
- result += "Fugitive Victory"
- result += "A fugitive survived, and no bodies were recovered by the [backstory]s."
- if(FUGITIVE_RESULT_MAJOR_FUGITIVE)
- result += "Major Fugitive Victory"
- result += "All of the fugitives survived and avoided capture!"
- else //get_result returned null- either bugged or no fugitives showed
- result += "Prank Call!"
- result += "[capitalize(backstory)]s were called, yet there were no fugitives...?"
-
- result += "
"
-
- return result.Join("
")
diff --git a/code/modules/antagonists/gang/gang.dm b/code/modules/antagonists/gang/gang.dm
index f9264d0bfd9b..8f73b93f8fd4 100644
--- a/code/modules/antagonists/gang/gang.dm
+++ b/code/modules/antagonists/gang/gang.dm
@@ -198,11 +198,9 @@
roundend_category = "The Tunnel Snakes"
gang_name = "Tunnel Snakes"
gang_id = "TS"
- acceptable_clothes = list(/obj/item/clothing/under/pants/classicjeans,
- /obj/item/clothing/suit/jacket,
+ acceptable_clothes = list(/obj/item/clothing/suit/jacket,
/obj/item/clothing/mask/bandana/skull)
free_clothes = list(/obj/item/clothing/suit/jacket,
- /obj/item/clothing/under/pants/classicjeans,
/obj/item/toy/crayon/spraycan)
gang_objective = "TUNNEL SNAKES RULE!!! Make sure that everyone knows that, by getting 25% of people on station to wear any part of our uniform! TUNNEL SNAKES RULE!!!"
antag_hud_name = "Snakes"
diff --git a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm
index c87faa0941b8..ddc895060b0c 100644
--- a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm
+++ b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm
@@ -96,7 +96,7 @@
return
if(listeningTo)
UnregisterSignal(listeningTo, signalCache)
- RegisterSignal(user, signalCache, .proc/disrupt)
+ RegisterSignal(user, signalCache, PROC_REF(disrupt))
listeningTo = user
/obj/item/borg_chameleon/proc/deactivate(mob/living/silicon/robot/user)
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index 9aaa8b989c0d..d0019eb19cc2 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -459,7 +459,7 @@
sound_to_playing_players('sound/machines/alarm.ogg')
if(SSticker && SSticker.mode)
SSticker.roundend_check_paused = TRUE
- addtimer(CALLBACK(src, .proc/actually_explode), 100)
+ addtimer(CALLBACK(src, PROC_REF(actually_explode)), 100)
/obj/machinery/nuclearbomb/proc/actually_explode()
if(!core)
@@ -494,8 +494,8 @@
SSticker.roundend_check_paused = FALSE
/obj/machinery/nuclearbomb/proc/really_actually_explode(off_station)
- Cinematic(get_cinematic_type(off_station),world,CALLBACK(SSticker,/datum/controller/subsystem/ticker/proc/station_explosion_detonation,src))
- INVOKE_ASYNC(GLOBAL_PROC,.proc/KillEveryoneOnZLevel, virtual_z())
+ Cinematic(get_cinematic_type(off_station),world,CALLBACK(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, station_explosion_detonation),src))
+ INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(KillEveryoneOnZLevel), virtual_z())
/obj/machinery/nuclearbomb/proc/get_cinematic_type(off_station)
if(off_station < 2)
@@ -540,7 +540,7 @@
var/datum/round_event_control/E = locate(/datum/round_event_control/vent_clog/beer) in SSevents.control
if(E)
E.runEvent()
- addtimer(CALLBACK(src, .proc/really_actually_explode), 110)
+ addtimer(CALLBACK(src, PROC_REF(really_actually_explode)), 110)
/obj/machinery/nuclearbomb/beer/proc/disarm()
detonation_timer = null
diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm
index ab8202527abc..9f807d9521e7 100644
--- a/code/modules/antagonists/nukeop/nukeop.dm
+++ b/code/modules/antagonists/nukeop/nukeop.dm
@@ -132,8 +132,8 @@
/datum/antagonist/nukeop/get_admin_commands()
. = ..()
- .["Send to base"] = CALLBACK(src,.proc/admin_send_to_base)
- .["Tell code"] = CALLBACK(src,.proc/admin_tell_code)
+ .["Send to base"] = CALLBACK(src, PROC_REF(admin_send_to_base))
+ .["Tell code"] = CALLBACK(src, PROC_REF(admin_tell_code))
/datum/antagonist/nukeop/proc/admin_send_to_base(mob/admin)
owner.current.forceMove(pick(GLOB.nukeop_start))
@@ -190,7 +190,7 @@
else
H.put_in_hands(dukinuki, TRUE)
owner.announce_objectives()
- addtimer(CALLBACK(src, .proc/nuketeam_name_assign), 1)
+ addtimer(CALLBACK(src, PROC_REF(nuketeam_name_assign)), 1)
/datum/antagonist/nukeop/leader/proc/nuketeam_name_assign()
diff --git a/code/modules/antagonists/pirate/pirate.dm b/code/modules/antagonists/pirate/pirate.dm
deleted file mode 100644
index 91bc063869a7..000000000000
--- a/code/modules/antagonists/pirate/pirate.dm
+++ /dev/null
@@ -1,108 +0,0 @@
-/datum/antagonist/pirate
- name = "Space Pirate"
- job_rank = ROLE_TRAITOR
- roundend_category = "space pirates"
- antagpanel_category = "Pirate"
- show_to_ghosts = TRUE
- var/datum/team/pirate/crew
-
-/datum/antagonist/pirate/greet()
- to_chat(owner, "
You are a Space Pirate!")
- to_chat(owner, "
The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot.")
- owner.announce_objectives()
-
-/datum/antagonist/pirate/get_team()
- return crew
-
-/datum/antagonist/pirate/create_team(datum/team/pirate/new_team)
- if(!new_team)
- for(var/datum/antagonist/pirate/P in GLOB.antagonists)
- if(!P.owner)
- continue
- if(P.crew)
- crew = P.crew
- return
- if(!new_team)
- crew = new /datum/team/pirate
- crew.forge_objectives()
- return
- if(!istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- crew = new_team
-
-/datum/antagonist/pirate/on_gain()
- if(crew)
- objectives |= crew.objectives
- . = ..()
-
-/datum/team/pirate
- name = "Pirate crew"
-
-/datum/team/pirate/proc/forge_objectives()
- var/datum/objective/loot/getbooty = new()
- getbooty.team = src
- for(var/obj/machinery/computer/piratepad_control/P in GLOB.machines)
- var/area/A = get_area(P)
- if(istype(A,/area/shuttle/pirate))
- getbooty.cargo_hold = P
- break
- getbooty.update_explanation_text()
- objectives += getbooty
- for(var/datum/mind/M in members)
- var/datum/antagonist/pirate/P = M.has_antag_datum(/datum/antagonist/pirate)
- if(P)
- P.objectives |= objectives
-
-
-/datum/objective/loot
- var/obj/machinery/computer/piratepad_control/cargo_hold
- explanation_text = "Acquire valuable loot and store it in designated area."
- var/target_value = 50000
-
-
-/datum/objective/loot/update_explanation_text()
- if(cargo_hold)
- var/area/storage_area = get_area(cargo_hold)
- explanation_text = "Acquire loot and store [target_value] of credits worth in [storage_area.name] cargo hold."
-
-/datum/objective/loot/proc/loot_listing()
- //Lists notable loot.
- if(!cargo_hold || !cargo_hold.total_report)
- return "Nothing"
- cargo_hold.total_report.total_value = sortTim(cargo_hold.total_report.total_value, cmp = /proc/cmp_numeric_dsc, associative = TRUE)
- var/count = 0
- var/list/loot_texts = list()
- for(var/datum/export/E in cargo_hold.total_report.total_value)
- if(++count > 5)
- break
- loot_texts += E.total_printout(cargo_hold.total_report,notes = FALSE)
- return loot_texts.Join(", ")
-
-/datum/objective/loot/proc/get_loot_value()
- return cargo_hold ? cargo_hold.points : 0
-
-/datum/objective/loot/check_completion()
- return ..() || get_loot_value() >= target_value
-
-/datum/team/pirate/roundend_report()
- var/list/parts = list()
-
- parts += ""
-
- var/all_dead = TRUE
- for(var/datum/mind/M in members)
- if(considered_alive(M))
- all_dead = FALSE
- parts += printplayerlist(members)
-
- parts += "Loot stolen: "
- var/datum/objective/loot/L = locate() in objectives
- parts += L.loot_listing()
- parts += "Total loot value : [L.get_loot_value()]/[L.target_value] credits"
-
- if(L.check_completion() && !all_dead)
- parts += "
The pirate crew was successful!"
- else
- parts += "
The pirate crew has failed."
-
- return "
[parts.Join("
")]
"
diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm
index 2487260dd5c1..76da8304df09 100644
--- a/code/modules/antagonists/revenant/revenant.dm
+++ b/code/modules/antagonists/revenant/revenant.dm
@@ -199,7 +199,7 @@
adjustBruteLoss(25) //hella effective
inhibited = TRUE
update_action_buttons_icon()
- addtimer(CALLBACK(src, .proc/reset_inhibit), 30)
+ addtimer(CALLBACK(src, PROC_REF(reset_inhibit)), 30)
/mob/living/simple_animal/revenant/proc/reset_inhibit()
inhibited = FALSE
@@ -361,7 +361,7 @@
/obj/item/ectoplasm/revenant/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/try_reform), 600)
+ addtimer(CALLBACK(src, PROC_REF(try_reform)), 600)
/obj/item/ectoplasm/revenant/proc/scatter()
qdel(src)
diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm
index edccf0775928..b235199ed750 100644
--- a/code/modules/antagonists/revenant/revenant_abilities.dm
+++ b/code/modules/antagonists/revenant/revenant_abilities.dm
@@ -200,7 +200,7 @@
/obj/effect/proc_holder/spell/aoe_turf/revenant/overload/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
if(attempt_cast(user))
for(var/turf/T in targets)
- INVOKE_ASYNC(src, .proc/overload, T, user)
+ INVOKE_ASYNC(src, PROC_REF(overload), T, user)
/obj/effect/proc_holder/spell/aoe_turf/revenant/overload/proc/overload(turf/T, mob/user)
for(var/obj/machinery/light/L in T)
@@ -211,7 +211,7 @@
s.set_up(4, 0, L)
s.start()
new /obj/effect/temp_visual/revenant(get_turf(L))
- addtimer(CALLBACK(src, .proc/overload_shock, L, user), 20)
+ addtimer(CALLBACK(src, PROC_REF(overload_shock), L, user), 20)
/obj/effect/proc_holder/spell/aoe_turf/revenant/overload/proc/overload_shock(obj/machinery/light/L, mob/user)
if(!L.on) //wait, wait, don't shock me
@@ -241,7 +241,7 @@
/obj/effect/proc_holder/spell/aoe_turf/revenant/defile/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
if(attempt_cast(user))
for(var/turf/T in targets)
- INVOKE_ASYNC(src, .proc/defile, T)
+ INVOKE_ASYNC(src, PROC_REF(defile), T)
/obj/effect/proc_holder/spell/aoe_turf/revenant/defile/proc/defile(turf/T)
for(var/obj/effect/blessing/B in T)
@@ -292,7 +292,7 @@
/obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
if(attempt_cast(user))
for(var/turf/T in targets)
- INVOKE_ASYNC(src, .proc/malfunction, T, user)
+ INVOKE_ASYNC(src, PROC_REF(malfunction), T, user)
/obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction/proc/malfunction(turf/T, mob/user)
for(var/mob/living/simple_animal/bot/bot in T)
@@ -335,7 +335,7 @@
/obj/effect/proc_holder/spell/aoe_turf/revenant/blight/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
if(attempt_cast(user))
for(var/turf/T in targets)
- INVOKE_ASYNC(src, .proc/blight, T, user)
+ INVOKE_ASYNC(src, PROC_REF(blight), T, user)
/obj/effect/proc_holder/spell/aoe_turf/revenant/blight/proc/blight(turf/T, mob/user)
for(var/mob/living/mob in T)
diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm
index 04381477802a..cd1b40957d82 100644
--- a/code/modules/antagonists/revenant/revenant_blight.dm
+++ b/code/modules/antagonists/revenant/revenant_blight.dm
@@ -62,6 +62,6 @@
affected_mob.dna.species.handle_hair(affected_mob,"#1d2953")
affected_mob.visible_message("
[affected_mob] looks terrifyingly gaunt...", "
You suddenly feel like your skin is wrong...")
affected_mob.add_atom_colour("#1d2953", TEMPORARY_COLOUR_PRIORITY)
- addtimer(CALLBACK(src, .proc/cure), 100)
+ addtimer(CALLBACK(src, PROC_REF(cure)), 100)
else
return
diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm
index b12050c263b7..595fbb27f61a 100644
--- a/code/modules/antagonists/slaughter/slaughter.dm
+++ b/code/modules/antagonists/slaughter/slaughter.dm
@@ -68,7 +68,7 @@
/mob/living/simple_animal/slaughter/phasein()
. = ..()
add_movespeed_modifier(/datum/movespeed_modifier/slaughter)
- addtimer(CALLBACK(src, .proc/remove_movespeed_modifier, /datum/movespeed_modifier/slaughter), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
+ addtimer(CALLBACK(src, PROC_REF(remove_movespeed_modifier), /datum/movespeed_modifier/slaughter), 6 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl
/obj/item/organ/heart/demon
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
index 48b9ecfad259..6fec09373797 100644
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ b/code/modules/antagonists/swarmer/swarmer.dm
@@ -569,7 +569,7 @@
/obj/structure/swarmer/trap/Initialize(mapload)
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index a3e4230373d8..894023d9c194 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -219,7 +219,7 @@
var/mob/living/silicon/ai/A = M
if(istype(A) && traitor_kind == TRAITOR_AI)
A.hack_software = TRUE
- RegisterSignal(M, COMSIG_MOVABLE_HEAR, .proc/handle_hearing)
+ RegisterSignal(M, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hearing))
/datum/antagonist/traitor/remove_innate_effects(mob/living/mob_override)
. = ..()
diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
index 0add31c60b74..339cd462d5a8 100644
--- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
+++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
@@ -338,8 +338,8 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module))
/datum/action/innate/ai/lockdown/Activate()
for(var/obj/machinery/door/D in GLOB.airlocks)
- INVOKE_ASYNC(D, /obj/machinery/door.proc/hostile_lockdown, owner)
- addtimer(CALLBACK(D, /obj/machinery/door.proc/disable_lockdown), 900)
+ INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door, hostile_lockdown), owner)
+ addtimer(CALLBACK(D, TYPE_PROC_REF(/obj/machinery/door, disable_lockdown)), 900)
var/obj/machinery/computer/communications/C = locate() in GLOB.machines
if(C)
@@ -347,7 +347,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module))
minor_announce("Hostile runtime detected in door controllers. Isolation lockdown protocols are now in effect. Please remain calm.","Network Alert:", TRUE)
to_chat(owner, "
Lockdown initiated. Network reset in 90 seconds.")
- addtimer(CALLBACK(GLOBAL_PROC, .proc/minor_announce,
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(minor_announce),
"Automatic system reboot complete. Have a secure day.",
"Network reset:"), 900)
@@ -400,7 +400,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module))
attached_action.desc = "[initial(attached_action.desc)] It has [attached_action.uses] use\s remaining."
attached_action.UpdateButtonIcon()
target.audible_message("
You hear a loud electrical buzzing sound coming from [target]!")
- addtimer(CALLBACK(attached_action, /datum/action/innate/ai/ranged/override_machine.proc/animate_machine, target), 50) //kabeep!
+ addtimer(CALLBACK(attached_action, TYPE_PROC_REF(/datum/action/innate/ai/ranged/override_machine, animate_machine), target), 50) //kabeep!
remove_ranged_ability("
Sending override signal...")
return TRUE
@@ -483,7 +483,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module))
attached_action.desc = "[initial(attached_action.desc)] It has [attached_action.uses] use\s remaining."
attached_action.UpdateButtonIcon()
target.audible_message("
You hear a loud electrical buzzing sound coming from [target]!")
- addtimer(CALLBACK(attached_action, /datum/action/innate/ai/ranged/overload_machine.proc/detonate_machine, target), 50) //kaboom!
+ addtimer(CALLBACK(attached_action, TYPE_PROC_REF(/datum/action/innate/ai/ranged/overload_machine, detonate_machine), target), 50) //kaboom!
remove_ranged_ability("
Overcharging machine...")
return TRUE
@@ -590,7 +590,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module))
I.loc = T
client.images += I
I.icon_state = "[success ? "green" : "red"]Overlay" //greenOverlay and redOverlay for success and failure respectively
- addtimer(CALLBACK(src, .proc/remove_transformer_image, client, I, T), 30)
+ addtimer(CALLBACK(src, PROC_REF(remove_transformer_image), client, I, T), 30)
if(!success)
to_chat(src, "
[alert_msg]")
return success
@@ -660,7 +660,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module))
/datum/action/innate/ai/emergency_lights/Activate()
for(var/obj/machinery/light/L in GLOB.machines)
L.no_emergency = TRUE
- INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE)
+ INVOKE_ASYNC(L, TYPE_PROC_REF(/obj/machinery/light, update), FALSE)
CHECK_TICK
to_chat(owner, "
Emergency light connections severed.")
owner.playsound_local(owner, 'sound/effects/light_flicker.ogg', 50, FALSE)
diff --git a/code/modules/antagonists/traitor/syndicate_contract.dm b/code/modules/antagonists/traitor/syndicate_contract.dm
index 17e841acb5e3..d012949ba054 100644
--- a/code/modules/antagonists/traitor/syndicate_contract.dm
+++ b/code/modules/antagonists/traitor/syndicate_contract.dm
@@ -61,7 +61,7 @@
/datum/syndicate_contract/proc/launch_extraction_pod(turf/empty_pod_turf)
var/obj/structure/closet/supplypod/extractionpod/empty_pod = new()
- RegisterSignal(empty_pod, COMSIG_ATOM_ENTERED, .proc/enter_check)
+ RegisterSignal(empty_pod, COMSIG_ATOM_ENTERED, PROC_REF(enter_check))
empty_pod.stay_after_drop = TRUE
empty_pod.reversing = TRUE
@@ -156,7 +156,7 @@
/datum/syndicate_contract/proc/handleVictimExperience(mob/living/M)
// Ship 'em back - dead or alive, 4 minutes wait.
// Even if they weren't the target, we're still treating them the same.
- addtimer(CALLBACK(src, .proc/returnVictim, M), (60 * 10) * 4)
+ addtimer(CALLBACK(src, PROC_REF(returnVictim), M), (60 * 10) * 4)
if (M.stat != DEAD)
// Heal them up - gets them out of crit/soft crit. If omnizine is removed in the future, this needs to be replaced with a
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index 01993ee5539e..a95ef0d1b579 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -129,7 +129,7 @@
insaneinthemembrane.sanity = 0
for(var/lore in typesof(/datum/brain_trauma/severe))
C.gain_trauma(lore)
- addtimer(CALLBACK(src, /obj/singularity/wizard.proc/deranged, C), 100)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/singularity/wizard, deranged), C), 100)
/obj/singularity/wizard/proc/deranged(mob/living/carbon/C)
if(!C || C.stat == DEAD)
@@ -340,7 +340,7 @@
if(BODY_ZONE_PRECISE_EYES)
user.set_machine(src)
user.reset_perspective(target)
- addtimer(CALLBACK(src, .proc/reset, user), 10 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(reset), user), 10 SECONDS)
if(BODY_ZONE_R_LEG,BODY_ZONE_L_LEG)
to_chat(user, "
You move the doll's legs around.")
var/turf/T = get_step(target,pick(GLOB.cardinals))
diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm
index 8a13c5c612ed..c426b953f725 100644
--- a/code/modules/antagonists/wizard/equipment/soulstone.dm
+++ b/code/modules/antagonists/wizard/equipment/soulstone.dm
@@ -224,7 +224,7 @@
"Wraith" = image(icon = 'icons/mob/cult.dmi', icon_state = "wraith"),
"Artificer" = image(icon = 'icons/mob/cult.dmi', icon_state = "artificer")
)
- var/construct_class = show_radial_menu(user, src, constructs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
+ var/construct_class = show_radial_menu(user, src, constructs, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE)
if(!T || !T.loc)
return
switch(construct_class)
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index 528fd33db5d4..14cf56d51ae0 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -162,7 +162,7 @@
/datum/antagonist/wizard/get_admin_commands()
. = ..()
- .["Send to Lair"] = CALLBACK(src,.proc/admin_send_to_lair)
+ .["Send to Lair"] = CALLBACK(src, PROC_REF(admin_send_to_lair))
/datum/antagonist/wizard/proc/admin_send_to_lair(mob/admin)
owner.current.forceMove(pick(GLOB.wizardstart))
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index 5c1324bdcfe9..2d5fd3efc9fc 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -35,7 +35,7 @@
/obj/item/assembly/Initialize()
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -75,9 +75,9 @@
//Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs
/obj/item/assembly/proc/pulsed(radio = FALSE)
if(wire_type & WIRE_RECEIVE)
- INVOKE_ASYNC(src, .proc/activate)
+ INVOKE_ASYNC(src, PROC_REF(activate))
if(radio && (wire_type & WIRE_RADIO_RECEIVE))
- INVOKE_ASYNC(src, .proc/activate)
+ INVOKE_ASYNC(src, PROC_REF(activate))
return TRUE
//Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index ab64cdc86700..8407f1d8b1a1 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -16,7 +16,7 @@
/obj/item/onetankbomb/Initialize()
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm
index 40a10a168ea0..3b8c2c8cf7ba 100644
--- a/code/modules/assembly/doorcontrol.dm
+++ b/code/modules/assembly/doorcontrol.dm
@@ -28,7 +28,7 @@
if(M.id == src.id)
if(openclose == null || !sync_doors)
openclose = M.density
- INVOKE_ASYNC(M, openclose ? /obj/machinery/door/poddoor.proc/open : /obj/machinery/door/poddoor.proc/close)
+ INVOKE_ASYNC(M, openclose ? TYPE_PROC_REF(/obj/machinery/door/poddoor, open) : TYPE_PROC_REF(/obj/machinery/door/poddoor, close))
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10)
/obj/item/assembly/control/airlock
@@ -71,7 +71,7 @@
D.safe = !D.safe
for(var/D in open_or_close)
- INVOKE_ASYNC(D, doors_need_closing ? /obj/machinery/door/airlock.proc/close : /obj/machinery/door/airlock.proc/open)
+ INVOKE_ASYNC(D, doors_need_closing ? TYPE_PROC_REF(/obj/machinery/door/airlock, close) : TYPE_PROC_REF(/obj/machinery/door/airlock, open))
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10)
@@ -86,7 +86,7 @@
cooldown = TRUE
for(var/obj/machinery/door/poddoor/M in GLOB.machines)
if (M.id == src.id)
- INVOKE_ASYNC(M, /obj/machinery/door/poddoor.proc/open)
+ INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/door/poddoor, open))
sleep(10)
@@ -98,7 +98,7 @@
for(var/obj/machinery/door/poddoor/M in GLOB.machines)
if (M.id == src.id)
- INVOKE_ASYNC(M, /obj/machinery/door/poddoor.proc/close)
+ INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/door/poddoor, close))
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10)
@@ -113,7 +113,7 @@
cooldown = TRUE
for(var/obj/machinery/sparker/M in GLOB.machines)
if (M.id == src.id)
- INVOKE_ASYNC(M, /obj/machinery/sparker.proc/ignite)
+ INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/sparker, ignite))
for(var/obj/machinery/igniter/M in GLOB.machines)
if(M.id == src.id)
@@ -133,7 +133,7 @@
cooldown = TRUE
for(var/obj/machinery/flasher/M in GLOB.machines)
if(M.id == src.id)
- INVOKE_ASYNC(M, /obj/machinery/flasher.proc/flash)
+ INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/flasher, flash))
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50)
@@ -163,6 +163,6 @@
cooldown = TRUE
for(var/obj/machinery/power/shieldwallgen/machine in GLOB.machines)
if(machine.id == src.id)
- INVOKE_ASYNC(machine, /obj/machinery/power/shieldwallgen.proc/toggle)
+ INVOKE_ASYNC(machine, TYPE_PROC_REF(/obj/machinery/power/shieldwallgen, toggle))
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 20)
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index 637157682a15..8fe788f79ca7 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -29,7 +29,7 @@
flashing = flash
. = ..()
if(flash)
- addtimer(CALLBACK(src, /atom/.proc/update_icon), 5)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 5)
holder?.update_icon(updates)
/obj/item/assembly/flash/update_overlays()
@@ -97,7 +97,7 @@
last_trigger = world.time
playsound(src, 'sound/weapons/flash.ogg', 100, TRUE)
set_light_on(TRUE)
- addtimer(CALLBACK(src, .proc/flash_end), FLASH_LIGHT_DURATION, TIMER_OVERRIDE|TIMER_UNIQUE)
+ addtimer(CALLBACK(src, PROC_REF(flash_end)), FLASH_LIGHT_DURATION, TIMER_OVERRIDE|TIMER_UNIQUE)
times_used++
flash_recharge()
update_icon(ALL, TRUE)
@@ -219,7 +219,7 @@
to_chat(real_arm.owner, "
Your photon projector implant overheats and deactivates!")
real_arm.Retract()
overheat = TRUE
- addtimer(CALLBACK(src, .proc/cooldown), flashcd * 2)
+ addtimer(CALLBACK(src, PROC_REF(cooldown)), flashcd * 2)
/obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null)
if(overheat)
@@ -228,7 +228,7 @@
to_chat(real_arm.owner, "
Your photon projector is running too hot to be used again so quickly!")
return FALSE
overheat = TRUE
- addtimer(CALLBACK(src, .proc/cooldown), flashcd)
+ addtimer(CALLBACK(src, PROC_REF(cooldown)), flashcd)
playsound(src, 'sound/weapons/flash.ogg', 100, TRUE)
update_icon(ALL, TRUE)
return TRUE
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index 4d2ffdac5d4e..8dbb1dc98b61 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -17,7 +17,7 @@
/obj/item/assembly_holder/Initialize()
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index bc8fdcc3d908..72d7bfd45a30 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -22,7 +22,7 @@
/obj/item/assembly/infra/ComponentInitialize()
. = ..()
var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS
- AddComponent(/datum/component/simple_rotation, rotation_flags, after_rotation=CALLBACK(src,.proc/after_rotation))
+ AddComponent(/datum/component/simple_rotation, rotation_flags, after_rotation=CALLBACK(src, PROC_REF(after_rotation)))
/obj/item/assembly/infra/proc/after_rotation()
refreshBeam()
@@ -162,7 +162,7 @@
return
if(listeningTo)
UnregisterSignal(listeningTo, COMSIG_ATOM_EXITED)
- RegisterSignal(newloc, COMSIG_ATOM_EXITED, .proc/check_exit)
+ RegisterSignal(newloc, COMSIG_ATOM_EXITED, PROC_REF(check_exit))
listeningTo = newloc
/obj/item/assembly/infra/proc/check_exit(datum/source, atom/movable/offender)
@@ -176,7 +176,7 @@
var/obj/item/I = offender
if (I.item_flags & ABSTRACT)
return
- INVOKE_ASYNC(src, .proc/refreshBeam)
+ INVOKE_ASYNC(src, PROC_REF(refreshBeam))
/obj/item/assembly/infra/setDir()
. = ..()
@@ -230,7 +230,7 @@
/obj/effect/beam/i_beam/Initialize()
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -242,4 +242,4 @@
var/obj/item/I = AM
if (I.item_flags & ABSTRACT)
return
- INVOKE_ASYNC(master, /obj/item/assembly/infra/proc/trigger_beam, AM, get_turf(src))
+ INVOKE_ASYNC(master, TYPE_PROC_REF(/obj/item/assembly/infra, trigger_beam), AM, get_turf(src))
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index bf9353a658d9..25b6ce470466 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -114,15 +114,15 @@
if(ishuman(AM))
var/mob/living/carbon/H = AM
if(H.m_intent == MOVE_INTENT_RUN)
- INVOKE_ASYNC(src, .proc/triggered, H)
+ INVOKE_ASYNC(src, PROC_REF(triggered), H)
H.visible_message(
"
[H] accidentally steps on [src].",
"
You accidentally step on [src]"
)
else if(ismouse(MM))
- INVOKE_ASYNC(src, .proc/triggered, MM)
+ INVOKE_ASYNC(src, PROC_REF(triggered), MM)
else if(AM.density) // For mousetrap grenades, set off by anything heavy
- INVOKE_ASYNC(src, .proc/triggered, AM)
+ INVOKE_ASYNC(src, PROC_REF(triggered), AM)
/obj/item/assembly/mousetrap/on_found(mob/finder)
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 0ff3fadae733..0bfac86ee0df 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -61,7 +61,7 @@
switch(action)
if("signal")
- INVOKE_ASYNC(src, .proc/signal)
+ INVOKE_ASYNC(src, PROC_REF(signal))
. = TRUE
if("freq")
frequency = unformat_frequency(params["freq"])
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index d154121956c9..84f1a5040015 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -41,7 +41,7 @@
record_speech(speaker, raw_message, message_language)
else
if(check_activation(speaker, raw_message))
- addtimer(CALLBACK(src, .proc/pulse, 0), 10)
+ addtimer(CALLBACK(src, PROC_REF(pulse), 0), 10)
/obj/item/assembly/voice/proc/record_speech(atom/movable/speaker, raw_message, datum/language/message_language)
switch(mode)
@@ -59,7 +59,7 @@
say("Your voice pattern is saved.", message_language)
if(VOICE_SENSOR_MODE)
if(length(raw_message))
- addtimer(CALLBACK(src, .proc/pulse, 0), 10)
+ addtimer(CALLBACK(src, PROC_REF(pulse), 0), 10)
/obj/item/assembly/voice/proc/check_activation(atom/movable/speaker, raw_message)
. = FALSE
diff --git a/code/modules/asset_cache/transports/asset_transport.dm b/code/modules/asset_cache/transports/asset_transport.dm
index 9f1073c9c9f0..5fbc239e45b8 100644
--- a/code/modules/asset_cache/transports/asset_transport.dm
+++ b/code/modules/asset_cache/transports/asset_transport.dm
@@ -14,7 +14,7 @@
/datum/asset_transport/proc/Load()
if (CONFIG_GET(flag/asset_simple_preload))
for(var/client/C in GLOB.clients)
- addtimer(CALLBACK(src, .proc/send_assets_slow, C, preload), 1 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(send_assets_slow), C, preload), 1 SECONDS)
/// Initialize - Called when SSassets initializes.
/datum/asset_transport/proc/Initialize(list/assets)
@@ -22,7 +22,7 @@
if (!CONFIG_GET(flag/asset_simple_preload))
return
for(var/client/C in GLOB.clients)
- addtimer(CALLBACK(src, .proc/send_assets_slow, C, preload), 1 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(send_assets_slow), C, preload), 1 SECONDS)
/**
@@ -137,7 +137,7 @@
client.sent_assets[new_asset_name] = ACI.hash
- addtimer(CALLBACK(client, /client/proc/asset_cache_update_json), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE)
+ addtimer(CALLBACK(client, TYPE_PROC_REF(/client, asset_cache_update_json)), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE)
return TRUE
return FALSE
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index 428e8b5a6d18..041f09cddc9b 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -60,7 +60,7 @@
air_update_turf()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/atmospherics/gasmixtures/auxgm.dm b/code/modules/atmospherics/gasmixtures/auxgm.dm
index 924e90b4767c..40691d8e5079 100644
--- a/code/modules/atmospherics/gasmixtures/auxgm.dm
+++ b/code/modules/atmospherics/gasmixtures/auxgm.dm
@@ -138,7 +138,7 @@ GLOBAL_DATUM_INIT(gas_data, /datum/auxgm, new)
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
anchored = TRUE // should only appear in vis_contents, but to be safe
layer = FLY_LAYER
- appearance_flags = TILE_BOUND
+ appearance_flags = TILE_BOUND | RESET_COLOR
vis_flags = NONE
/obj/effect/overlay/gas/New(state)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
index 0d93d554c47f..1f7b18ead917 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
@@ -199,7 +199,7 @@
if("set_external_pressure" in signal.data)
external_pressure_bound = clamp(text2num(signal.data["set_external_pressure"]),0,ONE_ATMOSPHERE*50)
- addtimer(CALLBACK(src, .proc/broadcast_status), 2)
+ addtimer(CALLBACK(src, PROC_REF(broadcast_status)), 2)
if(!("status" in signal.data)) //do not update_icon
update_appearance()
@@ -291,10 +291,6 @@
id_tag = INCINERATOR_ATMOS_DP_VENTPUMP
frequency = FREQ_AIRLOCK_CONTROL
-/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_syndicatelava
- id_tag = INCINERATOR_SYNDICATELAVA_DP_VENTPUMP
- frequency = FREQ_AIRLOCK_CONTROL
-
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer2
piping_layer = 2
icon_state = "dpvent_map-2"
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
index 0631fac4856c..020570f34785 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
@@ -49,7 +49,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
return
update_icon_nopipes(TRUE)
switching = TRUE
- addtimer(CALLBACK(src, .proc/finish_interact), 10)
+ addtimer(CALLBACK(src, PROC_REF(finish_interact)), 10)
/obj/machinery/atmospherics/components/binary/valve/proc/finish_interact()
toggle()
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index 1fdc91effb44..ad8dd9761598 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -27,7 +27,7 @@
. = ..()
if(hide)
- RegisterSignal(src, COMSIG_OBJ_HIDE, .proc/hide_pipe)
+ RegisterSignal(src, COMSIG_OBJ_HIDE, PROC_REF(hide_pipe))
// Iconnery
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 3864bc2ada18..8f547335e9e0 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -166,7 +166,7 @@
occupant_overlay.pixel_y--
add_overlay(occupant_overlay)
add_overlay("cover-on")
- addtimer(CALLBACK(src, .proc/run_anim, anim_up, occupant_overlay), 7, TIMER_UNIQUE)
+ addtimer(CALLBACK(src, PROC_REF(run_anim), anim_up, occupant_overlay), 7, TIMER_UNIQUE)
/obj/machinery/atmospherics/components/unary/cryo_cell/on_set_is_operational(old_value)
if(old_value) //Turned off
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
index d70e91b29de7..d3a4b115278f 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
@@ -125,7 +125,7 @@
on = !on
if("inject" in signal.data)
- INVOKE_ASYNC(src, .proc/inject)
+ INVOKE_ASYNC(src, PROC_REF(inject))
return
if("set_volume_rate" in signal.data)
@@ -133,7 +133,7 @@
var/datum/gas_mixture/air_contents = airs[1]
volume_rate = clamp(number, 0, air_contents.return_volume())
- addtimer(CALLBACK(src, .proc/broadcast_status), 2)
+ addtimer(CALLBACK(src, PROC_REF(broadcast_status)), 2)
if(!("status" in signal.data)) //do not update_icon
update_appearance()
diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm
index f7eeeb9f7f96..a29d48657446 100644
--- a/code/modules/awaymissions/away_props.dm
+++ b/code/modules/awaymissions/away_props.dm
@@ -65,7 +65,7 @@
/obj/structure/pitgrate/Initialize()
. = ..()
- RegisterSignal(SSdcs,COMSIG_GLOB_BUTTON_PRESSED, .proc/OnButtonPressed)
+ RegisterSignal(SSdcs,COMSIG_GLOB_BUTTON_PRESSED, PROC_REF(OnButtonPressed))
if(hidden)
update_openspace()
@@ -91,7 +91,7 @@
obj_flags |= BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP
plane = BYOND_LIGHTING_LAYER //What matters it's one above openspace, so our animation is not dependant on what's there. Up to revision with 513
animate(src,alpha = talpha,time = 10)
- addtimer(CALLBACK(src,.proc/reset_plane),10)
+ addtimer(CALLBACK(src, PROC_REF(reset_plane)),10)
if(hidden)
update_openspace()
var/turf/T = get_turf(src)
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index abf9ba4f5e16..77c655c38247 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -40,7 +40,7 @@
if(!reset)
reset = new reset_path(get_turf(src))
reset.flag = src
- RegisterSignal(src, COMSIG_PARENT_PREQDELETED, .proc/reset_flag) //just in case CTF has some map hazards (read: chasms).
+ RegisterSignal(src, COMSIG_PARENT_PREQDELETED, PROC_REF(reset_flag)) //just in case CTF has some map hazards (read: chasms).
/obj/item/ctf/ComponentInitialize()
. = ..()
@@ -283,7 +283,7 @@
var/turf/T = get_turf(body)
new /obj/effect/ctf/ammo(T)
recently_dead_ckeys += body.ckey
- addtimer(CALLBACK(src, .proc/clear_cooldown, body.ckey), respawn_cooldown, TIMER_UNIQUE)
+ addtimer(CALLBACK(src, PROC_REF(clear_cooldown), body.ckey), respawn_cooldown, TIMER_UNIQUE)
body.dust()
/obj/machinery/capture_the_flag/proc/clear_cooldown(ckey)
@@ -407,7 +407,7 @@
/obj/item/gun/ballistic/automatic/pistol/deagle/ctf/dropped()
. = ..()
- addtimer(CALLBACK(src, .proc/floor_vanish), 1)
+ addtimer(CALLBACK(src, PROC_REF(floor_vanish)), 1)
/obj/item/gun/ballistic/automatic/pistol/deagle/ctf/proc/floor_vanish()
if(isturf(loc))
@@ -435,7 +435,7 @@
/obj/item/gun/ballistic/automatic/laser/ctf/dropped()
. = ..()
- addtimer(CALLBACK(src, .proc/floor_vanish), 1)
+ addtimer(CALLBACK(src, PROC_REF(floor_vanish)), 1)
/obj/item/gun/ballistic/automatic/laser/ctf/proc/floor_vanish()
if(isturf(loc))
@@ -446,7 +446,7 @@
/obj/item/ammo_box/magazine/recharge/ctf/dropped()
. = ..()
- addtimer(CALLBACK(src, .proc/floor_vanish), 1)
+ addtimer(CALLBACK(src, PROC_REF(floor_vanish)), 1)
/obj/item/ammo_box/magazine/recharge/ctf/proc/floor_vanish()
if(isturf(loc))
@@ -637,7 +637,7 @@
/obj/effect/ctf/ammo/Initialize(mapload)
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
QDEL_IN(src, AMMO_DROP_LIFETIME)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 0caf1d7c4e3d..253d4c49eb3d 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -57,7 +57,7 @@
/obj/effect/mob_spawn/Initialize(mapload)
. = ..()
if(instant || (roundstart && (mapload || (SSticker && SSticker.current_state > GAME_STATE_SETTING_UP))))
- INVOKE_ASYNC(src, .proc/create)
+ INVOKE_ASYNC(src, PROC_REF(create))
else if(ghost_usable)
GLOB.poi_list |= src
LAZYADD(GLOB.mob_spawners[name], src)
@@ -465,8 +465,8 @@
name = "Beach Bum"
glasses = /obj/item/clothing/glasses/sunglasses
r_pocket = /obj/item/storage/wallet/random
- l_pocket = /obj/item/reagent_containers/food/snacks/pizzaslice/dank;
- uniform = /obj/item/clothing/under/pants/youngfolksjeans
+ l_pocket = /obj/item/reagent_containers/food/snacks/pizzaslice/dank
+ uniform = /obj/item/clothing/under/pants/jeans
id = /obj/item/card/id
/datum/outfit/beachbum/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index 189fe1ebfd11..a643be115aab 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -89,7 +89,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
/datum/gateway_destination/gateway/post_transfer(atom/movable/AM)
. = ..()
- addtimer(CALLBACK(AM,/atom/movable.proc/setDir,SOUTH),0)
+ addtimer(CALLBACK(AM, TYPE_PROC_REF(/atom/movable, setDir),SOUTH),0)
/* Special home destination, so we can check exile implants */
/datum/gateway_destination/gateway/home
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index 9fe39716543d..a4b9098c77a1 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -212,7 +212,7 @@
var/turf/T = get_turf(src)
T.visible_message("
[src] flares briefly.")
- addtimer(CALLBACK(src, .proc/effect, user, .), 1 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(effect), user, .), 1 SECONDS)
/obj/item/dice/d20/fate/equipped(mob/user, slot)
. = ..()
diff --git a/code/modules/awaymissions/mission_code/murderdome.dm b/code/modules/awaymissions/mission_code/murderdome.dm
index 695692ed331f..914a1f2828c7 100644
--- a/code/modules/awaymissions/mission_code/murderdome.dm
+++ b/code/modules/awaymissions/mission_code/murderdome.dm
@@ -33,7 +33,7 @@
/obj/effect/murderdome/dead_barricade/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/respawn), 3 MINUTES)
+ addtimer(CALLBACK(src, PROC_REF(respawn)), 3 MINUTES)
/obj/effect/murderdome/dead_barricade/proc/respawn()
if(!QDELETED(src))
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index 35396ddded18..26c6b4823dce 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -19,7 +19,7 @@
/obj/effect/meatgrinder/Initialize()
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm
index fcefdef265fe..bef302de217c 100644
--- a/code/modules/awaymissions/super_secret_room.dm
+++ b/code/modules/awaymissions/super_secret_room.dm
@@ -129,7 +129,7 @@
var/newcolor = color2hex(pick(10;"green", 5;"blue", 3;"red", 1;"purple"))
add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -138,7 +138,7 @@
if(!ismob(AM))
return
var/mob/M = AM
- INVOKE_ASYNC(src, .proc/do_hand_stuff, M)
+ INVOKE_ASYNC(src, PROC_REF(do_hand_stuff), M)
/obj/item/rupee/proc/do_hand_stuff(mob/M)
if(M.put_in_hands(src))
diff --git a/code/modules/balloon_alert/balloon_alert.dm b/code/modules/balloon_alert/balloon_alert.dm
index c27372260789..db4453bfa6b6 100644
--- a/code/modules/balloon_alert/balloon_alert.dm
+++ b/code/modules/balloon_alert/balloon_alert.dm
@@ -12,7 +12,7 @@
/atom/proc/balloon_alert(mob/viewer, text)
SHOULD_NOT_SLEEP(TRUE)
- INVOKE_ASYNC(src, .proc/balloon_alert_perform, viewer, text)
+ INVOKE_ASYNC(src, PROC_REF(balloon_alert_perform), viewer, text)
/// Create balloon alerts (text that floats up) to everything within range.
/// Will only display to people who can see.
@@ -79,7 +79,7 @@
easing = CUBIC_EASING | EASE_IN,
)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/remove_image_from_client, balloon_alert, viewer_client), BALLOON_TEXT_TOTAL_LIFETIME(duration_mult))
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(remove_image_from_client), balloon_alert, viewer_client), BALLOON_TEXT_TOTAL_LIFETIME(duration_mult))
#undef BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MIN
#undef BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MULT
diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm
index 74ac431c5fe9..700485eb1d7f 100644
--- a/code/modules/buildmode/buildmode.dm
+++ b/code/modules/buildmode/buildmode.dm
@@ -29,7 +29,7 @@
mode = new /datum/buildmode_mode/basic(src)
holder = c
buttons = list()
- li_cb = CALLBACK(src, .proc/post_login)
+ li_cb = CALLBACK(src, PROC_REF(post_login))
holder.player_details.post_login_callbacks += li_cb
holder.show_popup_menus = FALSE
create_buttons()
diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm
index 5a3982f7df47..38f1fea99906 100644
--- a/code/modules/cargo/bounties/medical.dm
+++ b/code/modules/cargo/bounties/medical.dm
@@ -26,7 +26,7 @@
/datum/bounty/item/medical/liver
name = "Livers"
- description = "Multiple high-ranking CentCom diplomats have been hospitalized with liver failure after a recent meeting with Third Soviet Union ambassadors. Help us out, will you?"
+ description = "Multiple high-ranking CentCom diplomats have been hospitalized with liver failure after a recent meeting. Help us out, will you?"
reward = 10000
required_count = 3
wanted_types = list(/obj/item/organ/liver)
diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm
index 42aea5437c4b..560fc46668de 100644
--- a/code/modules/cargo/gondolapod.dm
+++ b/code/modules/cargo/gondolapod.dm
@@ -69,7 +69,7 @@
/mob/living/simple_animal/pet/gondola/gondolapod/setOpened()
opened = TRUE
update_appearance()
- addtimer(CALLBACK(src, /atom/.proc/setClosed), 50)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, setClosed)), 50)
/mob/living/simple_animal/pet/gondola/gondolapod/setClosed()
opened = FALSE
diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm
index 9bb96a14be5c..33a5ee37be02 100644
--- a/code/modules/cargo/packs/ammo.dm
+++ b/code/modules/cargo/packs/ammo.dm
@@ -22,6 +22,15 @@
/obj/item/ammo_box/magazine/m45)
cost = 1500
+/datum/supply_pack/ammo/m45_speedloader
+ name = ".45 ACP Speedloader Crate"
+ desc = "Contains four .45 ACP speedloaders for revolvers, each containing six rounds."
+ contains = list(/obj/item/ammo_box/c45_speedloader,
+ /obj/item/ammo_box/c45_speedloader,
+ /obj/item/ammo_box/c45_speedloader,
+ /obj/item/ammo_box/c45_speedloader)
+ cost = 1500
+
/datum/supply_pack/ammo/c38_mag
name = ".38 Speedloader Crate"
desc = "Contains four .38 speedloaders for revolvers, each containing six rounds."
diff --git a/code/modules/cargo/packs/civilian.dm b/code/modules/cargo/packs/civilian.dm
index ed723283814a..154dce436ee7 100644
--- a/code/modules/cargo/packs/civilian.dm
+++ b/code/modules/cargo/packs/civilian.dm
@@ -53,6 +53,20 @@
Bundles
*/
+/datum/supply_pack/civilian/sauna_starter
+ name = "DIY Sauna Crate"
+ desc = "A Kalixcian staple. Comes with a set of five freshly cleaned towels, and enough wood to make your very own Sauna. Water not included."
+ cost = 500
+ contains = list(/obj/item/stack/sheet/mineral/wood/twentyfive,
+ /obj/item/reagent_containers/glass/bucket/wooden,
+ /obj/item/towel,
+ /obj/item/towel,
+ /obj/item/towel,
+ /obj/item/towel,
+ /obj/item/towel,)
+ crate_name = "sauna starter crate"
+ crate_type = /obj/structure/closet/crate/wooden
+
/datum/supply_pack/civilian/book_crate
name = "Book Crate"
desc = "Surplus from the Nanotrasen Archives, these six books are sure to be good reads."
@@ -199,7 +213,7 @@
/datum/supply_pack/civilian/carpet_exotic
name = "Exotic Carpet Crate"
- desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 8 different flooring patterns."
+ desc = "Exotic carpets for all your decorating needs. Contains 100 tiles each of 8 different flooring patterns."
cost = 3000
contains = list(/obj/item/stack/tile/carpet/blue/fifty,
/obj/item/stack/tile/carpet/blue/fifty,
@@ -272,7 +286,6 @@
crate_name = "masterwork fishing rod case"
crate_type = /obj/structure/closet/crate/wooden
-
/datum/supply_pack/civilian/fishinghooks
name = "Fishing Hook Variety Pack"
desc = "A variety of fishing hooks to allow for more specialized fishing."
diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm
index b91fe38e0390..6ca715889855 100644
--- a/code/modules/cargo/packs/gun.dm
+++ b/code/modules/cargo/packs/gun.dm
@@ -39,12 +39,18 @@
/obj/item/gun/ballistic/revolver)
/datum/supply_pack/gun/detrevolver
- name = "Revolver crate"
+ name = "Hunter's Pride Detective Revolver crate"
desc = "Contains two concealable Solarian revolvers, chambered in .38."
cost = 2000
contains = list(/obj/item/gun/ballistic/revolver/detective,
/obj/item/gun/ballistic/revolver/detective)
+/datum/supply_pack/gun/cattlemanrevolver
+ name = "Cattleman Revolver crate"
+ desc = "Contains two concealable Cattleman revolvers, chambered in .45 ACP."
+ cost = 2500
+ contains = list(/obj/item/gun/ballistic/revolver/cattleman,
+ /obj/item/gun/ballistic/revolver/cattleman)
/*
diff --git a/code/modules/cargo/packs/tools.dm b/code/modules/cargo/packs/tools.dm
index 2afbe0e85c2f..3d5389e23327 100644
--- a/code/modules/cargo/packs/tools.dm
+++ b/code/modules/cargo/packs/tools.dm
@@ -116,24 +116,24 @@
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/tools/watertank
- name = "Water Tank Crate"
+ name = "Fresh Water Supply Crate"
desc = "Contains a tank of dihydrogen monoxide. Sounds dangerous."
- cost = 600
+ cost = 500
contains = list(/obj/structure/reagent_dispensers/watertank)
crate_name = "water tank crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/tools/hightank
- name = "Large Water Tank Crate"
+ name = "Large Fresh Water Supply Crate"
desc = "Contains a high-capacity water tank. Useful for botany or other service jobs."
- cost = 1200
+ cost = 1500
contains = list(/obj/structure/reagent_dispensers/watertank/high)
crate_name = "high-capacity water tank crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/tools/foamtank
name = "Firefighting Foam Tank Crate"
- desc = "Contains a tank of firefighting foam. Also known as \"plasmaman's bane\"."
+ desc = "Contains a tank of firefighting foam. Also known as \"Phorid's Bane\"."
cost = 1500
contains = list(/obj/structure/reagent_dispensers/foamtank)
crate_name = "foam tank crate"
diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm
index e1568ae1adee..16b43704df58 100644
--- a/code/modules/cargo/supplypod.dm
+++ b/code/modules/cargo/supplypod.dm
@@ -264,11 +264,11 @@
var/mob/living/simple_animal/pet/gondola/gondolapod/benis = new(turf_underneath, src)
benis.contents |= contents //Move the contents of this supplypod into the gondolapod mob.
moveToNullspace()
- addtimer(CALLBACK(src, .proc/open_pod, benis), delays[POD_OPENING]) //After the opening delay passes, we use the open proc from this supplyprod while referencing the contents of the "holder", in this case the gondolapod mob
+ addtimer(CALLBACK(src, PROC_REF(open_pod), benis), delays[POD_OPENING]) //After the opening delay passes, we use the open proc from this supplyprod while referencing the contents of the "holder", in this case the gondolapod mob
else if (style == STYLE_SEETHROUGH)
open_pod(src)
else
- addtimer(CALLBACK(src, .proc/open_pod, src), delays[POD_OPENING]) //After the opening delay passes, we use the open proc from this supplypod, while referencing this supplypod's contents
+ addtimer(CALLBACK(src, PROC_REF(open_pod), src), delays[POD_OPENING]) //After the opening delay passes, we use the open proc from this supplypod, while referencing this supplypod's contents
/obj/structure/closet/supplypod/proc/open_pod(atom/movable/holder, broken = FALSE, forced = FALSE) //The holder var represents an atom whose contents we will be working with
if (!holder)
@@ -297,9 +297,9 @@
startExitSequence(src)
else
if (reversing)
- addtimer(CALLBACK(src, .proc/SetReverseIcon), delays[POD_LEAVING]/2) //Finish up the pod's duties after a certain amount of time
+ addtimer(CALLBACK(src, PROC_REF(SetReverseIcon)), delays[POD_LEAVING]/2) //Finish up the pod's duties after a certain amount of time
if(!stay_after_drop) // Departing should be handled manually
- addtimer(CALLBACK(src, .proc/startExitSequence, holder), delays[POD_LEAVING]*(4/5)) //Finish up the pod's duties after a certain amount of time
+ addtimer(CALLBACK(src, PROC_REF(startExitSequence), holder), delays[POD_LEAVING]*(4/5)) //Finish up the pod's duties after a certain amount of time
/obj/structure/closet/supplypod/proc/startExitSequence(atom/movable/holder)
if (leavingSound)
@@ -320,7 +320,7 @@
take_contents(holder)
playsound(holder, close_sound, soundVolume*0.75, TRUE, -3)
holder.setClosed()
- addtimer(CALLBACK(src, .proc/preReturn, holder), delays[POD_LEAVING] * 0.2) //Start to leave a bit after closing for cinematic effect
+ addtimer(CALLBACK(src, PROC_REF(preReturn), holder), delays[POD_LEAVING] * 0.2) //Start to leave a bit after closing for cinematic effect
/obj/structure/closet/supplypod/take_contents(atom/movable/holder)
var/turf/turf_underneath = holder.drop_location()
@@ -398,7 +398,7 @@
animate(holder, alpha = 0, time = 8, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL)
animate(holder, pixel_z = 400, time = 10, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) //Animate our rising pod
- addtimer(CALLBACK(src, .proc/handleReturnAfterDeparting, holder), 15) //Finish up the pod's duties after a certain amount of time
+ addtimer(CALLBACK(src, PROC_REF(handleReturnAfterDeparting), holder), 15) //Finish up the pod's duties after a certain amount of time
/obj/structure/closet/supplypod/setOpened() //Proc exists here, as well as in any atom that can assume the role of a "holder" of a supplypod. Check the open_pod() proc for more details
opened = TRUE
@@ -578,8 +578,8 @@
if (soundStartTime < 0)
soundStartTime = 1
if (!pod.effectQuiet && !(pod.pod_flags & FIRST_SOUNDS))
- addtimer(CALLBACK(src, .proc/playFallingSound), soundStartTime)
- addtimer(CALLBACK(src, .proc/beginLaunch, pod.effectCircle), pod.delays[POD_TRANSIT])
+ addtimer(CALLBACK(src, PROC_REF(playFallingSound)), soundStartTime)
+ addtimer(CALLBACK(src, PROC_REF(beginLaunch), pod.effectCircle), pod.delays[POD_TRANSIT])
/obj/effect/pod_landingzone/proc/playFallingSound()
playsound(src, pod.fallingSound, pod.soundVolume, 1, 6)
@@ -602,7 +602,7 @@
if (pod.style != STYLE_INVISIBLE)
animate(pod.get_filter("motionblur"), y = 0, time = pod.delays[POD_FALLING], flags = ANIMATION_PARALLEL)
animate(pod, pixel_z = -1 * abs(sin(rotation))*4, pixel_x = SUPPLYPOD_X_OFFSET + (sin(rotation) * 20), time = pod.delays[POD_FALLING], easing = LINEAR_EASING, flags = ANIMATION_PARALLEL) //Make the pod fall! At an angle!
- addtimer(CALLBACK(src, .proc/endLaunch), pod.delays[POD_FALLING], TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation
+ addtimer(CALLBACK(src, PROC_REF(endLaunch)), pod.delays[POD_FALLING], TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation
/obj/effect/pod_landingzone/proc/setupSmoke(rotation)
if (pod.style == STYLE_INVISIBLE || pod.style == STYLE_SEETHROUGH)
@@ -618,7 +618,7 @@
smoke_part.pixel_y = abs(cos(rotation))*32 * i
smoke_part.filters += filter(type = "blur", size = 4)
var/time = (pod.delays[POD_FALLING] / length(smoke_effects))*(length(smoke_effects)-i)
- addtimer(CALLBACK(smoke_part, /obj/effect/supplypod_smoke/.proc/drawSelf, i), time, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation
+ addtimer(CALLBACK(smoke_part, TYPE_PROC_REF(/obj/effect/supplypod_smoke, drawSelf), i), time, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation
QDEL_IN(smoke_part, pod.delays[POD_FALLING] + 35)
/obj/effect/pod_landingzone/proc/drawSmoke()
diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm
index b5ae8023bb4d..11fd10229e5e 100644
--- a/code/modules/cargo/supplypod_beacon.dm
+++ b/code/modules/cargo/supplypod_beacon.dm
@@ -23,7 +23,7 @@
launched = TRUE
playsound(src,'sound/machines/triple_beep.ogg',50,FALSE)
playsound(src,'sound/machines/warning-buzzer.ogg',50,FALSE)
- addtimer(CALLBACK(src, .proc/endLaunch), 33)//wait 3.3 seconds (time it takes for supplypod to land), then update icon
+ addtimer(CALLBACK(src, PROC_REF(endLaunch)), 33)//wait 3.3 seconds (time it takes for supplypod to land), then update icon
if (SP_UNLINK)
linked = FALSE
playsound(src,'sound/machines/synth_no.ogg',50,FALSE)
diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm
index 6357229e02db..b569faf75b10 100644
--- a/code/modules/client/client_colour.dm
+++ b/code/modules/client/client_colour.dm
@@ -204,7 +204,7 @@
/datum/client_colour/bloodlust/New(mob/_owner)
..()
- addtimer(CALLBACK(src, .proc/update_colour, list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0), 10, SINE_EASING|EASE_OUT), 1)
+ addtimer(CALLBACK(src, PROC_REF(update_colour), list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0), 10, SINE_EASING|EASE_OUT), 1)
/datum/client_colour/thirdeye
colour = list(
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 44710b0fd6fc..334818c0e1f9 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -137,8 +137,17 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
if(QDELETED(real_src))
return
+ //fun fact: Topic() acts like a verb and is executed at the end of the tick like other verbs. So we have to queue it if the server is
+ //overloaded
+ if(hsrc && hsrc != holder && DEFAULT_TRY_QUEUE_VERB(VERB_CALLBACK(src, PROC_REF(_Topic), hsrc, href, href_list)))
+ return
..() //redirect to hsrc.Topic()
+///dumb workaround because byond doesnt seem to recognize the .proc/Topic() typepath for /datum/proc/Topic() from the client Topic,
+///so we cant queue it without this
+/client/proc/_Topic(datum/hsrc, href, list/href_list)
+ return hsrc.Topic(href, href_list)
+
/client/proc/is_content_unlocked()
if(!prefs.unlock_content)
to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Only 10 bucks for 3 months!
Click Here to find out more.")
@@ -338,7 +347,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
// Initialize tgui panel
src << browse(file('html/statbrowser.html'), "window=statbrowser")
- addtimer(CALLBACK(src, .proc/check_panel_loaded), 30 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(check_panel_loaded)), 30 SECONDS)
tgui_panel.initialize()
if(alert_mob_dupe_login)
@@ -843,6 +852,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
click_intercept_time = 0 //Reset and return. Next click should work, but not this one.
return
click_intercept_time = 0 //Just reset. Let's not keep re-checking forever.
+
var/ab = FALSE
var/list/modifiers = params2list(params)
@@ -856,12 +866,16 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
var/mcl = CONFIG_GET(number/minute_click_limit)
if (!holder && mcl)
var/minute = round(world.time, 600)
+
if (!clicklimiter)
clicklimiter = new(LIMITER_SIZE)
+
if (minute != clicklimiter[CURRENT_MINUTE])
clicklimiter[CURRENT_MINUTE] = minute
clicklimiter[MINUTE_COUNT] = 0
- clicklimiter[MINUTE_COUNT] += 1+(ab)
+
+ clicklimiter[MINUTE_COUNT] += 1 + (ab)
+
if (clicklimiter[MINUTE_COUNT] > mcl)
var/msg = "Your previous click was ignored because you've done too many in a minute."
if (minute != clicklimiter[ADMINSWARNED_AT]) //only one admin message per-minute. (if they spam the admins can just boot/ban them)
@@ -882,14 +896,22 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
var/second = round(world.time, 10)
if (!clicklimiter)
clicklimiter = new(LIMITER_SIZE)
+
if (second != clicklimiter[CURRENT_SECOND])
clicklimiter[CURRENT_SECOND] = second
clicklimiter[SECOND_COUNT] = 0
- clicklimiter[SECOND_COUNT] += 1+(!!ab)
+
+ clicklimiter[SECOND_COUNT] += 1 + (!!ab)
+
if (clicklimiter[SECOND_COUNT] > scl)
- to_chat(src, "
Your previous click was ignored because you've done too many in a second")
+ to_chat(src, span_danger("Your previous click was ignored because you've done too many in a second"))
return
+ //check if the server is overloaded and if it is then queue up the click for next tick
+ //yes having it call a wrapping proc on the subsystem is fucking stupid glad we agree unfortunately byond insists its reasonable
+ if(!QDELETED(object) && TRY_QUEUE_VERB(VERB_CALLBACK(object, /atom/proc/_Click, location, control, params), VERB_OVERTIME_QUEUE_THRESHOLD, SSinput, control))
+ return
+
if (prefs.hotkeys)
winset(src, null, "input.focus=false")
else
@@ -932,7 +954,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
//Precache the client with all other assets slowly, so as to not block other browse() calls
if (CONFIG_GET(flag/asset_simple_preload))
- addtimer(CALLBACK(SSassets.transport, /datum/asset_transport.proc/send_assets_slow, src, SSassets.transport.preload), 5 SECONDS)
+ addtimer(CALLBACK(SSassets.transport, TYPE_PROC_REF(/datum/asset_transport, send_assets_slow), src, SSassets.transport.preload), 5 SECONDS)
#if (PRELOAD_RSC == 0)
for (var/name in GLOB.vox_sounds)
diff --git a/code/modules/client/loadout/loadout_uniform.dm b/code/modules/client/loadout/loadout_uniform.dm
index 4f88e6d1a905..4edb59b74076 100644
--- a/code/modules/client/loadout/loadout_uniform.dm
+++ b/code/modules/client/loadout/loadout_uniform.dm
@@ -91,10 +91,6 @@
display_name = "jeans"
path = /obj/item/clothing/under/pants/jeans
-/datum/gear/uniform/pants/classicjeans
- display_name = "classic jeans"
- path = /obj/item/clothing/under/pants/classicjeans
-
/datum/gear/uniform/pants/khaki
display_name = "khaki pants"
path = /obj/item/clothing/under/pants/khaki
@@ -119,10 +115,6 @@
display_name = "black jeans"
path = /obj/item/clothing/under/pants/blackjeans
-/datum/gear/uniform/pants/mustangjeans
- display_name = "Must Hang jeans"
- path = /obj/item/clothing/under/pants/mustangjeans
-
/datum/gear/uniform/pants/black
display_name = "black pants"
path = /obj/item/clothing/under/pants/black
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index f1fe218b175b..69ea5e634cda 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -609,7 +609,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("spider_legs" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
- dat += "
Spider Extra Legs Variant
"
+ dat += "
Extra Legs
"
dat += "
[features["spider_legs"]]"
@@ -621,7 +621,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("spider_spinneret" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
- dat += "
Spider Spinneret Markings
"
+ dat += "
Spinneret
"
dat += "
[features["spider_spinneret"]]"
@@ -630,18 +630,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
mutant_category = 0
- if("spider_mandibles" in pref_species.default_features)
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
- dat += "
Spider Mandible Variant
"
-
- dat += "
[features["spider_mandibles"]]"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
if("squid_face" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -1906,18 +1894,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_spider_spinneret)
features["spider_spinneret"] = new_spider_spinneret
- if("spider_mandibles")
- var/new_spider_mandibles
- new_spider_mandibles = input(user, "Choose your character's variant of mandibles:", "Character Preference") as null|anything in GLOB.spider_mandibles_list
- if (new_spider_mandibles)
- features["spider_mandibles"] = new_spider_mandibles
-
- if("squid_face")
- var/new_squid_face
- new_squid_face = input(user, "Choose your character's face type:", "Character Preference") as null|anything in GLOB.squid_face_list
- if (new_squid_face)
- features["squid_face"] = new_squid_face
-
if("ipc_screen")
var/new_ipc_screen
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 26cea413adb3..e8015ce2fbb7 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -122,7 +122,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(!addedbind)
notadded += kb
if(length(notadded))
- addtimer(CALLBACK(src, .proc/announce_conflict, notadded), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(announce_conflict), notadded), 5 SECONDS)
/datum/preferences/proc/announce_conflict(list/notadded)
to_chat(parent, "
KEYBINDING CONFLICT!!!\n\
@@ -503,52 +503,51 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
- socks = sanitize_inlist(socks, GLOB.socks_list)
- age = sanitize_integer(age, pref_species.species_age_min, pref_species.species_age_max, initial(age))
+ socks = sanitize_inlist(socks, GLOB.socks_list)
+ age = sanitize_integer(age, pref_species.species_age_min, pref_species.species_age_max, initial(age))
hair_color = sanitize_hexcolor(hair_color)
- facial_hair_color = sanitize_hexcolor(facial_hair_color)
- underwear_color = sanitize_hexcolor(underwear_color)
- eye_color = sanitize_hexcolor(eye_color)
- skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
+ facial_hair_color = sanitize_hexcolor(facial_hair_color)
+ underwear_color = sanitize_hexcolor(underwear_color)
+ eye_color = sanitize_hexcolor(eye_color)
+ skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
backpack = sanitize_inlist(backpack, GLOB.backpacklist, initial(backpack))
- jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
- exowear = sanitize_inlist(exowear, GLOB.exowearlist, initial(exowear))
- uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
- fbp = sanitize_integer(fbp, FALSE, TRUE, FALSE)
- features["grad_style"] = sanitize_inlist(features["grad_style"], GLOB.hair_gradients_list)
- features["grad_color"] = sanitize_hexcolor(features["grad_color"])
- features["body_size"] = sanitize_inlist(features["body_size"], GLOB.body_sizes, "Normal")
- features["mcolor"] = sanitize_hexcolor(features["mcolor"])
- features["mcolor2"] = sanitize_hexcolor(features["mcolor2"])
- features["ethcolor"] = copytext_char(features["ethcolor"], 1, 7)
- features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
- features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human, "None")
- features["face_markings"] = sanitize_inlist(features["face_markings"], GLOB.face_markings_list)
- features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list)
- features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list, "None")
- features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
- features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
- features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
- features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Normal Legs")
- features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list, "Plain")
- features["moth_fluff"] = sanitize_inlist(features["moth_fluff"], GLOB.moth_fluff_list, "Plain")
- features["spider_legs"] = sanitize_inlist(features["spider_legs"], GLOB.spider_legs_list, "Plain")
- features["spider_spinneret"] = sanitize_inlist(features["spider_spinneret"], GLOB.spider_spinneret_list, "Plain")
- features["spider_mandibles"] = sanitize_inlist(features["spider_mandibles"], GLOB.spider_mandibles_list, "Plain")
- features["moth_markings"] = sanitize_inlist(features["moth_markings"], GLOB.moth_markings_list, "None")
- features["squid_face"] = sanitize_inlist(features["squid_face"], GLOB.squid_face_list, "Squidward")
- features["ipc_screen"] = sanitize_inlist(features["ipc_screen"], GLOB.ipc_screens_list)
- features["ipc_antenna"] = sanitize_inlist(features["ipc_antenna"], GLOB.ipc_antennas_list)
- features["ipc_chassis"] = sanitize_inlist(features["ipc_chassis"], GLOB.ipc_chassis_list)
- features["ipc_brain"] = sanitize_inlist(features["ipc_brain"], GLOB.ipc_brain_list)
- features["kepori_feathers"] = sanitize_inlist(features["kepori_feathers"], GLOB.kepori_feathers_list, "Plain")
- features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "Plain")
- features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "Fan")
- features["vox_head_quills"] = sanitize_inlist(features["vox_head_quills"], GLOB.vox_head_quills_list, "None")
- features["vox_neck_quills"] = sanitize_inlist(features["vox_neck_quills"], GLOB.vox_neck_quills_list, "None")
- features["elzu_horns"] = sanitize_inlist(features["elzu_horns"], GLOB.elzu_horns_list)
- features["tail_elzu"] = sanitize_inlist(features["tail_elzu"], GLOB.tails_list_elzu)
- features["flavor_text"] = sanitize_text(features["flavor_text"], initial(features["flavor_text"]))
+ jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
+ exowear = sanitize_inlist(exowear, GLOB.exowearlist, initial(exowear))
+ uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
+ fbp = sanitize_integer(fbp, FALSE, TRUE, FALSE)
+ features["grad_style"] = sanitize_inlist(features["grad_style"], GLOB.hair_gradients_list)
+ features["grad_color"] = sanitize_hexcolor(features["grad_color"])
+ features["body_size"] = sanitize_inlist(features["body_size"], GLOB.body_sizes, "Normal")
+ features["mcolor"] = sanitize_hexcolor(features["mcolor"])
+ features["mcolor2"] = sanitize_hexcolor(features["mcolor2"])
+ features["ethcolor"] = copytext_char(features["ethcolor"], 1, 7)
+ features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
+ features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human, "None")
+ features["face_markings"] = sanitize_inlist(features["face_markings"], GLOB.face_markings_list)
+ features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list)
+ features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list, "None")
+ features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
+ features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
+ features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
+ features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Normal Legs")
+ features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list, "Plain")
+ features["moth_fluff"] = sanitize_inlist(features["moth_fluff"], GLOB.moth_fluff_list, "Plain")
+ features["spider_legs"] = sanitize_inlist(features["spider_legs"], GLOB.spider_legs_list, "Plain")
+ features["spider_spinneret"] = sanitize_inlist(features["spider_spinneret"], GLOB.spider_spinneret_list, "Plain")
+ features["moth_markings"] = sanitize_inlist(features["moth_markings"], GLOB.moth_markings_list, "None")
+ features["squid_face"] = sanitize_inlist(features["squid_face"], GLOB.squid_face_list, "Squidward")
+ features["ipc_screen"] = sanitize_inlist(features["ipc_screen"], GLOB.ipc_screens_list)
+ features["ipc_antenna"] = sanitize_inlist(features["ipc_antenna"], GLOB.ipc_antennas_list)
+ features["ipc_chassis"] = sanitize_inlist(features["ipc_chassis"], GLOB.ipc_chassis_list)
+ features["ipc_brain"] = sanitize_inlist(features["ipc_brain"], GLOB.ipc_brain_list)
+ features["kepori_feathers"] = sanitize_inlist(features["kepori_feathers"], GLOB.kepori_feathers_list, "Plain")
+ features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "Plain")
+ features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "Fan")
+ features["vox_head_quills"] = sanitize_inlist(features["vox_head_quills"], GLOB.vox_head_quills_list, "None")
+ features["vox_neck_quills"] = sanitize_inlist(features["vox_neck_quills"], GLOB.vox_neck_quills_list, "None")
+ features["elzu_horns"] = sanitize_inlist(features["elzu_horns"], GLOB.elzu_horns_list)
+ features["tail_elzu"] = sanitize_inlist(features["tail_elzu"], GLOB.tails_list_elzu)
+ features["flavor_text"] = sanitize_text(features["flavor_text"], initial(features["flavor_text"]))
all_quirks = SANITIZE_LIST(all_quirks)
diff --git a/code/modules/clothing/factions/gezena.dm b/code/modules/clothing/factions/gezena.dm
new file mode 100644
index 000000000000..6d2e11ea0010
--- /dev/null
+++ b/code/modules/clothing/factions/gezena.dm
@@ -0,0 +1,276 @@
+//Jumpsuits
+//thgvr TODO: Make more stuff (backpacks, headsets, doodads, part 2?)
+/obj/item/clothing/under/gezena
+ name = "gezenan navywear"
+ desc = "Made of a slick synthetic material that is both breathable, and resistant to scale and thorn alike."
+ icon = 'icons/obj/clothing/faction/gezena/uniforms.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/uniforms.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/gezena/gezena_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
+ icon_state = "naval"
+ item_state = "bluejump"
+ supports_variations = DIGITIGRADE_VARIATION
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
+
+/obj/item/clothing/under/gezena/captain
+ name = "gezenan captain's navywear"
+ desc = "A refined variation of the basic navywear, sporting sleek silver trim."
+ icon_state = "captain"
+ item_state = "bluejump"
+
+/obj/item/clothing/under/gezena/marine
+ name = "gezenan marine fatigue"
+ desc = "Rough inside and out, these fatigues have seen their fair share."
+ icon_state = "marine"
+ item_state = "marinejump"
+
+//Unarmored suit
+
+/obj/item/clothing/suit/toggle/gezena
+ name = "silkenweave jacket"
+ desc = "Refined and sturdy, emblazoned below the neck with the Federation's symbol."
+ icon = 'icons/obj/clothing/faction/gezena/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/suits.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/gezena/gezena_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
+ icon_state = "lightcoat"
+ item_state = "bluecloth"
+ blood_overlay_type = "coat"
+ togglename = "zipper"
+ body_parts_covered = CHEST|ARMS
+ pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+ armor = list("melee" = 20, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
+
+//Armored suit
+
+/obj/item/clothing/suit/armor/gezena
+ name = "navywear coat"
+ desc = "Formal navywear, emblazoned across the back with the Gezenan sigil."
+ icon = 'icons/obj/clothing/faction/gezena/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/suits.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/gezena/gezena_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
+ icon_state = "coat"
+ item_state = "bluecloth"
+ blood_overlay_type = "coat"
+ body_parts_covered = CHEST|ARMS|GROIN|LEGS
+ pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+ armor = list("melee" = 35, "bullet" = 35, "laser" = 20, "energy" = 40, "bomb" = 20, "bio" = 20, "rad" = 0, "fire" = 50, "acid" = 50)
+ allowed = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/tank/internals/plasmaman,
+ /obj/item/toy,
+ /obj/item/storage/fancy/cigarettes,
+ /obj/item/lighter,
+ /obj/item/radio,
+ /obj/item/gun/energy/kalix,
+ )
+
+/obj/item/clothing/suit/armor/gezena/engi
+ name = "engineer navywear coat"
+ desc = "Oil and stain resistant, with orange trim signifiying the wearer doesn't mind getting their hands dirty."
+ icon_state = "engicoat"
+ item_state = "bluecloth"
+
+/obj/item/clothing/suit/armor/gezena/captain
+ name = "captain's navywear coat"
+ desc = "Blood resistant, with silver trim to denote status. Lined with softer material."
+ icon_state = "captaincoat"
+ item_state = "captaincoat"
+
+/obj/item/clothing/suit/armor/gezena/marine
+ name = "\improper Raksha-plating vest"
+ desc = "Raksha - a Kalixcian word for 'protection of the heart'. Sturdy and reliable."
+ icon_state = "marinevest"
+ item_state = "marinevest"
+
+/obj/item/clothing/suit/armor/gezena/marinecoat
+ name = "coated Raksha-plating"
+ desc = "Less practical with the coat than without."
+ icon_state = "marinecoat"
+ item_state = "bluecloth"
+
+//Spacesuits
+
+/obj/item/clothing/suit/space/gezena
+ name = "\improper Rakalla-suit"
+ desc = "Rakalla - a Kalixcian word for 'protection among the stars'. Sturdy, flexible, and reliable."
+ icon = 'icons/obj/clothing/faction/gezena/suits.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/suits.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/gezena/gezena_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
+ icon_state = "spacesuit"
+ item_state = "spacesuit"
+ armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 15, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
+ w_class = WEIGHT_CLASS_NORMAL
+ supports_variations = DIGITIGRADE_VARIATION
+
+/obj/item/clothing/head/helmet/space/gezena
+ name = "\improper Rakalla-helm"
+ desc = "Featuring rubberized grommets fitting for any length of horn, and an internal monitor for life support."
+ icon = 'icons/obj/clothing/faction/gezena/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/head.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/gezena/gezena_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
+ icon_state = "spacehelmet"
+ item_state = "spacehelm"
+ armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 15, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
+ w_class = WEIGHT_CLASS_NORMAL
+
+//Hats
+
+/obj/item/clothing/head/gezena
+ name = "\improper PGFN Cap"
+ desc = "The standard cap of the PGF military, in Navy colors."
+ icon = 'icons/obj/clothing/faction/gezena/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/head.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/gezena/gezena_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
+ icon_state = "navalhat"
+ item_state = "bluecloth"
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+/obj/item/clothing/head/gezena/flap
+ name = "\improper PGFN Betzu-il cap"
+ desc = "The standard cap of the PGF military, in Navy colors. “betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects."
+ icon_state = "navalflap"
+ item_state = "bluecloth"
+
+/obj/item/clothing/head/gezena/marine
+ name = "\improper PGFMC Cap"
+ desc = "The standard cap of the PGF military, in Marine Corps colors."
+ icon_state = "marinehat"
+ item_state = "marinecloth"
+
+/obj/item/clothing/head/gezena/marine/flap
+ name = "\improper PGFMC Betzu-il cap"
+ desc = "The standard cap of the PGF military, in Marine Corps colors. “betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects."
+ icon_state = "marineflap"
+ item_state = "marinecloth"
+
+/obj/item/clothing/head/gezena/medic
+ name = "\improper PGF medic cap"
+ desc = "The standard cap of the PGF military. The coloring indicates the wearer as a medical officer."
+ icon_state = "medichat"
+ item_state = "whitecloth"
+
+/obj/item/clothing/head/gezena/medic/flap
+ name = "\improper PGF medic Betzu-il cap"
+ desc = "The standard cap of the PGF military. “betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. The coloring indicates the wearer as a medical officer."
+ icon_state = "medicflap"
+ item_state = "whitecloth"
+
+/obj/item/clothing/head/gezena/captain // no captain flap yet(?)
+ name = "\improper PGFN captain's cap"
+ desc = "The standard cap of the PGF military, in Navy colors. The decoration indicates the wearer as a ship's Captain."
+ icon_state = "captainhat"
+ item_state = "bluecloth"
+
+/obj/item/clothing/head/helmet/gezena
+ name = "\improper Raksha-helm"
+ desc = "Far more practical for combat than either type of cap, but not nearly as traditional or comfortable. Features small sections of removable plating to make space for the horns of horned races."
+ icon = 'icons/obj/clothing/faction/gezena/head.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/head.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/gezena/gezena_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
+ icon_state = "marinehelmet"
+ item_state = "marinehelm"
+
+//Gloves
+
+/obj/item/clothing/gloves/gezena
+ name = "\improper PGFN Ihuz-irra Gloves"
+ desc = "As the name, “ihuz-irra”, or “sure-grip”, suggests, the gloves employed by the PGF military are designed to ensure the highest possible grip is maintained while also providing protection from blisters in work environments."
+ icon = 'icons/obj/clothing/faction/gezena/hands.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/hands.dmi'
+ icon_state = "navalgloves"
+ item_state = "navalgloves"
+ cold_protection = HANDS
+ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
+ armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+/obj/item/clothing/gloves/gezena/marine
+ name = "\improper PGFMC Ihuz-irra Gloves"
+ desc = "As the name, “ihuz-irra”, or “sure-grip”, suggests, the gloves employed by the PGF military are designed to ensure the highest possible grip is maintained while also providing protection from blisters in work environments. Carries extra tactile grip on the fingertips for easy use of firearms."
+ icon_state = "marinegloves"
+ item_state = "marinegloves"
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 50)
+
+/obj/item/clothing/gloves/gezena/engi
+ name = "\improper PGFN Engineering Ihuz-irra Gloves"
+ desc = "As the name, “ihuz-irra”, or “sure-grip”, suggests, the gloves employed by the PGF military are designed to ensure the highest possible grip is maintained while also providing protection from blisters in work environments. Comes with anti-conductive microfibers interwoven to supply the useer with electrical insulation."
+ icon_state = "engigloves"
+ item_state = "engigloves"
+ siemens_coefficient = 0
+
+/obj/item/clothing/gloves/gezena/captain
+ name = "\improper PGFN Captain's Ihuz-irra Gloves"
+ desc = "As the name, “ihuz-irra”, or “sure-grip”, suggests, the gloves employed by the PGF military are designed to ensure the highest possible grip is maintained while also providing protection from blisters in work environments. Bears the silver standard of a Gezenan captain."
+ icon_state = "captaingloves"
+ item_state = "captaingloves"
+ siemens_coefficient = 0
+
+//Boots
+
+/obj/item/clothing/shoes/combat/gezena
+ name = "\improper PGF Uhro-sez Boots"
+ desc = "The word “uhro-sez” translates to “steel-foot”, in reference to the steel toe protection provided by these boots. Standard issue to all members of all branches of the PGF military."
+ icon = 'icons/obj/clothing/faction/gezena/feet.dmi'
+ //mob_overlay_icon = 'icons/mob/clothing/faction/gezena/feet.dmi' todo: find out why digi breaks here
+ icon_state = "pgfboots"
+ item_state = "pgfboots"
+
+//Belt
+
+/obj/item/storage/belt/military/gezena
+ name = "\improper PGF Iho-Usks"
+ desc = "The “iho-usks”, translating to “gear-holder”, is a lightweight harness covered in pouches, supplied to the ground troops of the PGF. This variant is designed for carrying ammunition."
+ icon = 'icons/obj/clothing/faction/gezena/belt.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/belt.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/gezena/gezena_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
+ icon_state = "pouches"
+ item_state = "bluecloth"
+
+/obj/item/storage/belt/medical/gezena
+ name = "\improper PGF Medical Iho-Usks"
+ desc = "The “iho-usks”, translating to “gear-holder”, is a lightweight harness covered in pouches, supplied to the ground troops of the PGF. This variant is designed for carrying medical supplies."
+ icon = 'icons/obj/clothing/faction/gezena/belt.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/belt.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/gezena/gezena_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
+ icon_state = "medpouches"
+ item_state = "whitecloth"
+
+//Capes
+
+/obj/item/clothing/neck/cloak/gezena
+ name = "\improper Aziulhauz"
+ desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as a standard non-officer soldier or crewperson."
+ icon = 'icons/obj/clothing/faction/gezena/neck.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/neck.dmi'
+ lefthand_file = 'icons/mob/inhands/faction/gezena/gezena_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/faction/gezena/gezena_righthand.dmi'
+ icon_state = "cape"
+ item_state = "blackcloth"
+
+/obj/item/clothing/neck/cloak/gezena/engi
+ name = "engineering Aziulhauz"
+ desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as an officer with an engineering specialization."
+ icon_state = "engicape"
+ item_state = "blackcloth"
+
+/obj/item/clothing/neck/cloak/gezena/med
+ name = "medical Aziulhauz"
+ desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as an officer with a medical specialization."
+ icon_state = "medcape"
+ item_state = "blackcloth"
+
+/obj/item/clothing/neck/cloak/gezena/captain
+ name = "captain's Azuilhauz"
+ desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as a high ranking officer."
+ icon_state = "captaincape"
+ item_state = "blackcloth"
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 119312c6902f..291b1c1b25b6 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -49,7 +49,7 @@
/obj/item/clothing/gloves/color/yellow/sprayon/equipped(mob/user, slot)
. = ..()
- RegisterSignal(user, COMSIG_LIVING_SHOCK_PREVENTED, .proc/Shocked)
+ RegisterSignal(user, COMSIG_LIVING_SHOCK_PREVENTED, PROC_REF(Shocked))
/obj/item/clothing/gloves/color/yellow/sprayon/proc/Shocked()
shocks_remaining--
@@ -73,7 +73,7 @@
/obj/item/clothing/gloves/color/yellow/sprayon/tape/equipped(mob/user, slot)
. = ..()
- RegisterSignal(user, COMSIG_LIVING_SHOCK_PREVENTED, .proc/Shocked)
+ RegisterSignal(user, COMSIG_LIVING_SHOCK_PREVENTED, PROC_REF(Shocked))
/obj/item/clothing/gloves/color/yellow/sprayon/tape/Shocked(mob/user)
if(prob(50)) //Fear the unpredictable
@@ -202,6 +202,12 @@
strip_delay = 60
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 50)
+/obj/item/clothing/gloves/color/captain/nt
+ desc = "Regal blue gloves, with a nice gold trim, a diamond anti-shock coating, and an integrated thermal barrier, and armoured bracers. Swanky."
+ name = "captain's gloves"
+ icon_state = "captainnt"
+ item_state = "egloves"
+
/obj/item/clothing/gloves/color/latex
name = "latex gloves"
desc = "Cheap sterile gloves made from latex. Transfers minor paramedic knowledge to the user via budget nanochips."
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 35960c36bbab..e6400198864e 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -145,7 +145,7 @@
attached_light.update_brightness()
to_chat(user, "You toggle the helmet light [attached_light.on ? "on":"off"].")
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
+ playsound(user, attached_light.on ? attached_light.toggle_on_sound : attached_light.toggle_off_sound, 100, TRUE)
update_helmlight()
/obj/item/clothing/head/helmet/proc/update_helmlight()
@@ -475,17 +475,9 @@
armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 40, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 50)
strip_delay = 60
-/obj/item/clothing/head/helmet/rus_helmet
- name = "russian helmet"
- desc = "It can hold a bottle of vodka."
- icon_state = "rus_helmet"
- item_state = "rus_helmet"
- armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 10, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50)
- pocket_storage_component_path = /datum/component/storage/concrete/pockets/helmet
-
/obj/item/clothing/head/helmet/r_trapper
name = "reinforced trapper hat"
- desc = "An occasional sight on the heads of soldiers stationed on cold worlds. 200% bear."
+ desc = "An occasional sight on the heads of Frontiersmen stationed on cold worlds. 200% bear."
icon_state = "rus_ushanka"
item_state = "rus_ushanka"
body_parts_covered = HEAD
@@ -567,11 +559,17 @@
item_state = "solgov_envirohelm"
/obj/item/clothing/head/helmet/operator
- name = "\improper Operator helmet"
+ name = "\improper operator helmet"
desc = "A robust combat helmet commonly employed by Syndicate forces, regardless of alignment."
icon_state = "operator"
item_state = "operator"
+/obj/item/clothing/head/helmet/medical
+ name = "\improper trauma team helmet"
+ desc = "A robust combat helmet commonly employed by cybersun medical trauma teams, with its distinctive turquoise."
+ icon_state = "traumahelm"
+ item_state = "traumahelm"
+
/obj/item/clothing/head/helmet/bulletproof/m10
name = "\improper M10 pattern Helmet"
desc = "A classic looking helmet, derived from numerous convergently-similar designs from all across inhabited space. A faded tag reads: 'The difference between an open-casket and closed-casket funeral. Wear on head for best results.'"
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 06bdf4de0e7f..ae7ecd5b121e 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -184,6 +184,12 @@
name = "syndicate cap"
desc = "A black cap fit for a high ranking syndicate officer."
+/obj/item/clothing/head/HoS/cybersun
+ name = "cybersun hat"
+ desc = "A crimson-red hat fit for a high ranking cybersun officer."
+ icon_state = "cybersunhat"
+ item_state = "cybersunhat"
+
/obj/item/clothing/head/HoS/beret/syndicate
name = "syndicate beret"
desc = "A black beret with thick armor padding inside. Stylish and robust."
@@ -248,7 +254,7 @@
/obj/item/clothing/head/warden/drill/equipped(mob/M, slot)
. = ..()
if (slot == ITEM_SLOT_HEAD)
- RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
+ RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech))
else
UnregisterSignal(M, COMSIG_MOB_SAY)
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 73261bf69ebb..d63003422e29 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -386,7 +386,7 @@
/obj/item/clothing/head/frenchberet/equipped(mob/M, slot)
. = ..()
if (slot == ITEM_SLOT_HEAD)
- RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
+ RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech))
else
UnregisterSignal(M, COMSIG_MOB_SAY)
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 94cd299b3cc0..3e188c253169 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -323,7 +323,7 @@
/obj/item/clothing/head/foilhat/Initialize(mapload)
. = ..()
if(!warped)
- AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD, 6, TRUE, null, CALLBACK(src, .proc/warp_up))
+ AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD, 6, TRUE, null, CALLBACK(src, PROC_REF(warp_up)))
else
warp_up()
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index dd689223380c..bc2036523bd7 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -137,6 +137,13 @@
dog_fashion = null
/obj/item/clothing/head/soft/cybersun
+ name = "cybersun agent cap"
+ desc = "A black baseball hat emblazoned with a reflective Cybersun patch."
+ icon_state = "agentsoft"
+ soft_type = "black"
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/cybersun/medical
name = "cybersun medic cap"
desc = "A turquoise baseball hat emblazoned with a reflective cross. Typical of Cybersun Industries field medics."
icon_state = "cybersunsoft"
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index f4e8ca45f697..739e0f832faa 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -19,7 +19,7 @@
/obj/item/clothing/mask/equipped(mob/M, slot)
. = ..()
if (slot == ITEM_SLOT_MASK && modifies_speech)
- RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
+ RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech))
else
UnregisterSignal(M, COMSIG_MOB_SAY)
diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm
index fc2a3d13e31b..c532202a3df3 100644
--- a/code/modules/clothing/masks/boxing.dm
+++ b/code/modules/clothing/masks/boxing.dm
@@ -87,12 +87,3 @@
desc = "Worn by robust fighters who are willing to do anything to win."
icon_state = "luchar"
item_state = "luchar"
-
-/obj/item/clothing/mask/russian_balaclava
- name = "russian balaclava"
- desc = "Protects your face from snow."
- icon_state = "rus_balaclava"
- item_state = "rus_balaclava"
- flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
- visor_flags_inv = HIDEFACE|HIDEFACIALHAIR
- w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/clothing/outfits/gezena.dm b/code/modules/clothing/outfits/gezena.dm
new file mode 100644
index 000000000000..b9fc26afeff1
--- /dev/null
+++ b/code/modules/clothing/outfits/gezena.dm
@@ -0,0 +1,17 @@
+/datum/outfit/job/gezena
+
+/datum/outfit/job/gezena/post_equip(mob/living/carbon/human/H, visualsOnly)
+ . = ..()
+ if(visualsOnly)
+ return
+ H.faction |= list("playergezena")
+
+/datum/outfit/job/gezena/assistant
+ name = "Deckhand (PGF)"
+ jobtype = /datum/job/assistant
+
+ head = /obj/item/clothing/head/gezena
+ uniform = /obj/item/clothing/under/gezena
+ suit = /obj/item/clothing/suit/toggle/gezena
+ gloves = /obj/item/clothing/gloves/gezena
+ shoes = /obj/item/clothing/shoes/combat/gezena
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index c339816c7e68..82ad3aae38d6 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -269,33 +269,6 @@
shoes = /obj/item/clothing/shoes/sandal/marisa
head = /obj/item/clothing/head/wizard/marisa
-/datum/outfit/centcom/soviet
- name = "Soviet Admiral"
-
- uniform = /obj/item/clothing/under/costume/soviet
- head = /obj/item/clothing/head/pirate/captain
- shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/tackler/combat/insulated
- ears = /obj/item/radio/headset/headset_cent
- glasses = /obj/item/clothing/glasses/thermal/eyepatch
- suit = /obj/item/clothing/suit/pirate/captain
- back = /obj/item/storage/backpack/satchel/leather
- belt = /obj/item/gun/ballistic/revolver/mateba
-
- id = /obj/item/card/id/centcom
-
-/datum/outfit/centcom/soviet/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- if(visualsOnly)
- return
-
- var/obj/item/card/id/W = H.wear_id
- W.access = get_all_accesses()
- W.access += get_centcom_access("Admiral")
- W.assignment = "Admiral"
- W.registered_name = H.real_name
- W.update_label()
- ..()
-
/datum/outfit/mobster
name = "Mobster"
@@ -416,7 +389,7 @@
id = /obj/item/card/id/silver
head = /obj/item/clothing/head/beret/lt
- uniform = /obj/item/clothing/under/rank/command/lieutenant
+ uniform = /obj/item/clothing/under/rank/command
alt_uniform = /obj/item/clothing/under/rank/command
suit = /obj/item/clothing/suit/toggle/lieutenant
alt_suit = /obj/item/clothing/suit/armor/lieutenant_trenchcoat
diff --git a/code/modules/clothing/outfits/syndicate.dm b/code/modules/clothing/outfits/syndicate.dm
new file mode 100644
index 000000000000..cb8f093a99e4
--- /dev/null
+++ b/code/modules/clothing/outfits/syndicate.dm
@@ -0,0 +1,826 @@
+//top outfit of everything syndicate. Don't change this.
+
+/datum/outfit/job/syndicate
+ name = "Syndicate (mostly) Empty"
+
+ uniform = /obj/item/clothing/under/syndicate
+ box = /obj/item/storage/box/survival/syndie
+ id = /obj/item/card/id/syndicate_command/crew_id
+
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/syndie
+ courierbag = /obj/item/storage/backpack/messenger/sec
+
+/datum/outfit/job/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly)
+ . = ..()
+ if(visualsOnly)
+ return
+ H.faction |= list(FACTION_PLAYER_SYNDICATE)
+
+//generates a codename and assigns syndicate access, used in the twinkleshine.
+/datum/outfit/job/syndicate/proc/assign_codename(mob/living/carbon/human/H)
+ var/obj/item/card/id/I = H.wear_id
+ I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(1, 12)) // squidquest real
+ I.access |= list(ACCESS_SYNDICATE)
+ I.update_label()
+
+//and now, for the Assistants
+
+/datum/outfit/job/syndicate/assistant
+ name = "Junior Agent (Assistant)"
+ jobtype = /datum/job/assistant
+
+ uniform = /obj/item/clothing/under/syndicate/intern
+ alt_uniform = null
+
+ shoes = /obj/item/clothing/shoes/jackboots
+ gloves = /obj/item/clothing/gloves/color/black
+ ears = /obj/item/radio/headset
+ back = /obj/item/storage/backpack
+
+ id = /obj/item/card/id/syndicate_command/crew_id
+ r_pocket = /obj/item/radio
+ belt = /obj/item/pda
+
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/syndie
+ courierbag = /obj/item/storage/backpack/messenger/sec
+
+ box = /obj/item/storage/box/survival/syndie
+
+/datum/outfit/job/syndicate/assistant/gorlex
+ name = "Junior Agent (Gorlex Marauders)"
+
+ uniform = /obj/item/clothing/under/syndicate/gorlex
+ alt_uniform = /obj/item/clothing/under/syndicate
+
+/datum/outfit/job/syndicate/assistant/gec
+ name = "Deckhand (GEC)"
+
+ uniform = /obj/item/clothing/under/syndicate
+ suit = /obj/item/clothing/suit/toggle/hazard
+
+ head = /obj/item/clothing/head/safety_helmet
+
+/datum/outfit/job/syndicate/assistant/cybersun
+ name = "Junior Agent (Cybersun)"
+
+ uniform = /obj/item/clothing/under/syndicate/cybersun
+ shoes = /obj/item/clothing/shoes/jackboots
+ r_pocket = /obj/item/radio
+ head = /obj/item/clothing/head/soft/cybersun
+
+/datum/outfit/job/syndicate/assistant/twink
+ name = "Deck Assistant (Twinkleshine)"
+
+ uniform = /obj/item/clothing/under/syndicate/intern
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/combat
+ ears = /obj/item/radio/headset/syndicate/alt
+ mask = /obj/item/clothing/mask/chameleon
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ back = /obj/item/storage/backpack
+ belt = /obj/item/storage/belt/military/assault
+ implants = list(/obj/item/implant/weapons_auth)
+ id = /obj/item/card/id/syndicate_command/crew_id
+
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/syndie
+ courierbag = /obj/item/storage/backpack/messenger/sec
+
+ box = /obj/item/storage/box/survival/syndie
+
+/datum/outfit/job/syndicate/assistant/twink/post_equip(mob/living/carbon/human/H)
+ . = ..()
+
+ assign_codename(H)
+
+//atmos techs
+
+//Shiptest
+/datum/outfit/job/syndicate/atmos
+ name = "Atmospheric Technician (Syndicate)"
+ jobtype = /datum/job/atmos
+
+ belt = /obj/item/storage/belt/utility/atmostech
+
+ uniform = /obj/item/clothing/under/rank/engineering/atmospheric_technician
+ alt_uniform = /obj/item/clothing/under/rank/engineering/engineer/hazard
+ alt_suit = /obj/item/clothing/suit/hazardvest
+ dcoat = /obj/item/clothing/suit/hooded/wintercoat/engineering
+
+ r_pocket = /obj/item/analyzer
+ l_pocket = /obj/item/pda/atmos
+
+ backpack = /obj/item/storage/backpack/industrial
+ satchel = /obj/item/storage/backpack/satchel/eng
+ duffelbag = /obj/item/storage/backpack/duffelbag/engineering
+ courierbag = /obj/item/storage/backpack/messenger/engi
+
+ box = /obj/item/storage/box/survival/engineer
+
+ pda_slot = ITEM_SLOT_LPOCKET
+ backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
+
+/datum/outfit/job/syndicate/atmos/gec
+ name = "Atmospheric Technician (GEC)"
+
+ uniform = /obj/item/clothing/under/syndicate/gec/atmos_tech
+ suit = /obj/item/clothing/suit/toggle/hazard
+ head = /obj/item/clothing/head/hardhat
+ id = /obj/item/card/id/syndicate_command/crew_id
+
+
+//bartenders
+
+/datum/outfit/job/syndicate/bartender
+ name = "Bartender (Syndicate)"
+ jobtype = /datum/job/bartender
+
+ id = /obj/item/card/id/syndicate_command/crew_id
+ head = /obj/item/clothing/head/HoS/beret/syndicate
+ glasses = /obj/item/clothing/glasses/sunglasses/reagent
+ belt = /obj/item/pda/bar
+ uniform = /obj/item/clothing/under/rank/civilian/bartender
+ alt_uniform = /obj/item/clothing/under/rank/civilian/bartender/purple
+ alt_suit = /obj/item/clothing/suit/apron/purple_bartender
+ suit = /obj/item/clothing/suit/armor/vest
+ backpack_contents = list(/obj/item/storage/box/beanbag=1)
+ shoes = /obj/item/clothing/shoes/laceup
+
+
+/datum/outfit/job/syndicate/bartender/post_equip(mob/living/carbon/human/H, visualsOnly)
+ . = ..()
+
+ var/obj/item/card/id/W = H.wear_id
+ if(H.age < AGE_MINOR)
+ W.registered_age = AGE_MINOR
+ to_chat(H, "You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")
+
+
+/datum/outfit/job/syndicate/bartender/twink
+ name = "Bartender (Twinkleshine)"
+
+ uniform = /obj/item/clothing/under/syndicate/donk
+ shoes = /obj/item/clothing/shoes/laceup
+ gloves = /obj/item/clothing/gloves/color/white
+ ears = /obj/item/radio/headset/syndicate
+ mask = /obj/item/clothing/mask/chameleon
+ belt = /obj/item/storage/belt/bandolier
+ implants = list(/obj/item/implant/weapons_auth)
+ id = /obj/item/card/id/syndicate_command/crew_id
+
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/syndie
+ courierbag = /obj/item/storage/backpack/messenger/sec
+
+ box = /obj/item/storage/box/survival/syndie
+
+/datum/outfit/job/syndicate/bartender/twink/post_equip(mob/living/carbon/human/H)
+ . = ..()
+ assign_codename(H)
+
+//botanist
+/datum/outfit/job/syndicate/botanist
+ name = "Botanist (Syndicate)"
+ jobtype = /datum/job/hydro
+ belt = /obj/item/pda/botanist
+ suit = /obj/item/clothing/suit/apron
+ alt_suit = /obj/item/clothing/suit/apron/overalls
+ gloves =/obj/item/clothing/gloves/botanic_leather
+ suit_store = /obj/item/plant_analyzer
+
+/datum/outfit/job/syndicate/botanist/suns
+ name = "Botanist-Chemist (SUNS)"
+
+ id = /obj/item/card/id/syndicate_command/crew_id
+ shoes = /obj/item/clothing/shoes/jackboots
+ glasses = /obj/item/clothing/glasses/science
+ suit = /obj/item/clothing/suit/toggle/labcoat/chemist
+ suit_store = null
+
+//Capitan (Captain)
+
+/datum/outfit/job/syndicate/captain
+ name = "Captain (Syndicate)"
+ jobtype = /datum/job/captain
+
+ id = /obj/item/card/id/syndicate_command/captain_id
+ ears = /obj/item/radio/headset/syndicate/alt/captain
+ uniform = /obj/item/clothing/under/syndicate/aclf
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/HoS/syndicate
+ gloves = /obj/item/clothing/gloves/combat
+ suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate
+ backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/pda/captain)
+
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/sec
+ courierbag = /obj/item/storage/backpack/messenger/sec
+
+ box = /obj/item/storage/box/survival/syndie
+
+/datum/outfit/job/syndicate/captain/aclf
+ name = "Captain (ACLF)"
+
+
+/datum/outfit/job/syndicate/captain/twink
+ name = "Captain (Twinkleshine)"
+
+ uniform = /obj/item/clothing/under/syndicate/aclf
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ ears = /obj/item/radio/headset/syndicate/alt/captain
+ mask = /obj/item/clothing/mask/chameleon
+ l_pocket = /obj/item/melee/transforming/energy/sword/saber/red
+ suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate
+ suit_store = /obj/item/gun/ballistic/revolver/mateba
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ belt = /obj/item/storage/belt/military/assault
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch
+ implants = list(/obj/item/implant/weapons_auth)
+
+
+/datum/outfit/job/syndicate/captain/sbc/post_equip(mob/living/carbon/human/H)
+ . = ..()
+ assign_codename(H)
+
+
+/datum/outfit/job/syndicate/captain/gorlex
+ name = "Captain (Gorlex Marauders)"
+ uniform = /obj/item/clothing/under/syndicate/aclf
+
+ head = /obj/item/clothing/head/aclfcap
+ suit = /obj/item/clothing/suit/aclf
+
+/datum/outfit/job/syndicate/captain/cybersun
+ name = "Captain (Cybersun)"
+
+ uniform = /obj/item/clothing/under/syndicate/cybersun/officer
+ suit = /obj/item/clothing/suit/armor/vest/capcarapace/cybersun
+ head = /obj/item/clothing/head/HoS/cybersun
+ gloves = /obj/item/clothing/gloves/combat
+
+
+//cargo tech
+
+/datum/outfit/job/syndicate/cargo_tech
+ name = "Cargo Tech (Syndicate)"
+ jobtype = /datum/job/cargo_tech
+
+ id = /obj/item/card/id/syndicate_command/crew_id
+ uniform = /obj/item/clothing/under/syndicate/donk
+ suit = /obj/item/clothing/suit/hazardvest/donk
+
+ belt = /obj/item/pda/cargo
+ alt_suit = /obj/item/clothing/suit/hazardvest
+ l_hand = /obj/item/export_scanner
+ backpack_contents = list(/obj/item/modular_computer/tablet/preset/cargo=1)
+
+
+/datum/outfit/job/syndicate/cargo_tech/donk
+ name = "Customer Associate (Donk! Co)"
+
+//chemist
+
+/datum/outfit/job/syndicate/chemist
+ name = "Chemist (Syndicate)"
+ jobtype = /datum/job/chemist
+
+ uniform = /obj/item/clothing/under/syndicate/intern
+ id = /obj/item/card/id/syndicate_command/crew_id
+ l_pocket =/obj/item/pda/chemist
+
+ glasses = /obj/item/clothing/glasses/science
+ belt = /obj/item/pda/chemist
+ shoes = /obj/item/clothing/shoes/sneakers/white
+ suit = /obj/item/clothing/suit/toggle/labcoat/chemist
+
+ box = /obj/item/storage/box/survival/medical
+
+/datum/outfit/job/syndicate/chemist/gec
+ name = "Chemist (GEC)"
+
+ uniform = /obj/item/clothing/under/syndicate/intern
+ suit = /obj/item/clothing/suit/toggle/hazard
+ head = /obj/item/clothing/head/hardhat
+ belt = /obj/item/storage/belt/utility/full/engi
+ id = /obj/item/card/id/syndicate_command/crew_id
+ l_pocket =/obj/item/pda/chemist
+
+//Chief Engineer
+
+/datum/outfit/job/syndicate/ce
+ name = "Chief Engineer (Syndicate)"
+ jobtype = /datum/job/chief_engineer
+
+ id = /obj/item/card/id/syndicate_command/crew_id
+ ears = /obj/item/radio/headset/syndicate/alt
+ glasses = /obj/item/clothing/glasses/sunglasses
+
+ belt = /obj/item/storage/belt/utility/chief/full
+ l_pocket = /obj/item/pda/heads/ce
+ uniform = /obj/item/clothing/under/rank/engineering/chief_engineer
+ shoes = /obj/item/clothing/shoes/sneakers/brown
+ head = /obj/item/clothing/head/hardhat/white
+ gloves = /obj/item/clothing/gloves/color/black
+ backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced=1)
+
+ backpack = /obj/item/storage/backpack/industrial
+ satchel = /obj/item/storage/backpack/satchel/eng
+ duffelbag = /obj/item/storage/backpack/duffelbag/engineering
+ courierbag = /obj/item/storage/backpack/messenger/engi
+ box = /obj/item/storage/box/survival/engineer
+ pda_slot = ITEM_SLOT_LPOCKET
+ chameleon_extras = /obj/item/stamp/ce
+
+
+/datum/outfit/job/syndicate/ce/gec
+ name = "Chief Engineer (GEC)"
+
+ uniform = /obj/item/clothing/under/syndicate/gec/chief_engineer
+ suit = /obj/item/clothing/suit/toggle/hazard
+ head = /obj/item/clothing/head/hardhat/white
+ shoes =/obj/item/clothing/shoes/laceup
+ ears = /obj/item/radio/headset/syndicate/alt/captain
+ id = /obj/item/card/id/syndicate_command/captain_id
+ gloves = /obj/item/clothing/gloves/combat
+
+/datum/outfit/job/syndicate/ce/gorlex
+ name = "Foreman (Gorlex Marauders)"
+
+ ears = /obj/item/radio/headset/syndicate/alt
+ uniform = /obj/item/clothing/under/syndicate/gorlex
+ alt_uniform = null
+ suit = /obj/item/clothing/suit/toggle/hazard
+ alt_suit = null
+ shoes = /obj/item/clothing/shoes/jackboots
+ gloves = /obj/item/clothing/gloves/combat
+
+//Chief Medical Officer
+
+/datum/outfit/job/syndicate/cmo
+ name = "Chief Medical Officer (Syndicate)"
+ jobtype = /datum/job/cmo
+
+ uniform = /obj/item/clothing/under/syndicate
+ ears = /obj/item/radio/headset/syndicate/alt/captain
+ id = /obj/item/card/id/syndicate_command/captain_id
+ shoes = /obj/item/clothing/shoes/jackboots
+ belt = /obj/item/pda/heads/cmo
+ l_pocket = /obj/item/pinpointer/crew
+ shoes = /obj/item/clothing/shoes/sneakers/brown
+ suit = /obj/item/clothing/suit/toggle/labcoat/cmo
+ l_hand = /obj/item/storage/firstaid/medical
+ suit_store = /obj/item/flashlight/pen
+ backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1)
+
+/datum/outfit/job/syndicate/cmo/suns
+ name = "Medical Director (SUNS)"
+
+//"Head Of Personnel"
+
+/datum/outfit/job/syndicate/head_of_personnel
+ name = "Bridge Officer (Syndicate)"
+ jobtype = /datum/job/head_of_personnel
+
+ ears = /obj/item/radio/headset/syndicate/alt
+ uniform = /obj/item/clothing/under/syndicate/aclfgrunt
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/HoS/beret/syndicate
+ gloves = /obj/item/clothing/gloves/color/white
+ id = /obj/item/card/id/syndicate_command/crew_id
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ glasses = /obj/item/clothing/glasses/hud/health
+ belt = /obj/item/pda/heads/head_of_personnel
+ backpack_contents = list(/obj/item/storage/box/ids=1,\
+ /obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
+
+/datum/outfit/job/syndicate/head_of_personnel/cybersun
+ name = "Intelligence Officer (Cybersun)"
+
+ ears = /obj/item/radio/headset/syndicate/alt
+ uniform = /obj/item/clothing/under/syndicate/cybersun/officer
+ suit = /obj/item/clothing/suit/cybersun_suit
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/HoS/cybersun
+ gloves = /obj/item/clothing/gloves/combat
+ id = /obj/item/card/id/syndicate_command/crew_id
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ glasses = /obj/item/clothing/glasses/sunglasses
+
+//head of security
+
+/datum/outfit/job/syndicate/hos
+ name = "Head Of Security (Syndicate)"
+ jobtype = /datum/job/hos
+
+ ears = /obj/item/radio/headset/syndicate/alt
+ uniform = /obj/item/clothing/under/syndicate/combat
+ head = /obj/item/clothing/head/warden
+ suit = /obj/item/clothing/suit/armor/vest/syndie
+ id = /obj/item/card/id/syndicate_command/crew_id
+ belt = /obj/item/pda/heads/hos
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/HoS
+ glasses = /obj/item/clothing/glasses/hud/security/sunglasses
+ suit_store = /obj/item/gun/energy/e_gun
+ r_pocket = /obj/item/assembly/flash/handheld
+ l_pocket = /obj/item/restraints/handcuffs
+ backpack_contents = list(/obj/item/melee/baton/loaded=1)
+
+ backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/storage/box/survival/syndie=1)
+
+/datum/outfit/job/syndicate/hos/gorlex
+ name = "Sergeant (Syndicate)"
+
+/datum/outfit/job/syndicate/hos/twink
+ name = "Lieutenant (Twinkleshine)"
+ uniform = /obj/item/clothing/under/syndicate/aclf
+ head = /obj/item/clothing/head/HoS/beret/syndicate
+ ears = /obj/item/radio/headset/syndicate/alt
+ mask = /obj/item/clothing/mask/chameleon
+ gloves = /obj/item/clothing/gloves/combat
+ l_pocket = /obj/item/gun/ballistic/automatic/pistol
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ belt = /obj/item/storage/belt/military/assault
+ shoes = /obj/item/clothing/shoes/combat
+ suit = /obj/item/clothing/suit/armor/vest
+ alt_suit = /obj/item/clothing/suit/aclf
+ id = /obj/item/card/id/syndicate_command/lieutenant
+ implants = list(/obj/item/implant/weapons_auth)
+ backpack_contents = list(/obj/item/melee/baton)
+
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/syndie
+ courierbag = /obj/item/storage/backpack/messenger/sec
+
+ box = /obj/item/storage/box/survival/syndie
+
+/datum/outfit/job/syndicate/hos/twink/post_equip(mob/living/carbon/human/H)
+ . = ..()
+ assign_codename(H)
+
+//medical doctors (assorted)
+
+/datum/outfit/job/syndicate/doctor
+ name = "Medical Doctor (Syndicate)"
+ jobtype = /datum/job/doctor
+
+ uniform = /obj/item/clothing/under/syndicate
+ id = /obj/item/card/id/syndicate_command/crew_id
+ shoes = /obj/item/clothing/shoes/jackboots
+ belt = /obj/item/pda/medical
+ shoes = /obj/item/clothing/shoes/sneakers/white
+ suit = /obj/item/clothing/suit/toggle/labcoat
+ alt_suit = /obj/item/clothing/suit/apron/surgical
+ l_hand = /obj/item/storage/firstaid/medical
+ suit_store = /obj/item/flashlight/pen
+
+/datum/outfit/job/syndicate/doctor/suns
+ name = "Medical Doctor (SUNS)"
+
+/datum/outfit/job/syndicate/doctor/cybersun
+ name = "Medical Doctor (Cybersun)"
+
+ uniform = /obj/item/clothing/under/syndicate/medic
+ accessory = /obj/item/clothing/accessory/armband/medblue
+ shoes = /obj/item/clothing/shoes/jackboots
+
+/datum/outfit/job/syndicate/doctor/gorlex
+ name = "Medical Doctor (Gorlex)"
+
+ uniform = /obj/item/clothing/under/syndicate/gorlex
+ glasses = /obj/item/clothing/glasses/hud/health/prescription
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ back = /obj/item/storage/backpack/duffelbag/syndie/med
+ id = /obj/item/card/id/syndicate_command/crew_id
+ backpack_contents = list(/obj/item/storage/box/survival/syndie=1, /obj/item/storage/firstaid/medical,)
+
+//paramedics
+
+
+/datum/outfit/job/syndicate/paramedic
+ name = "Paramedic (Syndicate)"
+ jobtype = /datum/job/paramedic
+
+
+ id = /obj/item/card/id/syndicate_command/crew_id
+ uniform = /obj/item/clothing/under/syndicate/gorlex
+ alt_uniform = null
+ shoes = /obj/item/clothing/shoes/jackboots
+
+ head = /obj/item/clothing/head/soft/paramedic
+ suit = /obj/item/clothing/suit/toggle/labcoat/paramedic
+ alt_suit = /obj/item/clothing/suit/apron/surgical
+ gloves = /obj/item/clothing/gloves/color/latex/nitrile/evil
+ belt = /obj/item/storage/belt/medical/paramedic
+ id = /obj/item/card/id
+ l_pocket = /obj/item/pda/medical
+ suit_store = /obj/item/flashlight/pen
+ backpack_contents = list(/obj/item/roller=1)
+ pda_slot = ITEM_SLOT_LPOCKET
+
+/datum/outfit/job/syndicate/paramedic/gorlex
+ name = "Paramedic (Gorlex)"
+
+/datum/outfit/job/syndicate/paramedic/cybersun
+ name = "Field Medic (Cybersun Industries)"
+
+ uniform = /obj/item/clothing/under/syndicate/medic
+ head = /obj/item/clothing/head/soft/cybersun/medical
+ shoes = /obj/item/clothing/shoes/combat
+ suit = /obj/item/clothing/suit/toggle/labcoat/raincoat
+
+/datum/outfit/job/syndicate/paramedic/twink
+ name = "Medic (Twinkleshine)"
+
+ gloves = /obj/item/clothing/gloves/color/latex/nitrile/evil
+ uniform = /obj/item/clothing/under/syndicate/medic
+ glasses = /obj/item/clothing/glasses/hud/health
+ belt = /obj/item/storage/belt/medical
+ back = /obj/item/storage/backpack/duffelbag/syndie/med
+ shoes = /obj/item/clothing/shoes/combat
+ suit = /obj/item/clothing/suit/longcoat/roboblack
+ alt_suit = /obj/item/clothing/suit/toggle/labcoat
+ suit_store = null
+ ears = /obj/item/radio/headset/syndicate
+ mask = /obj/item/clothing/mask/chameleon
+ id = /obj/item/card/id/syndicate_command/crew_id/med
+ implants = list(/obj/item/implant/weapons_auth)
+ backpack_contents = list(/obj/item/pda/brig_phys)
+
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/syndie/med
+ courierbag = /obj/item/storage/backpack/messenger/sec
+
+ box = /obj/item/storage/box/survival/syndie
+
+/datum/outfit/job/syndicate/paramedic/twink/post_equip(mob/living/carbon/human/H)
+ . = ..()
+ assign_codename(H)
+
+//psychologist
+
+/datum/outfit/job/syndicate/psychologist
+ name = "Psychologist (Syndicate)"
+ jobtype = /datum/job/psychologist
+
+ id = /obj/item/card/id/syndicate_command/crew_id
+ uniform = /obj/item/clothing/under/rank/medical/psychiatrist
+ suit = /obj/item/clothing/suit/toggle/labcoat
+ shoes = /obj/item/clothing/shoes/laceup
+ alt_uniform = null
+ l_hand = /obj/item/clipboard
+ belt = /obj/item/pda/medical
+ pda_slot = ITEM_SLOT_BELT
+
+/datum/outfit/job/syndicate/psychologist/suns
+ name = "Ship Psychologist (SUNS)"
+
+//patient (prisoner)
+
+/datum/outfit/job/syndicate/patient
+ name = "Long Term Patient"
+ jobtype = /datum/job/prisoner
+
+ id = /obj/item/card/id/patient
+ uniform = /obj/item/clothing/under/rank/medical/gown
+ alt_suit = null
+ shoes = /obj/item/clothing/shoes/sandal/slippers
+
+//Quartermaster
+
+/datum/outfit/job/syndicate/quartermaster
+ name = "Quartermaster (Syndicate)"
+ jobtype = /datum/job/qm
+
+ id = /obj/item/card/id/syndicate_command/captain_id
+
+ ears = /obj/item/radio/headset/syndicate/alt
+ uniform = /obj/item/clothing/under/syndicate/donk/qm
+ suit = /obj/item/clothing/suit/hazardvest/donk/qm
+ ears = /obj/item/radio/headset/syndicate/alt
+ shoes = /obj/item/clothing/shoes/laceup
+ belt = /obj/item/pda/quartermaster
+ glasses = /obj/item/clothing/glasses/sunglasses
+ l_hand = /obj/item/clipboard
+ backpack_contents = list(/obj/item/modular_computer/tablet/preset/cargo=1)
+
+/datum/outfit/job/syndicate/quartermaster/donk
+ name = "Manager (Donk! Co.)"
+ id = /obj/item/card/id/syndicate_command/captain_id
+
+ ears = /obj/item/radio/headset/syndicate/alt
+ uniform = /obj/item/clothing/under/syndicate/donk/qm
+ suit = /obj/item/clothing/suit/hazardvest/donk/qm
+ ears = /obj/item/radio/headset/syndicate/alt
+ shoes = /obj/item/clothing/shoes/laceup
+
+//security officers
+
+/datum/outfit/job/syndicate/security
+ name = "Operative (Syndicate)"
+ jobtype = /datum/job/officer
+
+
+ uniform = /obj/item/clothing/under/syndicate
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ belt = /obj/item/storage/belt/military
+ back = /obj/item/storage/backpack
+ suit = /obj/item/clothing/suit/armor/vest
+ id = /obj/item/card/id/syndicate_command/crew_id
+
+ ears = /obj/item/radio/headset/alt
+ gloves = /obj/item/clothing/gloves/color/black
+ head = /obj/item/clothing/head/helmet/sec
+ shoes = /obj/item/clothing/shoes/jackboots
+ l_pocket = /obj/item/restraints/handcuffs
+ r_pocket = /obj/item/assembly/flash/handheld
+
+ backpack_contents = list(
+ /obj/item/melee/baton/loaded=1,
+ )
+
+
+/datum/outfit/job/syndicate/security/gorlex
+ name = "Assault Operative (Gorlex)"
+
+/datum/outfit/job/syndicate/security/twink
+ name = "Operative (Twinkleshine)"
+ uniform = /obj/item/clothing/under/syndicate/combat
+ ears = /obj/item/radio/headset/syndicate/alt
+ mask = /obj/item/clothing/mask/chameleon
+ gloves = /obj/item/clothing/gloves/combat
+ shoes = /obj/item/clothing/shoes/combat
+ l_pocket = /obj/item/gun/ballistic/automatic/pistol
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ belt = /obj/item/storage/belt/military/assault
+ id = /obj/item/card/id/syndicate_command/crew_id
+ implants = list(/obj/item/implant/weapons_auth)
+ backpack_contents = list(/obj/item/gun_voucher/syndicate=1)
+
+ head = null
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/syndie
+ courierbag = /obj/item/storage/backpack/messenger/sec
+
+ box = /obj/item/storage/box/survival/syndie
+
+/datum/outfit/job/syndicate/security/twink/post_equip(mob/living/carbon/human/H)
+ . = ..()
+ assign_codename(H)
+
+//Miners
+
+/datum/outfit/job/syndicate/miner
+ name = "Miner (Syndicate)"
+ jobtype = /datum/job/mining
+
+ belt = /obj/item/pda/shaftminer
+ ears = /obj/item/radio/headset/headset_cargo/mining
+ shoes = /obj/item/clothing/shoes/workboots/mining
+ gloves = /obj/item/clothing/gloves/explorer
+ uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland
+ l_pocket = /obj/item/reagent_containers/hypospray/medipen/survival
+ r_pocket = /obj/item/storage/bag/ore
+ backpack_contents = list(
+ /obj/item/flashlight/seclite=1,\
+ /obj/item/kitchen/knife/combat/survival=1,\
+ /obj/item/mining_voucher=1,\
+ /obj/item/stack/marker_beacon/ten=1)
+
+/datum/outfit/job/syndicate/miner/gorlex
+ name = "Wrecker (Gorlex Marauders)"
+
+ uniform = /obj/item/clothing/under/syndicate/gorlex
+ shoes = /obj/item/clothing/shoes/workboots
+ ears = /obj/item/radio/headset/alt
+
+/datum/outfit/job/syndicate/miner/twink
+ name = "Miner (Twinkleshine)"
+
+ uniform = /obj/item/clothing/under/syndicate/gorlex
+ shoes = /obj/item/clothing/shoes/workboots
+ glasses = /obj/item/clothing/glasses/meson/night
+ gloves = /obj/item/clothing/gloves/explorer
+ ears = /obj/item/radio/headset/syndicate
+ mask = /obj/item/clothing/mask/chameleon
+ r_pocket = /obj/item/kitchen/knife/combat/survival
+ belt = /obj/item/storage/belt/mining/alt
+ implants = list(/obj/item/implant/weapons_auth)
+ id = /obj/item/card/id/syndicate_command/crew_id/engi
+
+ backpack = /obj/item/storage/backpack/security
+ satchel = /obj/item/storage/backpack/satchel/sec
+ duffelbag = /obj/item/storage/backpack/duffelbag/syndie
+ courierbag = /obj/item/storage/backpack/messenger/sec
+
+ box = /obj/item/storage/box/survival/mining
+
+/datum/outfit/job/syndicate/miner/twink/post_equip(mob/living/carbon/human/H)
+ . = ..()
+ assign_codename(H)
+
+/datum/outfit/job/syndicate/miner/cybersun
+ name = "Field Agent (Cybersun)"
+
+ id = /obj/item/card/id/syndicate_command/crew_id
+ ears = /obj/item/radio/headset
+ uniform = /obj/item/clothing/under/syndicate/cybersun
+ accessory = /obj/item/clothing/accessory/armband/cargo
+ head = /obj/item/clothing/head/soft/cybersun
+ r_pocket = /obj/item/radio
+
+/datum/outfit/job/syndicate/miner/gec
+ name = "Shaft Miner (GEC)"
+
+ id = /obj/item/card/id/syndicate_command/crew_id
+ ears = /obj/item/radio/headset
+ uniform = /obj/item/clothing/under/syndicate
+ alt_uniform = null
+ accessory = /obj/item/clothing/accessory/armband/cargo
+ head = /obj/item/clothing/head/soft/black
+ r_pocket = /obj/item/radio
+ head = /obj/item/clothing/head/hardhat/orange
+ suit = /obj/item/clothing/suit/toggle/industrial
+ suit_store = /obj/item/tank/internals/emergency_oxygen/double
+
+//"station" engineers
+
+/datum/outfit/job/syndicate/engineer
+ name = "Ship Technician (Syndicate)"
+ jobtype = /datum/job/engineer
+
+ id = /obj/item/card/id/syndicate_command/crew_id
+ uniform = /obj/item/clothing/under/syndicate/aclfgrunt
+ accessory = /obj/item/clothing/accessory/armband/engine
+ glasses = /obj/item/clothing/glasses/sunglasses
+ shoes = /obj/item/clothing/shoes/jackboots
+
+ belt = /obj/item/storage/belt/utility/full/engi
+ l_pocket = /obj/item/pda/engineering
+ head = /obj/item/clothing/head/hardhat/dblue
+ r_pocket = /obj/item/t_scanner
+
+ box = /obj/item/storage/box/survival/engineer
+ pda_slot = ITEM_SLOT_LPOCKET
+ backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1)
+
+/datum/outfit/job/syndicate/engineer/gec
+ name = "Ship Engineer (GEC)"
+
+ uniform = /obj/item/clothing/under/syndicate/gec
+ suit = /obj/item/clothing/suit/toggle/hazard
+ head = /obj/item/clothing/head/hardhat
+ id = /obj/item/card/id/syndicate_command/crew_id
+
+/datum/outfit/job/syndicate/engineer/gorlex
+ name = "Mechanic (Gorlex Marauders)"
+
+ uniform = /obj/item/clothing/under/syndicate/gorlex
+ shoes = /obj/item/clothing/shoes/workboots
+ alt_uniform = null
+ glasses = null
+
+/datum/outfit/job/syndicate/engineer/twink
+ name = "Ship Engineer (Twinkleshine)"
+
+ uniform = /obj/item/clothing/under/syndicate/gec
+ accessory = null
+ glasses = /obj/item/clothing/glasses/meson/night
+ head = /obj/item/clothing/head/hardhat/orange
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
+ ears = /obj/item/radio/headset/syndicate
+ mask = /obj/item/clothing/mask/chameleon
+ back = /obj/item/storage/backpack/industrial
+ belt = /obj/item/storage/belt/utility/syndicate
+ shoes = /obj/item/clothing/shoes/combat
+ suit = /obj/item/clothing/suit/hazardvest
+ alt_suit = /obj/item/clothing/suit/toggle/hazard
+ implants = list(/obj/item/implant/weapons_auth)
+ id = /obj/item/card/id/syndicate_command/crew_id/engi
+ backpack_contents = list(/obj/item/construction/rcd/combat, /obj/item/rcd_ammo/large)
+
+ box = /obj/item/storage/box/survival/syndie
+
+/datum/outfit/job/syndicate/engineer/twink/post_equip(mob/living/carbon/human/H)
+ . = ..()
+ assign_codename(H)
+
+/datum/outfit/job/syndicate/engineer/cybersun
+ name = "Engineer (Cybersun)"
+
+ uniform = /obj/item/clothing/under/syndicate/cybersun/research
+ shoes = /obj/item/clothing/shoes/workboots
+ r_pocket = /obj/item/radio
+ head = /obj/item/clothing/head/soft/cybersun
+ accessory = /obj/item/clothing/accessory/armband/engine
diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm
deleted file mode 100644
index 825dd8e46c32..000000000000
--- a/code/modules/clothing/outfits/vr.dm
+++ /dev/null
@@ -1,41 +0,0 @@
-/datum/outfit/vr
- name = "Basic VR"
- uniform = /obj/item/clothing/under/color/random
- shoes = /obj/item/clothing/shoes/sneakers/black
- ears = /obj/item/radio/headset
- id = /obj/item/card/id
-
-/datum/outfit/vr/pre_equip(mob/living/carbon/human/H)
- H.dna.species.before_equip_job(null, H)
-
-/datum/outfit/vr/post_equip(mob/living/carbon/human/H)
- var/obj/item/card/id/id = H.wear_id
- if (istype(id))
- id.access |= get_all_accesses()
-
-/datum/outfit/vr/syndicate
- name = "Syndicate VR Operative - Basic"
- uniform = /obj/item/clothing/under/syndicate
- shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/tackler/combat/insulated
- back = /obj/item/storage/backpack
- id = /obj/item/card/id/syndicate
- belt = /obj/item/gun/ballistic/automatic/pistol
- l_pocket = /obj/item/paper/fluff/vr/fluke_ops
- backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
- /obj/item/kitchen/knife/combat/survival)
-
-/datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H)
- . = ..()
- var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80)
- H.equip_to_slot_or_del(U, ITEM_SLOT_BACKPACK)
- var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H)
- W.implant(H)
- var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H)
- E.implant(H)
- H.faction |= ROLE_SYNDICATE
- H.update_icons()
-
-/obj/item/paper/fluff/vr/fluke_ops
- name = "Where is my uplink?"
- default_raw_text = "Use the radio in your backpack."
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index c24759933dd6..05db2331fc49 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -59,7 +59,7 @@
. = ..()
if(can_be_tied && tied == SHOES_UNTIED)
our_alert = user.throw_alert("shoealert", /atom/movable/screen/alert/shoes/untied)
- RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, .proc/check_trip, override=TRUE)
+ RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, PROC_REF(check_trip), override=TRUE)
/obj/item/clothing/shoes/proc/restore_offsets(mob/user)
@@ -110,7 +110,7 @@
else
if(tied == SHOES_UNTIED && our_guy && user == our_guy)
our_alert = our_guy.throw_alert("shoealert", /atom/movable/screen/alert/shoes/untied) // if we're the ones unknotting our own laces, of course we know they're untied
- RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, .proc/check_trip, override=TRUE)
+ RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, PROC_REF(check_trip), override=TRUE)
/**
* handle_tying deals with all the actual tying/untying/knotting, inferring your intent from who you are in relation to the state of the laces
@@ -134,7 +134,7 @@
if(user == loc && tied != SHOES_TIED) // if they're our own shoes, go tie-wards
user.visible_message("[user] begins [tied ? "unknotting" : "tying"] the laces of [user.p_their()] [src.name].", "You begin [tied ? "unknotting" : "tying"] the laces of your [src.name]...")
- if(do_after(user, lace_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, .proc/still_shoed, our_guy)))
+ if(do_after(user, lace_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, PROC_REF(still_shoed), our_guy)))
to_chat(user, "You [tied ? "unknot" : "tie"] the laces of your [src.name].")
if(tied == SHOES_UNTIED)
adjust_laces(SHOES_TIED, user)
@@ -155,7 +155,7 @@
if(HAS_TRAIT(user, TRAIT_CLUMSY)) // based clowns trained their whole lives for this
mod_time *= 0.75
- if(do_after(user, mod_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, .proc/still_shoed, our_guy)))
+ if(do_after(user, mod_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, PROC_REF(still_shoed), our_guy)))
to_chat(user, "You [tied ? "untie" : "knot"] the laces on [loc]'s [src.name].")
if(tied == SHOES_UNTIED)
adjust_laces(SHOES_KNOTTED, user)
@@ -210,7 +210,7 @@
to_chat(our_guy, "You stumble a bit on your untied shoelaces!")
if(!our_guy.has_movespeed_modifier(/datum/movespeed_modifier/shove))
our_guy.add_movespeed_modifier(/datum/movespeed_modifier/shove)
- addtimer(CALLBACK(our_guy, /mob/living/carbon/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH)
+ addtimer(CALLBACK(our_guy, TYPE_PROC_REF(/mob/living/carbon, clear_shove_slowdown)), SHOVE_SLOWDOWN_LENGTH)
if(26 to 1000)
wiser = FALSE
@@ -232,6 +232,6 @@
to_chat(user, "You begin [tied ? "untying" : "tying"] the laces on [src]...")
- if(do_after(user, lace_time, needhand=TRUE, target=src,extra_checks=CALLBACK(src, .proc/still_shoed, user)))
+ if(do_after(user, lace_time, needhand=TRUE, target=src,extra_checks=CALLBACK(src, PROC_REF(still_shoed), user)))
to_chat(user, "You [tied ? "untie" : "tie"] the laces on [src].")
adjust_laces(tied ? SHOES_TIED : SHOES_UNTIED, user)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 2d5301844c98..03abdf1325f8 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -362,26 +362,18 @@
active = TRUE
set_light_color(rgb(rand(0, 255), rand(0, 255), rand(0, 255)))
set_light_on(active)
- addtimer(CALLBACK(src, .proc/lightUp), 0.5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(lightUp)), 0.5 SECONDS)
/obj/item/clothing/shoes/kindleKicks/proc/lightUp(mob/user)
if(lightCycle < 15)
set_light_color(rgb(rand(0, 255), rand(0, 255), rand(0, 255)))
lightCycle++
- addtimer(CALLBACK(src, .proc/lightUp), 0.5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(lightUp)), 0.5 SECONDS)
else
lightCycle = 0
active = FALSE
set_light_on(active)
-/obj/item/clothing/shoes/russian
- name = "russian boots"
- desc = "Comfy shoes."
- icon_state = "rus_shoes"
- item_state = "rus_shoes"
- pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
- lace_time = 8 SECONDS
-
/obj/item/clothing/shoes/cowboy
name = "cowboy boots"
desc = "A small sticker lets you know they've been inspected for snakes, It is unclear how long ago the inspection took place..."
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 9c1bf3acdc0c..6bbde7b4a4dc 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -142,12 +142,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, color = list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 1,1,1,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)
@@ -155,14 +155,14 @@
if(teleporting && activated && user)
user.forceMove(to_turf)
animate(user, color = "#00ccee", 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)
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index de5874c98d38..b4fa1a1282f6 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -637,7 +637,7 @@
/obj/item/clothing/head/helmet/space/hardsuit/rd/Initialize()
. = ..()
- RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, .proc/sense_explosion)
+ RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, PROC_REF(sense_explosion))
/obj/item/clothing/head/helmet/space/hardsuit/rd/equipped(mob/living/carbon/human/user, slot)
..()
@@ -820,7 +820,7 @@
return
if(listeningTo)
UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED)
- RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_mob_move)
+ RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_mob_move))
listeningTo = user
/obj/item/clothing/suit/space/hardsuit/ancient/dropped()
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index e6e15c51aecc..9f7afba9fb4b 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -326,7 +326,7 @@
//bomb scanner for RD helmet
/obj/item/clothing/head/helmet/space/plasmaman/rd/Initialize()
. = ..()
- RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, .proc/sense_explosion)
+ RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, PROC_REF(sense_explosion))
/obj/item/clothing/head/helmet/space/plasmaman/rd/equipped(mob/living/carbon/human/user, slot)
..()
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index fbe1eceb1f65..d0eba4833ea5 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -56,6 +56,11 @@
name = "large tactical armor vest"
icon_state = "marine_heavy"
+/obj/item/clothing/suit/armor/vest/marine/trauma
+ name = "cybersun trauma team armor vest"
+ icon_state = "traumavest"
+ desc = "A set of stamped plasteel armor plates decorated with a medical cross and colors associated with the medical division of Cybersun."
+
/obj/item/clothing/suit/armor/vest/old
name = "degrading armor vest"
desc = "Older generation Type 1 armored vest. Due to degradation over time the vest is far less maneuverable to move in."
@@ -143,12 +148,23 @@
desc = "A sinister looking vest of advanced armor worn over a black and red fireproof jacket. The gold collar and shoulders denote that this belongs to a high ranking syndicate officer."
icon_state = "carapace_syndie"
+/obj/item/clothing/suit/armor/vest/capcarapace/cybersun
+ name = "cybersun captain's haori"
+ desc = "An extraordinarily fashionable haori, utilized by cybersun captains. Weaved with armored fabric to protect the user from gunshots."
+ icon_state = "cybersunhaori"
+
/obj/item/clothing/suit/armor/vest/capcarapace/alt
name = "captain's parade jacket"
desc = "For when an armoured vest isn't fashionable enough."
icon_state = "carapace_ntformal"
item_state = "capspacesuit"
+/obj/item/clothing/suit/armor/vest/capcarapace/captunic
+ name = "captain's parade coat"
+ desc = "Worn by a Captain to show their class."
+ icon_state = "carapace_formal"
+ item_state = "bio_suit"
+
/obj/item/clothing/suit/armor/vest/capcarapace/minutemen
name = "colonial minutemen general coat"
desc = "A very fancy coat used by generals of the Colonial Minutemen."
@@ -317,23 +333,6 @@
resistance_flags = FLAMMABLE
armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 40, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 40, "acid" = 50)
-/obj/item/clothing/suit/armor/vest/russian
- name = "russian vest"
- desc = "A bulletproof vest with forest camo. Good thing there's plenty of forests to hide in around here, right?"
- icon_state = "armor_camo"
- item_state = "rus_armor"
- armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 10, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50)
-
-/obj/item/clothing/suit/armor/vest/russian_coat
- name = "russian battle coat"
- desc = "Used in extremly cold fronts, made out of real bears."
- icon_state = "armor_coat"
- item_state = "rus_coat"
- body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
- armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 30, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50)
-
/obj/item/clothing/suit/armor/hos/inteq
name = "inteq battle coat"
desc = "A luxurious brown coat made from a crossweave of kevlar and ballistic fibre, the collar and wrist trims are made from genuine wolf fur. as protective as it is stylish."
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index d584d07b9bfd..14f721334462 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -12,7 +12,6 @@
greyscale_colors = list(list(11, 15), list(12, 22), list(12, 22))
greyscale_icon_state = "cloak"
-
/obj/item/clothing/neck/cloak/hos
name = "head of security's cloak"
desc = "Worn by Securistan, ruling their watch with an iron fist."
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 241b231043fe..c9c0edd2def8 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -22,16 +22,6 @@
body_parts_covered = CHEST|GROIN|LEGS
permeability_coefficient = 0.5
-//Captain
-/obj/item/clothing/suit/captunic
- name = "captain's parade tunic"
- desc = "Worn by a Captain to show their class."
- icon_state = "captunic"
- item_state = "bio_suit"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- flags_inv = HIDEJUMPSUIT
- allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/assembly/flash/handheld, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
-
//Chef
/obj/item/clothing/suit/toggle/chef
name = "chef's apron"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 1a020e40623c..5bb6923dec73 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -331,13 +331,6 @@
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
-/obj/item/clothing/suit/security/officer/russian
- name = "\improper Russian officer's jacket"
- desc = "This jacket is for those special occasions when a russian officer isn't required to wear their armor."
- icon_state = "officertanjacket"
- item_state = "officertanjacket"
- body_parts_covered = CHEST|ARMS
-
/obj/item/clothing/suit/shrine_maiden
name = "shrine maiden's outfit"
desc = "Makes you want to exterminate some troublesome youkai."
@@ -350,6 +343,12 @@
* Misc
*/
+/obj/item/clothing/suit/cybersun_suit
+ name = "cybersun suit"
+ desc = "A plain white suit commonly used by Cybersun's officers."
+ icon_state = "cybersun_suit"
+ item_state = "cybersun_suit"
+
/obj/item/clothing/suit/straight_jacket
name = "straight jacket"
desc = "A suit that completely restrains the wearer. Manufactured by Antyphun Corp." //Straight jacket is antifun
diff --git a/code/modules/clothing/towels.dm b/code/modules/clothing/towels.dm
new file mode 100644
index 000000000000..22c1b29976fc
--- /dev/null
+++ b/code/modules/clothing/towels.dm
@@ -0,0 +1,206 @@
+/// Default shape of the towel, when it's folded.
+#define TOWEL_FOLDED ""
+/// Chest-down variant of the towel.
+#define TOWEL_FULL "chest"
+/// Waist-down variant of the towel.
+#define TOWEL_WAIST "waist"
+/// Head variant of the towel.
+#define TOWEL_HEAD "head"
+/// Shape of the towel when it has been used, and is no longer neatly folded.
+#define TOWEL_USED "used"
+
+/// Icon path to the obj icon of the towel.
+#define TOWEL_OBJ_ICON 'icons/obj/clothing/towel.dmi'
+/// Icon path to the worn icon of the towel.
+#define TOWEL_WORN_ICON 'icons/mob/clothing/towel.dmi'
+
+/// How much cloth goes into a towel.
+#define TOWEL_CLOTH_AMOUNT 2
+
+/obj/item/towel
+ name = "towel"
+ desc = "Everyone knows what a towel is. Use it to dry yourself, or wear it around your chest, your waist or even your head!"
+ icon = TOWEL_OBJ_ICON
+ mob_overlay_icon = TOWEL_WORN_ICON
+ icon_state = "towel"
+ base_icon_state = "towel"
+ force = 0
+ throwforce = 0
+ throw_speed = 1
+ throw_range = 3 // They're not very aerodynamic.
+ w_class = WEIGHT_CLASS_SMALL // Don't ask me why other cloth-related items are considered tiny, and not small like this one.
+ item_flags = NOBLUDGEON
+ resistance_flags = FLAMMABLE
+ flags_inv = HIDEHAIR // Only relevant when in head shape, but useful to keep around regardless.
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+ /// The shape we're currently in.
+ var/shape = TOWEL_FOLDED
+
+/obj/item/towel/examine(mob/user)
+ . = ..()
+
+ if(!ishuman(user) && !iscyborg(user))
+ return
+
+ . += "" // Just for an empty line
+
+ var/in_hands = TRUE
+ if(ishuman(user))
+ in_hands = user.get_active_held_item() == src || user.get_inactive_held_item() == src
+
+ if(in_hands)
+ . += span_notice("Use in hand to shape [src] into something different.")
+
+ if(iscyborg(user))
+ return
+
+ if(in_hands && shape != TOWEL_FOLDED)
+ . += span_notice("Ctrl-click to fold [src] neatly.")
+
+ if(shape == TOWEL_FULL || shape == TOWEL_WAIST)
+ . += span_notice("Alt-click to adjust the fit of [src].")
+
+/obj/item/towel/attack_self(mob/user, modifiers)
+ . = ..()
+
+ /// Initializing this only once to avoid having to do it every time
+ var/static/list/datum/radial_menu_choice/worn_options = list()
+
+ if(!length(worn_options))
+ for(var/variant in list(TOWEL_FULL, TOWEL_WAIST, TOWEL_HEAD))
+ var/datum/radial_menu_choice/option = new
+ var/image/variant_image = image(icon = TOWEL_OBJ_ICON, icon_state = "[base_icon_state]-[variant]")
+
+ option.image = variant_image
+ worn_options[capitalize(variant)] = option
+
+ var/choice = show_radial_menu(user, src, worn_options, require_near = TRUE, tooltips = TRUE)
+
+ if(!choice)
+ return
+
+ change_towel_shape(user, lowertext(choice))
+
+/obj/item/towel/attackby(obj/item/I, mob/user, params)
+ if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness())
+ var/obj/item/stack/sheet/cotton/cloth/shreds = new (get_turf(src), 3)
+ if(!QDELETED(shreds)) //stacks merged
+ transfer_fingerprints_to(shreds)
+ shreds.add_fingerprint(user)
+ qdel(src)
+ to_chat(user, "You tear [src] up.")
+ else
+ return ..()
+
+/obj/item/towel/CtrlClick(mob/user)
+ . = ..()
+
+ if(. == FALSE)
+ return
+ if(shape == TOWEL_FOLDED)
+ to_chat(user, span_warning("You can't fold a towel that's already folded!"))
+ var/in_hands = TRUE
+ if(ishuman(user) && shape == TOWEL_USED)
+ in_hands = user.get_active_held_item() == src || user.get_inactive_held_item() == src
+ if(in_hands)
+ change_towel_shape(user, TOWEL_FOLDED, silent = TRUE)
+ to_chat(user, span_notice("You fold [src] up neatly."))
+ return
+
+/obj/item/towel/AltClick(mob/user)
+ . = ..()
+
+ if(. == FALSE)
+ return
+
+ if(!(shape == TOWEL_FULL || shape == TOWEL_WAIST))
+ return FALSE
+
+ if(!ishuman(user))
+ return FALSE
+
+ var/mob/living/carbon/human/towel_user = user
+ var/worn = towel_user.wear_suit == src
+
+ change_towel_shape(user, shape == TOWEL_FULL ? TOWEL_WAIST : TOWEL_FULL, silent = worn)
+
+ // No need to display the different message if they're not wearing it.
+ if(!worn)
+ return
+
+ to_chat(user, span_notice(shape == TOWEL_FULL ? "You raise \the [src] over your [shape]." : "You lower \the [src] down to your [shape]."))
+
+/obj/item/towel/machine_wash(obj/machinery/washing_machine/washer)
+ . = ..() // This isn't really needed, including it in case we ever get dyeable towels.
+ make_used(null, silent = TRUE)
+
+/obj/item/towel/dropped(mob/user, silent)
+ . = ..()
+
+ if(!ishuman(loc) && shape != TOWEL_FOLDED)
+ make_used(user, silent = TRUE)
+
+/*
+ * Helper to change the shape of the towel, so that it updates its look both
+ * in-hand and on the body of the wearer.
+ *
+ * Arguments:
+ * * user - Mob that's trying to change the shape of the towel.
+ * * new_shape - The new shape that the towel can be in.
+ * * silent (optional) - Whether we produce a to_chat to the user to elaborate on
+ * the new shape it is now in. Requires `user` to be non-null if `TRUE` in order to
+ * do anything. Defaults to `FALSE`.
+ */
+/obj/item/towel/proc/change_towel_shape(mob/user, new_shape, silent = FALSE)
+ if(new_shape == shape)
+ return
+
+ shape = new_shape
+
+ icon_state = "[base_icon_state][shape ? "-[shape]" : ""]"
+
+ if(shape == TOWEL_HEAD)
+ flags_inv |= HIDEHAIR
+ else
+ flags_inv &= ~HIDEHAIR
+
+ update_appearance()
+ update_slot_related_flags()
+
+ if(!silent && user)
+ to_chat(user, span_notice(shape ? "You adjust [src] so that it can be worn over your [shape]." : "You fold [src] neatly."))
+
+/*
+ * Helper proc to change the slot flags of the towel based on its shape.
+ */
+/obj/item/towel/proc/update_slot_related_flags()
+ switch(shape)
+ if(TOWEL_FULL)
+ slot_flags = ITEM_SLOT_OCLOTHING
+ body_parts_covered = CHEST | GROIN | LEGS
+
+ if(TOWEL_WAIST)
+ slot_flags = ITEM_SLOT_OCLOTHING
+ body_parts_covered = GROIN | LEGS
+
+ if(TOWEL_HEAD)
+ slot_flags = ITEM_SLOT_HEAD
+ body_parts_covered = HEAD
+
+ else
+ slot_flags = NONE
+ body_parts_covered = NONE
+
+ update_slot_icon()
+
+/*
+ * Simple helper to make the towel into a used towel shape.
+ *
+ * Arguments:
+ * * user - Mob that's making the towel used. Can be null if `silent` is `FALSE`.
+ * * silent (optional) - Whether we produce a to_chat to the user to elaborate on
+ * the new shape it is now in. Requires `user` to be non-null if `TRUE` in order to
+ * do anything. Defaults to `FALSE`.
+ */
+/obj/item/towel/proc/make_used(mob/user, silent = FALSE)
+ change_towel_shape(user, TOWEL_USED, silent)
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index e3e8be62bab7..5fc4cc67390b 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -75,7 +75,7 @@
UnregisterSignal(detached_pockets, COMSIG_PARENT_QDELETING)
detached_pockets = new_pocket
if(detached_pockets)
- RegisterSignal(detached_pockets, COMSIG_PARENT_QDELETING, .proc/handle_pockets_del)
+ RegisterSignal(detached_pockets, COMSIG_PARENT_QDELETING, PROC_REF(handle_pockets_del))
/obj/item/clothing/accessory/proc/handle_pockets_del(datum/source)
SIGNAL_HANDLER
diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm
index e0ac5f17275e..bfc7524149cb 100644
--- a/code/modules/clothing/under/costume.dm
+++ b/code/modules/clothing/under/costume.dm
@@ -54,13 +54,6 @@
item_state = "pirate"
can_adjust = FALSE
-/obj/item/clothing/under/costume/soviet
- name = "soviet uniform"
- desc = "For the Motherland!"
- icon_state = "soviet"
- item_state = "soviet"
- can_adjust = FALSE
-
/obj/item/clothing/under/costume/kilt
name = "kilt"
desc = "Includes shoes and plaid."
@@ -196,19 +189,6 @@
icon_state = "blue_mech_suit"
item_state = "blue_mech_suit"
-/obj/item/clothing/under/costume/russian_officer
- name = "\improper Russian officer's uniform"
- desc = "The latest in fashionable russian outfits."
- icon = 'icons/obj/clothing/under/security.dmi'
- icon_state = "hostanclothes"
- item_state = "hostanclothes"
- mob_overlay_icon = 'icons/mob/clothing/under/security.dmi'
- alt_covers_chest = TRUE
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30)
- strip_delay = 50
- sensor_mode = SENSOR_COORDS
- random_sensor = FALSE
-
/obj/item/clothing/under/costume/jackbros
name = "jack bros outfit"
desc = "For when it's time to hee some hos."
diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm
index 5c319344bf56..8edb11ba91cc 100644
--- a/code/modules/clothing/under/jobs/command.dm
+++ b/code/modules/clothing/under/jobs/command.dm
@@ -20,7 +20,7 @@
/obj/item/clothing/under/rank/command/nt/skirt
desc = "A standard command jumpskirt."
name = "command jumpskirt"
- icon_state = "cmd_skirt"
+ icon_state = "cmd_nt_skirt"
body_parts_covered = CHEST|GROIN|ARMS
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
@@ -113,13 +113,13 @@
//Lieutenant
-/obj/item/clothing/under/rank/command/lieutenant
+/obj/item/clothing/under/rank/command
desc = "A standard command jumpsuit in the colours of the Lieutenant."
name = "\improper lieutenant jumpsuit"
icon_state = "lt"
can_adjust = FALSE
-/obj/item/clothing/under/rank/command/lieutenant/skirt
+/obj/item/clothing/under/rank/command/skirt
desc = "A command jumpskirt in the colours of the Lieutenant."
name = "\improper lieutenant jumpskirt"
icon_state = "lt_skirt"
@@ -127,13 +127,13 @@
can_adjust = FALSE
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
-/obj/item/clothing/under/rank/command/lieutenant/nt
+/obj/item/clothing/under/rank/command/nt
desc = "A standard command jumpsuit in the colours of the Lieutenant."
name = "\improper lieutenant blue jumpsuit"
icon_state = "lt_nt"
item_state = "b_suit"
-/obj/item/clothing/under/rank/command/lieutenant/nt/skirt
+/obj/item/clothing/under/rank/command/nt/skirt
desc = "A command jumpskirt in the colours of the Lieutenant."
name = "\improper lieutenant blue jumpskirt"
icon_state = "lt_nt_skirt"
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 0f5472a80407..251743a5cdad 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -276,6 +276,7 @@
icon_state = "minuteman"
item_state = "b_suit"
can_adjust = FALSE
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/rank/security/officer/camo
name = "fatigues"
diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm
index 23800bf4a799..3a2475129acc 100644
--- a/code/modules/clothing/under/pants.dm
+++ b/code/modules/clothing/under/pants.dm
@@ -7,28 +7,13 @@
mob_overlay_icon = 'icons/mob/clothing/under/shorts_pants.dmi'
greyscale_colors = list(list(14, 10), list(16, 10), list(16, 9))
greyscale_icon_state = "pants"
-
-/obj/item/clothing/under/pants/classicjeans
- name = "classic jeans"
- desc = "You feel cooler already."
- icon_state = "jeansclassic"
-
-/obj/item/clothing/under/pants/mustangjeans
- name = "Must Hang jeans"
- desc = "Made in the finest space jeans factory this side of Alpha Centauri."
- icon_state = "jeans"
- custom_price = 180
+ supports_variations = DIGITIGRADE_VARIATION
/obj/item/clothing/under/pants/blackjeans
name = "black jeans"
desc = "Only for those who can pull it off."
icon_state = "jeansblack"
-/obj/item/clothing/under/pants/youngfolksjeans
- name = "Young Folks jeans"
- desc = "For those tired of boring old jeans. Relive the passion of your youth!"
- icon_state = "jeansclassic"
-
/obj/item/clothing/under/pants/white
name = "white pants"
desc = "Plain white pants. Boring."
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index c1ae9679effb..e2e972ab70ae 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -70,14 +70,6 @@
item_state = "g_suit"
can_adjust = FALSE
-/obj/item/clothing/under/syndicate/soviet
- name = "Ratnik 5 tracksuit"
- desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in."
- icon_state = "trackpants"
- can_adjust = FALSE
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- resistance_flags = NONE
-
/obj/item/clothing/under/syndicate/combat
name = "combat uniform"
desc = "With a suit lined with this many pockets, you are ready to operate."
@@ -123,6 +115,12 @@
supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
/obj/item/clothing/under/syndicate/cybersun
+ name = "cybersun jumpsuit"
+ desc = "The standard jumpsuit used by the agents employed by Cybersun, in its distinctive half-black-half-white aesthetic."
+ icon_state = "cybersun_agent"
+ alt_covers_chest = TRUE
+
+/obj/item/clothing/under/syndicate/cybersun/research
name = "Cybersun coveralls"
desc = "Nomex coveralls worn by workers and research personnel employed by Cybersun industries."
icon_state = "cybersun"
@@ -130,12 +128,20 @@
alt_covers_chest = TRUE
supports_variations = DIGITIGRADE_VARIATION | KEPORI_VARIATION
+/obj/item/clothing/under/syndicate/cybersun/officer
+ name = "cybersun officer's suit"
+ desc = "A crimson-red suit used by the officers employed by Cybersun."
+ icon_state = "cybersun_officer"
+ alt_covers_chest = TRUE
+ supports_variations = DIGITIGRADE_VARIATION
+
/obj/item/clothing/under/syndicate/medic
name = "Cybersun medical jumpsuit"
desc = "Sterile coveralls worn by Cybersun Industries field medics for protection against biological hazards."
icon_state = "cybersun_med"
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION | KEPORI_VARIATION
/obj/item/clothing/under/syndicate/medic/skirt
name = "Cybersun medical jumpskirt"
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index ffc7737284df..6b7f6f19fa2f 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -35,7 +35,7 @@
if(log.len && !scanning)
scanning = 1
to_chat(user, "Printing report, please wait...")
- addtimer(CALLBACK(src, .proc/PrintReport), 100)
+ addtimer(CALLBACK(src, PROC_REF(PrintReport)), 100)
else
to_chat(user, "The scanner has no logs or is in use.")
diff --git a/code/modules/donator/_donator.dm b/code/modules/donator/_donator.dm
index 02631ee8ea28..b18dbe8f78b3 100644
--- a/code/modules/donator/_donator.dm
+++ b/code/modules/donator/_donator.dm
@@ -12,8 +12,8 @@ GLOBAL_PROTECT(donators)
. = ..()
donator = GLOB.donators[ckey] || new /datum/donator(src)
donator.owner = src
- add_verb(src, .proc/do_donator_redemption)
- add_verb(src, .proc/do_donator_wcir)
+ add_verb(src, /client/proc/do_donator_redemption)
+ add_verb(src, /client/proc/do_donator_wcir)
/client/Destroy()
. = ..()
diff --git a/code/modules/economy/selling_pad.dm b/code/modules/economy/selling_pad.dm
index 56cafbc35a72..46d660c5cec3 100644
--- a/code/modules/economy/selling_pad.dm
+++ b/code/modules/economy/selling_pad.dm
@@ -176,7 +176,7 @@
status_report = "Sending..."
sell_pad.visible_message("[sell_pad] starts charging up.")
sell_pad.icon_state = "lpad-idle"
- sending_timer = addtimer(CALLBACK(src,.proc/send),warmup_time, TIMER_STOPPABLE)
+ sending_timer = addtimer(CALLBACK(src, PROC_REF(send)),warmup_time, TIMER_STOPPABLE)
/obj/machinery/computer/selling_pad_control/proc/stop_sending()
if(!sending)
diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm
index 0e21622c72c5..9e4ac8f570a0 100644
--- a/code/modules/events/fake_virus.dm
+++ b/code/modules/events/fake_virus.dm
@@ -25,7 +25,7 @@
for(var/i=1; i<=rand(1,defacto_min); i++)
var/mob/living/carbon/human/onecoughman = pick(fake_virus_victims)
if(prob(25))//1/4 odds to get a spooky message instead of coughing out loud
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, onecoughman, "[pick("Your head hurts.", "Your head pounds.")]"), rand(30,150))
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), onecoughman, "[pick("Your head hurts.", "Your head pounds.")]"), rand(30,150))
else
addtimer(CALLBACK(onecoughman, .mob/proc/emote, pick("cough", "sniff", "sneeze")), rand(30,150))//deliver the message with a slightly randomized time interval so there arent multiple people coughing at the exact same time
fake_virus_victims -= onecoughman
diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm
deleted file mode 100644
index 8cf295310282..000000000000
--- a/code/modules/events/fugitive_spawning.dm
+++ /dev/null
@@ -1,112 +0,0 @@
-/datum/round_event_control/fugitives
- name = "Spawn Fugitives"
- typepath = /datum/round_event/ghost_role/fugitives
- max_occurrences = 1
- min_players = 20
- earliest_start = 30 MINUTES //deadchat sink, lets not even consider it early on.
- gamemode_blacklist = list("nuclear")
-
-/datum/round_event/ghost_role/fugitives
- minimum_required = 1
- role_name = "fugitive"
- fakeable = FALSE
-
-/datum/round_event/ghost_role/fugitives/spawn_role()
- var/list/possible_spawns = list()//Some xeno spawns are in some spots that will instantly kill the refugees, like atmos
- for(var/turf/X in GLOB.xeno_spawn)
- if(istype(X.loc, /area/ship/maintenance))
- possible_spawns += X
- if(!possible_spawns.len)
- message_admins("No valid spawn locations found, aborting...")
- return MAP_ERROR
- var/turf/landing_turf = pick(possible_spawns)
- var/list/possible_backstories = list()
- var/list/candidates = get_candidates(ROLE_TRAITOR, null, ROLE_TRAITOR)
- if(candidates.len >= 1) //solo refugees
- if(prob(30))
- possible_backstories.Add("waldo") //less common as it comes with magicks and is kind of immershun shattering
- else //For accurate deadchat feedback
- minimum_required = 4
- if(candidates.len >= 4)//group refugees
- possible_backstories.Add("prisoner", "cultist", "synth")
- if(!possible_backstories.len)
- return NOT_ENOUGH_PLAYERS
-
- var/backstory = pick(possible_backstories)
- var/member_size = 3
- var/leader
- switch(backstory)
- if("synth")
- leader = pick_n_take(candidates)
- if("waldo")
- member_size = 0 //solo refugees have no leader so the member_size gets bumped to one a bit later
- var/list/members = list()
- var/list/spawned_mobs = list()
- if(isnull(leader))
- member_size++ //if there is no leader role, then the would be leader is a normal member of the team.
-
- for(var/i in 1 to member_size)
- members += pick_n_take(candidates)
-
- for(var/mob/dead/selected in members)
- var/mob/living/carbon/human/S = gear_fugitive(selected, landing_turf, backstory)
- spawned_mobs += S
- if(!isnull(leader))
- gear_fugitive_leader(leader, landing_turf, backstory)
-
-//after spawning
- playsound(src, 'sound/weapons/emitter.ogg', 50, TRUE)
- new /obj/item/storage/toolbox/mechanical(landing_turf) //so they can actually escape maint
- addtimer(CALLBACK(src, .proc/spawn_hunters), 10 MINUTES)
- role_name = "fugitive hunter"
- return SUCCESSFUL_SPAWN
-
-/datum/round_event/ghost_role/fugitives/proc/gear_fugitive(mob/dead/selected, turf/landing_turf, backstory) //spawns normal fugitive
- var/datum/mind/player_mind = new /datum/mind(selected.key)
- player_mind.active = TRUE
- var/mob/living/carbon/human/S = new(landing_turf)
- player_mind.transfer_to(S)
- player_mind.assigned_role = "Fugitive"
- player_mind.special_role = "Fugitive"
- player_mind.add_antag_datum(/datum/antagonist/fugitive)
- var/datum/antagonist/fugitive/fugitiveantag = player_mind.has_antag_datum(/datum/antagonist/fugitive)
- INVOKE_ASYNC(fugitiveantag, /datum/antagonist/fugitive.proc/greet, backstory) //some fugitives have a sleep on their greet, so we don't want to stop the entire antag granting proc with fluff
-
- switch(backstory)
- if("prisoner")
- S.equipOutfit(/datum/outfit/prisoner)
- if("cultist")
- S.equipOutfit(/datum/outfit/yalp_cultist)
- if("waldo")
- S.equipOutfit(/datum/outfit/waldo)
- if("synth")
- S.equipOutfit(/datum/outfit/synthetic)
- message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Fugitive by an event.")
- log_game("[key_name(S)] was spawned as a Fugitive by an event.")
- spawned_mobs += S
- return S
-
-//special spawn for one member. it can be used for a special mob or simply to give one normal member special items.
-/datum/round_event/ghost_role/fugitives/proc/gear_fugitive_leader(mob/dead/leader, turf/landing_turf, backstory)
- var/datum/mind/player_mind = new /datum/mind(leader.key)
- player_mind.active = TRUE
- //if you want to add a fugitive with a special leader in the future, make this switch with the backstory
- var/mob/living/carbon/human/S = gear_fugitive(leader, landing_turf, backstory)
- var/obj/item/choice_beacon/augments/A = new(S)
- S.put_in_hands(A)
- new /obj/item/autosurgeon(landing_turf)
-
-//security team gets called in after 10 minutes of prep to find the refugees
-/datum/round_event/ghost_role/fugitives/proc/spawn_hunters()
- var/backstory = pick( "russian", "bounty hunter")
- var/datum/map_template/shuttle/template
- if (backstory == "russian")
- template = new /datum/map_template/shuttle/hunter/russian
- else
- template = new /datum/map_template/shuttle/hunter/bounty
-
- var/datum/overmap/ship/controlled/ship = new(SSovermap.get_unused_overmap_square(), template)
-
- if(!ship)
- CRASH("Loading [backstory] ship failed!")
- priority_announce("Unidentified ship detected near the station.")
diff --git a/code/modules/events/ghost_role.dm b/code/modules/events/ghost_role.dm
index 5d7637332353..aecf7c481415 100644
--- a/code/modules/events/ghost_role.dm
+++ b/code/modules/events/ghost_role.dm
@@ -28,7 +28,7 @@
var/waittime = 300 * (2^retry)
message_admins("The event will not spawn a [role_name] until certain \
conditions are met. Waiting [waittime/10]s and then retrying.")
- addtimer(CALLBACK(src, .proc/try_spawning, 0, ++retry), waittime)
+ addtimer(CALLBACK(src, PROC_REF(try_spawning), 0, ++retry), waittime)
return
if(status == MAP_ERROR)
diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm
index f1a36affcd3b..f38d21b868c4 100644
--- a/code/modules/events/holiday/xmas.dm
+++ b/code/modules/events/holiday/xmas.dm
@@ -49,15 +49,13 @@
var/festive_tree = /obj/structure/flora/tree/pine/xmas
var/christmas_tree = /obj/structure/flora/tree/pine/xmas/presents
-/obj/effect/spawner/xmastree/Initialize()
- ..()
+/obj/effect/spawner/xmastree/Initialize(mapload)
+ . = ..()
if((CHRISTMAS in SSevents.holidays) && christmas_tree)
new christmas_tree(get_turf(src))
else if((FESTIVE_SEASON in SSevents.holidays) && festive_tree)
new festive_tree(get_turf(src))
- return INITIALIZE_HINT_QDEL
-
/obj/effect/spawner/xmastree/rdrod
name = "festivus pole spawner"
festive_tree = /obj/structure/festivus
diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm
deleted file mode 100644
index 186922c76a8f..000000000000
--- a/code/modules/events/pirates.dm
+++ /dev/null
@@ -1,324 +0,0 @@
-/datum/round_event_control/pirates
- name = "Space Pirates"
- typepath = /datum/round_event/pirates
- weight = 8
- max_occurrences = 1
- min_players = 10
- earliest_start = 30 MINUTES
- gamemode_blacklist = list("nuclear")
-
-/datum/round_event/pirates
- startWhen = 60 //2 minutes to answer
- var/datum/comm_message/threat
- var/payoff = 0
- var/payoff_min = 20000
- var/paid_off = FALSE
- var/ship_name = "Space Privateers Association"
- var/shuttle_spawned = FALSE
-
-/datum/round_event/pirates/setup()
- ship_name = pick(strings(PIRATE_NAMES_FILE, "ship_names"))
-
-/datum/round_event/pirates/announce(fake)
- priority_announce("Incoming subspace communication. Secure channel opened at all communication consoles.", "Incoming Message", 'sound/ai/commandreport.ogg')
- if(fake)
- return
- threat = new
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- if(D)
- payoff = max(payoff_min, FLOOR(D.account_balance * 0.80, 1000))
- threat.title = "Business proposition"
- threat.content = "This is [ship_name]. Pay up [payoff] credits or you'll walk the plank."
- threat.possible_answers = list("We'll pay.","No way.")
- threat.answer_callback = CALLBACK(src,.proc/answered)
- SScommunications.send_message(threat,unique = TRUE)
-
-/datum/round_event/pirates/proc/answered()
- if(threat && threat.answered == 1)
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- if(D)
- if(D.adjust_money(-payoff))
- priority_announce("Thanks for the credits, landlubbers.",sender_override = ship_name)
- paid_off = TRUE
- return
- else
- priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name)
- if(!shuttle_spawned)
- spawn_shuttle()
- else
- priority_announce("Too late to beg for mercy!",sender_override = ship_name)
-
-/datum/round_event/pirates/start()
- if(threat && !threat.answered)
- threat.possible_answers = list("Too late")
- threat.answered = 1
- if(!paid_off && !shuttle_spawned)
- spawn_shuttle()
-
-/datum/round_event/pirates/proc/spawn_shuttle()
- shuttle_spawned = TRUE
-
- var/list/candidates = pollGhostCandidates("Do you wish to be considered for pirate crew?", ROLE_TRAITOR)
- shuffle_inplace(candidates)
-
- var/datum/map_template/shuttle/pirate/default/template = new
- var/datum/overmap/ship/controlled/ship = new(SSovermap.get_unused_overmap_square(), template)
-
- if(!ship)
- CRASH("Loading pirate ship failed!")
-
- for(var/turf/A in ship.shuttle_port.return_turfs())
- for(var/obj/effect/mob_spawn/human/pirate/spawner in A)
- if(candidates.len > 0)
- var/mob/M = candidates[1]
- spawner.create(M.ckey)
- candidates -= M
- announce_to_ghosts(M)
- else
- announce_to_ghosts(spawner)
-
- priority_announce("Unidentified armed ship detected near the station.")
-
-/obj/docking_port/mobile/pirate
- name = "pirate shuttle"
- rechargeTime = 3 MINUTES
-
-/obj/machinery/suit_storage_unit/pirate
- suit_type = /obj/item/clothing/suit/space
- helmet_type = /obj/item/clothing/head/helmet/space
- mask_type = /obj/item/clothing/mask/breath
- storage_type = /obj/item/tank/internals/oxygen
-
-/obj/machinery/loot_locator
- name = "Booty Locator"
- desc = "This sophisticated machine scans the nearby space for items of value."
- icon = 'icons/obj/machines/research.dmi'
- icon_state = "tdoppler"
- density = TRUE
- var/cooldown = 300
- var/next_use = 0
-
-/obj/machinery/loot_locator/interact(mob/user)
- if(world.time <= next_use)
- to_chat(user,"[src] is recharging.")
- return
- next_use = world.time + cooldown
- var/atom/movable/AM = find_random_loot()
- if(!AM)
- say("No valuables located. Try again later.")
- else
- say("Located: [AM.name] at [get_area_name(AM)]")
-
-/obj/machinery/loot_locator/proc/find_random_loot()
- if(!GLOB.exports_list.len)
- setupExports()
- var/list/possible_loot = list()
- for(var/datum/export/pirate/E in GLOB.exports_list)
- possible_loot += E
- var/datum/export/pirate/P
- var/atom/movable/AM
- while(!AM && possible_loot.len)
- P = pick_n_take(possible_loot)
- AM = P.find_loot()
- return AM
-
-//Pad & Pad Terminal
-/obj/machinery/piratepad
- name = "cargo hold pad"
- icon = 'icons/obj/telescience.dmi'
- icon_state = "lpad-idle-o"
- var/idle_state = "lpad-idle-o"
- var/warmup_state = "lpad-idle"
- var/sending_state = "lpad-beam"
- var/cargo_hold_id
-
-/obj/machinery/piratepad/multitool_act(mob/living/user, obj/item/multitool/I)
- . = ..()
- if (istype(I))
- to_chat(user, "You register [src] in [I]s buffer.")
- I.buffer = src
- return TRUE
-
-/obj/machinery/computer/piratepad_control
- name = "cargo hold control terminal"
- icon_screen = "bounty"
- var/status_report = "Ready for delivery."
- var/obj/machinery/piratepad/pad
- var/warmup_time = 100
- var/sending = FALSE
- var/points = 0
- var/datum/export_report/total_report
- var/sending_timer
- var/cargo_hold_id
-
-/obj/machinery/computer/piratepad_control/Initialize()
- ..()
- return INITIALIZE_HINT_LATELOAD
-
-/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/multitool/I)
- . = ..()
- if (istype(I) && istype(I.buffer,/obj/machinery/piratepad))
- to_chat(user, "You link [src] with [I.buffer] in [I] buffer.")
- pad = I.buffer
- return TRUE
-
-/obj/machinery/computer/piratepad_control/LateInitialize()
- . = ..()
- if(cargo_hold_id)
- for(var/obj/machinery/piratepad/P in GLOB.machines)
- if(P.cargo_hold_id == cargo_hold_id)
- pad = P
- return
- else
- pad = locate() in range(4,src)
-
-/obj/machinery/computer/piratepad_control/ui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "CargoHoldTerminal", name)
- ui.open()
-
-/obj/machinery/computer/piratepad_control/ui_data(mob/user)
- var/list/data = list()
- data["points"] = points
- data["pad"] = pad ? TRUE : FALSE
- data["sending"] = sending
- data["status_report"] = status_report
- return data
-
-/obj/machinery/computer/piratepad_control/ui_act(action, params)
- . = ..()
- if(.)
- return
- if(!pad)
- return
-
- switch(action)
- if("recalc")
- recalc()
- . = TRUE
- if("send")
- start_sending()
- . = TRUE
- if("stop")
- stop_sending()
- . = TRUE
-
-/obj/machinery/computer/piratepad_control/proc/recalc()
- if(sending)
- return
-
- status_report = "Predicted value: "
- var/value = 0
- var/datum/export_report/ex = new
- for(var/atom/movable/AM in get_turf(pad))
- if(AM == pad)
- continue
- export_item_and_contents(AM, EXPORT_PIRATE | EXPORT_CARGO | EXPORT_CONTRABAND | EXPORT_EMAG, apply_elastic = FALSE, dry_run = TRUE, external_report = ex)
-
- for(var/datum/export/E in ex.total_amount)
- status_report += E.total_printout(ex,notes = FALSE)
- status_report += " "
- value += ex.total_value[E]
-
- if(!value)
- status_report += "0"
-
-/obj/machinery/computer/piratepad_control/proc/send()
- if(!sending)
- return
-
- var/datum/export_report/ex = new
-
- for(var/atom/movable/AM in get_turf(pad))
- if(AM == pad)
- continue
- export_item_and_contents(AM, EXPORT_PIRATE | EXPORT_CARGO | EXPORT_CONTRABAND | EXPORT_EMAG, apply_elastic = FALSE, delete_unsold = FALSE, external_report = ex)
-
- status_report = "Sold: "
- var/value = 0
- for(var/datum/export/E in ex.total_amount)
- var/export_text = E.total_printout(ex,notes = FALSE) //Don't want nanotrasen messages, makes no sense here.
- if(!export_text)
- continue
-
- status_report += export_text
- status_report += " "
- value += ex.total_value[E]
-
- if(!total_report)
- total_report = ex
- else
- total_report.exported_atoms += ex.exported_atoms
- for(var/datum/export/E in ex.total_amount)
- total_report.total_amount[E] += ex.total_amount[E]
- total_report.total_value[E] += ex.total_value[E]
-
- points += value
-
- if(!value)
- status_report += "Nothing"
-
- pad.visible_message("[pad] activates!")
- flick(pad.sending_state,pad)
- pad.icon_state = pad.idle_state
- sending = FALSE
-
-/obj/machinery/computer/piratepad_control/proc/start_sending()
- if(sending)
- return
- sending = TRUE
- status_report = "Sending..."
- pad.visible_message("[pad] starts charging up.")
- pad.icon_state = pad.warmup_state
- sending_timer = addtimer(CALLBACK(src,.proc/send),warmup_time, TIMER_STOPPABLE)
-
-/obj/machinery/computer/piratepad_control/proc/stop_sending()
- if(!sending)
- return
- sending = FALSE
- status_report = "Ready for delivery."
- pad.icon_state = pad.idle_state
- deltimer(sending_timer)
-
-/datum/export/pirate
- export_category = EXPORT_PIRATE
-
-//Attempts to find the thing on station
-/datum/export/pirate/proc/find_loot()
- return
-
-/datum/export/pirate/ransom
- cost = 3000
- unit_name = "hostage"
- export_types = list(/mob/living/carbon/human)
-
-/datum/export/pirate/ransom/get_cost(atom/movable/AM)
- var/mob/living/carbon/human/H = AM
- if(H.stat != CONSCIOUS || !H.mind || !H.mind.assigned_role) //mint condition only
- return 0
- else if("pirate" in H.faction) //can't ransom your fellow pirates to CentCom!
- return 0
- else
- if(H.mind.assigned_role in GLOB.command_positions)
- return 3000
- else
- return 1000
-
-/datum/export/pirate/cash
- cost = 1
- unit_name = "bills"
- export_types = list(/obj/item/spacecash/bundle)
-
-/datum/export/pirate/cash/get_amount(obj/O)
- var/obj/item/spacecash/bundle/C = O
- return ..() * C.value
-
-/datum/export/pirate/holochip
- cost = 1
- unit_name = "holochip"
- export_types = list(/obj/item/holochip)
-
-/datum/export/pirate/holochip/get_cost(atom/movable/AM)
- var/obj/item/holochip/H = AM
- return H.credits
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 45e9551ae25a..ede24c643c43 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -289,7 +289,7 @@
. = ..()
add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY)
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm
index 5232f81bb696..890bbc0f1f2b 100644
--- a/code/modules/events/wizard/greentext.dm
+++ b/code/modules/events/wizard/greentext.dm
@@ -35,7 +35,7 @@
/obj/item/greentext/Initialize(mapload)
. = ..()
GLOB.poi_list |= src
- roundend_callback = CALLBACK(src,.proc/check_winner)
+ roundend_callback = CALLBACK(src, PROC_REF(check_winner))
SSticker.OnRoundend(roundend_callback)
/obj/item/greentext/equipped(mob/living/user as mob)
diff --git a/code/modules/fishing/aquarium/aquarium.dm b/code/modules/fishing/aquarium/aquarium.dm
index 4bb131f49460..1850d7afee22 100644
--- a/code/modules/fishing/aquarium/aquarium.dm
+++ b/code/modules/fishing/aquarium/aquarium.dm
@@ -43,7 +43,7 @@
/obj/structure/aquarium/Initialize(mapload)
. = ..()
update_appearance()
- RegisterSignal(src,COMSIG_PARENT_ATTACKBY, .proc/feed_feedback)
+ RegisterSignal(src,COMSIG_PARENT_ATTACKBY, PROC_REF(feed_feedback))
/obj/structure/aquarium/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
. = ..()
diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm
index 4d65e0cea0f6..48219cf98f2f 100644
--- a/code/modules/fishing/fish/_fish.dm
+++ b/code/modules/fishing/fish/_fish.dm
@@ -33,7 +33,7 @@
/// What type of reagent this fish needs to be fed.
var/food = /datum/reagent/consumable/nutriment
/// How often the fish needs to be fed
- var/feeding_frequency = 5 MINUTES
+ var/feeding_frequency = 20 MINUTES
/// Time of last feedeing
var/last_feeding
@@ -103,8 +103,8 @@
. = ..()
/* if(fillet_type)
AddElement(/datum/element/processable, TOOL_KNIFE, fillet_type, 1, 5) */
- AddComponent(/datum/component/aquarium_content, .proc/get_aquarium_animation, list(COMSIG_FISH_STATUS_CHANGED,COMSIG_FISH_STIRRED))
- RegisterSignal(src, COMSIG_ATOM_TEMPORARY_ANIMATION_START, .proc/on_temp_animation)
+ AddComponent(/datum/component/aquarium_content, PROC_REF(get_aquarium_animation), list(COMSIG_FISH_STATUS_CHANGED,COMSIG_FISH_STIRRED))
+ RegisterSignal(src, COMSIG_ATOM_TEMPORARY_ANIMATION_START, PROC_REF(on_temp_animation))
check_environment_after_movement()
if(status != FISH_DEAD)
@@ -165,8 +165,8 @@
/obj/item/fish/proc/on_aquarium_insertion(obj/structure/aquarium)
if(isnull(last_feeding)) //Fish start fed.
last_feeding = world.time
- RegisterSignal(aquarium, COMSIG_ATOM_EXITED, .proc/aquarium_exited)
- RegisterSignal(aquarium, COMSIG_PARENT_ATTACKBY, .proc/attack_reaction)
+ RegisterSignal(aquarium, COMSIG_ATOM_EXITED, PROC_REF(aquarium_exited))
+ RegisterSignal(aquarium, COMSIG_PARENT_ATTACKBY, PROC_REF(attack_reaction))
/obj/item/fish/proc/aquarium_exited(datum/source, atom/movable/gone, direction)
SIGNAL_HANDLER
@@ -265,10 +265,10 @@
var/health_change_per_second = 0
if(!proper_environment())
health_change_per_second -= 3 //Dying here
- if(world.time - last_feeding >= feeding_frequency)
- health_change_per_second -= 0.5 //Starving
- else
+ if(world.time - last_feeding <= feeding_frequency)
health_change_per_second += 0.5 //Slowly healing
+ else
+ return
adjust_health(health + health_change_per_second)
/obj/item/fish/proc/adjust_health(amt)
@@ -291,6 +291,8 @@
return
if(length(aquarium.tracked_fish) >= AQUARIUM_MAX_BREEDING_POPULATION) //so aquariums full of fish don't need to do these expensive checks
return
+ if(world.time - last_feeding >= feeding_frequency)
+ return
var/list/other_fish_of_same_type = list()
for(var/obj/item/fish/fish_in_aquarium in aquarium)
if(fish_in_aquarium == src || fish_in_aquarium.type != type)
@@ -363,7 +365,7 @@
/// Refreshes flopping animation after temporary animation finishes
/obj/item/fish/proc/on_temp_animation(datum/source, animation_duration)
if(animation_duration > 0)
- addtimer(CALLBACK(src, .proc/refresh_flopping), animation_duration)
+ addtimer(CALLBACK(src, PROC_REF(refresh_flopping)), animation_duration)
/obj/item/fish/proc/refresh_flopping()
if(flopping)
diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm
index ce91cbf03321..18db513aa6ee 100644
--- a/code/modules/fishing/fishing_minigame.dm
+++ b/code/modules/fishing/fishing_minigame.dm
@@ -77,10 +77,10 @@
/// Create fishing line visuals
fishing_line = used_rod.create_fishing_line(lure, target_py = 5)
// If fishing line breaks los / rod gets dropped / deleted
- RegisterSignal(fishing_line, COMSIG_FISHING_LINE_SNAPPED, .proc/interrupt)
+ RegisterSignal(fishing_line, COMSIG_FISHING_LINE_SNAPPED, PROC_REF(interrupt))
ADD_TRAIT(user, TRAIT_GONE_FISHING, REF(src))
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "fishing", /datum/mood_event/fishing)
- RegisterSignal(user, COMSIG_MOB_CLICKON, .proc/handle_click)
+ RegisterSignal(user, COMSIG_MOB_CLICKON, PROC_REF(handle_click))
start_baiting_phase()
to_chat(user, span_notice("You start fishing..."))
playsound(lure, 'sound/effects/splash.ogg', 100)
@@ -137,7 +137,7 @@
animate(pixel_y = -1, time = 1 SECONDS, flags = ANIMATION_RELATIVE)
//Setup next phase
var/wait_time = rand(1 SECONDS, 30 SECONDS)
- next_phase_timer = addtimer(CALLBACK(src, .proc/start_biting_phase), wait_time, TIMER_STOPPABLE)
+ next_phase_timer = addtimer(CALLBACK(src, PROC_REF(start_biting_phase)), wait_time, TIMER_STOPPABLE)
/datum/fishing_challenge/proc/start_biting_phase()
phase = BITING_PHASE
@@ -148,7 +148,7 @@
animate(pixel_y = -3, time = 5, flags = ANIMATION_RELATIVE)
// Setup next phase
var/wait_time = rand(3 SECONDS, 6 SECONDS)
- next_phase_timer = addtimer(CALLBACK(src, .proc/start_baiting_phase), wait_time, TIMER_STOPPABLE)
+ next_phase_timer = addtimer(CALLBACK(src, PROC_REF(start_baiting_phase)), wait_time, TIMER_STOPPABLE)
/datum/fishing_challenge/proc/start_minigame_phase()
phase = MINIGAME_PHASE
diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm
index 1c4c0aa5377f..aa6841f7f355 100644
--- a/code/modules/fishing/fishing_rod.dm
+++ b/code/modules/fishing/fishing_rod.dm
@@ -88,10 +88,10 @@
var/beam_color = line?.line_color || default_line_color
var/datum/beam/fishing_line/fishing_line_beam = new(user, target, icon_state = "fishing_line", beam_color = beam_color, override_target_pixel_y = target_py)
fishing_line_beam.lefthand = user.get_held_index_of_item(src) % 2 == 1
- RegisterSignal(fishing_line_beam, COMSIG_BEAM_BEFORE_DRAW, .proc/check_los)
- RegisterSignal(fishing_line_beam, COMSIG_PARENT_QDELETING, .proc/clear_line)
+ RegisterSignal(fishing_line_beam, COMSIG_BEAM_BEFORE_DRAW, PROC_REF(check_los))
+ RegisterSignal(fishing_line_beam, COMSIG_PARENT_QDELETING, PROC_REF(clear_line))
fishing_lines += fishing_line_beam
- INVOKE_ASYNC(fishing_line_beam, /datum/beam/.proc/Start)
+ INVOKE_ASYNC(fishing_line_beam, TYPE_PROC_REF(/datum/beam, Start))
user.update_inv_hands()
return fishing_line_beam
@@ -118,7 +118,7 @@
return
currently_hooked_item = target_atom
hooked_item_fishing_line = create_fishing_line(target_atom)
- RegisterSignal(hooked_item_fishing_line, COMSIG_FISHING_LINE_SNAPPED, .proc/clear_hooked_item)
+ RegisterSignal(hooked_item_fishing_line, COMSIG_FISHING_LINE_SNAPPED, PROC_REF(clear_hooked_item))
/// Checks what can be hooked
/obj/item/fishing_rod/proc/can_be_hooked(atom/movable/target)
@@ -411,7 +411,7 @@
/datum/beam/fishing_line/Start()
update_offsets(origin.dir)
. = ..()
- RegisterSignal(origin, COMSIG_ATOM_DIR_CHANGE, .proc/handle_dir_change)
+ RegisterSignal(origin, COMSIG_ATOM_DIR_CHANGE, PROC_REF(handle_dir_change))
/datum/beam/fishing_line/Destroy()
UnregisterSignal(origin, COMSIG_ATOM_DIR_CHANGE)
@@ -420,7 +420,7 @@
/datum/beam/fishing_line/proc/handle_dir_change(atom/movable/source, olddir, newdir)
SIGNAL_HANDLER
update_offsets(newdir)
- INVOKE_ASYNC(src, /datum/beam/.proc/redrawing)
+ INVOKE_ASYNC(src, TYPE_PROC_REF(/datum/beam, redrawing))
/datum/beam/fishing_line/proc/update_offsets(user_dir)
switch(user_dir)
diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm
index 3f0ba7f94ff8..ac6fae8bc53f 100644
--- a/code/modules/flufftext/Dreaming.dm
+++ b/code/modules/flufftext/Dreaming.dm
@@ -64,7 +64,7 @@
dream_fragments.Cut(1,2)
to_chat(src, "... [next_message] ...")
if(LAZYLEN(dream_fragments))
- dream_timer = addtimer(CALLBACK(src, .proc/dream_sequence, dream_fragments), rand(1, 3) SECONDS, TIMER_STOPPABLE)
+ dream_timer = addtimer(CALLBACK(src, PROC_REF(dream_sequence), dream_fragments), rand(1, 3) SECONDS, TIMER_STOPPABLE)
else
stop_dreaming()
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 7c604a15c22b..7bf30e86d498 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -321,7 +321,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
target.client.images |= fakerune
target.playsound_local(wall,'sound/effects/meteorimpact.ogg', 150, 1)
bubblegum = new(wall, target)
- addtimer(CALLBACK(src, .proc/bubble_attack, landing), 10)
+ addtimer(CALLBACK(src, PROC_REF(bubble_attack), landing), 10)
/datum/hallucination/oh_yeah/proc/bubble_attack(turf/landing)
var/charged = FALSE //only get hit once
@@ -365,10 +365,10 @@ GLOBAL_LIST_INIT(hallucination_list, list(
for(var/i in 1 to rand(5, 10))
target.playsound_local(source, 'sound/weapons/laser.ogg', 25, 1)
if(prob(50))
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/sear.ogg', 25, 1), rand(5,10))
+ addtimer(CALLBACK(target, TYPE_PROC_REF(/mob, playsound_local), source, 'sound/weapons/sear.ogg', 25, 1), rand(5,10))
hits++
else
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(5,10))
+ addtimer(CALLBACK(target, TYPE_PROC_REF(/mob, playsound_local), source, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(5,10))
sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 6))
if(hits >= 4 && prob(70))
target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
@@ -378,10 +378,10 @@ GLOBAL_LIST_INIT(hallucination_list, list(
for(var/i in 1 to rand(5, 10))
target.playsound_local(source, 'sound/weapons/taser2.ogg', 25, 1)
if(prob(50))
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/tap.ogg', 25, 1), rand(5,10))
+ addtimer(CALLBACK(target, TYPE_PROC_REF(/mob, playsound_local), source, 'sound/weapons/tap.ogg', 25, 1), rand(5,10))
hits++
else
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(5,10))
+ addtimer(CALLBACK(target, TYPE_PROC_REF(/mob, playsound_local), source, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(5,10))
sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 6))
if(hits >= 3 && prob(70))
target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
@@ -399,10 +399,10 @@ GLOBAL_LIST_INIT(hallucination_list, list(
for(var/i in 1 to rand(3, 6))
target.playsound_local(source, 'sound/weapons/gun/shotgun/shot.ogg', 25, TRUE)
if(prob(60))
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, 'sound/weapons/pierce.ogg', 25, 1), rand(5,10))
+ addtimer(CALLBACK(target, TYPE_PROC_REF(/mob, playsound_local), source, 'sound/weapons/pierce.ogg', 25, 1), rand(5,10))
hits++
else
- addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, "ricochet", 25, 1), rand(5,10))
+ addtimer(CALLBACK(target, TYPE_PROC_REF(/mob, playsound_local), source, "ricochet", 25, 1), rand(5,10))
sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 6))
if(hits >= 2 && prob(80))
target.playsound_local(source, get_sfx("bodyfall"), 25, 1)
@@ -728,7 +728,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
// Display message
if (!is_radio && !target.client?.prefs.chat_on_map)
var/image/speech_overlay = image('icons/mob/talk.dmi', person, "default0", layer = ABOVE_MOB_LAYER)
- INVOKE_ASYNC(GLOBAL_PROC, /proc/flick_overlay, speech_overlay, list(target.client), 30)
+ INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay), speech_overlay, list(target.client), 30)
if (target.client?.prefs.chat_on_map)
target.create_chat_message(speaker || person, understood_language, chosen, spans)
to_chat(target, message)
@@ -1098,7 +1098,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/obj/effect/hallucination/danger/lava/Initialize(mapload, _target)
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -1119,7 +1119,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/obj/effect/hallucination/danger/chasm/Initialize(mapload, _target)
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -1136,7 +1136,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
return
to_chat(target, "You fall into the chasm!")
target.Paralyze(40)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, target, "It's surprisingly shallow."), 15)
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), target, "It's surprisingly shallow."), 15)
QDEL_IN(src, 30)
/obj/effect/hallucination/danger/anomaly
@@ -1146,7 +1146,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
. = ..()
START_PROCESSING(SSobj, src)
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -1263,13 +1263,13 @@ GLOBAL_LIST_INIT(hallucination_list, list(
if(target.client)
target.client.images |= shock_image
target.client.images |= electrocution_skeleton_anim
- addtimer(CALLBACK(src, .proc/reset_shock_animation), 40)
+ addtimer(CALLBACK(src, PROC_REF(reset_shock_animation)), 40)
target.playsound_local(get_turf(src), "sparks", 100, 1)
target.staminaloss += 50
target.Stun(40)
target.jitteriness += 1000
target.do_jitter_animation(target.jitteriness)
- addtimer(CALLBACK(src, .proc/shock_drop), 20)
+ addtimer(CALLBACK(src, PROC_REF(shock_drop)), 20)
/datum/hallucination/shock/proc/reset_shock_animation()
if(target.client)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 8db4c2846dcb..cd372392b927 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -79,7 +79,7 @@
if(iscyborg(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
var/mob/living/silicon/robot/bro = user
bro.cell.use(30)
- addtimer(CALLBACK(reagents, /datum/reagents.proc/add_reagent, refill, trans), 600)
+ addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, add_reagent), refill, trans), 600)
else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us.
if (!is_refillable())
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 77de6fddcad7..b4d8cf8090c9 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -179,13 +179,13 @@
/obj/item/reagent_containers/food/drinks/bottle/vodka
name = "Tunguska triple distilled"
- desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide."
+ desc = "Vodka, prime choice of drink and fuel."
icon_state = "vodkabottle"
list_reagents = list(/datum/reagent/consumable/ethanol/vodka = 100)
/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka
name = "Badminka vodka"
- desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'."
+ desc = "The label's written in some unknown language. All you can make out is the name and a word that looks vaguely like 'Vodka'."
icon_state = "badminka"
list_reagents = list(/datum/reagent/consumable/ethanol/vodka = 100)
@@ -532,7 +532,7 @@
to_chat(user, "You light [src] on fire.")
add_overlay(custom_fire_overlay ? custom_fire_overlay : GLOB.fire_overlay)
if(!isGlass)
- addtimer(CALLBACK(src, .proc/explode), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(explode)), 5 SECONDS)
/obj/item/reagent_containers/food/drinks/bottle/molotov/proc/explode()
if(!active)
@@ -567,7 +567,7 @@
/obj/item/reagent_containers/food/drinks/bottle/pruno/Initialize()
. = ..()
- RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/check_fermentation)
+ RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(check_fermentation))
/obj/item/reagent_containers/food/drinks/bottle/pruno/Destroy()
UnregisterSignal(src, COMSIG_MOVABLE_MOVED)
@@ -587,7 +587,7 @@
return
if(!fermentation_time_remaining)
fermentation_time_remaining = fermentation_time
- fermentation_timer = addtimer(CALLBACK(src, .proc/do_fermentation), fermentation_time_remaining, TIMER_UNIQUE|TIMER_STOPPABLE)
+ fermentation_timer = addtimer(CALLBACK(src, PROC_REF(do_fermentation)), fermentation_time_remaining, TIMER_UNIQUE|TIMER_STOPPABLE)
fermentation_time_remaining = null
// actually ferment
diff --git a/code/modules/food_and_drinks/drinks/drinks/breakawayflask.dm b/code/modules/food_and_drinks/drinks/drinks/breakawayflask.dm
new file mode 100644
index 000000000000..e4e839468ed3
--- /dev/null
+++ b/code/modules/food_and_drinks/drinks/drinks/breakawayflask.dm
@@ -0,0 +1,84 @@
+/obj/item/reagent_containers/food/drinks/breakawayflask
+ name = "breakaway flask"
+ desc = "A special flask designed to stabilize trick wines and shatter violently on contact."
+ icon_state = "breakawayflask"
+ item_state = "breakawayflask"
+ w_class = WEIGHT_CLASS_SMALL
+ gulp_size = 25
+ amount_per_transfer_from_this = 25
+ volume = 50
+ throwforce = 10
+ custom_materials = list(/datum/material/glass=2500, /datum/material/plasma=500)
+ max_integrity = 20
+ spillable = TRUE
+ resistance_flags = ACID_PROOF
+ obj_flags = UNIQUE_RENAME
+ drop_sound = 'sound/items/handling/drinkglass_drop.ogg'
+ pickup_sound = 'sound/items/handling/drinkglass_pickup.ogg'
+ custom_price = 25
+ can_have_cap = TRUE
+ cap_icon_state = "baflask_cap"
+ cap_on = TRUE
+ var/vintage = FALSE
+
+/obj/item/reagent_containers/food/drinks/breakawayflask/on_reagent_change(changetype)
+ cut_overlays()
+
+ gulp_size = max(round(reagents.total_volume / 25), 25)
+ var/datum/reagent/largest_reagent = reagents.get_master_reagent()
+ if (reagents.reagent_list.len > 0)
+ if(!renamedByPlayer && vintage == FALSE)
+ name = largest_reagent.glass_name
+ desc = largest_reagent.glass_desc
+ if(largest_reagent.breakaway_flask_icon_state)
+ icon_state = largest_reagent.breakaway_flask_icon_state
+ else
+ var/mutable_appearance/baflask_overlay = mutable_appearance(icon, "baflaskoverlay")
+ icon_state = "baflaskclear"
+ baflask_overlay.color = mix_color_from_reagents(reagents.reagent_list)
+ add_overlay(baflask_overlay)
+
+ else
+ icon_state = "breakawayflask"
+ name = "breakaway flask"
+ desc = "A special flask designed to stabilize trick wines and shatter violently on contact."
+ return
+
+/obj/item/reagent_containers/food/drinks/breakawayflask/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ spillable = TRUE
+ . = ..()
+
+/obj/item/reagent_containers/food/drinks/breakawayflask/vintage
+ name = "Vintange Saint-Roumain Trickwine"
+ desc = "Supposedly one of the first bottles made"
+ vintage = TRUE
+
+/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/ashwine
+ name = "Vintange Saint-Roumain Ashwine"
+ list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/ash_wine = 45, /datum/reagent/consumable/ethanol/absinthe = 5)
+ desc = "Ashwine was originally created using herbs native to Illestren, as a means of relaxing after a long hunt. The Saint-Roumain Militia has no prohibition on a little fun."
+
+/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/icewine
+ name = "Vintange Saint-Roumain Icewine"
+ list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/ice_wine = 45, /datum/reagent/consumable/ethanol/sake = 5)
+ desc = "Icewine, inspired by the frigid slopes of the 'Godforsaken Precipice' that forged the group's reputation as valiant survivalists, was engineered to both soothe overheated Hunters and freeze their foes in their tracks."
+
+/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/shockwine
+ name = "Vintange Saint-Roumain Shockwine"
+ list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/shock_wine = 45, /datum/reagent/consumable/ethanol/vodka = 5)
+ desc = "Shockwine, made to invigorate consumers and incapacitate targets, took inspiration from an incident early in the Saint-Roumain Militia's history, when a young Shadow stopped a rampaging beast by plunging an electrical cable that had been dislodged in the fighting into its side."
+
+/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/hearthwine
+ name = "Vintange Saint-Roumain Hearthwine"
+ list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/hearth_wine = 45, /datum/reagent/consumable/ethanol/hcider = 5)
+ desc = "Hearthwine is one of the most important tonics devised by the SRM – both for its potent abilities in staunching wounds or setting enemies aflame, and for its closeness to the divine fire associated with the Ashen Huntsman."
+
+/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/forcewine
+ name = "Vintange Saint-Roumain Forcewine"
+ list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/force_wine = 45, /datum/reagent/consumable/ethanol/tequila = 5)
+ desc = "Forcewine was originally created as a means to create temporary shelters during long tracking expeditions. While the structures proved to be not as versatile in shape as its brewers had hoped, its utility in creating barricades or heming in hostiles was still greatly appreciated."
+
+/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/prismwine
+ name = "Vintange Saint-Roumain Prismwine"
+ list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/prism_wine = 45, /datum/reagent/consumable/ethanol/gin = 5)
+ desc = "Prismwine is one of the most recent additions to the Saint-Roumain Militia's reserve of trickwines. It was purpose-created for fighting hostiles that utilized more advanced energy projection attacks, such as the cryonic beams of watchers or the laser guns of interstellar pirates."
diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
index 4ca34b224689..1d7adb7db4f2 100644
--- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
@@ -88,63 +88,6 @@
if(ishumanbasic(user))
. += "You feel like this might be in poor taste."
-//Breakaway Flasks!
-
-/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask
- name = "breakaway flask"
- desc = "A special flask designed to stabilize trick wines and shatter violently on contact"
- icon_state = "breakawayflask"
- gulp_size = 25
- amount_per_transfer_from_this = 25
- volume = 50
- throwforce = 20
- custom_materials = list(/datum/material/glass=2500, /datum/material/plasma=500)
- max_integrity = 20
- spillable = TRUE
- resistance_flags = ACID_PROOF
- obj_flags = UNIQUE_RENAME
- drop_sound = 'sound/items/handling/drinkglass_drop.ogg'
- pickup_sound = 'sound/items/handling/drinkglass_pickup.ogg'
- custom_price = 25
-
-/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/on_reagent_change(changetype)
- cut_overlays()
-
- gulp_size = max(round(reagents.total_volume / 25), 25)
- var/datum/reagent/largest_reagent = reagents.get_master_reagent()
- if (reagents.reagent_list.len > 0)
- if(!renamedByPlayer)
- name = largest_reagent.glass_name
- desc = largest_reagent.glass_desc
- if(largest_reagent.breakaway_flask_icon_state)
- icon_state = largest_reagent.breakaway_flask_icon_state
- else
- var/mutable_appearance/baflask_overlay = mutable_appearance(icon, "baflaskoverlay")
- icon_state = "baflaskclear"
- baflask_overlay.color = mix_color_from_reagents(reagents.reagent_list)
- add_overlay(baflask_overlay)
-
- else
- icon_state = "breakawayflask"
- name = initial(src.name)
- desc = initial(src.desc)
- return
-
-/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageash
- name = "Vintange Saint-Roumain Ashwine"
- desc = "Supposedly one of the first bottles of ashwine made"
- list_reagents = list(/datum/reagent/consumable/ethanol/ash_wine = 45, /datum/reagent/uranium = 5)
-
-/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageice
- name = "Vintange Saint-Roumain Icewine"
- desc = "Supposedly one of the first bottles of icewine made"
- list_reagents = list(/datum/reagent/consumable/ethanol/ice_wine = 45, /datum/reagent/uranium = 5)
-
-/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageshock
- name = "Vintange Saint-Roumain Shockwine"
- desc = "Supposedly one of the first bottles of shockwine made"
- list_reagents = list(/datum/reagent/consumable/ethanol/shock_wine = 45, /datum/reagent/uranium = 5)
-
/obj/item/reagent_containers/food/drinks/drinkingglass/filled/Initialize()
. = ..()
on_reagent_change(ADD_REAGENT)
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index 66c3c87a82da..3d5adf18e6fd 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -506,7 +506,7 @@
/obj/item/reagent_containers/food/snacks/chewable/lollipop/cyborg/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/spamcheck), 1200)
+ addtimer(CALLBACK(src, PROC_REF(spamcheck)), 1200)
/obj/item/reagent_containers/food/snacks/chewable/lollipop/cyborg/equipped(mob/living/user, slot)
. = ..(user, slot)
@@ -584,7 +584,7 @@
/obj/item/reagent_containers/food/snacks/gumball/cyborg/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/spamcheck), 1200)
+ addtimer(CALLBACK(src, PROC_REF(spamcheck)), 1200)
/obj/item/reagent_containers/food/snacks/gumball/cyborg/equipped(mob/living/user, slot)
. = ..(user, slot)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/big_mortar.dm b/code/modules/food_and_drinks/kitchen_machinery/big_mortar.dm
index 2dbbb4f5cc86..3024c188facf 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/big_mortar.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/big_mortar.dm
@@ -113,6 +113,7 @@
juice_target_item(target_item, user)
else
grind_target_item(target_item, user)
+ target_item = null
if("Grind")
for(var/obj/item/target_item as anything in contents)
@@ -120,6 +121,7 @@
grind_target_item(target_item, user)
else
juice_target_item(target_item, user)
+ target_item = null
return
if(!attacking_item.juice_results && !attacking_item.grind_results)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 3a7c7245955c..ca8900c1dda3 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -200,7 +200,7 @@
mob_occupant.death(1)
mob_occupant.ghostize()
qdel(src.occupant)
- addtimer(CALLBACK(src, .proc/make_meat, skin, allmeat, meat_produced, gibtype, diseases), gibtime)
+ addtimer(CALLBACK(src, PROC_REF(make_meat), skin, allmeat, meat_produced, gibtype, diseases), gibtime)
/obj/machinery/gibber/proc/make_meat(obj/item/stack/sheet/animalhide/skin, list/obj/item/reagent_containers/food/snacks/meat/slab/allmeat, meat_produced, gibtype, list/datum/disease/diseases)
playsound(src.loc, 'sound/effects/splat.ogg', 50, TRUE)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 5736d187fc78..13a35b579679 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -309,7 +309,7 @@
return
time--
use_power(500)
- addtimer(CALLBACK(src, .proc/loop, type, time, wait), wait)
+ addtimer(CALLBACK(src, PROC_REF(loop), type, time, wait), wait)
/obj/machinery/microwave/proc/loop_finish()
operating = FALSE
@@ -382,7 +382,7 @@
tocook = target
RegisterSignal(tocook, COMSIG_PARENT_QDELETING, PROC_REF(clear_cooking))
target.add_overlay(ration_overlay)
- addtimer(CALLBACK(src, .proc/cook), 100)
+ addtimer(CALLBACK(src, PROC_REF(cook)), 100)
target.visible_message("\The [target] rapidly begins cooking...")
playsound(src, 'sound/items/cig_light.ogg', 50, 1)
moveToNullspace()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
index 0566a655dc3e..005ffa7632ba 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
@@ -82,7 +82,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers)
use_power(500)
stored_matter += cube_production
addtimer(VARSET_CALLBACK(src, pixel_x, base_pixel_x))
- addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, user, "The machine now has [stored_matter] monkey\s worth of material stored."))
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), user, "The machine now has [stored_matter] monkey\s worth of material stored."))
/obj/machinery/monkey_recycler/interact(mob/user)
if(stored_matter >= 1)
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index 2625b25233e5..3d759bce3fd2 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -634,19 +634,37 @@
mix_sound = 'sound/effects/clockcult_gateway_closing.ogg'
/datum/chemical_reaction/ash_wine
- results = list(/datum/reagent/consumable/ethanol/ash_wine = 5)
+ results = list(/datum/reagent/consumable/ethanol/trickwine/ash_wine = 5)
required_reagents = list(/datum/reagent/consumable/ethanol/absinthe = 3, /datum/reagent/ash = 1, /datum/reagent/drug/mushroomhallucinogen = 1)
- required_container = /obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask
+ required_container = /obj/structure/fermenting_barrel/distiller
mix_sound ='sound/weather/ashstorm/inside/weak_end.ogg'
/datum/chemical_reaction/ice_wine
- results = list(/datum/reagent/consumable/ethanol/ice_wine = 5)
+ results = list(/datum/reagent/consumable/ethanol/trickwine/ice_wine = 5)
required_reagents = list(/datum/reagent/consumable/ethanol/sake = 3, /datum/reagent/polar_bear_fur = 1, /datum/reagent/consumable/frostoil = 1)
- required_container = /obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask
+ required_container = /obj/structure/fermenting_barrel/distiller
mix_sound ='sound/effects/glassbr3.ogg'
/datum/chemical_reaction/shock_wine
- results = list(/datum/reagent/consumable/ethanol/shock_wine = 5)
+ results = list(/datum/reagent/consumable/ethanol/trickwine/shock_wine = 5)
required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 3, /datum/reagent/calcium = 1, /datum/reagent/consumable/lemonjuice = 1)
- required_container = /obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask
+ required_container = /obj/structure/fermenting_barrel/distiller
mix_sound ='sound/machines/defib_zap.ogg'
+
+/datum/chemical_reaction/hearth_wine
+ results = list(/datum/reagent/consumable/ethanol/trickwine/hearth_wine = 5)
+ required_reagents = list(/datum/reagent/consumable/ethanol/hcider = 3, /datum/reagent/consumable/pyre_elementum = 1, /datum/reagent/fuel = 1)
+ required_container = /obj/structure/fermenting_barrel/distiller
+ mix_sound ='sound/items/welder.ogg'
+
+/datum/chemical_reaction/force_wine
+ results = list(/datum/reagent/consumable/ethanol/trickwine/force_wine = 5)
+ required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 3, /datum/reagent/calcium = 1, /datum/reagent/consumable/spacemountainwind = 1)
+ required_container = /obj/structure/fermenting_barrel/distiller
+ mix_sound ='sound/magic/forcewall.ogg'
+
+/datum/chemical_reaction/prism_wine
+ results = list(/datum/reagent/consumable/ethanol/trickwine/prism_wine = 5)
+ required_reagents = list(/datum/reagent/consumable/ethanol/gin = 3, /datum/reagent/toxin/plasma = 1, /datum/reagent/consumable/tinlux = 1)
+ required_container = /obj/structure/fermenting_barrel/distiller
+ mix_sound ='sound/weapons/laser.ogg'
diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm
index af1a89a1a38a..e95bdb2063a8 100644
--- a/code/modules/holiday/halloween.dm
+++ b/code/modules/holiday/halloween.dm
@@ -205,7 +205,7 @@
///Adds a timer to call stalk() on Aggro
/mob/living/simple_animal/hostile/clown_insane/Aggro()
. = ..()
- timer = addtimer(CALLBACK(src, .proc/stalk), 30, TIMER_STOPPABLE|TIMER_UNIQUE)
+ timer = addtimer(CALLBACK(src, PROC_REF(stalk)), 30, TIMER_STOPPABLE|TIMER_UNIQUE)
/mob/living/simple_animal/hostile/clown_insane/LoseAggro()
. = ..()
@@ -224,8 +224,8 @@
qdel(src)
return
playsound(M, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 100, TRUE)
- timer = addtimer(CALLBACK(src, .proc/stalk), 30, TIMER_STOPPABLE|TIMER_UNIQUE)
- addtimer(CALLBACK(src, .proc/teleport_to_target), 12, TIMER_STOPPABLE|TIMER_UNIQUE)
+ timer = addtimer(CALLBACK(src, PROC_REF(stalk)), 30, TIMER_STOPPABLE|TIMER_UNIQUE)
+ addtimer(CALLBACK(src, PROC_REF(teleport_to_target)), 12, TIMER_STOPPABLE|TIMER_UNIQUE)
///Does what's in the name. Teleports to target.loc. Called from a timer.
/mob/living/simple_animal/hostile/clown_insane/proc/teleport_to_target()
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index e962dbb520a1..ae19b1dea376 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -528,7 +528,7 @@
return "Have a merry Christmas!"
/datum/holiday/xmas/celebrate()
- SSticker.OnRoundstart(CALLBACK(src, .proc/roundstart_celebrate))
+ SSticker.OnRoundstart(CALLBACK(src, PROC_REF(roundstart_celebrate)))
GLOB.maintenance_loot += list(
/obj/item/toy/xmas_cracker = 3,
/obj/item/clothing/head/santa = 1,
diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm
index ea07e2f70b27..e6a1c90ede6e 100644
--- a/code/modules/holodeck/computer.dm
+++ b/code/modules/holodeck/computer.dm
@@ -183,7 +183,7 @@ and clear when youre done! if you dont i will use :newspaper2: on you
var/turf/possible_blacklist = _turf
if (possible_blacklist.holodeck_compatible)
continue
- input_blacklist += possible_blacklist
+ input_blacklist[possible_blacklist] = TRUE
///loads the template whose id string it was given ("offline_program" loads datum/map_template/holodeck/offline)
/obj/machinery/computer/holodeck/proc/load_program(map_id, force = FALSE, add_delay = TRUE)
@@ -248,7 +248,7 @@ and clear when youre done! if you dont i will use :newspaper2: on you
continue
atoms.flags_1 |= HOLOGRAM_1
- RegisterSignal(atoms, COMSIG_PARENT_PREQDELETED, .proc/remove_from_holo_lists)
+ RegisterSignal(atoms, COMSIG_PARENT_PREQDELETED, PROC_REF(remove_from_holo_lists))
if (isholoeffect(atoms))//activates holo effects and transfers them from the spawned list into the effects list
var/obj/effect/holodeck_effect/holo_effect = atoms
@@ -333,7 +333,7 @@ and clear when youre done! if you dont i will use :newspaper2: on you
if(toggleOn)
if(last_program && (last_program != offline_program))
- addtimer(CALLBACK(src,.proc/load_program, last_program, TRUE), 25)
+ addtimer(CALLBACK(src, PROC_REF(load_program), last_program, TRUE), 25)
active = TRUE
else
last_program = program
@@ -342,7 +342,7 @@ and clear when youre done! if you dont i will use :newspaper2: on you
/obj/machinery/computer/holodeck/power_change()
. = ..()
- INVOKE_ASYNC(src, .proc/toggle_power, !machine_stat)
+ INVOKE_ASYNC(src, PROC_REF(toggle_power), !machine_stat)
///shuts down the holodeck and force loads the offline_program
/obj/machinery/computer/holodeck/proc/emergency_shutdown()
diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm
index 9c69b8e89812..122c852fbc9a 100644
--- a/code/modules/holodeck/holo_effect.dm
+++ b/code/modules/holodeck/holo_effect.dm
@@ -34,7 +34,7 @@
deck = new(loc)
safety(!(HC.obj_flags & EMAGGED))
deck.holo = HC
- RegisterSignal(deck, COMSIG_PARENT_QDELETING, .proc/handle_card_delete)
+ RegisterSignal(deck, COMSIG_PARENT_QDELETING, PROC_REF(handle_card_delete))
return deck
/obj/effect/holodeck_effect/cards/proc/handle_card_delete(datum/source)
@@ -84,7 +84,7 @@
// these vars are not really standardized but all would theoretically create stuff on death
for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & our_mob.vars)
our_mob.vars[v] = null
- RegisterSignal(our_mob, COMSIG_PARENT_QDELETING, .proc/handle_mob_delete)
+ RegisterSignal(our_mob, COMSIG_PARENT_QDELETING, PROC_REF(handle_mob_delete))
return our_mob
/obj/effect/holodeck_effect/mobspawner/deactivate(obj/machinery/computer/holodeck/HC)
diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm
index 26ea485474aa..b69c05e34653 100644
--- a/code/modules/holodeck/turfs.dm
+++ b/code/modules/holodeck/turfs.dm
@@ -147,7 +147,7 @@
/turf/open/floor/holofloor/carpet/Initialize(mapload, inherited_virtual_z)
. = ..()
- addtimer(CALLBACK(src, /atom/.proc/update_icon), 1)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 1)
/turf/open/floor/holofloor/carpet/update_icon()
. = ..()
diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm
index 4c9eb274dcb0..30e94845e593 100644
--- a/code/modules/hydroponics/fermenting_barrel.dm
+++ b/code/modules/hydroponics/fermenting_barrel.dm
@@ -48,7 +48,7 @@
to_chat(user, "[I] is stuck to your hand!")
return TRUE
to_chat(user, "You place [I] into [src] to start the fermentation process.")
- addtimer(CALLBACK(src, .proc/makeWine, fruit), rand(80, 120) * speed_multiplier)
+ addtimer(CALLBACK(src, PROC_REF(makeWine), fruit), rand(80, 120) * speed_multiplier)
return TRUE
if(I)
if(I.is_refillable())
@@ -75,9 +75,14 @@
icon_state = "barrel"
return ..()
-/datum/crafting_recipe/fermenting_barrel
- name = "Wooden Barrel"
- result = /obj/structure/fermenting_barrel
- reqs = list(/obj/item/stack/sheet/mineral/wood = 8)
- time = 50
- category = CAT_PRIMAL
+/obj/structure/fermenting_barrel/distiller
+ name = "Distiller"
+ icon_state = "distiller"
+ desc = "A repurposed barrel and keg host to a special culture of bacteria native to Illestren"
+
+/obj/structure/fermenting_barrel/distiller/update_icon_state()
+ if(open)
+ icon_state = "distiller_open"
+ else
+ icon_state = "distiller"
+ return ..()
diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm
index 75e9b3fbfcdc..ec05b821371a 100644
--- a/code/modules/hydroponics/grown/citrus.dm
+++ b/code/modules/hydroponics/grown/citrus.dm
@@ -126,7 +126,7 @@
log_bomber(user, "primed a", src, "for detonation")
icon_state = "firelemon_active"
playsound(loc, 'sound/weapons/armbomb.ogg', 75, TRUE, -3)
- addtimer(CALLBACK(src, .proc/prime), rand(10, 60))
+ addtimer(CALLBACK(src, PROC_REF(prime)), rand(10, 60))
/obj/item/reagent_containers/food/snacks/grown/firelemon/burn()
prime()
diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm
index 627a13354078..1378fb0253fc 100644
--- a/code/modules/hydroponics/grown/melon.dm
+++ b/code/modules/hydroponics/grown/melon.dm
@@ -58,7 +58,7 @@
var/uses = 1
if(seed)
uses = round(seed.potency / 20)
- AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, ITEM_SLOT_HANDS, uses, TRUE, CALLBACK(src, .proc/block_magic), CALLBACK(src, .proc/expire)) //deliver us from evil o melon god
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, ITEM_SLOT_HANDS, uses, TRUE, CALLBACK(src, PROC_REF(block_magic)), CALLBACK(src, PROC_REF(expire))) //deliver us from evil o melon god
/obj/item/reagent_containers/food/snacks/grown/holymelon/proc/block_magic(mob/user, major)
if(major)
diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm
index 0ec5046e659c..6c44d2ad3788 100644
--- a/code/modules/hydroponics/grown/tomato.dm
+++ b/code/modules/hydroponics/grown/tomato.dm
@@ -137,7 +137,7 @@
return
to_chat(user, "You begin to awaken the Killer Tomato...")
awakening = TRUE
- addtimer(CALLBACK(src, .proc/awaken), 3 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(awaken)), 3 SECONDS)
log_game("[key_name(user)] awakened a killer tomato at [AREACOORD(user)].")
/obj/item/reagent_containers/food/snacks/grown/tomato/killer/proc/awaken()
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index b786c854dba6..e9be7685e152 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -171,7 +171,7 @@
/obj/structure/bonfire/Initialize()
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index b38eeac048cb..74d004849a2a 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -85,7 +85,7 @@
/obj/item/cultivator/rake/Initialize()
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index fee6a3857d67..7063207255f5 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -35,7 +35,7 @@
// Here lies irrigation. You won't be missed, because you were never used.
/obj/machinery/hydroponics/Initialize()
- RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exited)
+ RegisterSignal(src, COMSIG_ATOM_EXITED, PROC_REF(on_exited))
//Here lies "nutrilevel", killed by ArcaneMusic 20??-2019. Finally, we strive for a better future. Please use "reagents" instead
create_reagents(20)
reagents.add_reagent(/datum/reagent/plantnutriment/eznutriment, 10) //Half filled nutrient trays for dirt trays to have more to grow with in prison/lavaland.
@@ -48,7 +48,7 @@
/obj/machinery/hydroponics/constructable/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated))
+ AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, PROC_REF(can_be_rotated)))
AddComponent(/datum/component/plumbing/simple_demand)
/obj/machinery/hydroponics/constructable/proc/can_be_rotated(mob/user, rotation_type)
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index bc18ce87377b..a57934dc551d 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -241,7 +241,7 @@
if(!istype(G, /obj/item/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent(/datum/reagent/lube)))
stun_len /= 3
- G.AddComponent(/datum/component/slippery, min(stun_len,140), NONE, CALLBACK(src, .proc/handle_slip, G))
+ G.AddComponent(/datum/component/slippery, min(stun_len,140), NONE, CALLBACK(src, PROC_REF(handle_slip), G))
/datum/plant_gene/trait/slip/proc/handle_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/M)
for(var/datum/plant_gene/trait/T in G.seed.genes)
diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm
index 146d8e32d7e2..149f78437fa4 100644
--- a/code/modules/instruments/items.dm
+++ b/code/modules/instruments/items.dm
@@ -85,8 +85,8 @@
/obj/item/instrument/piano_synth/headphones/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
- RegisterSignal(src, COMSIG_SONG_START, .proc/start_playing)
- RegisterSignal(src, COMSIG_SONG_END, .proc/stop_playing)
+ RegisterSignal(src, COMSIG_SONG_START, PROC_REF(start_playing))
+ RegisterSignal(src, COMSIG_SONG_END, PROC_REF(stop_playing))
/**
* Called by a component signal when our song starts playing.
@@ -249,7 +249,7 @@
/obj/item/instrument/harmonica/equipped(mob/M, slot)
. = ..()
- RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
+ RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech))
/obj/item/instrument/harmonica/dropped(mob/M)
. = ..()
diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm
index f672c0ecac61..ba411709edfc 100644
--- a/code/modules/instruments/songs/editor.dm
+++ b/code/modules/instruments/songs/editor.dm
@@ -160,7 +160,7 @@
tempo = sanitize_tempo(tempo + text2num(href_list["tempo"]))
else if(href_list["play"])
- INVOKE_ASYNC(src, .proc/start_playing, usr)
+ INVOKE_ASYNC(src, PROC_REF(start_playing), usr)
else if(href_list["newline"])
var/newline = html_encode(input("Enter your line: ", parent.name) as text|null)
diff --git a/code/modules/interview/interview.dm b/code/modules/interview/interview.dm
index 452ce2a9b5f5..c1ed4dcd87ec 100644
--- a/code/modules/interview/interview.dm
+++ b/code/modules/interview/interview.dm
@@ -65,7 +65,7 @@
SEND_SOUND(owner, sound('sound/effects/adminhelp.ogg'))
to_chat(owner, "-- Interview Update --" \
+ "\nYour interview was approved, you will now be reconnected in 5 seconds.", confidential = TRUE)
- addtimer(CALLBACK(src, .proc/reconnect_owner), 50)
+ addtimer(CALLBACK(src, PROC_REF(reconnect_owner)), 50)
/**
* Denies the interview and adds the owner to the cooldown for new interviews.
@@ -80,7 +80,7 @@
GLOB.interviews.cooldown_ckeys |= owner_ckey
log_admin_private("[key_name(denied_by)] has denied interview #[id] for [owner_ckey][!owner ? "(DC)": ""].")
message_admins("[key_name(denied_by)] has denied interview #[id] for [owner_ckey][!owner ? "(DC)": ""].")
- addtimer(CALLBACK(GLOB.interviews, /datum/interview_manager.proc/release_from_cooldown, owner_ckey), 180)
+ addtimer(CALLBACK(GLOB.interviews, TYPE_PROC_REF(/datum/interview_manager, release_from_cooldown), owner_ckey), 180)
if (owner)
SEND_SOUND(owner, sound('sound/effects/adminhelp.ogg'))
to_chat(owner, "-- Interview Update --" \
diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm
index 5f04f8c31000..159c1e1df6aa 100644
--- a/code/modules/jobs/job_exp.dm
+++ b/code/modules/jobs/job_exp.dm
@@ -191,7 +191,7 @@ GLOBAL_PROTECT(exp_to_update)
"ckey" = ckey,
"minutes" = jvalue)))
prefs.exp[jtype] += jvalue
- addtimer(CALLBACK(SSblackbox,/datum/controller/subsystem/blackbox/proc/update_exp_db),20,TIMER_OVERRIDE|TIMER_UNIQUE)
+ addtimer(CALLBACK(SSblackbox, TYPE_PROC_REF(/datum/controller/subsystem/blackbox, update_exp_db)),20,TIMER_OVERRIDE|TIMER_UNIQUE)
//ALWAYS call this at beginning to any proc touching player flags, or your database admin will probably be mad
diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm
index b6e6c9e2b731..b098e79dadac 100644
--- a/code/modules/jobs/job_types/assistant.dm
+++ b/code/modules/jobs/job_types/assistant.dm
@@ -78,7 +78,6 @@ Assistant
/datum/outfit/job/assistant/inteq
name = "IRMG Recruit (Inteq)"
-
uniform = /obj/item/clothing/under/syndicate/inteq
/datum/outfit/job/assistant/intern
@@ -121,60 +120,6 @@ Assistant
shoes = /obj/item/clothing/shoes/laceup
suit = /obj/item/clothing/suit/toggle/lawyer/black
-/datum/outfit/job/assistant/syndicate
- name = "Junior Agent (Assistant)"
-
- id = /obj/item/card/id/syndicate_command/crew_id
- uniform = /obj/item/clothing/under/syndicate
- alt_uniform = null
- shoes = /obj/item/clothing/shoes/jackboots
-
-/datum/outfit/job/assistant/syndicate/gorlex
- name = "Junior Agent (Gorlex Marauders)"
-
- uniform = /obj/item/clothing/under/syndicate/gorlex
- alt_uniform = /obj/item/clothing/under/syndicate
-
-/datum/outfit/job/assistant/syndicate/gec
- name = "Deckhand (GEC)"
-
- id = /obj/item/card/id/syndicate_command/crew_id
- uniform = /obj/item/clothing/under/syndicate
- suit = /obj/item/clothing/suit/toggle/hazard
- alt_uniform = null
- shoes = /obj/item/clothing/shoes/jackboots
- head = /obj/item/clothing/head/safety_helmet
-
-/datum/outfit/job/assistant/syndicate/sbc
- name = "Deck Assistant (Twinkleshine)"
-
- uniform = /obj/item/clothing/under/syndicate
- alt_uniform = /obj/item/clothing/under/syndicate/intern
- shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
- ears = /obj/item/radio/headset/syndicate/alt
- mask = /obj/item/clothing/mask/gas/syndicate/voicechanger
- r_pocket = /obj/item/kitchen/knife/combat/survival
- back = /obj/item/storage/backpack
- implants = list(/obj/item/implant/weapons_auth)
- id = /obj/item/card/id/syndicate_command/crew_id
-
- backpack = /obj/item/storage/backpack/security
- satchel = /obj/item/storage/backpack/satchel/sec
- duffelbag = /obj/item/storage/backpack/duffelbag/syndie
- courierbag = /obj/item/storage/backpack/messenger/sec
-
- box = /obj/item/storage/box/survival/syndie
-
-/datum/outfit/job/assistant/syndicate/sbc/post_equip(mob/living/carbon/human/H)
- H.faction |= list("PlayerSyndicate")
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(1, 4)) // squidquest real
- I.assignment = "Deck Assistant"
- I.access |= list(ACCESS_SYNDICATE)
- I.update_label()
-
/datum/outfit/job/assistant/independent/crewmatefancy
name = "Crewmate (Independent)"
@@ -208,10 +153,6 @@ Assistant
gloves = /obj/item/clothing/gloves/color/white
accessory = /obj/item/clothing/neck/scarf/darkblue
-/datum/outfit/job/assistant/waiter/syndicate
- name = "Assistant (Syndicate Waiter)"
- uniform = /obj/item/clothing/under/suit/waiter/syndicate
-
/datum/outfit/job/assistant/roumain
name = "Shadow (Saint-Roumain Militia)"
@@ -222,13 +163,8 @@ Assistant
head = /obj/item/clothing/head/cowboy/sec/roumain/shadow
-/datum/outfit/job/assistant/syndicate/cyberagent
- name = "Junior Agent (Cybersun)"
-
- uniform = /obj/item/clothing/under/syndicate
- shoes = /obj/item/clothing/shoes/jackboots
- r_pocket = /obj/item/radio
- head = /obj/item/clothing/head/soft/black
+/datum/outfit/job/assistant/roumain/post_equip(mob/living/carbon/human/H)
+ H.faction |= list("roumain")
/datum/outfit/job/assistant/pharma
name = "Pharmacology Student"
diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm
index eb2df5a68039..f00d87eb6ba4 100644
--- a/code/modules/jobs/job_types/atmospheric_technician.dm
+++ b/code/modules/jobs/job_types/atmospheric_technician.dm
@@ -40,14 +40,6 @@
suit_store = /obj/item/tank/internals/oxygen
internals_slot = ITEM_SLOT_SUITSTORE
-/datum/outfit/job/atmos/gec
- name = "Atmospheric Technician (GEC)"
-
- uniform = /obj/item/clothing/under/syndicate/gec/atmos_tech
- suit = /obj/item/clothing/suit/toggle/hazard
- head = /obj/item/clothing/head/hardhat
- id = /obj/item/card/id/syndicate_command/crew_id
-
/datum/outfit/job/atmos/frontiersmen
name = "Atmospheric Technician (Frontiersmen)"
diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm
index 680fe6ee880d..f704f1c62139 100644
--- a/code/modules/jobs/job_types/bartender.dm
+++ b/code/modules/jobs/job_types/bartender.dm
@@ -1,6 +1,7 @@
/datum/job/bartender
name = "Bartender"
- wiki_page = "Drinks" //WS Edit - Wikilinks/Warning
+ wiki_page = "Drinks"
+
outfit = /datum/outfit/job/bartender
@@ -17,16 +18,12 @@
belt = /obj/item/pda/bar
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/civilian/bartender
- alt_uniform = /obj/item/clothing/under/rank/civilian/bartender/purple //WS Edit - Alt Uniforms
+ alt_uniform = /obj/item/clothing/under/rank/civilian/bartender/purple
alt_suit = /obj/item/clothing/suit/apron/purple_bartender
suit = /obj/item/clothing/suit/armor/vest
backpack_contents = list(/obj/item/storage/box/beanbag=1)
shoes = /obj/item/clothing/shoes/laceup
-/datum/outfit/job/bartender/syndicate
- id = /obj/item/card/id/syndicate_command/crew_id
- head = /obj/item/clothing/head/HoS/beret/syndicate
-
/datum/outfit/job/bartender/post_equip(mob/living/carbon/human/H, visualsOnly)
. = ..()
@@ -35,34 +32,6 @@
W.registered_age = AGE_MINOR
to_chat(H, "You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")
-/datum/outfit/job/bartender/syndicate/sbc
- name = "Bartender (Twinkleshine)"
-
- uniform = /obj/item/clothing/under/syndicate/donk
- shoes = /obj/item/clothing/shoes/laceup
- gloves = /obj/item/clothing/gloves/color/white
- ears = /obj/item/radio/headset/syndicate
- mask = /obj/item/clothing/mask/gas/syndicate/voicechanger
- belt = /obj/item/storage/belt/bandolier
- implants = list(/obj/item/implant/weapons_auth)
- id = /obj/item/card/id/syndicate_command/crew_id
-
- backpack = /obj/item/storage/backpack/security
- satchel = /obj/item/storage/backpack/satchel/sec
- duffelbag = /obj/item/storage/backpack/duffelbag/syndie
- courierbag = /obj/item/storage/backpack/messenger/sec
-
- box = /obj/item/storage/box/survival/syndie
-
-/datum/outfit/job/bartender/syndicate/sbc/post_equip(mob/living/carbon/human/H)
- H.faction |= list("PlayerSyndicate")
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(2, 5)) // squidquest real
- I.assignment = "Bartender"
- I.access |= list(ACCESS_SYNDICATE)
- I.update_label()
-
/datum/outfit/job/bartender/pharma
name = "Mixologist"
diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm
index 27906b1d8bac..17820864e57f 100644
--- a/code/modules/jobs/job_types/botanist.dm
+++ b/code/modules/jobs/job_types/botanist.dm
@@ -27,17 +27,6 @@
satchel = /obj/item/storage/backpack/satchel/hyd
courierbag = /obj/item/storage/backpack/messenger/hyd
-//shiptest!!!!!!!!!!
-/datum/outfit/job/botanist/syndicate/nsv
- name = "Botanist-Chemist (NSV-M)"
-
- uniform = /obj/item/clothing/under/syndicate
- id = /obj/item/card/id/syndicate_command/crew_id
- shoes = /obj/item/clothing/shoes/jackboots
- glasses = /obj/item/clothing/glasses/science
- suit = /obj/item/clothing/suit/toggle/labcoat/chemist
- suit_store = null
-
/datum/outfit/job/botanist/pharma
name = "Herbalist"
diff --git a/code/modules/jobs/job_types/brig_physician.dm b/code/modules/jobs/job_types/brig_physician.dm
index 6b670693186e..d27f2df6b859 100644
--- a/code/modules/jobs/job_types/brig_physician.dm
+++ b/code/modules/jobs/job_types/brig_physician.dm
@@ -45,39 +45,3 @@
suit = /obj/item/clothing/suit/toggle/labcoat/brig_phys
l_pocket = /obj/item/reagent_containers/syringe
alt_suit = null
-
-/datum/outfit/job/brig_phys/syndicate/sbc
- name = "Medic (Twinkleshine)"
-
- uniform = /obj/item/clothing/under/rank/medical/doctor/red
- gloves = /obj/item/clothing/gloves/color/latex/nitrile/evil
- alt_uniform = /obj/item/clothing/under/syndicate/cybersun
- glasses = /obj/item/clothing/glasses/hud/health
- belt = /obj/item/storage/belt/medical
- back = /obj/item/storage/backpack/duffelbag/syndie/med
- shoes = /obj/item/clothing/shoes/combat
- suit = /obj/item/clothing/suit/longcoat/roboblack
- alt_suit = /obj/item/clothing/suit/toggle/labcoat
- suit_store = null
- head = null
- ears = /obj/item/radio/headset/syndicate
- mask = /obj/item/clothing/mask/gas/syndicate/voicechanger
- id = /obj/item/card/id/syndicate_command/crew_id/med
- implants = list(/obj/item/implant/weapons_auth)
- backpack_contents = list(/obj/item/pda/brig_phys)
-
- backpack = /obj/item/storage/backpack/security
- satchel = /obj/item/storage/backpack/satchel/sec
- duffelbag = /obj/item/storage/backpack/duffelbag/syndie/med
- courierbag = /obj/item/storage/backpack/messenger/sec
-
- box = /obj/item/storage/box/survival/syndie
-
-/datum/outfit/job/brig_phys/syndicate/sbc/post_equip(mob/living/carbon/human/H)
- H.faction |= list("PlayerSyndicate")
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(6, 8)) // squidquest real
- I.assignment = "Medic"
- I.access |= list(ACCESS_SYNDICATE)
- I.update_label()
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index 554ea742e9e3..78e7eb8dde74 100644
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -54,6 +54,7 @@
ears = /obj/item/radio/headset/nanotrasen/captain
uniform = /obj/item/clothing/under/rank/command/captain/nt
+ gloves = /obj/item/clothing/gloves/color/captain/nt
shoes = /obj/item/clothing/shoes/laceup
head = /obj/item/clothing/head/caphat/nt
@@ -61,25 +62,15 @@
name = "Captain (Nanotrasen)"
uniform = /obj/item/clothing/under/rank/centcom/officer
+ gloves = /obj/item/clothing/gloves/combat
head = /obj/item/clothing/head/centhat
suit = /obj/item/clothing/suit/armor/vest/bulletproof
-/datum/outfit/job/captain/solgov
- name = "Captain (SolGov)"
-
- ears = /obj/item/radio/headset/solgov/captain
- shoes = /obj/item/clothing/shoes/laceup
- suit = /obj/item/clothing/suit/toggle/solgov
-
-/datum/outfit/job/captain/solgov/rebel
- name = "Captain (Deserter)"
- suit = /obj/item/clothing/suit/toggle/solgov/terragov
-
/datum/outfit/job/captain/pirate
name = "Captain (Pirate)"
ears = /obj/item/radio/headset/pirate/captain
- uniform = /obj/item/clothing/under/costume/russian_officer
+ uniform = /obj/item/clothing/under/costume/pirate
shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/pirate/captain
suit = /obj/item/clothing/suit/pirate/captain
@@ -99,71 +90,6 @@
glasses = /obj/item/clothing/glasses/sunglasses
alt_suit = null
-/datum/outfit/job/captain/syndicate
- name = "Captain (ACLF)"
- id = /obj/item/card/id/syndicate_command/captain_id
- ears = /obj/item/radio/headset/syndicate/alt/captain
- uniform = /obj/item/clothing/under/syndicate/aclf
- shoes = /obj/item/clothing/shoes/jackboots
- head = /obj/item/clothing/head/HoS/syndicate
- gloves = /obj/item/clothing/gloves/combat
- suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate
-
- backpack = /obj/item/storage/backpack/security
- satchel = /obj/item/storage/backpack/satchel/sec
- duffelbag = /obj/item/storage/backpack/duffelbag/sec
- courierbag = /obj/item/storage/backpack/messenger/sec
-
-/datum/outfit/job/captain/syndicate/sbc
- name = "Captain (Twinkleshine)"
-
- uniform = /obj/item/clothing/under/syndicate/aclf
- gloves = /obj/item/clothing/gloves/combat
- shoes = /obj/item/clothing/shoes/combat
- ears = /obj/item/radio/headset/syndicate/alt/captain
- mask = /obj/item/clothing/mask/gas/syndicate/voicechanger
- l_pocket = /obj/item/melee/transforming/energy/sword/saber/red
- suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate
- suit_store = /obj/item/gun/ballistic/revolver/mateba
- r_pocket = /obj/item/kitchen/knife/combat/survival
- belt = /obj/item/storage/belt/military/assault
- glasses = /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch
- id = /obj/item/card/id/syndicate_command/captain_id
- implants = list(/obj/item/implant/weapons_auth)
- backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/pda/captain)
-
- backpack = /obj/item/storage/backpack/security
- satchel = /obj/item/storage/backpack/satchel/sec
- duffelbag = /obj/item/storage/backpack/duffelbag/syndie
- courierbag = /obj/item/storage/backpack/messenger/sec
-
- box = /obj/item/storage/box/survival/syndie
-
-/datum/outfit/job/captain/syndicate/sbc/post_equip(mob/living/carbon/human/H)
- H.faction |= list("PlayerSyndicate")
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(9, 12)) // squidquest real
- I.access = get_all_accesses()+get_all_syndicate_access()
- I.update_label()
-
-/datum/outfit/job/captain/syndicate/gorlex
- name = "Captain (Gorlex Marauders)"
-
- uniform = /obj/item/clothing/under/syndicate/aclf
- shoes = /obj/item/clothing/shoes/jackboots
- head = /obj/item/clothing/head/aclfcap
- suit = /obj/item/clothing/suit/aclf
-
-/datum/outfit/job/captain/syndicate/cybersun
- name = "Cybersun Commander"
-
- uniform = /obj/item/clothing/under/suit/black_really
- shoes = /obj/item/clothing/shoes/jackboots
- head = /obj/item/clothing/head/HoS/syndicate
- gloves = /obj/item/clothing/gloves/combat
- suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate
-
/datum/outfit/job/captain/minutemen
name = "Captain (Colonial Minutemen)"
diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm
index c5d2b14aa0eb..22f85ed9f57a 100644
--- a/code/modules/jobs/job_types/cargo_technician.dm
+++ b/code/modules/jobs/job_types/cargo_technician.dm
@@ -35,11 +35,6 @@
gloves = /obj/item/clothing/gloves/fingerless
glasses = /obj/item/clothing/glasses/sunglasses/big
-/datum/outfit/job/cargo_tech/donk
- name = "Customer Associate (Donk! Co.)"
- id = /obj/item/card/id/syndicate_command/crew_id
- uniform = /obj/item/clothing/under/syndicate/donk
- suit = /obj/item/clothing/suit/hazardvest/donk
/datum/outfit/job/cargo_tech/frontiersmen
name = "Cargo Tech (frontiersmen)"
diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm
index 97a2a2403717..9dd36c1e201a 100644
--- a/code/modules/jobs/job_types/chaplain.dm
+++ b/code/modules/jobs/job_types/chaplain.dm
@@ -115,7 +115,6 @@
belt = /obj/item/pda/chaplain
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/civilian/chaplain
- alt_uniform = /obj/item/clothing/under/pants/youngfolksjeans //WS Edit - Alt Uniforms
backpack_contents = list(
/obj/item/stamp/chap = 1,
/obj/item/camera/spooky = 1
diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm
index 9e26a0787865..d98181af7324 100644
--- a/code/modules/jobs/job_types/chemist.dm
+++ b/code/modules/jobs/job_types/chemist.dm
@@ -76,15 +76,6 @@
backpack_contents = list(/obj/item/clothing/glasses/science=1)
//Shiptest
-/datum/outfit/job/chemist/gec
- name = "Chemist (GEC)"
-
- uniform = /obj/item/clothing/under/syndicate/intern
- suit = /obj/item/clothing/suit/toggle/hazard
- head = /obj/item/clothing/head/hardhat
- belt = /obj/item/storage/belt/utility/full/engi
- id = /obj/item/card/id/syndicate_command/crew_id
- l_pocket =/obj/item/pda/chemist
/datum/outfit/job/chemist/pharma
name = "Pharmacist"
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index 76d49f4b0f4d..5b862731db49 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -72,35 +72,6 @@
neck = /obj/item/clothing/neck/tie/green
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced=1, /obj/item/clothing/gloves/color/black=1)
-/datum/outfit/job/ce/gec
- name = "Chief Engineer (GEC)"
-
- uniform = /obj/item/clothing/under/syndicate/gec/chief_engineer
- suit = /obj/item/clothing/suit/toggle/hazard
- head = /obj/item/clothing/head/hardhat/white
- shoes =/obj/item/clothing/shoes/laceup
- ears = /obj/item/radio/headset/syndicate/alt/captain
- id = /obj/item/card/id/syndicate_command/captain_id
- gloves = /obj/item/clothing/gloves/combat
-
-/datum/outfit/job/ce/syndicate
- name = "Chief Engineer (Syndicate Generic)"
-
- id = /obj/item/card/id/syndicate_command/crew_id
- ears = /obj/item/radio/headset/syndicate/alt
- glasses = /obj/item/clothing/glasses/sunglasses
-
-/datum/outfit/job/ce/syndicate/gorlex
- name = "Foreman (Gorlex Marauders)"
-
- ears = /obj/item/radio/headset/syndicate/alt
- uniform = /obj/item/clothing/under/syndicate/gorlex
- alt_uniform = null
- suit = /obj/item/clothing/suit/toggle/hazard
- alt_suit = null
- shoes = /obj/item/clothing/shoes/jackboots
- gloves = /obj/item/clothing/gloves/combat
-
/datum/outfit/job/ce/inteq
name = "IRMG Artificer Class II (Inteq)"
diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm
index 92e270ee22e7..f614aab080a0 100644
--- a/code/modules/jobs/job_types/chief_medical_officer.dm
+++ b/code/modules/jobs/job_types/chief_medical_officer.dm
@@ -75,14 +75,6 @@
suit_store = null
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/storage/firstaid/medical=1, /obj/item/flashlight/pen=1)
-//Shiptest!
-/datum/outfit/job/cmo/syndicate/nsv
- name = "Medical Director (NSV-M)"
-
- uniform = /obj/item/clothing/under/syndicate
- ears = /obj/item/radio/headset/syndicate/alt/captain
- id = /obj/item/card/id/syndicate_command/captain_id
- shoes = /obj/item/clothing/shoes/jackboots
/datum/outfit/job/cmo/pharma
name = "Chief Pharmacist"
diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm
index 2a9016c9285d..e38e758cf71e 100644
--- a/code/modules/jobs/job_types/head_of_personnel.dm
+++ b/code/modules/jobs/job_types/head_of_personnel.dm
@@ -65,7 +65,7 @@
/datum/outfit/job/head_of_personnel/pirate
name = "First Mate (Pirate)"
ears = /obj/item/radio/headset/pirate
- uniform = /obj/item/clothing/under/costume/russian_officer
+ uniform = /obj/item/clothing/under/costume/pirate
shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/pirate
suit = /obj/item/clothing/suit/pirate
@@ -95,30 +95,6 @@
backpack_contents = list(/obj/item/storage/box/ids=1,\
/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
-/datum/outfit/job/head_of_personnel/syndicate
- name = "Bridge Officer (Syndicate)"
-
- ears = /obj/item/radio/headset/syndicate/alt
- uniform = /obj/item/clothing/under/syndicate/aclfgrunt
- shoes = /obj/item/clothing/shoes/jackboots
- head = /obj/item/clothing/head/HoS/beret/syndicate
- gloves = /obj/item/clothing/gloves/color/white
- id = /obj/item/card/id/syndicate_command/crew_id
- r_pocket = /obj/item/kitchen/knife/combat/survival
- glasses = /obj/item/clothing/glasses/hud/health
-
-/datum/outfit/job/head_of_personnel/syndicate/intel
- name = "Intelligence Officer (Syndicate)"
-
- ears = /obj/item/radio/headset/syndicate/alt
- uniform = /obj/item/clothing/under/suit/charcoal
- shoes = /obj/item/clothing/shoes/jackboots
- head = /obj/item/clothing/head/HoS/syndicate
- gloves = /obj/item/clothing/gloves/combat
- id = /obj/item/card/id/syndicate_command/crew_id
- r_pocket = /obj/item/kitchen/knife/combat/survival
- glasses = /obj/item/clothing/glasses/sunglasses
-
/datum/outfit/job/head_of_personnel/beluga
uniform = /obj/item/clothing/under/rank/command/head_of_personnel
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index f38c9fd3a901..a122b4249b98 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -61,16 +61,6 @@
suit_store = /obj/item/tank/internals/oxygen
backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/gun/energy/e_gun=1, /obj/item/ammo_box/magazine/co9mm=1) //WS edit - free lethals
-/datum/outfit/job/hos/syndicate
- name = "Sergeant (Syndicate)"
-
- ears = /obj/item/radio/headset/syndicate/alt
- uniform = /obj/item/clothing/under/syndicate/combat
- head = /obj/item/clothing/head/warden
- suit = /obj/item/clothing/suit/armor/vest/syndie
- id = /obj/item/card/id/syndicate_command/crew_id
- backpack_contents = list(/obj/item/melee/classic_baton=1,/obj/item/storage/box/survival/syndie=1)
-
/datum/outfit/job/hos/nanotrasen
name = "Head of Security (Nanotrasen)"
@@ -122,6 +112,9 @@
/obj/item/melee/classic_baton/telescopic=1
)
+/datum/outfit/job/hos/roumain/post_equip(mob/living/carbon/human/H)
+ H.faction |= list("roumain")
+
/datum/job/hos/roumain
outfit = /datum/outfit/job/hos/roumain
mind_traits = null
diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm
index 49a23855c3c8..f46b1f243582 100644
--- a/code/modules/jobs/job_types/medical_doctor.dm
+++ b/code/modules/jobs/job_types/medical_doctor.dm
@@ -106,27 +106,6 @@
uniform = /obj/item/clothing/under/costume/sailor
shoes = /obj/item/clothing/shoes/jackboots
-/datum/outfit/job/doctor/cybersun
- name = "Operations Assistant (Medical Doctor)"
-
- uniform = /obj/item/clothing/under/syndicate/cybersun
- accessory = /obj/item/clothing/accessory/armband/medblue
- shoes = /obj/item/clothing/shoes/jackboots
-/datum/outfit/job/doctor/syndicate/nsv
- name = "Medical Doctor (NSV-M)"
-
- uniform = /obj/item/clothing/under/syndicate
- id = /obj/item/card/id/syndicate_command/crew_id
- shoes = /obj/item/clothing/shoes/jackboots
-
-/datum/outfit/job/doctor/syndicate_komodo
- name = "Ship Medical Doctor"
- uniform = /obj/item/clothing/under/syndicate/gorlex
- glasses = /obj/item/clothing/glasses/hud/health/prescription
- r_pocket = /obj/item/kitchen/knife/combat/survival
- back = /obj/item/storage/backpack/duffelbag/syndie/med
- id = /obj/item/card/id/syndicate_command/crew_id
- backpack_contents = list(/obj/item/storage/box/survival/syndie=1, /obj/item/storage/firstaid/medical,)
/datum/outfit/job/doctor/roumain
name = "Hunter Doctor (Saint-Roumain Militia)"
@@ -145,6 +124,9 @@
courierbag = /obj/item/storage/backpack/messenger
backpack_contents = list(/obj/item/storage/firstaid/roumain=1)
+/datum/outfit/job/doctor/roumain/post_equip(mob/living/carbon/human/H)
+ H.faction |= list("roumain")
+
/datum/outfit/job/doctor/frontiersmen
name = "Surgeon (frontiersmen)"
diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm
index a51249c10f7d..5ac130370a6c 100644
--- a/code/modules/jobs/job_types/paramedic.dm
+++ b/code/modules/jobs/job_types/paramedic.dm
@@ -53,22 +53,6 @@
backpack = /obj/item/storage/backpack/ert/medical
belt = /obj/item/storage/belt/medical/webbing/paramedic
-/datum/outfit/job/paramedic/syndicate/gorlex
- name = "Paramedic (Gorlex)"
-
- id = /obj/item/card/id/syndicate_command/crew_id
- uniform = /obj/item/clothing/under/syndicate/gorlex
- alt_uniform = null
- shoes = /obj/item/clothing/shoes/jackboots
-
-/datum/outfit/job/paramedic/syndicate
- name = "Field Medic (Cybersun Industries)"
-
- uniform = /obj/item/clothing/under/syndicate/medic
- head = /obj/item/clothing/head/soft/cybersun
- shoes = /obj/item/clothing/shoes/combat
- suit = /obj/item/clothing/suit/toggle/labcoat/raincoat
-
/datum/outfit/job/paramedic/inteq
name = "IRMG Corpsman (Inteq)"
diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm
index 16195bfc1a85..aca27ae4acbf 100644
--- a/code/modules/jobs/job_types/prisoner.dm
+++ b/code/modules/jobs/job_types/prisoner.dm
@@ -29,9 +29,3 @@
name = "Shotcaller"
l_pocket = /obj/item/kitchen/knife/shiv
-/datum/outfit/job/prisoner/syndicatepatient
- name = "Long Term Patient"
- id = /obj/item/card/id/patient
- uniform = /obj/item/clothing/under/rank/medical/gown
- alt_suit = null
- shoes = /obj/item/clothing/shoes/sandal/slippers
diff --git a/code/modules/jobs/job_types/psychologist.dm b/code/modules/jobs/job_types/psychologist.dm
index de4a0eb10a24..1bc260c61c5f 100644
--- a/code/modules/jobs/job_types/psychologist.dm
+++ b/code/modules/jobs/job_types/psychologist.dm
@@ -25,13 +25,3 @@
satchel = /obj/item/storage/backpack/satchel/med
duffelbag = /obj/item/storage/backpack/duffelbag/med
-//Shiptest Outfits
-
-/datum/outfit/job/psychologist/syndicate/nsv
- name = "Ship Psychologist"
- id = /obj/item/card/id/syndicate_command/crew_id
- uniform = /obj/item/clothing/under/rank/medical/psychiatrist
- suit = /obj/item/clothing/suit/toggle/labcoat
- shoes = /obj/item/clothing/shoes/laceup
- alt_uniform = null
- l_hand = /obj/item/clipboard
diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm
index 3399fb9de9f1..68380b99fa05 100644
--- a/code/modules/jobs/job_types/quartermaster.dm
+++ b/code/modules/jobs/job_types/quartermaster.dm
@@ -36,16 +36,6 @@
glasses = /obj/item/clothing/glasses/sunglasses
head = /obj/item/clothing/head/cowboy/sec
-/datum/outfit/job/quartermaster/donk
- name = "Manager (Donk! Co.)"
- id = /obj/item/card/id/syndicate_command/captain_id
-
- ears = /obj/item/radio/headset/syndicate/alt
- uniform = /obj/item/clothing/under/syndicate/donk/qm
- suit = /obj/item/clothing/suit/hazardvest/donk/qm
- ears = /obj/item/radio/headset/syndicate/alt
- shoes = /obj/item/clothing/shoes/laceup
-
/datum/outfit/job/quartermaster/requisitionsofficer
name = "Requisitions Officer"
suit = /obj/item/clothing/suit/jacket/miljacket
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index 781e6f360dc5..3fe484c56986 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -100,8 +100,6 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S
chameleon_extras = list(/obj/item/gun/energy/disabler, /obj/item/clothing/glasses/hud/security/sunglasses, /obj/item/clothing/head/helmet)
//The helmet is necessary because /obj/item/clothing/head/helmet/sec is overwritten in the chameleon list by the standard helmet, which has the same name and icon state
-//Shiptest outfits begin
-
/datum/outfit/job/security/pirate
name = "Buccaneer (Pirate)"
@@ -289,46 +287,8 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S
courierbag = /obj/item/storage/backpack/messenger
backpack_contents = null
-/datum/outfit/job/security/syndicate/gorlex
- name = "Syndicate Battlecruiser Assault Operative"
- uniform = /obj/item/clothing/under/syndicate
- r_pocket = /obj/item/kitchen/knife/combat/survival
- belt = /obj/item/storage/belt/military
- back = /obj/item/storage/backpack
- suit = /obj/item/clothing/suit/armor/vest
- id = /obj/item/card/id/syndicate_command/crew_id
- backpack_contents = list(/obj/item/storage/box/survival/syndie=1)
-
-/datum/outfit/job/security/syndicate/sbc
- name = "Operative (Twinkleshine)"
- uniform = /obj/item/clothing/under/syndicate/combat
- ears = /obj/item/radio/headset/syndicate/alt
- mask = /obj/item/clothing/mask/gas/syndicate/voicechanger
- gloves = /obj/item/clothing/gloves/combat
- shoes = /obj/item/clothing/shoes/combat
- l_pocket = /obj/item/gun/ballistic/automatic/pistol
- r_pocket = /obj/item/kitchen/knife/combat/survival
- belt = /obj/item/storage/belt/military/assault
- id = /obj/item/card/id/syndicate_command/crew_id
- implants = list(/obj/item/implant/weapons_auth)
- backpack_contents = list(/obj/item/gun_voucher/syndicate=1)
-
- head = null
- backpack = /obj/item/storage/backpack/security
- satchel = /obj/item/storage/backpack/satchel/sec
- duffelbag = /obj/item/storage/backpack/duffelbag/syndie
- courierbag = /obj/item/storage/backpack/messenger/sec
-
- box = /obj/item/storage/box/survival/syndie
-
-/datum/outfit/job/security/syndicate/sbc/post_equip(mob/living/carbon/human/H)
- H.faction |= list("PlayerSyndicate")
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(4, 8)) // squidquest real
- I.assignment = "Operative"
- I.access |= list(ACCESS_SYNDICATE)
- I.update_label()
+/datum/outfit/job/security/roumain/post_equip(mob/living/carbon/human/H)
+ H.faction |= list("roumain")
/datum/outfit/job/security/aipirate
name = "Nodesman (Security)"
@@ -359,7 +319,6 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S
l_pocket = /obj/item/flashlight/seclite
r_pocket = /obj/item/tank/internals/emergency_oxygen/double
-
/datum/outfit/job/security/lp
name = "LP Security Specialist"
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index 1fade6b2ecf0..6a3f13da7c78 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -90,43 +90,6 @@
satchel = /obj/item/storage/backpack/satchel/tox
courierbag = /obj/item/storage/backpack/messenger/tox
-/datum/outfit/job/miner/syndicate/gorlex
- name = "Wrecker (Gorlex Marauders)"
-
- uniform = /obj/item/clothing/under/syndicate/gorlex
- shoes = /obj/item/clothing/shoes/workboots
- ears = /obj/item/radio/headset/alt
-
-/datum/outfit/job/miner/syndicate/sbc
- name = "Miner (Twinkleshine)"
-
- uniform = /obj/item/clothing/under/syndicate/gorlex
- shoes = /obj/item/clothing/shoes/workboots
- glasses = /obj/item/clothing/glasses/meson/night
- gloves = /obj/item/clothing/gloves/explorer
- ears = /obj/item/radio/headset/syndicate
- mask = /obj/item/clothing/mask/gas/syndicate/voicechanger
- r_pocket = /obj/item/kitchen/knife/combat/survival
- belt = /obj/item/storage/belt/mining/alt
- implants = list(/obj/item/implant/weapons_auth)
- id = /obj/item/card/id/syndicate_command/crew_id/engi
-
- backpack = /obj/item/storage/backpack/security
- satchel = /obj/item/storage/backpack/satchel/sec
- duffelbag = /obj/item/storage/backpack/duffelbag/syndie
- courierbag = /obj/item/storage/backpack/messenger/sec
-
- box = /obj/item/storage/box/survival/mining
-
-/datum/outfit/job/miner/syndicate/sbc/post_equip(mob/living/carbon/human/H)
- H.faction |= list("PlayerSyndicate")
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(5, 7)) // squidquest real
- I.assignment = "Miner"
- I.access |= list(ACCESS_SYNDICATE, ACCESS_ENGINE)
- I.update_label()
-
/datum/outfit/job/miner/old
name = "Shaft Miner (Legacy)"
suit = /obj/item/clothing/suit/hooded/explorer/old
@@ -162,30 +125,6 @@
/obj/item/borg/upgrade/modkit/aoe=1
)
-/datum/outfit/job/miner/syndicate/cybersun
- name = "Field Agent"
-
- id = /obj/item/card/id/syndicate_command/crew_id
- ears = /obj/item/radio/headset
- uniform = /obj/item/clothing/under/syndicate
- accessory = /obj/item/clothing/accessory/armband/cargo
- head = /obj/item/clothing/head/soft/black
- r_pocket = /obj/item/radio
-
-/datum/outfit/job/miner/syndicate/gec
- name = "Shaft Miner (GEC)"
-
- id = /obj/item/card/id/syndicate_command/crew_id
- ears = /obj/item/radio/headset
- uniform = /obj/item/clothing/under/syndicate
- alt_uniform = null
- accessory = /obj/item/clothing/accessory/armband/cargo
- head = /obj/item/clothing/head/soft/black
- r_pocket = /obj/item/radio
- head = /obj/item/clothing/head/hardhat/orange
- suit = /obj/item/clothing/suit/toggle/industrial
- suit_store = /obj/item/tank/internals/emergency_oxygen/double
-
/datum/outfit/job/miner/hazard/minutemen
name = "Industrial Miner (Minutemen)"
gloves = /obj/item/clothing/gloves/color/black
diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm
index cf774d8a25bb..a347965d9323 100644
--- a/code/modules/jobs/job_types/station_engineer.dm
+++ b/code/modules/jobs/job_types/station_engineer.dm
@@ -84,61 +84,6 @@
suit = /obj/item/clothing/suit/toggle/hazard
alt_suit = /obj/item/clothing/suit/hazardvest
-/datum/outfit/job/engineer/syndicate
- name = "Ship Technician (Engineer)"
-
- id = /obj/item/card/id/syndicate_command/crew_id
- uniform = /obj/item/clothing/under/syndicate/aclfgrunt
- accessory = /obj/item/clothing/accessory/armband/engine
- glasses = /obj/item/clothing/glasses/sunglasses
- shoes = /obj/item/clothing/shoes/jackboots
-
-/datum/outfit/job/engineer/gec
- name = "Station Engineer (GEC)"
-
- uniform = /obj/item/clothing/under/syndicate/gec
- suit = /obj/item/clothing/suit/toggle/hazard
- head = /obj/item/clothing/head/hardhat
- id = /obj/item/card/id/syndicate_command/crew_id
-
-/datum/outfit/job/engineer/syndicate/gorlex
- name = "Mechanic (Gorlex Marauders)"
-
- uniform = /obj/item/clothing/under/syndicate/gorlex
- shoes = /obj/item/clothing/shoes/workboots
- alt_uniform = null
- glasses = null
-
-/datum/outfit/job/engineer/syndicate/sbc
- name = "Ship Engineer (Twinkleshine)"
-
- uniform = /obj/item/clothing/under/syndicate/gec
- accessory = null
- glasses = /obj/item/clothing/glasses/meson/night
- head = /obj/item/clothing/head/hardhat/orange
- gloves = /obj/item/clothing/gloves/tackler/combat/insulated
- ears = /obj/item/radio/headset/syndicate
- mask = /obj/item/clothing/mask/gas/syndicate/voicechanger
- back = /obj/item/storage/backpack/industrial
- belt = /obj/item/storage/belt/utility/syndicate
- shoes = /obj/item/clothing/shoes/combat
- suit = /obj/item/clothing/suit/hazardvest
- alt_suit = /obj/item/clothing/suit/toggle/hazard
- implants = list(/obj/item/implant/weapons_auth)
- id = /obj/item/card/id/syndicate_command/crew_id/engi
- backpack_contents = list(/obj/item/construction/rcd/combat, /obj/item/rcd_ammo/large)
-
- box = /obj/item/storage/box/survival/syndie
-
-/datum/outfit/job/engineer/syndicate/sbc/post_equip(mob/living/carbon/human/H)
- H.faction |= list("PlayerSyndicate")
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(6, 8)) // squidquest real
- I.assignment = "Engineer"
- I.access |= list(ACCESS_SYNDICATE)
- I.update_label()
-
/datum/outfit/job/engineer/independent/ship_engineer
name = "Ship Engineer (Independent)"
@@ -161,16 +106,6 @@
r_pocket = null
glasses = null
-
-/datum/outfit/job/engineer/syndicate/cybersun
- name = "Engineer (Cybersun)"
-
- uniform = /obj/item/clothing/under/syndicate/cybersun
- shoes = /obj/item/clothing/shoes/workboots
- r_pocket = /obj/item/radio
- head = /obj/item/clothing/head/beanie/black
- accessory = /obj/item/clothing/accessory/armband/engine
-
/datum/outfit/job/engineer/aipirate
name = "Nodesman (Engineer)"
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index a59b68a49892..f16d6119d147 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -109,35 +109,3 @@
suit = /obj/item/clothing/suit/armor/vest/security/warden/alt/nt
alt_uniform = null
alt_suit = null
-
-/datum/outfit/job/warden/syndicate/sbc
- name = "Lieutenant (Twinkleshine)"
- uniform = /obj/item/clothing/under/syndicate/aclf
- head = /obj/item/clothing/head/HoS/beret/syndicate
- ears = /obj/item/radio/headset/syndicate/alt
- mask = /obj/item/clothing/mask/gas/syndicate/voicechanger
- gloves = /obj/item/clothing/gloves/combat
- l_pocket = /obj/item/gun/ballistic/automatic/pistol
- r_pocket = /obj/item/kitchen/knife/combat/survival
- belt = /obj/item/storage/belt/military/assault
- shoes = /obj/item/clothing/shoes/combat
- suit = /obj/item/clothing/suit/armor/vest
- alt_suit = /obj/item/clothing/suit/aclf
- id = /obj/item/card/id/syndicate_command/lieutenant
- implants = list(/obj/item/implant/weapons_auth)
- backpack_contents = list(/obj/item/melee/baton)
-
- backpack = /obj/item/storage/backpack/security
- satchel = /obj/item/storage/backpack/satchel/sec
- duffelbag = /obj/item/storage/backpack/duffelbag/syndie
- courierbag = /obj/item/storage/backpack/messenger/sec
-
- box = /obj/item/storage/box/survival/syndie
-
-/datum/outfit/job/warden/syndicate/sbc/post_equip(mob/living/carbon/human/H)
- H.faction |= list("PlayerSyndicate")
-
- var/obj/item/card/id/I = H.wear_id
- I.registered_name = pick(GLOB.twinkle_names) + "-" + num2text(rand(8, 10)) // squidquest real
- I.access |= list(ACCESS_SYNDICATE)
- I.update_label()
diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm
index 47d6b16feb5e..8f2a4433db65 100644
--- a/code/modules/keybindings/bindings_atom.dm
+++ b/code/modules/keybindings/bindings_atom.dm
@@ -16,3 +16,6 @@
if((movement_dir & EAST) && (movement_dir & WEST))
movement_dir &= ~(EAST|WEST)
user.Move(get_step(src, movement_dir), movement_dir)
+ return !!movement_dir //true if there was actually any player input
+
+ return FALSE
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index 1f42ec424706..61570535cbbf 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -55,7 +55,7 @@ Key procs
/// Initializes, and copies in the languages from the current atom if available.
/datum/language_holder/New(atom/_owner)
if(_owner && QDELETED(_owner))
- CRASH("Langauge holder added to a qdeleting thing, what the fuck \ref[_owner]")
+ CRASH("Langauge holder added to a qdeleting thing, what the fuck [text_ref(_owner)]")
owner = _owner
if(istype(owner, /datum/mind))
var/datum/mind/M = owner
diff --git a/code/modules/language/mouse.dm b/code/modules/language/mouse.dm
index 8e488c93e5ac..98dcd9133c74 100644
--- a/code/modules/language/mouse.dm
+++ b/code/modules/language/mouse.dm
@@ -4,7 +4,7 @@
speech_verb = "squeaks"
ask_verb = "squeaks"
exclaim_verb = "squeaks"
- key = "m"
+ key = "l"
flags = NO_STUTTER | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD | LANGUAGE_HIDE_ICON_IF_UNDERSTOOD
/datum/language/mouse/scramble(input)
diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm
index be017a07ef6b..c4263a771b0d 100644
--- a/code/modules/library/lib_codex_gigas.dm
+++ b/code/modules/library/lib_codex_gigas.dm
@@ -71,7 +71,7 @@
return FALSE
if(action == "search")
SStgui.close_uis(src)
- addtimer(CALLBACK(src, .proc/perform_research, usr, currentName), 0)
+ addtimer(CALLBACK(src, PROC_REF(perform_research), usr, currentName), 0)
currentName = ""
currentSection = PRE_TITLE
return FALSE
diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm
index 39d443929e21..b3f5b1078b20 100644
--- a/code/modules/mapping/map_template.dm
+++ b/code/modules/mapping/map_template.dm
@@ -159,6 +159,7 @@
var/list/turf_blacklist = list()
update_blacklist(T, turf_blacklist)
+ UNSETEMPTY(turf_blacklist)
parsed.turf_blacklist = turf_blacklist
if(!parsed.load(T.x, T.y, T.z, cropMap=TRUE, no_changeturf=(SSatoms.initialized == INITIALIZATION_INSSATOMS), placeOnTop=should_place_on_top))
return
diff --git a/code/modules/mapping/preloader.dm b/code/modules/mapping/preloader.dm
index 4b61663f668e..59480159f1c8 100644
--- a/code/modules/mapping/preloader.dm
+++ b/code/modules/mapping/preloader.dm
@@ -1,6 +1,7 @@
// global datum that will preload variables on atoms instanciation
GLOBAL_VAR_INIT(use_preloader, FALSE)
-GLOBAL_DATUM_INIT(_preloader, /datum/map_preloader, new)
+GLOBAL_LIST_INIT(_preloader_attributes, null)
+GLOBAL_LIST_INIT(_preloader_path, null)
/// Preloader datum
/datum/map_preloader
@@ -11,15 +12,14 @@ GLOBAL_DATUM_INIT(_preloader, /datum/map_preloader, new)
/world/proc/preloader_setup(list/the_attributes, path)
if(the_attributes.len)
GLOB.use_preloader = TRUE
- var/datum/map_preloader/preloader_local = GLOB._preloader
- preloader_local.attributes = the_attributes
- preloader_local.target_path = path
+ GLOB._preloader_attributes = the_attributes
+ GLOB._preloader_path = path
/world/proc/preloader_load(atom/what)
GLOB.use_preloader = FALSE
- var/datum/map_preloader/preloader_local = GLOB._preloader
- for(var/attribute in preloader_local.attributes)
- var/value = preloader_local.attributes[attribute]
+ var/list/attributes = GLOB._preloader_attributes
+ for(var/attribute in attributes)
+ var/value = attributes[attribute]
if(islist(value))
value = deepCopyList(value)
#ifdef TESTING
diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm
index 59c0bb14dbc4..9e12fb7d4ce7 100644
--- a/code/modules/mapping/reader.dm
+++ b/code/modules/mapping/reader.dm
@@ -11,9 +11,13 @@
/datum/parsed_map
var/original_path
+ /// The length of a key in this file. This is promised by the standard to be static
var/key_len = 0
var/list/grid_models = list()
var/list/gridSets = list()
+ /// List of area types we've loaded AS A PART OF THIS MAP
+ /// We do this to allow non unique areas, so we'll only load one per map
+ var/list/area/loaded_areas = list()
var/list/modelCache
@@ -23,19 +27,21 @@
var/list/bounds
var/did_expand = FALSE
- ///any turf in this list is skipped inside of build_coordinate
- var/list/turf_blacklist = list()
+ ///any turf in this list is skipped inside of build_coordinate. Lazy assoc list
+ var/list/turf_blacklist
// raw strings used to represent regexes more accurately
// '' used to avoid confusing syntax highlighting
var/static/regex/dmmRegex = new(@'"([a-zA-Z]+)" = \(((?:.|\n)*?)\)\n(?!\t)|\((\d+),(\d+),(\d+)\) = \{"([a-zA-Z\n]*)"\}', "g")
- var/static/regex/trimQuotesRegex = new(@'^[\s\n]+"?|"?[\s\n]+$|^"|"$', "g")
var/static/regex/trimRegex = new(@'^[\s\n]+|[\s\n]+$', "g")
#ifdef TESTING
var/turfsSkipped = 0
#endif
+//text trimming (both directions) helper macro
+#define TRIM_TEXT(text) (trim_reduced(text))
+
/// Shortcut function to parse a map and apply it to the world.
///
/// - `dmm_file`: A .dmm file to load (Required).
@@ -53,6 +59,9 @@
/// Parse a map, possibly cropping it.
/datum/parsed_map/New(tfile, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper=INFINITY, measureOnly=FALSE)
+ // This proc sleeps for like 6 seconds. why?
+ // Is it file accesses? if so, can those be done ahead of time, async to save on time here? I wonder.
+ // Love ya :)
if(isfile(tfile))
original_path = "[tfile]"
tfile = file2text(tfile)
@@ -60,16 +69,23 @@
// create a new datum without loading a map
return
- bounds = parsed_bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
- var/stored_index = 1
+ src.bounds = parsed_bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
+ // lists are structs don't you know :)
+ var/list/bounds = src.bounds
+ var/list/grid_models = src.grid_models
+ var/key_len = src.key_len
+ var/stored_index = 1
+ var/list/regexOutput
//multiz lool
while(dmmRegex.Find(tfile, stored_index))
stored_index = dmmRegex.next
+ // Datum var lookup is expensive, this isn't
+ regexOutput = dmmRegex.group
// "aa" = (/type{vars=blah})
- if(dmmRegex.group[1]) // Model
- var/key = dmmRegex.group[1]
+ if(regexOutput[1]) // Model
+ var/key = regexOutput[1]
if(grid_models[key]) // Duplicate model keys are ignored in DMMs
continue
if(key_len != length(key))
@@ -78,14 +94,14 @@
else
CRASH("Inconsistent key length in DMM")
if(!measureOnly)
- grid_models[key] = dmmRegex.group[2]
+ grid_models[key] = regexOutput[2]
// (1,1,1) = {"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}
- else if(dmmRegex.group[3]) // Coords
+ else if(regexOutput[3]) // Coords
if(!key_len)
CRASH("Coords before model definition in DMM")
- var/curr_x = text2num(dmmRegex.group[3])
+ var/curr_x = text2num(regexOutput[3])
if(curr_x < x_lower || curr_x > x_upper)
continue
@@ -94,69 +110,96 @@
gridSet.xcrd = curr_x
//position of the currently processed square
- gridSet.ycrd = text2num(dmmRegex.group[4])
- gridSet.zcrd = text2num(dmmRegex.group[5])
+ gridSet.ycrd = text2num(regexOutput[4])
+ gridSet.zcrd = text2num(regexOutput[5])
- bounds[MAP_MINX] = min(bounds[MAP_MINX], clamp(gridSet.xcrd, x_lower, x_upper))
+ bounds[MAP_MINX] = min(bounds[MAP_MINX], curr_x)
bounds[MAP_MINZ] = min(bounds[MAP_MINZ], gridSet.zcrd)
bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], gridSet.zcrd)
- var/list/gridLines = splittext(dmmRegex.group[6], "\n")
+ var/list/gridLines = splittext(regexOutput[6], "\n")
gridSet.gridLines = gridLines
var/leadingBlanks = 0
- while(leadingBlanks < gridLines.len && gridLines[++leadingBlanks] == "")
+ while(leadingBlanks < length(gridLines) && gridLines[++leadingBlanks] == "")
if(leadingBlanks > 1)
gridLines.Cut(1, leadingBlanks) // Remove all leading blank lines.
- if(!gridLines.len) // Skip it if only blank lines exist.
+ if(!length(gridLines)) // Skip it if only blank lines exist.
continue
gridSets += gridSet
- if(gridLines.len && gridLines[gridLines.len] == "")
- gridLines.Cut(gridLines.len) // Remove only one blank line at the end.
+ if(gridLines[length(gridLines)] == "")
+ gridLines.Cut(length(gridLines)) // Remove only one blank line at the end.
- bounds[MAP_MINY] = min(bounds[MAP_MINY], clamp(gridSet.ycrd, y_lower, y_upper))
- gridSet.ycrd += gridLines.len - 1 // Start at the top and work down
- bounds[MAP_MAXY] = max(bounds[MAP_MAXY], clamp(gridSet.ycrd, y_lower, y_upper))
+ bounds[MAP_MINY] = min(bounds[MAP_MINY], gridSet.ycrd)
+ gridSet.ycrd += length(gridLines) - 1 // Start at the top and work down
+ bounds[MAP_MAXY] = max(bounds[MAP_MAXY], gridSet.ycrd)
- var/maxx = gridSet.xcrd
- if(gridLines.len) //Not an empty map
- maxx = max(maxx, gridSet.xcrd + length(gridLines[1]) / key_len - 1)
+ var/maxx = curr_x
+ if(length(gridLines)) //Not an empty map
+ maxx = max(maxx, curr_x + length(gridLines[1]) / key_len - 1)
- bounds[MAP_MAXX] = clamp(max(bounds[MAP_MAXX], maxx), x_lower, x_upper)
+ bounds[MAP_MAXX] = max(bounds[MAP_MAXX], maxx)
CHECK_TICK
// Indicate failure to parse any coordinates by nulling bounds
if(bounds[1] == 1.#INF)
- bounds = null
- parsed_bounds = bounds
+ src.bounds = null
+ else
+ // Clamp all our mins and maxes down to the proscribed limits
+ bounds[MAP_MINX] = clamp(bounds[MAP_MINX], x_lower, x_upper)
+ bounds[MAP_MAXX] = clamp(bounds[MAP_MAXX], x_lower, x_upper)
+ bounds[MAP_MINY] = clamp(bounds[MAP_MINY], y_lower, y_upper)
+ bounds[MAP_MAXY] = clamp(bounds[MAP_MAXY], y_lower, y_upper)
+
+ parsed_bounds = src.bounds
+ src.key_len = key_len
/// Load the parsed map into the world. See [/proc/load_map] for arguments.
-/datum/parsed_map/proc/load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop)
+/datum/parsed_map/proc/load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, whitelist = FALSE)
//How I wish for RAII
Master.StartLoadingMap()
. = _load_impl(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop)
Master.StopLoadingMap()
+
+#define MAPLOADING_CHECK_TICK \
+ if(TICK_CHECK) { \
+ SSatoms.map_loader_stop(); \
+ stoplag(); \
+ SSatoms.map_loader_begin(); \
+ }
// Do not call except via load() above.
/datum/parsed_map/proc/_load_impl(x_offset = 1, y_offset = 1, z_offset = world.maxz + 1, cropMap = FALSE, no_changeturf = FALSE, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, placeOnTop = FALSE)
PRIVATE_PROC(TRUE)
- var/list/areaCache = list()
var/list/modelCache = build_cache(no_changeturf)
var/space_key = modelCache[SPACE_KEY]
var/list/bounds
+ var/key_len = src.key_len
src.bounds = bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
- for(var/I in gridSets)
- var/datum/grid_set/gset = I
- var/ycrd = gset.ycrd + y_offset - 1
+ // Tell ss atoms that we're doing maploading
+ // We'll have to account for this in the following tick_checks so it doesn't overflow
+ SSatoms.map_loader_begin()
+
+ //used for sending the maxx and maxy expanded global signals at the end of this proc
+ var/has_expanded_world_maxx = FALSE
+ var/has_expanded_world_maxy = FALSE
+ var/y_relative_to_absolute = y_offset - 1
+ var/x_relative_to_absolute = x_offset - 1
+ for(var/datum/grid_set/gset as anything in gridSets)
+ var/relative_x = gset.xcrd
+ var/relative_y = gset.ycrd
+ var/true_xcrd = relative_x + x_relative_to_absolute
+ var/ycrd = relative_y + y_relative_to_absolute
var/zcrd = gset.zcrd + z_offset - 1
if(!cropMap && ycrd > world.maxy)
world.maxy = ycrd // Expand Y here. X is expanded in the loop below
did_expand = TRUE
var/zexpansion = zcrd > world.maxz
+ var/no_afterchange = no_changeturf
if(zexpansion)
if(cropMap)
continue
@@ -166,50 +209,141 @@
did_expand = FALSE
if(!no_changeturf)
WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called")
-
- for(var/line in gset.gridLines)
- if((ycrd - y_offset + 1) < y_lower || (ycrd - y_offset + 1) > y_upper) //Reverse operation and check if it is out of bounds of cropping.
- --ycrd
+ no_afterchange = TRUE
+ // Ok so like. something important
+ // We talk in "relative" coords here, so the coordinate system of the map datum
+ // This is so we can do offsets, but it is NOT the same as positions in game
+ // That's why there's some uses of - y_relative_to_absolute here, to turn absolute positions into relative ones
+
+ // Skip Y coords that are above the smallest of the three params
+ // So maxy and y_upper get to act as thresholds, and relative_y can play
+ var/y_skip_above = min(world.maxy - y_relative_to_absolute, y_upper, relative_y)
+ // How many lines to skip because they'd be above the y cuttoff line
+ var/y_starting_skip = relative_y - y_skip_above
+ ycrd += y_starting_skip
+
+ // Y is the LOWEST it will ever be here, so we can easily set a threshold for how low to go
+ var/line_count = length(gset.gridLines)
+ var/lowest_y = relative_y - (line_count - 1) // -1 because we decrement at the end of the loop, not the start
+ var/y_ending_skip = max(max(y_lower, 1 - y_relative_to_absolute) - lowest_y, 0)
+
+ // Now we're gonna precompute the x thresholds
+ // We skip all the entries below the lower x, or 1
+ var/starting_x_delta = max(max(x_lower, 1 - x_relative_to_absolute) - relative_x, 0)
+ // The x loop counts by key length, so we gotta multiply here
+ var/x_starting_skip = starting_x_delta * key_len
+ true_xcrd += starting_x_delta
+
+ var/line_length = 0
+ if(line_count)
+ // This is promised as static, so we will treat it as such
+ line_length = length(gset.gridLines[1])
+ // We're gonna skip all the entries above the upper x, or maxx if cropMap is set
+ var/x_target = line_length - key_len + 1
+ var/x_step_count = ROUND_UP(x_target / key_len)
+ var/final_x = relative_x + (x_step_count - 1)
+ var/x_delta_with = x_upper
+ if(cropMap)
+ // Take our smaller crop threshold yes?
+ x_delta_with = min(x_delta_with, world.maxx)
+ if(final_x > x_delta_with)
+ // If our relative x is greater then X upper, well then we've gotta limit our expansion
+ var/delta = max(final_x - x_delta_with, 0)
+ x_step_count -= delta
+ final_x -= delta
+ x_target = x_step_count * key_len
+ if(final_x > world.maxx && !cropMap)
+ world.maxx = final_x
+ has_expanded_world_maxx = TRUE
+
+ // We're gonna track the first and last pairs of coords we find
+ // The first x is guarenteed to be the lowest, the first y the highest, and vis versa
+ // This is faster then doing mins and maxes inside the hot loop below
+ var/first_found = FALSE
+ var/first_x = 0
+ var/first_y = 0
+ var/last_x = 0
+ var/last_y = 0
+
+ // Everything following this line is VERY hot. How hot depends on the map format
+ // (Yes this does mean dmm is technically faster to parse. shut up)
+
+ // This is the "is this map tgm" check
+ if(key_len == line_length)
+ // Wanna clear something up about maps, talking in 255x255 here
+ // In the tgm format, each gridset contains 255 lines, each line representing one tile, with 255 total gridsets
+ // In the dmm format, each gridset contains 255 lines, each line representing one row of tiles, containing 255 * line length characters, with one gridset per z
+ // since this is the tgm branch any cutoff of x means we just shouldn't iterate this gridset
+ if(!x_step_count || x_starting_skip)
continue
- if(ycrd <= world.maxy && ycrd >= 1)
- var/xcrd = gset.xcrd + x_offset - 1
- for(var/tpos = 1 to length(line) - key_len + 1 step key_len)
- if((xcrd - x_offset + 1) < x_lower || (xcrd - x_offset + 1) > x_upper) //Same as above.
- ++xcrd
- continue //X cropping.
- if(xcrd > world.maxx)
- if(cropMap)
- break
- else
- world.maxx = xcrd
- did_expand = TRUE
-
- if(xcrd >= 1)
- var/model_key = copytext(line, tpos, tpos + key_len)
- var/no_afterchange = no_changeturf || zexpansion
- if(!no_afterchange || (model_key != space_key))
- var/list/cache = modelCache[model_key]
- if(!cache)
- CRASH("Undefined model key in DMM: [model_key]")
- build_coordinate(areaCache, cache, locate(xcrd, ycrd, zcrd), no_afterchange, placeOnTop)
-
- // only bother with bounds that actually exist
- bounds[MAP_MINX] = min(bounds[MAP_MINX], xcrd)
- bounds[MAP_MINY] = min(bounds[MAP_MINY], ycrd)
- bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd)
- bounds[MAP_MAXX] = max(bounds[MAP_MAXX], xcrd)
- bounds[MAP_MAXY] = max(bounds[MAP_MAXY], ycrd)
- bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd)
+ for(var/i in 1 + y_starting_skip to line_count - y_ending_skip)
+ var/line = gset.gridLines[i]
+ if(line == space_key && no_afterchange)
+ #ifdef TESTING
+ ++turfsSkipped
+ #endif
+ ycrd--
+ MAPLOADING_CHECK_TICK
+ continue
+
+ var/list/cache = modelCache[line]
+ if(!cache)
+ SSatoms.map_loader_stop()
+ CRASH("Undefined model key in DMM: [line]")
+ build_coordinate(cache, locate(true_xcrd, ycrd, zcrd), no_afterchange, placeOnTop)
+
+ // only bother with bounds that actually exist
+ if(!first_found)
+ first_found = TRUE
+ first_y = ycrd
+ last_y = ycrd
+ ycrd--
+ MAPLOADING_CHECK_TICK
+ // The x coord never changes, so this is safe
+ if(first_found)
+ first_x = true_xcrd
+ last_x = true_xcrd
+ else
+ // This is the dmm parser, note the double loop
+ for(var/i in 1 + y_starting_skip to line_count - y_ending_skip)
+ var/line = gset.gridLines[i]
+
+ var/xcrd = true_xcrd
+ for(var/tpos in 1 + x_starting_skip to x_target step key_len)
+ var/model_key = copytext(line, tpos, tpos + key_len)
+ if(model_key == space_key && no_afterchange)
#ifdef TESTING
- else
- ++turfsSkipped
+ ++turfsSkipped
#endif
- CHECK_TICK
+ MAPLOADING_CHECK_TICK
+ ++xcrd
+ continue
+ var/list/cache = modelCache[model_key]
+ if(!cache)
+ SSatoms.map_loader_stop()
+ CRASH("Undefined model key in DMM: [model_key]")
+ build_coordinate(cache, locate(xcrd, ycrd, zcrd), no_afterchange, placeOnTop)
+
+ // only bother with bounds that actually exist
+ if(!first_found)
+ first_found = TRUE
+ first_x = xcrd
+ first_y = ycrd
+ last_x = xcrd
+ last_y = ycrd
+ MAPLOADING_CHECK_TICK
++xcrd
- --ycrd
-
- CHECK_TICK
-
+ ycrd--
+ MAPLOADING_CHECK_TICK
+ bounds[MAP_MINX] = min(bounds[MAP_MINX], first_x)
+ bounds[MAP_MINY] = min(bounds[MAP_MINY], last_y)
+ bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd)
+ bounds[MAP_MAXX] = max(bounds[MAP_MAXX], last_x)
+ bounds[MAP_MAXY] = max(bounds[MAP_MAXY], first_y)
+ bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd)
+
+ // And we are done lads, call it off
+ SSatoms.map_loader_stop()
if(!no_changeturf)
for(var/t in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])))
var/turf/T = t
@@ -221,180 +355,176 @@
testing("Skipped loading [turfsSkipped] default turfs")
#endif
+ if(has_expanded_world_maxx || has_expanded_world_maxy)
+ SEND_GLOBAL_SIGNAL(COMSIG_GLOB_EXPANDED_WORLD_BOUNDS, has_expanded_world_maxx, has_expanded_world_maxy)
+
if(did_expand)
world.refresh_atmos_grid()
return TRUE
+GLOBAL_LIST_EMPTY(map_model_default)
+
/datum/parsed_map/proc/build_cache(no_changeturf, bad_paths=null)
if(modelCache && !bad_paths)
return modelCache
. = modelCache = list()
var/list/grid_models = src.grid_models
+ var/set_space = FALSE
+ // Use where a list is needed, but where it will not be modified
+ // Used here to remove the cost of needing to make a new list for each fields entry when it's set manually later
+ var/static/list/default_list = GLOB.map_model_default
for(var/model_key in grid_models)
var/model = grid_models[model_key]
- var/list/members = list() //will contain all members (paths) in model (in our example : /turf/unsimulated/wall and /area/mine/explored)
- var/list/members_attributes = list() //will contain lists filled with corresponding variables, if any (in our example : list(icon_state = "rock") and list())
+ // This is safe because dmm strings will never actually newline
+ // So we can parse things just fine
+ var/list/entries = splittext(model, ",\n")
+ //will contain all members (paths) in model (in our example : /turf/unsimulated/wall and /area/mine/explored)
+ var/list/members = new /list(length(entries))
+ //will contain lists filled with corresponding variables, if any (in our example : list(icon_state = "rock") and list())
+ //member attributes are rarish, so we could lazyinit this
+ var/list/members_attributes = new /list(length(entries))
/////////////////////////////////////////////////////////
//Constructing members and corresponding variables lists
////////////////////////////////////////////////////////
var/index = 1
- var/old_position = 1
- var/dpos
-
- while(dpos != 0)
- //finding next member (e.g /turf/unsimulated/wall{icon_state = "rock"} or /area/mine/explored)
- dpos = find_next_delimiter_position(model, old_position, ",", "{", "}") //find next delimiter (comma here) that's not within {...}
-
- var/full_def = trim_text(copytext(model, old_position, dpos)) //full definition, e.g : /obj/foo/bar{variables=derp}
- var/variables_start = findtext(full_def, "{")
- var/path_text = trim_text(copytext(full_def, 1, variables_start))
+ for(var/member_string in entries)
+ var/variables_start = 0
+ //findtext is a bit expensive, lets only do this if the last char of our string is a } (IE: we know we have vars)
+ //this saves about 25 miliseconds on my machine. Not a major optimization
+ if(member_string[length(member_string)] == "}")
+ variables_start = findtext(member_string, "{")
+
+ var/path_text = TRIM_TEXT(copytext(member_string, 1, variables_start))
var/atom_def = text2path(path_text) //path definition, e.g /obj/foo/bar
- if(dpos)
- old_position = dpos + length(model[dpos])
if(!ispath(atom_def, /atom)) // Skip the item if the path does not exist. Fix your crap, mappers!
if(bad_paths)
LAZYOR(bad_paths[path_text], model_key)
continue
- members.Add(atom_def)
+ members[index] = atom_def
//transform the variables in text format into a list (e.g {var1="derp"; var2; var3=7} => list(var1="derp", var2, var3=7))
- var/list/fields = list()
-
+ var/list/fields = default_list
if(variables_start)//if there's any variable
- full_def = copytext(full_def, variables_start + length(full_def[variables_start]), -length(copytext_char(full_def, -1))) //removing the last '}'
- fields = readlist(full_def, ";")
- if(fields.len)
- if(!trim(fields[fields.len]))
- --fields.len
- for(var/I in fields)
- var/value = fields[I]
- if(istext(value))
- fields[I] = apply_text_macros(value)
+ member_string = copytext(member_string, variables_start + length(member_string[variables_start]), -length(copytext_char(member_string, -1))) //removing the last '}'
+ fields = readlist(member_string, ";")
+ for(var/I in fields)
+ var/value = fields[I]
+ if(istext(value))
+ fields[I] = apply_text_macros(value)
//then fill the members_attributes list with the corresponding variables
- members_attributes.len++
members_attributes[index++] = fields
-
CHECK_TICK
//check and see if we can just skip this turf
//So you don't have to understand this horrid statement, we can do this if
- // 1. no_changeturf is set
- // 2. the space_key isn't set yet
+ // 1. the space_key isn't set yet
+ // 2. no_changeturf is set
// 3. there are exactly 2 members
// 4. with no attributes
// 5. and the members are world.turf and world.area
// Basically, if we find an entry like this: "XXX" = (/turf/default, /area/default)
// We can skip calling this proc every time we see XXX
- if(no_changeturf \
- && !(.[SPACE_KEY]) \
+ if(!set_space \
+ && no_changeturf \
&& members.len == 2 \
&& members_attributes.len == 2 \
&& length(members_attributes[1]) == 0 \
&& length(members_attributes[2]) == 0 \
&& (world.area in members) \
&& (world.turf in members))
-
+ set_space = TRUE
.[SPACE_KEY] = model_key
continue
-
.[model_key] = list(members, members_attributes)
-/datum/parsed_map/proc/build_coordinate(list/areaCache, list/model, turf/crds, no_changeturf as num, placeOnTop as num)
+/datum/parsed_map/proc/build_coordinate(list/model, turf/crds, no_changeturf as num, placeOnTop as num)
+ // If we don't have a turf, nothing we will do next will actually acomplish anything, so just go back
+ // Note, this would actually drop area vvs in the tile, but like, why tho
+ if(!crds)
+ return
var/index
var/list/members = model[1]
var/list/members_attributes = model[2]
+ // We use static lists here because it's cheaper then passing them around
+ var/static/list/default_list = GLOB.map_model_default
////////////////
//Instanciation
////////////////
- for (var/turf_in_blacklist in turf_blacklist)
- if (crds == turf_in_blacklist) //if the given turf is blacklisted, dont do anything with it
- return
+ if(turf_blacklist?[crds])
+ return
//The next part of the code assumes there's ALWAYS an /area AND a /turf on a given tile
//first instance the /area and remove it from the members list
index = members.len
+ var/atom/instance
if(members[index] != /area/template_noop)
- var/atype = members[index]
- world.preloader_setup(members_attributes[index], atype)//preloader for assigning set variables on atom creation
- var/atom/instance = areaCache[atype]
- if (!instance)
- instance = GLOB.areas_by_type[atype]
+ if(members_attributes[index] != default_list)
+ world.preloader_setup(members_attributes[index], members[index])//preloader for assigning set variables on atom creation
+ instance = loaded_areas[members[index]]
+ if(!instance)
+ var/area_type = members[index]
+ // If this parsed map doesn't have that area already, we check the global cache
+ instance = GLOB.areas_by_type[area_type]
+ // If the global list DOESN'T have this area it's either not a unique area, or it just hasn't been created yet
if (!instance)
- instance = new atype(null)
- areaCache[atype] = instance
- if(crds)
- instance.contents.Add(crds)
+ instance = new area_type(null)
+ if(!instance)
+ CRASH("[area_type] failed to be new'd, what'd you do?")
+ loaded_areas[area_type] = instance
- if(GLOB.use_preloader && instance)
- world.preloader_load(instance)
+ instance.contents.Add(crds)
- //then instance the /turf and, if multiple tiles are presents, simulates the DMM underlays piling effect
+ if(GLOB.use_preloader)
+ world.preloader_load(instance)
- var/first_turf_index = 1
- while(!ispath(members[first_turf_index], /turf)) //find first /turf object in members
- first_turf_index++
+ // Index right before /area is /turf
+ index--
+ //then instance the /turf
+ //NOTE: this used to place any turfs before the last "underneath" it using .appearance and underlays
+ //We don't actually use this, and all it did was cost cpu, so we don't do this anymore
+ if(members[index] != /turf/template_noop)
+ if(members_attributes[index] != default_list)
+ world.preloader_setup(members_attributes[index], members[index])
+
+ // Note: we make the assertion that the last path WILL be a turf. if it isn't, this will fail.
+ var/old_virtual_z = crds.virtual_z
+ if(placeOnTop)
+ instance = crds.PlaceOnTop(null, members[index], CHANGETURF_DEFER_CHANGE | (no_changeturf ? CHANGETURF_SKIP : NONE))
+ else if(!no_changeturf)
+ instance = crds.ChangeTurf(members[index], null, CHANGETURF_DEFER_CHANGE)
+ else
+ instance = create_turf(members[index], crds , old_virtual_z)//first preloader pass
+ var/turf/new_turf = instance
+ new_turf.virtual_z = old_virtual_z //UNDER NO CIRCUMSTANCES LOOSE THIS VARIABLE
- //turn off base new Initialization until the whole thing is loaded
- SSatoms.map_loader_begin()
- //instanciate the first /turf
- var/turf/T
- if(members[first_turf_index] != /turf/template_noop)
- T = instance_atom(members[first_turf_index],members_attributes[first_turf_index],crds,no_changeturf,placeOnTop)
-
- if(T)
- //if others /turf are presents, simulates the underlays piling effect
- index = first_turf_index + 1
- while(index <= members.len - 1) // Last item is an /area
- var/underlay = T.appearance
- T = instance_atom(members[index],members_attributes[index],crds,no_changeturf,placeOnTop)//instance new turf
- T.underlays += underlay
- index++
+ if(GLOB.use_preloader && instance)//second preloader pass, for those atoms that don't ..() in New()
+ world.preloader_load(instance)
+ MAPLOADING_CHECK_TICK
//finally instance all remainings objects/mobs
- for(index in 1 to first_turf_index-1)
- instance_atom(members[index],members_attributes[index],crds,no_changeturf,placeOnTop)
- //Restore initialization to the previous value
- SSatoms.map_loader_stop()
+ for(var/atom_index in 1 to index-1)
+ if(members_attributes[atom_index] != default_list)
+ world.preloader_setup(members_attributes[atom_index], members[atom_index])
+
+ // We make the assertion that only /atom s will be in this portion of the code. if that isn't true, this will fail
+ instance = create_atom(members[atom_index], crds)//first preloader pass
+
+ if(GLOB.use_preloader && instance)//second preloader pass, for those atoms that don't ..() in New()
+ world.preloader_load(instance)
+ MAPLOADING_CHECK_TICK
////////////////
//Helpers procs
////////////////
-//Instance an atom at (x,y,z) and gives it the variables in attributes
-/datum/parsed_map/proc/instance_atom(path,list/attributes, turf/crds, no_changeturf, placeOnTop)
- world.preloader_setup(attributes, path)
-
- if(crds)
- if(ispath(path, /turf))
- var/old_virtual_z = crds.virtual_z
- if(placeOnTop)
- . = crds.PlaceOnTop(null, path, CHANGETURF_DEFER_CHANGE | (no_changeturf ? CHANGETURF_SKIP : NONE))
- else if(!no_changeturf)
- . = crds.ChangeTurf(path, null, CHANGETURF_DEFER_CHANGE)
- else
- . = create_turf(path, crds , old_virtual_z)//first preloader pass
- var/turf/new_turf = .
- new_turf.virtual_z = old_virtual_z //UNDER NO CIRCUMSTANCES LOOSE THIS VARIABLE
- else
- . = create_atom(path, crds)//first preloader pass
-
- if(GLOB.use_preloader && .)//second preloader pass, for those atoms that don't ..() in New()
- world.preloader_load(.)
-
- //custom CHECK_TICK here because we don't want things created while we're sleeping to not initialize
- if(TICK_CHECK)
- SSatoms.map_loader_stop()
- stoplag()
- SSatoms.map_loader_begin()
-
/datum/parsed_map/proc/create_turf(path, crds, virtual_z)
set waitfor = FALSE
. = new path (crds, virtual_z)
@@ -403,15 +533,6 @@
set waitfor = FALSE
. = new path (crds)
-//text trimming (both directions) helper proc
-//optionally removes quotes before and after the text (for variable name)
-/datum/parsed_map/proc/trim_text(what as text,trim_quotes=0)
- if(trim_quotes)
- return trimQuotesRegex.Replace(what, "")
- else
- return trimRegex.Replace(what, "")
-
-
//find the position of the next delimiter,skipping whatever is comprised between opening_escape and closing_escape
//returns 0 if reached the last delimiter
/datum/parsed_map/proc/find_next_delimiter_position(text as text,initial_position as num, delimiter=",",opening_escape="\"",closing_escape="\"")
@@ -426,7 +547,6 @@
return next_delimiter
-
//build a list from variables in text form (e.g {var1="derp"; var2; var3=7} => list(var1="derp", var2, var3=7))
//return the filled list
/datum/parsed_map/proc/readlist(text as text, delimiter=",")
@@ -434,30 +554,49 @@
if (!text)
return
- var/position
- var/old_position = 1
-
- while(position != 0)
- // find next delimiter that is not within "..."
- position = find_next_delimiter_position(text,old_position,delimiter)
-
- // check if this is a simple variable (as in list(var1, var2)) or an associative one (as in list(var1="foo",var2=7))
- var/equal_position = findtext(text,"=",old_position, position)
-
- var/trim_left = trim_text(copytext(text,old_position,(equal_position ? equal_position : position)))
- var/left_constant = delimiter == ";" ? trim_left : parse_constant(trim_left)
- if(position)
- old_position = position + length(text[position])
+ // If we're using a semi colon, we can do this as splittext rather then constant calls to find_next_delimiter_position
+ // This does make the code a bit harder to read, but saves a good bit of time so suck it up
+ var/using_semicolon = delimiter == ";"
+ if(using_semicolon)
+ var/list/line_entries = splittext(text, ";\n")
+ for(var/entry in line_entries)
+ // check if this is a simple variable (as in list(var1, var2)) or an associative one (as in list(var1="foo",var2=7))
+ var/equal_position = findtext(entry,"=")
+ // This could in theory happen if someone inserts an improper newline
+ // Let's be nice and kill it here rather then later, it'll save like 0.02 seconds if we don't need to run trims in build_cache
+ if(!equal_position)
+ continue
+ var/trim_left = TRIM_TEXT(copytext(entry,1,equal_position))
- if(equal_position && !isnum(left_constant))
// Associative var, so do the association.
// Note that numbers cannot be keys - the RHS is dropped if so.
- var/trim_right = trim_text(copytext(text, equal_position + length(text[equal_position]), position))
+ var/trim_right = TRIM_TEXT(copytext(entry, equal_position + length(entry[equal_position])))
var/right_constant = parse_constant(trim_right)
- .[left_constant] = right_constant
+ .[trim_left] = right_constant
+ else
+ var/position
+ var/old_position = 1
+ while(position != 0)
+ // find next delimiter that is not within "..."
+ position = find_next_delimiter_position(text,old_position,delimiter)
+
+ // check if this is a simple variable (as in list(var1, var2)) or an associative one (as in list(var1="foo",var2=7))
+ var/equal_position = findtext(text,"=",old_position, position)
+ var/trim_left = TRIM_TEXT(copytext(text,old_position,(equal_position ? equal_position : position)))
+ var/left_constant = parse_constant(trim_left)
+ if(position)
+ old_position = position + length(text[position])
+ if(!left_constant) // damn newlines man. Exists to provide behavior consistency with the above loop. not a major cost becuase this path is cold
+ continue
- else // simple var
- . += list(left_constant)
+ if(equal_position && !isnum(left_constant))
+ // Associative var, so do the association.
+ // Note that numbers cannot be keys - the RHS is dropped if so.
+ var/trim_right = TRIM_TEXT(copytext(text, equal_position + length(text[equal_position]), position))
+ var/right_constant = parse_constant(trim_right)
+ .[left_constant] = right_constant
+ else // simple var
+ . += list(left_constant)
/datum/parsed_map/proc/parse_constant(text)
// number
@@ -467,7 +606,10 @@
// string
if(text[1] == "\"")
- return copytext(text, length(text[1]) + 1, findtext(text, "\"", length(text[1]) + 1))
+ // insert implied locate \" and length("\"") here
+ // It's a minimal timesave but it is a timesave
+ // Safe becuase we're guarenteed trimmed constants
+ return copytext(text, 2, -1)
// list
if(copytext(text, 1, 6) == "list(")//6 == length("list(") + 1
@@ -495,7 +637,8 @@
/datum/parsed_map/Destroy()
..()
- turf_blacklist.Cut()
+ if(turf_blacklist)
+ turf_blacklist.Cut()
parsed_bounds.Cut()
bounds.Cut()
grid_models.Cut()
diff --git a/code/modules/mentor/verbs/mentorhelp.dm b/code/modules/mentor/verbs/mentorhelp.dm
index 0099d7eb20e5..a81ec907320c 100644
--- a/code/modules/mentor/verbs/mentorhelp.dm
+++ b/code/modules/mentor/verbs/mentorhelp.dm
@@ -23,7 +23,7 @@
//spam prevention, 60 second delay
remove_verb(src, /client/verb/mentorhelp)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/add_verb, src, /client/verb/mentorhelp), 1 MINUTES, TIMER_STOPPABLE)
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(add_verb), src, /client/verb/mentorhelp), 1 MINUTES, TIMER_STOPPABLE)
/proc/get_mentor_counts()
. = list("total" = 0, "afk" = 0, "present" = 0)
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index f36c7c441bad..8cf62d92abd4 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -33,8 +33,8 @@
/obj/item/kinetic_crusher/Initialize()
. = ..()
- RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
- RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
/obj/item/kinetic_crusher/ComponentInitialize()
. = ..()
@@ -111,7 +111,7 @@
D.fire()
charged = FALSE
update_appearance()
- 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
@@ -352,7 +352,7 @@
/obj/item/crusher_trophy/magma_wing/on_mark_detonation(mob/living/target, mob/living/user)
deadly_shot = TRUE
- addtimer(CALLBACK(src, .proc/reset_deadly_shot), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
+ addtimer(CALLBACK(src, PROC_REF(reset_deadly_shot)), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
/obj/item/crusher_trophy/magma_wing/proc/reset_deadly_shot()
deadly_shot = FALSE
@@ -405,7 +405,7 @@
/obj/item/crusher_trophy/watcher_wing_forgotten/on_mark_detonation(mob/living/target, mob/living/user)
deadly_shot = TRUE
- addtimer(CALLBACK(src, .proc/reset_deadly_shot), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
+ addtimer(CALLBACK(src, PROC_REF(reset_deadly_shot)), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
/obj/item/crusher_trophy/watcher_wing_forgotten/proc/reset_deadly_shot()
deadly_shot = FALSE
@@ -538,7 +538,7 @@
continue
playsound(L, 'sound/magic/fireball.ogg', 20, TRUE)
new /obj/effect/temp_visual/fire(L.loc)
- addtimer(CALLBACK(src, .proc/pushback, L, user), 1) //no free backstabs, we push AFTER module stuff is done
+ addtimer(CALLBACK(src, PROC_REF(pushback), L, user), 1) //no free backstabs, we push AFTER module stuff is done
L.adjustFireLoss(bonus_value, forced = TRUE)
/obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user)
@@ -572,7 +572,7 @@
continue
playsound(L, 'sound/magic/fireball.ogg', 20, TRUE)
new /obj/effect/temp_visual/fire(L.loc)
- addtimer(CALLBACK(src, .proc/pushback, L, user), 1) //no free backstabs, we push AFTER module stuff is done
+ addtimer(CALLBACK(src, PROC_REF(pushback), L, user), 1) //no free backstabs, we push AFTER module stuff is done
L.adjustFireLoss(bonus_value, forced = TRUE)
/obj/item/crusher_trophy/ash_spike/proc/pushback(mob/living/target, mob/living/user)
@@ -640,7 +640,7 @@
/obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user)
deadly_shot = TRUE
- addtimer(CALLBACK(src, .proc/reset_deadly_shot), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
+ addtimer(CALLBACK(src, PROC_REF(reset_deadly_shot)), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
/obj/item/crusher_trophy/blaster_tubes/proc/reset_deadly_shot()
deadly_shot = FALSE
diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm
index b8240b34ddd2..bf0877262923 100644
--- a/code/modules/mining/equipment/regenerative_core.dm
+++ b/code/modules/mining/equipment/regenerative_core.dm
@@ -35,7 +35,7 @@
/obj/item/organ/regenerative_core/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/inert_check), 2400)
+ addtimer(CALLBACK(src, PROC_REF(inert_check)), 2400)
/obj/item/organ/regenerative_core/proc/inert_check()
if(!preserved)
@@ -142,7 +142,7 @@
update_appearance()
/obj/item/organ/regenerative_core/update_icon_state()
- icon_state = inert ? "legion_soul_inert" : "legion_soul"
+ icon_state = inert ? "[icon_state]_inert" : "[icon_state]"
return ..()
/obj/item/organ/regenerative_core/update_overlays()
@@ -162,6 +162,7 @@
/obj/item/organ/regenerative_core/legion/crystal
name = "crystal heart"
desc = "A strange rock in the shape of a heart symbol. Applying will repair your body with crystals, but may have additional side effects. It seems it can't survive for very long outside a host."
+ icon_state = "crystal_heart"
crackle_animation = FALSE
/obj/item/organ/regenerative_core/legion/crystal/Initialize()
@@ -191,7 +192,6 @@
qdel(src)
/obj/item/organ/regenerative_core/legion/crystal/update_icon_state()
- icon_state = inert ? "crystal_heart_inert" : "crystal_heart"
if(preserved)
icon_state = "crystal_heart_preserved"
return ..()
diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm
index 9e911966f023..ce299cea1c71 100644
--- a/code/modules/mining/equipment/resonator.dm
+++ b/code/modules/mining/equipment/resonator.dm
@@ -73,7 +73,7 @@
transform = matrix()*0.75
animate(src, transform = matrix()*1.5, time = duration)
deltimer(timerid)
- timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE)
+ timerid = addtimer(CALLBACK(src, PROC_REF(burst)), duration, TIMER_STOPPABLE)
/obj/effect/temp_visual/resonance/Destroy()
if(res)
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
index 1e281e2f856d..9c989b986a33 100644
--- a/code/modules/mining/equipment/wormhole_jaunter.dm
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -99,4 +99,4 @@
L.Paralyze(60)
if(ishuman(L))
shake_camera(L, 20, 1)
- addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living/carbon, vomit)), 20)
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index d88bddc3188c..cc90920f96a7 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -53,7 +53,7 @@
name = harvested_name
desc = harvested_desc
harvested = TRUE
- addtimer(CALLBACK(src, .proc/regrow), rand(regrowth_time_low, regrowth_time_high))
+ addtimer(CALLBACK(src, PROC_REF(regrow)), rand(regrowth_time_low, regrowth_time_high))
return 1
/obj/structure/flora/ash/proc/regrow()
@@ -496,7 +496,7 @@
name = harvested_name
desc = harvested_desc
harvested = TRUE
- addtimer(CALLBACK(src, .proc/regrow), rand(regrowth_time_low, regrowth_time_high))
+ addtimer(CALLBACK(src, PROC_REF(regrow)), rand(regrowth_time_low, regrowth_time_high))
return 1
/obj/structure/flora/ash/glowshroom
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 698e0a2dae25..a291811d5e83 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -393,7 +393,7 @@
/obj/effect/wisp/orbit(atom/thing, radius, clockwise, rotation_speed, rotation_segments, pre_rotation, lockinorbit)
. = ..()
if(ismob(thing))
- RegisterSignal(thing, COMSIG_MOB_UPDATE_SIGHT, .proc/update_user_sight)
+ RegisterSignal(thing, COMSIG_MOB_UPDATE_SIGHT, PROC_REF(update_user_sight))
var/mob/being = thing
being.update_sight()
to_chat(thing, "The wisp enhances your vision.")
@@ -630,7 +630,7 @@
can_destroy = FALSE
- addtimer(CALLBACK(src, .proc/unvanish, user), 15 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(unvanish), user), 15 SECONDS)
/obj/effect/immortality_talisman/proc/unvanish(mob/user)
user.status_flags &= ~GODMODE
@@ -865,7 +865,7 @@
if(ismovable(hit_atom) && !caught && (!thrown_by || thrown_by && COOLDOWN_FINISHED(src, freeze_cooldown)))
freeze(hit_atom)
if(thrown_by && !caught)
- addtimer(CALLBACK(src, /atom/movable.proc/throw_at, thrown_by, throw_range+2, throw_speed, null, TRUE), 1)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, throw_at), thrown_by, throw_range+2, throw_speed, null, TRUE), 1)
/obj/item/freeze_cube/proc/freeze(atom/movable/hit_atom)
playsound(src, 'sound/effects/glassbr3.ogg', 50, TRUE)
@@ -904,8 +904,8 @@
. = ..()
if(slot == ITEM_SLOT_GLOVES)
tool_behaviour = TOOL_MINING
- RegisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, .proc/rocksmash)
- RegisterSignal(user, COMSIG_MOVABLE_BUMP, .proc/rocksmash)
+ RegisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(rocksmash))
+ RegisterSignal(user, COMSIG_MOVABLE_BUMP, PROC_REF(rocksmash))
else
stopmining(user)
@@ -1520,7 +1520,7 @@
/obj/item/mayhem/attack_self(mob/user)
for(var/mob/living/carbon/human/H in range(7,user))
var/obj/effect/mine/pickup/bloodbath/B = new(H)
- INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, H)
+ INVOKE_ASYNC(B, TYPE_PROC_REF(/obj/effect/mine/pickup/bloodbath, mineEffect), H)
to_chat(user, "You shatter the bottle!")
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, TRUE)
message_admins("[ADMIN_LOOKUPFLW(user)] has activated a bottle of mayhem!")
@@ -1636,11 +1636,11 @@
calculate_anger_mod(user)
timer = world.time + CLICK_CD_MELEE //by default, melee attacks only cause melee blasts, and have an accordingly short cooldown
if(proximity_flag)
- INVOKE_ASYNC(src, .proc/aoe_burst, T, user)
+ INVOKE_ASYNC(src, PROC_REF(aoe_burst), T, user)
log_combat(user, target, "fired 3x3 blast at", src)
else
if(ismineralturf(target) && get_dist(user, target) < 6) //target is minerals, we can hit it(even if we can't see it)
- INVOKE_ASYNC(src, .proc/cardinal_blasts, T, user)
+ INVOKE_ASYNC(src, PROC_REF(cardinal_blasts), T, user)
timer = world.time + cooldown_time
else if(target in view(5, get_turf(user))) //if the target is in view, hit it
timer = world.time + cooldown_time
@@ -1651,12 +1651,12 @@
C.monster_damage_boost = FALSE
log_combat(user, target, "fired a chaser at", src)
else
- INVOKE_ASYNC(src, .proc/cardinal_blasts, T, user) //otherwise, just do cardinal blast
+ INVOKE_ASYNC(src, PROC_REF(cardinal_blasts), T, user) //otherwise, just do cardinal blast
log_combat(user, target, "fired cardinal blast at", src)
else
to_chat(user, "That target is out of range!" )
timer = world.time
- INVOKE_ASYNC(src, .proc/prepare_icon_update)
+ INVOKE_ASYNC(src, PROC_REF(prepare_icon_update))
/obj/item/hierophant_club/proc/calculate_anger_mod(mob/user) //we get stronger as the user loses health
chaser_cooldown = initial(chaser_cooldown)
@@ -1695,7 +1695,7 @@
user.visible_message("[user] starts fiddling with [src]'s pommel...", \
"You start detaching the hierophant beacon...")
timer = world.time + 51
- INVOKE_ASYNC(src, .proc/prepare_icon_update)
+ INVOKE_ASYNC(src, PROC_REF(prepare_icon_update))
if(do_after(user, 50, target = user) && !beacon)
var/turf/T = get_turf(user)
playsound(T,'sound/magic/blind.ogg', 200, TRUE, -4)
@@ -1707,7 +1707,7 @@
You can remove the beacon to place it again by striking it with the club.")
else
timer = world.time
- INVOKE_ASYNC(src, .proc/prepare_icon_update)
+ INVOKE_ASYNC(src, PROC_REF(prepare_icon_update))
else
to_chat(user, "You need to be on solid ground to detach the beacon!")
return
@@ -1725,7 +1725,7 @@
user.update_action_buttons_icon()
user.visible_message("[user] starts to glow faintly...")
timer = world.time + 50
- INVOKE_ASYNC(src, .proc/prepare_icon_update)
+ INVOKE_ASYNC(src, PROC_REF(prepare_icon_update))
beacon.icon_state = "hierophant_tele_on"
var/obj/effect/temp_visual/hierophant/telegraph/edge/TE1 = new /obj/effect/temp_visual/hierophant/telegraph/edge(user.loc)
var/obj/effect/temp_visual/hierophant/telegraph/edge/TE2 = new /obj/effect/temp_visual/hierophant/telegraph/edge(beacon.loc)
@@ -1737,7 +1737,7 @@
to_chat(user, "The beacon is blocked by something, preventing teleportation!")
user.update_action_buttons_icon()
timer = world.time
- INVOKE_ASYNC(src, .proc/prepare_icon_update)
+ INVOKE_ASYNC(src, PROC_REF(prepare_icon_update))
beacon.icon_state = "hierophant_tele_off"
return
new /obj/effect/temp_visual/hierophant/telegraph(T, user)
@@ -1749,7 +1749,7 @@
if(user)
user.update_action_buttons_icon()
timer = world.time
- INVOKE_ASYNC(src, .proc/prepare_icon_update)
+ INVOKE_ASYNC(src, PROC_REF(prepare_icon_update))
if(beacon)
beacon.icon_state = "hierophant_tele_off"
return
@@ -1758,7 +1758,7 @@
to_chat(user, "The beacon is blocked by something, preventing teleportation!")
user.update_action_buttons_icon()
timer = world.time
- INVOKE_ASYNC(src, .proc/prepare_icon_update)
+ INVOKE_ASYNC(src, PROC_REF(prepare_icon_update))
beacon.icon_state = "hierophant_tele_off"
return
user.log_message("teleported self from [AREACOORD(source)] to [beacon]", LOG_GAME)
@@ -1771,7 +1771,7 @@
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies
B.damage = 30
for(var/mob/living/L in range(1, source))
- INVOKE_ASYNC(src, .proc/teleport_mob, source, L, T, user) //regardless, take all mobs near us along
+ INVOKE_ASYNC(src, PROC_REF(teleport_mob), source, L, T, user) //regardless, take all mobs near us along
sleep(6) //at this point the blasts detonate
if(beacon)
beacon.icon_state = "hierophant_tele_off"
@@ -1779,7 +1779,7 @@
qdel(TE1)
qdel(TE2)
timer = world.time
- INVOKE_ASYNC(src, .proc/prepare_icon_update)
+ INVOKE_ASYNC(src, PROC_REF(prepare_icon_update))
if(beacon)
beacon.icon_state = "hierophant_tele_off"
teleporting = FALSE
@@ -1820,7 +1820,7 @@
B.damage = HIEROPHANT_CLUB_CARDINAL_DAMAGE
B.monster_damage_boost = FALSE
for(var/d in GLOB.cardinals)
- INVOKE_ASYNC(src, .proc/blast_wall, T, d, user)
+ INVOKE_ASYNC(src, PROC_REF(blast_wall), T, d, user)
/obj/item/hierophant_club/proc/blast_wall(turf/T, dir, mob/living/user) //make a wall of blasts blast_range tiles long
if(!T)
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 6ac92bd75e34..10f43aad4580 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -24,7 +24,7 @@
/obj/machinery/mineral/proc/register_input_turf()
input_turf = get_step(src, input_dir)
if(input_turf) // make sure there is actually a turf
- RegisterSignal(input_turf, COMSIG_ATOM_ENTERED, .proc/pickup_item)
+ RegisterSignal(input_turf, COMSIG_ATOM_ENTERED, PROC_REF(pickup_item))
/// Unregisters signals that are registered the machine's input turf, if it has one.
/obj/machinery/mineral/proc/unregister_input_turf()
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 67379f1df8b5..ec971ed84bed 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -332,7 +332,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
else
user.visible_message("[user] strikes \the [src], causing a chain reaction!", "You strike \the [src], causing a chain reaction.")
log_bomber(user, "has primed a", src, "for detonation", notify_admins)
- det_timer = addtimer(CALLBACK(src, .proc/detonate, notify_admins), det_time, TIMER_STOPPABLE)
+ det_timer = addtimer(CALLBACK(src, PROC_REF(detonate), notify_admins), det_time, TIMER_STOPPABLE)
/obj/item/gibtonite/proc/detonate(notify_admins)
if(primed)
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 6f37de4c4c77..d7865c9d2276 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -291,6 +291,12 @@
if(auth_check)
return
+ if(!client.prefs.randomise[RANDOM_NAME]) // do they have random names enabled
+ var/name = client.prefs.real_name
+ if(GLOB.real_names_joined.Find(name)) // is there someone who spawned with the same name
+ to_chat(usr, "Someone has spawned with this name already.")
+ return FALSE
+
var/error = IsJobUnavailable(job, ship, check_playtime)
if(error != JOB_AVAILABLE)
alert(src, get_job_unavailable_error_message(error, job))
@@ -398,6 +404,7 @@
close_spawn_windows()
var/mob/living/carbon/human/H = new(loc)
+ GLOB.joined_player_list += ckey
var/frn = CONFIG_GET(flag/force_random_names)
var/admin_anon_names = SSticker.anonymousnames
@@ -418,6 +425,7 @@
is_antag = TRUE
client.prefs.copy_to(H, antagonist = is_antag)
+ update_names_joined_list(H.real_name)
H.dna.update_dna_identity()
if(mind)
if(transfer_after)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
index 443f13c6917f..afe97c858cff 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
@@ -54,7 +54,7 @@
var/gender_specific //Something that can be worn by either gender, but looks different on each
var/use_static //determines if the accessory will be skipped by color preferences
var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
- var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears.
+ var/secondary_color //Decides if this sprite has a secondary color in use.
var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects
var/center = FALSE //Should we center the sprite?
var/limbs_id //The limbs id supplied for full-body replacing features.
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
index 36b2f4d91dab..8b0ec1d6f79d 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
@@ -11,13 +11,13 @@
icon = 'icons/mob/species/misc/cat.dmi'
name = "Cat"
icon_state = "cat"
- hasinner = 1
+ secondary_color = TRUE
color_src = HAIR
/datum/sprite_accessory/ears/cat/slime
name = "Slimecat"
icon_state = "cat"
- hasinner = FALSE
+ secondary_color = FALSE
color_src = HAIR
image_alpha = 150
@@ -25,11 +25,11 @@
icon = 'icons/mob/species/misc/fox.dmi'
name = "Fox"
icon_state = "fox"
- hasinner = 1
+ secondary_color = TRUE
color_src = HAIR
/datum/sprite_accessory/ears/elf
name = "Elf"
icon_state = "elf"
- hasinner = FALSE
+ secondary_color = FALSE
color_src = SKINCOLORS
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair.dm
index 95f937811444..af774d9b055b 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair.dm
@@ -198,10 +198,6 @@
name = "Crewcut"
icon_state = "hair_crewcut"
-/datum/sprite_accessory/hair/curls
- name = "Curls"
- icon_state = "hair_curls"
-
/datum/sprite_accessory/hair/cut
name = "Cut Hair"
icon_state = "hair_c"
@@ -330,10 +326,6 @@
name = "Hime Cut"
icon_state = "hair_himecut"
-/datum/sprite_accessory/hair/himecut2
- name = "Hime Cut 2"
- icon_state = "hair_himecut2"
-
/datum/sprite_accessory/hair/shorthime
name = "Hime Cut (Short)"
icon_state = "hair_shorthime"
@@ -378,10 +370,6 @@
name = "Long Hair 2"
icon_state = "hair_long2"
-/datum/sprite_accessory/hair/long3
- name = "Long Hair 3"
- icon_state = "hair_long3"
-
/datum/sprite_accessory/hair/long_over_eye
name = "Long Over Eye"
icon_state = "hair_longovereye"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/lizard.dm b/code/modules/mob/dead/new_player/sprite_accessories/lizard.dm
index e18e88353061..ce536a403e48 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/lizard.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/lizard.dm
@@ -172,7 +172,7 @@
/datum/sprite_accessory/frills/ears
name = "Normal ears"
icon_state = "ears"
- hasinner = TRUE
+ secondary_color = TRUE
//End ears
/datum/sprite_accessory/frills/simple
name = "Simple"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/rachnid.dm b/code/modules/mob/dead/new_player/sprite_accessories/rachnid.dm
index 1e60fd1d7ab5..d34b915e3e35 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/rachnid.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/rachnid.dm
@@ -4,52 +4,37 @@
/datum/sprite_accessory/spider_legs
icon = 'icons/mob/species/rachnid/spider_legs.dmi'
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/spider_legs/plain
- name = "Plain"
- icon_state = "plain"
+ color_src = 0
+ secondary_color = TRUE
-/datum/sprite_accessory/spider_legs/fuzzy
- name = "Fuzzy"
- icon_state = "fuzzy"
-
-/datum/sprite_accessory/spider_legs/spiky
- name = "Spiky"
- icon_state = "spiky"
+/datum/sprite_accessory/spider_legs/carapace
+ name = "Carapace"
+ icon_state = "carapace"
//Start spinner
/datum/sprite_accessory/spider_spinneret
icon = 'icons/mob/species/rachnid/spider_spinneret.dmi'
color_src = MUTCOLORS
+ secondary_color = TRUE
-/datum/sprite_accessory/spider_spinneret/plain
- name = "Plain"
- icon_state = "plain"
-
-/datum/sprite_accessory/spider_spinneret/fuzzy
- name = "Fuzzy"
- icon_state = "fuzzy"
+/datum/sprite_accessory/spider_spinneret/spikecore
+ name = "Spikecore"
+ icon_state = "spikecore"
-/datum/sprite_accessory/spider_spinneret/black_widow
- name = "Black Widow"
- icon_state = "blackwidow"
-
-//Start mandible
-
-/datum/sprite_accessory/spider_mandibles
- icon = 'icons/mob/species/rachnid/spider_mandibles.dmi'
- color_src = MUTCOLORS
+/datum/sprite_accessory/spider_spinneret/cerberus
+ name = "Cerberus"
+ icon_state = "cerberus"
-/datum/sprite_accessory/spider_mandibles/plain
- name = "Plain"
- icon_state = "plain"
+/datum/sprite_accessory/spider_spinneret/queen
+ name = "Queen"
+ icon_state = "queen"
-/datum/sprite_accessory/spider_mandibles/fuzzy
- name = "Fuzzy"
- icon_state = "fuzzy"
+/datum/sprite_accessory/spider_spinneret/folds
+ name = "Folds"
+ icon_state = "folds"
+ secondary_color = FALSE
-/datum/sprite_accessory/spider_mandibles/spiky
- name = "Spiky"
- icon_state = "spiky"
+/datum/sprite_accessory/spider_spinneret/prongs
+ name = "Prongs"
+ icon_state = "prongs"
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index dca421b8736d..5d8c44bbc188 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -156,7 +156,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
var/old_color = color
color = "#960000"
animate(src, color = old_color, time = 10, flags = ANIMATION_PARALLEL)
- addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 10)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 10)
/mob/dead/observer/Destroy()
// Update our old body's medhud since we're abandoning it
@@ -662,14 +662,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
target.faction = list("neutral")
return TRUE
-//this is a mob verb instead of atom for performance reasons
-//see /mob/verb/examinate() in mob.dm for more info
-//overridden here and in /mob/living for different point span classes and sanity checks
-/mob/dead/observer/pointed(atom/A as mob|obj|turf in view(client.view, src))
+/mob/dead/observer/_pointed(atom/pointed_at)
if(!..())
return FALSE
- usr.visible_message("[src] points to [A].")
- return TRUE
+
+ usr.visible_message("[src] points to [pointed_at].")
/mob/dead/observer/verb/view_manifest()
set name = "View Crew Manifest"
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 85a3fd324809..de07b3d4f0fd 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -431,6 +431,10 @@
set name = "quick-equip"
set hidden = TRUE
+ DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(execute_quick_equip)))
+
+///proc extender of [/mob/verb/quick_equip] used to make the verb queuable if the server is overloaded
+/mob/proc/execute_quick_equip()
var/obj/item/I = get_active_held_item()
if (I)
I.equip_to_best_slot(src)
@@ -439,6 +443,9 @@
set name = "equipment-swap"
set hidden = TRUE
+ DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(execute_equipment_swap)))
+
+/mob/proc/execute_equipment_swap()
var/obj/item/I = get_active_held_item()
if (I)
if(!do_after(src, 1 SECONDS, target = I))
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index a986fc5be298..aec75960989d 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -9,7 +9,7 @@
return
else
bleedsuppress = TRUE
- addtimer(CALLBACK(src, .proc/resume_bleeding), amount)
+ addtimer(CALLBACK(src, PROC_REF(resume_bleeding)), amount)
/mob/living/carbon/human/proc/resume_bleeding()
bleedsuppress = 0
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index 6aaa361b0bfb..bc0f3849360f 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -38,7 +38,7 @@
C.regenerate_icons()
notransform = TRUE
- INVOKE_ASYNC(src, .proc/bloodpool_sink, B)
+ INVOKE_ASYNC(src, PROC_REF(bloodpool_sink), B)
return TRUE
@@ -155,7 +155,7 @@
newcolor = rgb(43, 186, 0)
add_atom_colour(newcolor, TEMPORARY_COLOUR_PRIORITY)
// but only for a few seconds
- addtimer(CALLBACK(src, /atom/.proc/remove_atom_colour, TEMPORARY_COLOUR_PRIORITY, newcolor), 6 SECONDS)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, remove_atom_colour), TEMPORARY_COLOUR_PRIORITY, newcolor), 6 SECONDS)
/mob/living/proc/phasein(obj/effect/decal/cleanable/B)
if(notransform)
diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm
index 06bc7e0bc886..1cba16cc0a9a 100644
--- a/code/modules/mob/living/brain/posibrain.dm
+++ b/code/modules/mob/living/brain/posibrain.dm
@@ -58,7 +58,7 @@ GLOBAL_VAR(posibrain_notify_cooldown)
next_ask = world.time + askDelay
searching = TRUE
update_appearance()
- addtimer(CALLBACK(src, .proc/check_success), askDelay)
+ addtimer(CALLBACK(src, PROC_REF(check_success)), askDelay)
/obj/item/mmi/posibrain/AltClick(mob/living/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 186dedcc86d5..5163821a9573 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -103,7 +103,7 @@
leaping = 1
weather_immunities += "lava"
update_icons()
- throw_at(leap_target, MAX_ALIEN_LEAP_DIST, 2, src, FALSE, TRUE, callback = CALLBACK(src, .proc/leap_end))
+ throw_at(leap_target, MAX_ALIEN_LEAP_DIST, 2, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(leap_end)))
#undef MAX_ALIEN_LEAP_DIST
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index 33e8cb7ab708..8faa15b83929 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -137,7 +137,7 @@
recent_queen_death = 1
owner.throw_alert("alien_noqueen", /atom/movable/screen/alert/alien_vulnerable)
- addtimer(CALLBACK(src, .proc/clear_queen_death), QUEEN_DEATH_DEBUFF_DURATION)
+ addtimer(CALLBACK(src, PROC_REF(clear_queen_death)), QUEEN_DEATH_DEBUFF_DURATION)
/obj/item/organ/alien/hivenode/proc/clear_queen_death()
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index b2020b3b9c71..49ff1e88937b 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -49,7 +49,7 @@
/obj/item/organ/body_egg/alien_embryo/egg_process()
if(stage < 5 && prob(3))
stage++
- INVOKE_ASYNC(src, .proc/RefreshInfectionImage)
+ INVOKE_ASYNC(src, PROC_REF(RefreshInfectionImage))
if(stage == 5 && prob(50))
for(var/datum/surgery/S in owner.surgeries)
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 39958b84fc0d..a9caeba37208 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -206,7 +206,7 @@
if(!facehugger_mob.sterile)
target.take_bodypart_damage(brute = facehugger_mob.melee_damage_upper)
target.Unconscious(facehugger_mob.pregnation_time)
- addtimer(CALLBACK(src, .proc/Impregnate, target), facehugger_mob.pregnation_time)
+ addtimer(CALLBACK(src, PROC_REF(Impregnate), target), facehugger_mob.pregnation_time)
COOLDOWN_START(facehugger_mob, coupling_cooldown, facehugger_mob.couple_retry_time)
/**
diff --git a/code/modules/mob/living/carbon/alien/utilities/structures.dm b/code/modules/mob/living/carbon/alien/utilities/structures.dm
index 3ebba3ed7958..0ac30d207a41 100644
--- a/code/modules/mob/living/carbon/alien/utilities/structures.dm
+++ b/code/modules/mob/living/carbon/alien/utilities/structures.dm
@@ -195,7 +195,7 @@
check_weed = new(check_turf)
//set the new one's parent node to our parent node
check_weed.parent_node = parent_node
- check_weed.RegisterSignal(parent_node, COMSIG_PARENT_QDELETING, .proc/after_parent_destroyed)
+ check_weed.RegisterSignal(parent_node, COMSIG_PARENT_QDELETING, PROC_REF(after_parent_destroyed))
/**
* Called when the parent node is destroyed
@@ -203,7 +203,7 @@
/obj/structure/alien/weeds/proc/after_parent_destroyed()
if(!find_new_parent())
var/random_time = rand(2 SECONDS, 8 SECONDS)
- addtimer(CALLBACK(src, .proc/do_qdel), random_time)
+ addtimer(CALLBACK(src, PROC_REF(do_qdel)), random_time)
/**
* Called when trying to find a new parent after our previous parent died
@@ -218,7 +218,7 @@
continue
parent_node = new_parent
- RegisterSignal(parent_node, COMSIG_PARENT_QDELETING, .proc/after_parent_destroyed)
+ RegisterSignal(parent_node, COMSIG_PARENT_QDELETING, PROC_REF(after_parent_destroyed))
return parent_node
return FALSE
@@ -319,7 +319,7 @@
if(status == GROWING || status == GROWN)
child = new(src)
if(status == GROWING)
- addtimer(CALLBACK(src, .proc/Grow), GROWTH_TIME)
+ addtimer(CALLBACK(src, PROC_REF(Grow)), GROWTH_TIME)
proximity_monitor = new(src, status == GROWN ? 1 : 0)
if(status == BURST)
obj_integrity = integrity_failure * max_integrity
@@ -375,7 +375,7 @@
proximity_monitor.set_range(0)
update_appearance()
flick("egg_opening", src)
- addtimer(CALLBACK(src, .proc/finish_bursting, kill), 15)
+ addtimer(CALLBACK(src, PROC_REF(finish_bursting), kill), 15)
/obj/structure/alien/egg/proc/finish_bursting(kill = TRUE)
if(child)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 84f67c8f8814..82c27e95174b 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -399,7 +399,7 @@
switch(rand(1,100)+modifier) //91-100=Nothing special happens
if(-INFINITY to 0) //attack yourself
- INVOKE_ASYNC(I, /obj/item.proc/attack, src, src)
+ INVOKE_ASYNC(I, TYPE_PROC_REF(/obj/item, attack), src, src)
if(1 to 30) //throw it at yourself
I.throw_impact(src)
if(31 to 60) //Throw object in facing direction
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index a99baf1baf54..df9b5c22704d 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -248,7 +248,7 @@
target.visible_message("[name] kicks [target.name] onto [target.p_their()] side!",
"You're kicked onto your side by [name]!", "You hear aggressive shuffling followed by a loud thud!", COMBAT_MESSAGE_RANGE, src)
to_chat(src, "You kick [target.name] onto [target.p_their()] side!")
- addtimer(CALLBACK(target, /mob/living/proc/SetKnockdown, 0), SHOVE_CHAIN_PARALYZE)
+ addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living, SetKnockdown), 0), SHOVE_CHAIN_PARALYZE)
log_combat(src, target, "kicks", "onto their side (paralyzing)")
if(shove_blocked && !target.is_shove_knockdown_blocked() && !target.buckled)
@@ -304,7 +304,7 @@
if(target_held_item)
target.visible_message("[target.name]'s grip on \the [target_held_item] loosens!",
"Your grip on \the [target_held_item] loosens!", null, COMBAT_MESSAGE_RANGE)
- addtimer(CALLBACK(target, /mob/living/carbon/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH)
+ addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living/carbon, clear_shove_slowdown)), SHOVE_SLOWDOWN_LENGTH)
else if(target_held_item)
target.dropItemToGround(target_held_item)
knocked_item = TRUE
@@ -374,7 +374,7 @@
jitteriness += 1000
do_jitter_animation(jitteriness)
stuttering += 2
- addtimer(CALLBACK(src, .proc/secondary_shock, should_stun), 20)
+ addtimer(CALLBACK(src, PROC_REF(secondary_shock), should_stun), 20)
return shock_damage
///Called slightly after electrocute act to reduce jittering and apply a secondary stun.
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 4da26d4406ca..2045bfe4aa18 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -25,12 +25,16 @@
update_damage_overlays()
else //no bodypart, we deal damage with a more general method.
adjustBruteLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
if(BURN)
if(BP)
if(BP.receive_damage(0, damage_amount, break_modifier))
update_damage_overlays()
else
adjustFireLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
if(TOX)
adjustToxLoss(damage_amount, forced = forced)
if(OXY)
@@ -43,6 +47,8 @@
update_damage_overlays()
else
adjustStaminaLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
return TRUE
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index 5062adbff8a1..8c1a36c2061b 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -6,7 +6,7 @@
losebreath = 0
if(!gibbed)
- INVOKE_ASYNC(src, .proc/emote, "deathgasp")
+ INVOKE_ASYNC(src, PROC_REF(emote), "deathgasp")
reagents.end_metabolization(src)
. = ..()
@@ -19,7 +19,7 @@
SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
/mob/living/carbon/proc/inflate_gib() // Plays an animation that makes mobs appear to inflate before finally gibbing
- addtimer(CALLBACK(src, .proc/gib, null, null, TRUE, TRUE), 25)
+ addtimer(CALLBACK(src, PROC_REF(gib), null, null, TRUE, TRUE), 25)
var/matrix/M = matrix()
M.Scale(1.8, 1.2)
animate(src, time = 40, transform = M, easing = SINE_EASING)
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index 3a4591fabb98..55b01d4200e2 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -26,7 +26,7 @@
var/list/key_emotes = GLOB.emote_list["blink"]
for(var/datum/emote/living/carbon/blink/living_emote in key_emotes)
// The existing timer restarts if it's already running
- blink_timer = addtimer(CALLBACK(living_emote, .proc/end_blink, living_user), BLINK_DURATION, TIMER_UNIQUE | TIMER_OVERRIDE)
+ blink_timer = addtimer(CALLBACK(living_emote, PROC_REF(end_blink), living_user), BLINK_DURATION, TIMER_UNIQUE | TIMER_OVERRIDE)
/datum/emote/living/carbon/blink/proc/end_blink(mob/living/living_user)
if(!QDELETED(living_user))
@@ -429,7 +429,7 @@
icon = 'icons/mob/animal.dmi'
icon_state = "heart"
hitsound = 'sound/effects/kiss.ogg'
- hitsound_wall = 'sound/effects/kiss.ogg'
+ hitsound_non_living = 'sound/effects/kiss.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
speed = 1.6
damage_type = BRUTE
@@ -480,7 +480,7 @@
if(2)
other_msg = "stammers softly for a moment before choking on something!"
self_msg = "You feel your tongue disappear down your throat as you fight to remember how to make words!"
- addtimer(CALLBACK(living_target, /atom/movable.proc/say, pick("Uhhh...", "O-oh, uhm...", "I- uhhhhh??", "You too!!", "What?")), rand(0.5 SECONDS, 1.5 SECONDS))
+ addtimer(CALLBACK(living_target, TYPE_PROC_REF(/atom/movable, say), pick("Uhhh...", "O-oh, uhm...", "I- uhhhhh??", "You too!!", "What?")), rand(0.5 SECONDS, 1.5 SECONDS))
living_target.stuttering += rand(5, 15)
if(3)
other_msg = "locks up with a stunned look on [living_target.p_their()] face, staring at [firer ? firer : "the ceiling"]!"
@@ -528,7 +528,7 @@
var/mob/living/owner = loc
if(!istype(owner))
return
- RegisterSignal(owner, COMSIG_PARENT_EXAMINE, .proc/ownerExamined)
+ RegisterSignal(owner, COMSIG_PARENT_EXAMINE, PROC_REF(ownerExamined))
/obj/item/circlegame/Destroy()
var/mob/owner = loc
@@ -543,7 +543,7 @@
if(!istype(sucker) || !in_range(owner, sucker))
return
- addtimer(CALLBACK(src, .proc/waitASecond, owner, sucker), 4)
+ addtimer(CALLBACK(src, PROC_REF(waitASecond), owner, sucker), 4)
/// Stage 2: Fear sets in
/obj/item/circlegame/proc/waitASecond(mob/living/owner, mob/living/sucker)
@@ -552,10 +552,10 @@
if(owner == sucker) // big mood
to_chat(owner, "Wait a second... you just looked at your own [src.name]!")
- addtimer(CALLBACK(src, .proc/selfGottem, owner), 10)
+ addtimer(CALLBACK(src, PROC_REF(selfGottem), owner), 10)
else
to_chat(sucker, "Wait a second... was that a-")
- addtimer(CALLBACK(src, .proc/GOTTEM, owner, sucker), 6)
+ addtimer(CALLBACK(src, PROC_REF(GOTTEM), owner, sucker), 6)
/// Stage 3A: We face our own failures
/obj/item/circlegame/proc/selfGottem(mob/living/owner)
diff --git a/code/modules/mob/living/carbon/hologram/em_holopads.dm b/code/modules/mob/living/carbon/hologram/em_holopads.dm
index 96947ef44326..5e0462d6f3cc 100644
--- a/code/modules/mob/living/carbon/hologram/em_holopads.dm
+++ b/code/modules/mob/living/carbon/hologram/em_holopads.dm
@@ -99,7 +99,7 @@
em_starting = TRUE
icon_state = "holopad_ringing"
calling = TRUE
- addtimer(CALLBACK(src, .proc/stop_starting), 300)
+ addtimer(CALLBACK(src, PROC_REF(stop_starting)), 300)
else
QDEL_NULL(em)
em_cooldown = TRUE
diff --git a/code/modules/mob/living/carbon/hologram/hologram.dm b/code/modules/mob/living/carbon/hologram/hologram.dm
index 840488a3c120..4283e2304fed 100644
--- a/code/modules/mob/living/carbon/hologram/hologram.dm
+++ b/code/modules/mob/living/carbon/hologram/hologram.dm
@@ -51,7 +51,7 @@
O.r_hand = null
O.l_hand = null //It would be confusing if, say, the medical hologram had a fake medkit
- INVOKE_ASYNC(src, .proc/icon_setup, O, _prefs)
+ INVOKE_ASYNC(src, PROC_REF(icon_setup), O, _prefs)
access_card = new /obj/item/card/id(src)
access_card?.access |= job_type.access //dunno how the access card would delete itself before then, but this is DM, after all
@@ -159,7 +159,7 @@
/mob/living/simple_animal/hologram/proc/disco()
color = pick(HOLOGRAM_CYCLE_COLORS)
alpha = rand(75, 180)
- addtimer(CALLBACK(src, .proc/disco, src), 5) //Call ourselves every 0.5 seconds to change color
+ addtimer(CALLBACK(src, PROC_REF(disco), src), 5) //Call ourselves every 0.5 seconds to change color
/mob/living/simple_animal/hologram/med_hud_set_health()
var/image/holder = hud_list[DIAG_HUD]
diff --git a/code/modules/mob/living/carbon/human/consistent_human.dm b/code/modules/mob/living/carbon/human/consistent_human.dm
index c28328fde590..c35d8a71759e 100644
--- a/code/modules/mob/living/carbon/human/consistent_human.dm
+++ b/code/modules/mob/living/carbon/human/consistent_human.dm
@@ -24,7 +24,6 @@
dna.features["moth_fluff"] = GLOB.moth_fluff_list[seed % length(GLOB.moth_fluff_list) + 1]
dna.features["spider_legs"] = GLOB.spider_legs_list[seed % length(GLOB.spider_legs_list) + 1]
dna.features["spider_spinneret"] = GLOB.spider_spinneret_list[seed % length(GLOB.spider_spinneret_list) + 1]
- dna.features["spider_mandibles"] = GLOB.spider_mandibles_list[seed % length(GLOB.spider_mandibles_list) + 1]
dna.features["squid_face"] = GLOB.squid_face_list[seed % length(GLOB.squid_face_list) + 1]
dna.features["kepori_feathers"] = GLOB.kepori_feathers_list[seed % length(GLOB.kepori_feathers_list) + 1]
dna.features["kepori_body_feathers"] = GLOB.kepori_body_feathers_list[seed % length(GLOB.kepori_body_feathers_list) + 1]
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index f5d37597ed84..55adc5bd5d17 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -63,7 +63,7 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift)
SSblackbox.ReportDeath(src)
log_message("has died (BRUTE: [src.getBruteLoss()], BURN: [src.getFireLoss()], TOX: [src.getToxLoss()], OXY: [src.getOxyLoss()], CLONE: [src.getCloneLoss()])", LOG_ATTACK)
if(is_devil(src))
- INVOKE_ASYNC(is_devil(src), /datum/antagonist/devil.proc/beginResurrectionCheck, src)
+ INVOKE_ASYNC(is_devil(src), TYPE_PROC_REF(/datum/antagonist/devil, beginResurrectionCheck), src)
to_chat(src, "You have died. Barring complete bodyloss, you can in most cases be revived by other players. If you do not wish to be brought back, use the \"Do Not Resuscitate\" verb in the ghost tab.")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ecd847b3b37f..8c72925e7c96 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -13,7 +13,7 @@
prepare_huds() //Prevents a nasty runtime on human init
if(dna.species)
- INVOKE_ASYNC(src, .proc/set_species, dna.species.type) //This generates new limbs based on the species, beware.
+ INVOKE_ASYNC(src, PROC_REF(set_species), dna.species.type) //This generates new limbs based on the species, beware.
//initialise organs
create_internal_organs() //most of it is done in set_species now, this is only for parent call
@@ -21,7 +21,7 @@
. = ..()
- RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, .proc/clean_face)
+ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, PROC_REF(clean_face))
AddComponent(/datum/component/personal_crafting)
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_HUMAN, 1, -6)
AddComponent(/datum/component/bloodysoles/feet)
@@ -844,7 +844,7 @@
electrocution_skeleton_anim = mutable_appearance(icon, "electrocuted_base")
electrocution_skeleton_anim.appearance_flags |= RESET_COLOR|KEEP_APART
add_overlay(electrocution_skeleton_anim)
- addtimer(CALLBACK(src, .proc/end_electrocution_animation, electrocution_skeleton_anim), anim_duration)
+ addtimer(CALLBACK(src, PROC_REF(end_electrocution_animation), electrocution_skeleton_anim), anim_duration)
else //or just do a generic animation
flick_overlay_view(image(icon,src,"electrocuted_generic",ABOVE_MOB_LAYER), src, anim_duration)
@@ -1319,7 +1319,7 @@
/mob/living/carbon/human/species/Initialize()
. = ..()
- INVOKE_ASYNC(src, .proc/set_species, race)
+ INVOKE_ASYNC(src, PROC_REF(set_species), race)
/mob/living/carbon/human/species/abductor
race = /datum/species/abductor
@@ -1413,13 +1413,6 @@
/mob/living/carbon/human/species/golem/snow
race = /datum/species/golem/snow
-
-/mob/living/carbon/human/species/golem/capitalist
- race = /datum/species/golem/capitalist
-
-/mob/living/carbon/human/species/golem/soviet
- race = /datum/species/golem/soviet
-
/mob/living/carbon/human/species/jelly
race = /datum/species/jelly
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 4f3399675f0a..eab67e22a6be 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -978,8 +978,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
S = GLOB.spider_legs_list[H.dna.features["spider_legs"]]
if("spider_spinneret")
S = GLOB.spider_spinneret_list[H.dna.features["spider_spinneret"]]
- if ("spider_mandibles")
- S = GLOB.spider_mandibles_list[H.dna.features["spider_mandibles"]]
if("kepori_body_feathers")
S = GLOB.kepori_body_feathers_list[H.dna.features["kepori_body_feathers"]]
if("kepori_tail_feathers")
@@ -1054,17 +1052,17 @@ GLOBAL_LIST_EMPTY(roundstart_races)
accessory_overlay.color = forced_colour
standing += accessory_overlay
- if(S.hasinner)
- var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer = -layer)
+ if(S.secondary_color)
+ var/mutable_appearance/secondary_color_overlay = mutable_appearance(S.icon, layer = -layer)
if(S.gender_specific)
- inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[S.icon_state]_[layertext]"
+ secondary_color_overlay.icon_state = "[g]_[bodypart]_secondary_[S.icon_state]_[layertext]"
else
- inner_accessory_overlay.icon_state = "m_[bodypart]inner_[S.icon_state]_[layertext]"
+ secondary_color_overlay.icon_state = "m_[bodypart]_secondary_[S.icon_state]_[layertext]"
if(S.center)
- inner_accessory_overlay = center_image(inner_accessory_overlay, S.dimension_x, S.dimension_y)
- inner_accessory_overlay.color = "#[H.dna.features["mcolor2"]]"
- standing += inner_accessory_overlay
+ secondary_color_overlay = center_image(secondary_color_overlay, S.dimension_x, S.dimension_y)
+ secondary_color_overlay.color = "#[H.dna.features["mcolor2"]]"
+ standing += secondary_color_overlay
H.overlays_standing[layer] = standing.Copy()
standing = list()
@@ -1467,7 +1465,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(radiation > RAD_MOB_HAIRLOSS)
if(prob(15) && !(H.hairstyle == "Bald") && (HAIR in species_traits))
to_chat(H, "Your hair starts to fall out in clumps...")
- addtimer(CALLBACK(src, .proc/go_bald, H), 50)
+ addtimer(CALLBACK(src, PROC_REF(go_bald), H), 50)
/datum/species/proc/go_bald(mob/living/carbon/human/H)
if(QDELETED(H)) //may be called from a timer
@@ -1768,6 +1766,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.update_damage_overlays()
else//no bodypart, we deal damage with a more general method.
H.adjustBruteLoss(damage_amount)
+ if(H.stat <= HARD_CRIT)
+ H.shake_animation(damage_amount)
if(BURN)
H.damageoverlaytemp = 20
var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod
@@ -1776,6 +1776,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.update_damage_overlays()
else
H.adjustFireLoss(damage_amount)
+ if(H.stat <= HARD_CRIT)
+ H.shake_animation(damage_amount)
if(TOX)
var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.tox_mod
H.adjustToxLoss(damage_amount)
@@ -1792,6 +1794,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.update_stamina()
else
H.adjustStaminaLoss(damage_amount)
+ if(H.stat <= HARD_CRIT)
+ H.shake_animation(damage_amount)
if(BRAIN)
var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount)
@@ -2233,7 +2237,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
buckled_obj.unbuckle_mob(H)
step(buckled_obj, olddir)
else
- new /datum/forced_movement(H, get_ranged_target_turf(H, olddir, 4), 1, FALSE, CALLBACK(H, /mob/living/carbon/.proc/spin, 1, 1))
+ new /datum/forced_movement(H, get_ranged_target_turf(H, olddir, 4), 1, FALSE, CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon, spin), 1, 1))
return TRUE
//UNSAFE PROC, should only be called through the Activate or other sources that check for CanFly
diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm
index 38eeeb9d9c18..dfa12f329054 100644
--- a/code/modules/mob/living/carbon/human/species_types/IPC.dm
+++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm
@@ -86,7 +86,7 @@
saved_screen = C.dna.features["ipc_screen"]
C.dna.features["ipc_screen"] = "BSOD"
C.update_body()
- addtimer(CALLBACK(src, .proc/post_death, C), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(post_death), C), 5 SECONDS)
/datum/species/ipc/proc/post_death(mob/living/carbon/C)
if(C.stat < DEAD)
@@ -218,7 +218,7 @@
H.dna.features["ipc_screen"] = "BSOD"
H.update_body()
H.say("Reactivating [pick("core systems", "central subroutines", "key functions")]...")
- addtimer(CALLBACK(src, .proc/post_revival, H), 6 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(post_revival), H), 6 SECONDS)
/datum/species/ipc/proc/post_revival(mob/living/carbon/human/H)
if(H.stat == DEAD)
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index 55217a814d35..26ed84073c99 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -17,12 +17,6 @@
var/obj/item/dullahan_relay/myhead
-
-/datum/species/dullahan/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return FALSE
-
/datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
. = ..()
H.lose_hearing_sensitivity(ORGAN_TRAIT)
@@ -122,10 +116,10 @@
return INITIALIZE_HINT_QDEL
owner = new_owner
START_PROCESSING(SSobj, src)
- RegisterSignal(owner, COMSIG_CLICK_SHIFT, .proc/examinate_check)
- RegisterSignal(src, COMSIG_ATOM_HEARER_IN_VIEW, .proc/include_owner)
- RegisterSignal(owner, COMSIG_LIVING_REGENERATE_LIMBS, .proc/unlist_head)
- RegisterSignal(owner, COMSIG_LIVING_REVIVE, .proc/retrieve_head)
+ RegisterSignal(owner, COMSIG_CLICK_SHIFT, PROC_REF(examinate_check))
+ RegisterSignal(src, COMSIG_ATOM_HEARER_IN_VIEW, PROC_REF(include_owner))
+ RegisterSignal(owner, COMSIG_LIVING_REGENERATE_LIMBS, PROC_REF(unlist_head))
+ RegisterSignal(owner, COMSIG_LIVING_REVIVE, PROC_REF(retrieve_head))
become_hearing_sensitive(ROUNDSTART_TRAIT)
/obj/item/dullahan_relay/process()
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index 2a0e8a2d62fe..a2ff92508d61 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -58,8 +58,8 @@
return
var/mob/living/carbon/human/ethereal = C
default_color = "#[ethereal.dna.features["ethcolor"]]"
- RegisterSignal(ethereal, COMSIG_ATOM_EMAG_ACT, .proc/on_emag_act)
- RegisterSignal(ethereal, COMSIG_ATOM_EMP_ACT, .proc/on_emp_act)
+ RegisterSignal(ethereal, COMSIG_ATOM_EMAG_ACT, PROC_REF(on_emag_act))
+ RegisterSignal(ethereal, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act))
ethereal_light = ethereal.mob_light()
spec_updatehealth(ethereal)
@@ -143,9 +143,9 @@
to_chat(H, "You feel the light of your body leave you.")
switch(severity)
if(EMP_LIGHT)
- addtimer(CALLBACK(src, .proc/stop_emp, H), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 10 seconds
+ addtimer(CALLBACK(src, PROC_REF(stop_emp), H), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 10 seconds
if(EMP_HEAVY)
- addtimer(CALLBACK(src, .proc/stop_emp, H), 20 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 20 seconds
+ addtimer(CALLBACK(src, PROC_REF(stop_emp), H), 20 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 20 seconds
/datum/species/ethereal/proc/on_emag_act(mob/living/carbon/human/H, mob/user)
if(emag_effect)
@@ -155,7 +155,7 @@
to_chat(user, "You tap [H] on the back with your card.")
H.visible_message("[H] starts flickering in an array of colors!")
handle_emag(H)
- addtimer(CALLBACK(src, .proc/stop_emag, H), 30 SECONDS) //Disco mode for 30 seconds! This doesn't affect the ethereal at all besides either annoying some players, or making someone look badass.
+ addtimer(CALLBACK(src, PROC_REF(stop_emag), H), 30 SECONDS) //Disco mode for 30 seconds! This doesn't affect the ethereal at all besides either annoying some players, or making someone look badass.
/datum/species/ethereal/spec_life(mob/living/carbon/human/H)
.=..()
@@ -171,7 +171,7 @@
return
current_color = pick(ETHEREAL_EMAG_COLORS)
spec_updatehealth(H)
- addtimer(CALLBACK(src, .proc/handle_emag, H), 5) //Call ourselves every 0.5 seconds to change color
+ addtimer(CALLBACK(src, PROC_REF(handle_emag), H), 5) //Call ourselves every 0.5 seconds to change color
/datum/species/ethereal/proc/stop_emag(mob/living/carbon/human/H)
emag_effect = FALSE
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 0379bca7bb34..380d91aebbe6 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -496,7 +496,7 @@
var/mob/living/carbon/human/H = owner
H.visible_message("[H] starts vibrating!", "You start charging your bluespace core...")
playsound(get_turf(H), 'sound/weapons/flash.ogg', 25, TRUE)
- addtimer(CALLBACK(src, .proc/teleport, H), 15)
+ addtimer(CALLBACK(src, PROC_REF(teleport), H), 15)
/datum/action/innate/unstable_teleport/proc/teleport(mob/living/carbon/human/H)
H.visible_message("[H] disappears in a shower of sparks!", "You teleport!")
@@ -508,7 +508,7 @@
last_teleport = world.time
UpdateButtonIcon() //action icon looks unavailable
//action icon looks available again
- addtimer(CALLBACK(src, .proc/UpdateButtonIcon), cooldown + 5)
+ addtimer(CALLBACK(src, PROC_REF(UpdateButtonIcon)), cooldown + 5)
//honk
@@ -544,7 +544,7 @@
..()
last_banana = world.time
last_honk = world.time
- RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech)
+ RegisterSignal(C, COMSIG_MOB_SAY, PROC_REF(handle_speech))
/datum/species/golem/bananium/on_species_loss(mob/living/carbon/C)
. = ..()
@@ -696,11 +696,6 @@
REMOVE_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
..()
-/datum/species/golem/cloth/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return ..()
-
/datum/species/golem/cloth/random_name(gender,unique,lastname)
var/pharaoh_name = pick("Neferkare", "Hudjefa", "Khufu", "Mentuhotep", "Ahmose", "Amenhotep", "Thutmose", "Hatshepsut", "Tutankhamun", "Ramses", "Seti", \
"Merenptah", "Djer", "Semerkhet", "Nynetjer", "Khafre", "Pepi", "Intef", "Ay") //yes, Ay was an actual pharaoh
@@ -743,7 +738,7 @@
H.forceMove(src)
cloth_golem = H
to_chat(cloth_golem, "You start gathering your life energy, preparing to rise again...")
- addtimer(CALLBACK(src, .proc/revive), revive_time)
+ addtimer(CALLBACK(src, PROC_REF(revive)), revive_time)
else
return INITIALIZE_HINT_QDEL
@@ -1049,7 +1044,7 @@
badtime.appearance_flags = RESET_COLOR
H.overlays_standing[FIRE_LAYER+0.5] = badtime
H.apply_overlay(FIRE_LAYER+0.5)
- addtimer(CALLBACK(H, /mob/living/carbon/.proc/remove_overlay, FIRE_LAYER+0.5), 25)
+ addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon, remove_overlay), FIRE_LAYER+0.5), 25)
else
playsound(get_turf(owner),'sound/magic/RATTLEMEBONES.ogg', 100)
for(var/mob/living/L in orange(7, get_turf(owner)))
@@ -1116,89 +1111,3 @@
charge_max = 15
action_icon = 'icons/obj/toy.dmi'
action_icon_state = "snowball"
-
-/datum/species/golem/capitalist
- name = "Capitalist Golem"
- id = "capitalist golem"
- prefix = "Capitalist"
- attack_verb = "monopoliz"
- special_names = list("John D. Rockefeller","Rich Uncle Pennybags","Commodore Vanderbilt","Entrepreneur","Mr. Moneybags", "Adam Smith")
- species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES)
- fixed_mut_color = null
- inherent_traits = list(TRAIT_NOFLASH,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
- info_text = "As a Capitalist Golem, your fist spreads the powerful industrializing light of capitalism."
- changesource_flags = MIRROR_BADMIN
- random_eligible = FALSE
-
- var/last_cash = 0
- var/cash_cooldown = 100
-
-/datum/species/golem/capitalist/on_species_gain(mob/living/carbon/C, datum/species/old_species)
- . = ..()
- C.equip_to_slot_or_del(new /obj/item/clothing/head/that (), ITEM_SLOT_HEAD)
- C.equip_to_slot_or_del(new /obj/item/clothing/glasses/monocle (), ITEM_SLOT_EYES)
- C.revive(full_heal = TRUE, admin_revive = FALSE)
-
- SEND_SOUND(C, sound('sound/misc/capitialism.ogg'))
- C.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock ())
- RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech)
-
-/datum/species/golem/capitalist/on_species_loss(mob/living/carbon/C)
- . = ..()
- UnregisterSignal(C, COMSIG_MOB_SAY)
- for(var/obj/effect/proc_holder/spell/aoe_turf/knock/spell in C.mob_spell_list)
- C.RemoveSpell(spell)
-
-/datum/species/golem/capitalist/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
- ..()
- if(isgolem(target))
- return
- if(target.nutrition >= NUTRITION_LEVEL_FAT)
- target.set_species(/datum/species/golem/capitalist)
- return
- target.adjust_nutrition(40)
-
-/datum/species/golem/capitalist/proc/handle_speech(datum/source, list/speech_args)
- playsound(source, 'sound/misc/mymoney.ogg', 25, FALSE)
- speech_args[SPEECH_MESSAGE] = "Hello, I like money!"
-
-/datum/species/golem/soviet
- name = "Soviet Golem"
- id = "soviet golem"
- prefix = "Comrade"
- attack_verb = "nationaliz"
- special_names = list("Stalin","Lenin","Trotsky","Marx","Comrade") //comrade comrade
- species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES)
- fixed_mut_color = null
- inherent_traits = list(TRAIT_NOFLASH, TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
- info_text = "As a Soviet Golem, your fist spreads the bright soviet light of communism."
- changesource_flags = MIRROR_BADMIN
- random_eligible = FALSE
-
-/datum/species/golem/soviet/on_species_gain(mob/living/carbon/C, datum/species/old_species)
- . = ..()
- C.equip_to_slot_or_del(new /obj/item/clothing/head/trapper (), ITEM_SLOT_HEAD)
- C.revive(full_heal = TRUE, admin_revive = FALSE)
-
- SEND_SOUND(C, sound('sound/misc/Russian_Anthem_chorus.ogg'))
- C.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock ())
- RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech)
-
-/datum/species/golem/soviet/on_species_loss(mob/living/carbon/C)
- . = ..()
- for(var/obj/effect/proc_holder/spell/aoe_turf/knock/spell in C.mob_spell_list)
- C.RemoveSpell(spell)
- UnregisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech)
-
-/datum/species/golem/soviet/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
- ..()
- if(isgolem(target))
- return
- if(target.nutrition <= NUTRITION_LEVEL_STARVING)
- target.set_species(/datum/species/golem/soviet)
- return
- target.adjust_nutrition(-40)
-
-/datum/species/golem/soviet/proc/handle_speech(datum/source, list/speech_args)
- playsound(source, 'sound/misc/Cyka Blyat.ogg', 25, FALSE)
- speech_args[SPEECH_MESSAGE] = "Cyka Blyat"
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 7dcfb31f1e8a..eb78ef131644 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -750,8 +750,8 @@
var/datum/action/innate/linked_speech/action = new(src)
linked_actions.Add(action)
action.Grant(M)
- RegisterSignal(M, COMSIG_MOB_DEATH , .proc/unlink_mob)
- RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/unlink_mob)
+ RegisterSignal(M, COMSIG_MOB_DEATH , PROC_REF(unlink_mob))
+ RegisterSignal(M, COMSIG_PARENT_QDELETING, PROC_REF(unlink_mob))
return TRUE
/datum/species/jelly/stargazer/proc/unlink_mob(mob/living/M)
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index f54c9dff634d..6e4ae1cdb9a3 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -32,11 +32,6 @@
else if (light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) //heal in the dark
H.heal_overall_damage(1,1, 0, BODYTYPE_ORGANIC)
-/datum/species/shadow/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return ..()
-
/datum/species/shadow/nightmare
name = "Nightmare"
id = "nightmare"
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index caa36764a1ff..920115f52c02 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -23,11 +23,6 @@
species_l_leg = /obj/item/bodypart/leg/left/skeleton
species_r_leg = /obj/item/bodypart/leg/right/skeleton
-/datum/species/skeleton/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return ..()
-
//Can still metabolize milk through meme magic
/datum/species/skeleton/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.type == /datum/reagent/consumable/milk)
diff --git a/code/modules/mob/living/carbon/human/species_types/spider.dm b/code/modules/mob/living/carbon/human/species_types/spider.dm
index 84faffde6ca2..f7ae4f6bef10 100644
--- a/code/modules/mob/living/carbon/human/species_types/spider.dm
+++ b/code/modules/mob/living/carbon/human/species_types/spider.dm
@@ -45,8 +45,8 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt"))
default_color = "00FF00"
species_traits = list(LIPS, NOEYESPRITES, MUTCOLORS_PARTSONLY)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
- mutant_bodyparts = list("spider_legs", "spider_spinneret", "spider_mandibles")
- default_features = list("spider_legs" = "Plain", "spider_spinneret" = "Plain", "spider_mandibles" = "Plain", "body_size" = "Normal")
+ mutant_bodyparts = list("spider_legs", "spider_spinneret")
+ default_features = list("spider_legs" = "Carapaced", "spider_spinneret" = "Plain", "body_size" = "Normal")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -187,7 +187,7 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt"))
(Press ALT+CLICK or MMB on the target to start wrapping.)")
H.adjust_nutrition(E.spinner_rate * -0.5)
addtimer(VARSET_CALLBACK(E, web_ready, TRUE), E.web_cooldown)
- RegisterSignal(H, list(COMSIG_MOB_MIDDLECLICKON, COMSIG_MOB_ALTCLICKON), .proc/cocoonAtom)
+ RegisterSignal(H, list(COMSIG_MOB_MIDDLECLICKON, COMSIG_MOB_ALTCLICKON), PROC_REF(cocoonAtom))
return
else
to_chat(H, "You're too hungry to spin web right now, eat something first!")
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index b4c9fac9db08..ebc923c01075 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -16,14 +16,6 @@
var/info_text = "You are a Vampire. You will slowly but constantly lose blood if outside of a coffin. If inside a coffin, you will slowly heal. You may gain more blood by grabbing a live victim and using your drain ability."
var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/batform //attached to the datum itself to avoid cloning memes, and other duplicates
-
-
-
-/datum/species/vampire/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return FALSE
-
/datum/species/vampire/on_species_gain(mob/living/carbon/human/C, datum/species/old_species)
. = ..()
to_chat(C, "[info_text]")
diff --git a/code/modules/mob/living/carbon/human/species_types/vox.dm b/code/modules/mob/living/carbon/human/species_types/vox.dm
index de92657cb519..e1a0107bc0ad 100644
--- a/code/modules/mob/living/carbon/human/species_types/vox.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vox.dm
@@ -139,7 +139,7 @@
/datum/action/innate/tail_hold/Grant(mob/M)
. = ..()
- RegisterSignal(owner, COMSIG_ATOM_DIR_CHANGE, .proc/handle_sprite_magic, override = TRUE)
+ RegisterSignal(owner, COMSIG_ATOM_DIR_CHANGE, PROC_REF(handle_sprite_magic), override = TRUE)
/datum/action/innate/tail_hold/Trigger()
var/mob/living/carbon/human/H = owner
@@ -156,7 +156,7 @@
if(H.temporarilyRemoveItemFromInventory(I, FALSE, FALSE))
held_item = I
to_chat(H,"You move \the [I] into your tail's grip.")
- RegisterSignal(owner, COMSIG_PARENT_EXAMINE, .proc/on_examine)
+ RegisterSignal(owner, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine))
handle_sprite_magic(force = TRUE)
return
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 8c53a6ca9a07..702adfb224a2 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -24,11 +24,6 @@
species_l_leg = /obj/item/bodypart/leg/left/zombie
species_r_leg = /obj/item/bodypart/leg/right/zombie
-/datum/species/zombie/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return ..()
-
/datum/species/zombie/infectious
name = "\improper Infectious Zombie"
id = "memezombies"
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index 832c2a375095..1f730de799d0 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -80,7 +80,7 @@
else if(istype(I, /obj/item/clothing))
var/obj/item/clothing/C = I
monkeyDrop(C)
- addtimer(CALLBACK(src, .proc/pickup_and_wear, C), 5)
+ addtimer(CALLBACK(src, PROC_REF(pickup_and_wear), C), 5)
return TRUE
// EVERYTHING ELSE
@@ -95,7 +95,7 @@
/mob/living/carbon/monkey/proc/pickup_and_wear(obj/item/clothing/C)
if(!equip_to_appropriate_slot(C))
monkeyDrop(get_item_by_slot(C)) // remove the existing item if worn
- addtimer(CALLBACK(src, .proc/equip_to_appropriate_slot, C), 5)
+ addtimer(CALLBACK(src, PROC_REF(equip_to_appropriate_slot), C), 5)
/mob/living/carbon/monkey/resist_restraints()
var/obj/item/I = null
@@ -132,7 +132,7 @@
pickupTarget = null
pickupTimer = 0
else
- INVOKE_ASYNC(src, .proc/walk2derpless, pickupTarget.loc)
+ INVOKE_ASYNC(src, PROC_REF(walk2derpless), pickupTarget.loc)
if(Adjacent(pickupTarget) || Adjacent(pickupTarget.loc)) // next to target
drop_all_held_items() // who cares about these items, i want that one!
if(isturf(pickupTarget.loc)) // on floor
@@ -144,7 +144,7 @@
if(!pickpocketing)
pickpocketing = TRUE
M.visible_message("[src] starts trying to take [pickupTarget] from [M]!", "[src] tries to take [pickupTarget]!")
- INVOKE_ASYNC(src, .proc/pickpocket, M)
+ INVOKE_ASYNC(src, PROC_REF(pickpocket), M)
return TRUE
switch(mode)
@@ -180,7 +180,7 @@
return TRUE
if(target != null)
- INVOKE_ASYNC(src, .proc/walk2derpless, target)
+ INVOKE_ASYNC(src, PROC_REF(walk2derpless), target)
// pickup any nearby weapon
if(!pickupTarget && prob(MONKEY_WEAPON_PROB))
@@ -265,7 +265,7 @@
if(target.pulledby != src && !istype(target.pulledby, /mob/living/carbon/monkey/))
- INVOKE_ASYNC(src, .proc/walk2derpless, target.loc)
+ INVOKE_ASYNC(src, PROC_REF(walk2derpless), target.loc)
if(Adjacent(target) && isturf(target.loc))
a_intent = INTENT_GRAB
@@ -278,11 +278,11 @@
frustration = 0
else if(!disposing_body)
- INVOKE_ASYNC(src, .proc/walk2derpless, bodyDisposal.loc)
+ INVOKE_ASYNC(src, PROC_REF(walk2derpless), bodyDisposal.loc)
if(Adjacent(bodyDisposal))
disposing_body = TRUE
- addtimer(CALLBACK(src, .proc/stuff_mob_in), 5)
+ addtimer(CALLBACK(src, PROC_REF(stuff_mob_in)), 5)
else
var/turf/olddist = get_dist(src, bodyDisposal)
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index e32369c360d7..b4469ea5b63c 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -17,7 +17,7 @@
if(!resisting && prob(MONKEY_RESIST_PROB))
resisting = TRUE
walk_to(src,0)
- resist()
+ execute_resist()
else if(resisting)
resisting = FALSE
else if((mode == MONKEY_IDLE && !pickupTarget && !prob(MONKEY_SHENANIGAN_PROB)) || !handle_combat())
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index 308abdb92f36..c80c9a821fd0 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -343,7 +343,7 @@ GLOBAL_LIST_EMPTY(masked_leg_icons_cache)
/mob/living/carbon/proc/update_hands_on_rotate() //Required for unconventionally placed hands on species
SIGNAL_HANDLER
if(!layered_hands) //Defined in human_defines.dm
- RegisterSignal(src, COMSIG_ATOM_DIR_CHANGE, .proc/special_update_hands)
+ RegisterSignal(src, COMSIG_ATOM_DIR_CHANGE, PROC_REF(special_update_hands))
layered_hands = TRUE
/mob/living/carbon/proc/stop_updating_hands()
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 4916d062da29..76daa5ba21d4 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -23,8 +23,12 @@
switch(damagetype)
if(BRUTE)
adjustBruteLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
if(BURN)
adjustFireLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
if(TOX)
adjustToxLoss(damage_amount, forced = forced)
if(OXY)
@@ -33,6 +37,8 @@
adjustCloneLoss(damage_amount, forced = forced)
if(STAMINA)
adjustStaminaLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
return TRUE
///like [apply_damage][/mob/living/proc/apply_damage] except it always uses the damage procs
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 7b11668db56a..56ae0db795e5 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -26,7 +26,7 @@
var/list/key_emotes = GLOB.emote_list["blush"]
for(var/datum/emote/living/blush/living_emote in key_emotes)
// The existing timer restarts if it's already running
- blush_timer = addtimer(CALLBACK(living_emote, .proc/end_blush, living_user), BLUSH_DURATION, TIMER_UNIQUE | TIMER_OVERRIDE)
+ blush_timer = addtimer(CALLBACK(living_emote, PROC_REF(end_blush), living_user), BLUSH_DURATION, TIMER_UNIQUE | TIMER_OVERRIDE)
/datum/emote/living/blush/proc/end_blush(mob/living/living_user)
if(!QDELETED(living_user))
@@ -169,7 +169,7 @@
H.CloseWings()
else
H.OpenWings()
- addtimer(CALLBACK(H, open ? /mob/living/carbon/human.proc/OpenWings : /mob/living/carbon/human.proc/CloseWings), wing_time)
+ addtimer(CALLBACK(H, open ? TYPE_PROC_REF(/mob/living/carbon/human, OpenWings) : TYPE_PROC_REF(/mob/living/carbon/human, CloseWings)), wing_time)
/datum/emote/living/flap/aflap
key = "aflap"
@@ -417,7 +417,7 @@
var/list/key_emotes = GLOB.emote_list["snore"]
for(var/datum/emote/living/snore/living_emote in key_emotes)
// The existing timer restarts if it's already running
- snore_timer = addtimer(CALLBACK(living_emote, .proc/end_snore, living_user), SNORE_DURATION, TIMER_UNIQUE | TIMER_OVERRIDE)
+ snore_timer = addtimer(CALLBACK(living_emote, PROC_REF(end_snore), living_user), SNORE_DURATION, TIMER_UNIQUE | TIMER_OVERRIDE)
/datum/emote/living/snore/proc/end_snore(mob/living/living_user)
if(!QDELETED(living_user))
diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm
index 65bb3b762955..d3f9f0ebd8a9 100644
--- a/code/modules/mob/living/init_signals.dm
+++ b/code/modules/mob/living/init_signals.dm
@@ -1,31 +1,31 @@
/// Called on [/mob/living/Initialize()], for the mob to register to relevant signals.
/mob/living/proc/register_init_signals()
- RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_KNOCKEDOUT), .proc/on_knockedout_trait_gain)
- RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_KNOCKEDOUT), .proc/on_knockedout_trait_loss)
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_KNOCKEDOUT), PROC_REF(on_knockedout_trait_gain))
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_KNOCKEDOUT), PROC_REF(on_knockedout_trait_loss))
- RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_DEATHCOMA), .proc/on_deathcoma_trait_gain)
- RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA), .proc/on_deathcoma_trait_loss)
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_DEATHCOMA), PROC_REF(on_deathcoma_trait_gain))
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA), PROC_REF(on_deathcoma_trait_loss))
- RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), .proc/on_immobilized_trait_gain)
- RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_IMMOBILIZED), .proc/on_immobilized_trait_loss)
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), PROC_REF(on_immobilized_trait_gain))
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_IMMOBILIZED), PROC_REF(on_immobilized_trait_loss))
- RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_FLOORED), .proc/on_floored_trait_gain)
- RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_FLOORED), .proc/on_floored_trait_loss)
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_FLOORED), PROC_REF(on_floored_trait_gain))
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_FLOORED), PROC_REF(on_floored_trait_loss))
- RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), .proc/on_handsblocked_trait_gain)
- RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_HANDS_BLOCKED), .proc/on_handsblocked_trait_loss)
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), PROC_REF(on_handsblocked_trait_gain))
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_HANDS_BLOCKED), PROC_REF(on_handsblocked_trait_loss))
- RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_UI_BLOCKED), .proc/on_ui_blocked_trait_gain)
- RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_UI_BLOCKED), .proc/on_ui_blocked_trait_loss)
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_UI_BLOCKED), PROC_REF(on_ui_blocked_trait_gain))
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_UI_BLOCKED), PROC_REF(on_ui_blocked_trait_loss))
- RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_PULL_BLOCKED), .proc/on_pull_blocked_trait_gain)
- RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_PULL_BLOCKED), .proc/on_pull_blocked_trait_loss)
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_PULL_BLOCKED), PROC_REF(on_pull_blocked_trait_gain))
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_PULL_BLOCKED), PROC_REF(on_pull_blocked_trait_loss))
- RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), .proc/on_incapacitated_trait_gain)
- RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_INCAPACITATED), .proc/on_incapacitated_trait_loss)
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), PROC_REF(on_incapacitated_trait_gain))
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_INCAPACITATED), PROC_REF(on_incapacitated_trait_loss))
- RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_RESTRAINED), .proc/on_restrained_trait_gain)
- RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_RESTRAINED), .proc/on_restrained_trait_loss)
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_RESTRAINED), PROC_REF(on_restrained_trait_gain))
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_RESTRAINED), PROC_REF(on_restrained_trait_loss))
RegisterSignal(src, list(
SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION),
@@ -33,7 +33,7 @@
SIGNAL_ADDTRAIT(TRAIT_NODEATH),
SIGNAL_REMOVETRAIT(TRAIT_NODEATH),
- ), .proc/update_succumb_action)
+ ), PROC_REF(update_succumb_action))
/// Called when [TRAIT_KNOCKEDOUT] is added to the mob.
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 33d73b6e4997..47fc5bd82ecb 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -130,7 +130,7 @@
/mob/living/proc/gravity_animate()
if(!get_filter("gravity"))
add_filter("gravity",1,list("type"="motion_blur", "x"=0, "y"=0))
- INVOKE_ASYNC(src, .proc/gravity_pulse_animation)
+ INVOKE_ASYNC(src, PROC_REF(gravity_pulse_animation))
/mob/living/proc/gravity_pulse_animation()
animate(get_filter("gravity"), y = 1, time = 10)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 8e01f457ef2e..821bef7d25ff 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -13,7 +13,7 @@
update_living_varspeed()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -398,11 +398,14 @@
/mob/living/pointed(atom/A as mob|obj|turf in view(client.view, src))
if(incapacitated())
return FALSE
+
+ return ..()
+
+/mob/living/_pointed(atom/pointing_at)
if(!..())
return FALSE
- visible_message("[src] points at [A].", "You point at [A].")
- return TRUE
-
+ log_message("points at [pointing_at]", LOG_EMOTE)
+ visible_message("[span_name("[src]")] points at [pointing_at].", span_notice("You point at [pointing_at]."))
/mob/living/verb/succumb(whispered as null)
set hidden = TRUE
@@ -499,8 +502,7 @@
/mob/living/proc/get_up(instant = FALSE)
set waitfor = FALSE
- var/static/datum/callback/rest_checks = CALLBACK(src, .proc/rest_checks_callback)
- if(!instant && !do_mob(src, src, 2 SECONDS, uninterruptible = TRUE, extra_checks = rest_checks))
+ if(!instant && !do_mob(src, src, 2 SECONDS, uninterruptible = TRUE, extra_checks = CALLBACK(src, TYPE_PROC_REF(/mob/living, rest_checks_callback))))
return
if(resting || body_position == STANDING_UP || HAS_TRAIT(src, TRAIT_FLOORED))
return
@@ -654,7 +656,7 @@
var/obj/effect/proc_holder/spell/spell = S
spell.updateButtonIcon()
if(excess_healing)
- INVOKE_ASYNC(src, .proc/emote, "gasp")
+ INVOKE_ASYNC(src, PROC_REF(emote), "gasp")
log_combat(src, src, "revived")
/mob/living/proc/remove_CC()
@@ -859,6 +861,10 @@
set name = "Resist"
set category = "IC"
+ DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(execute_resist)))
+
+///proc extender of [/mob/living/verb/resist] meant to make the process queable if the server is overloaded when the verb is called
+/mob/living/proc/execute_resist()
if(!can_resist())
return
changeNext_move(CLICK_CD_RESIST)
@@ -884,7 +890,6 @@
else if(last_special <= world.time)
resist_restraints() //trying to remove cuffs.
-
/mob/proc/resist_grab(moving_resist)
return 1 //returning 0 means we successfully broke free
@@ -1520,8 +1525,8 @@
if(!can_look_up())
return
changeNext_move(CLICK_CD_LOOK_UP)
- RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, .proc/stop_look_up) //We stop looking up if we move.
- RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/start_look_up) //We start looking again after we move.
+ RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(stop_look_up)) //We stop looking up if we move.
+ RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(start_look_up)) //We start looking again after we move.
start_look_up()
/mob/living/proc/start_look_up()
@@ -1565,8 +1570,8 @@
if(!can_look_up()) //if we cant look up, we cant look down.
return
changeNext_move(CLICK_CD_LOOK_UP)
- RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, .proc/stop_look_down) //We stop looking down if we move.
- RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/start_look_down) //We start looking again after we move.
+ RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(stop_look_down)) //We stop looking down if we move.
+ RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(start_look_down)) //We start looking again after we move.
start_look_down()
/mob/living/proc/start_look_down()
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 31676cd64007..f119c7dbc308 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -55,6 +55,7 @@
var/on_hit_state = P.on_hit(src, armor, piercing_hit)
if(!P.nodamage && on_hit_state != BULLET_ACT_BLOCK && !QDELETED(src)) //QDELETED literally just for the instagib rifle. Yeah.
apply_damage(P.damage, P.damage_type, def_zone, armor)
+ recoil_camera(src, clamp((P.damage-armor)/4,0.5,10), clamp((P.damage-armor)/4,0.5,10), P.damage/8, P.Angle)
apply_effects(P.stun, P.knockdown, P.unconscious, P.irradiate, P.slur, P.stutter, P.eyeblur, P.drowsy, armor, P.stamina, P.jitter, P.paralyze, P.immobilize)
if(P.dismemberment)
check_projectile_dismemberment(P, def_zone)
@@ -398,8 +399,8 @@
if((GLOB.cult_narsie.souls == GLOB.cult_narsie.soul_goal) && (GLOB.cult_narsie.resolved == FALSE))
GLOB.cult_narsie.resolved = TRUE
sound_to_playing_players('sound/machines/alarm.ogg')
- addtimer(CALLBACK(GLOBAL_PROC, .proc/cult_ending_helper, 1), 120)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/ending_helper), 270)
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(cult_ending_helper), 1), 120)
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(ending_helper)), 270)
if(client)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, src, cultoverride = TRUE)
else
@@ -422,7 +423,7 @@
return FALSE
if(get_eye_protection() < intensity && (override_blindness_check || !is_blind()))
overlay_fullscreen("flash", type)
- addtimer(CALLBACK(src, .proc/clear_fullscreen, "flash", 25), 25)
+ addtimer(CALLBACK(src, PROC_REF(clear_fullscreen), "flash", 25), 25)
return TRUE
return FALSE
diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm
index f092cef8cac9..eeb3948e627c 100644
--- a/code/modules/mob/living/living_say.dm
+++ b/code/modules/mob/living/living_say.dm
@@ -159,7 +159,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
saymode = null
message_mods -= RADIO_EXTENSION
message_range = 1
- src.log_talk(message, LOG_WHISPER, custom_say_emote = message_mods[MODE_CUSTOM_SAY_EMOTE])
+ var/logged_message = message
if(stat == HARD_CRIT) //This is cheaper than checking for MODE_WHISPER_CRIT message mod
var/health_diff = round(-HEALTH_THRESHOLD_DEAD + health)
// If we cut our message short, abruptly end it with a-..
@@ -167,8 +167,12 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
message = copytext_char(message, 1, health_diff) + "[message_len > health_diff ? "-.." : "..."]"
message = Ellipsis(message, 10, 1)
last_words = message
+ var/final_warning = alert(usr, "Your dying words will be \"[last_words]\", continue?", "Succumb", "Cancel", "Continue")
+ if(final_warning == "Cancel" || QDELETED(src))
+ return
message_mods[WHISPER_MODE] = MODE_WHISPER_CRIT
succumbed = TRUE
+ src.log_talk(logged_message, LOG_WHISPER, custom_say_emote = message_mods[MODE_CUSTOM_SAY_EMOTE])
else
src.log_talk(message, LOG_SAY, forced_by=forced, custom_say_emote = message_mods[MODE_CUSTOM_SAY_EMOTE])
@@ -297,7 +301,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
speech_bubble_recipients.Add(M.client)
var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", FLY_LAYER)
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
- INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_recipients, 30)
+ INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay), I, speech_bubble_recipients, 30)
/mob/proc/binarycheck()
return FALSE
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 81d1cc78ca92..2223a1491a6c 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -134,7 +134,7 @@
create_eye()
if(client)
- INVOKE_ASYNC(src, .proc/apply_pref_name,"ai",client)
+ INVOKE_ASYNC(src, PROC_REF(apply_pref_name),"ai",client)
set_core_display_icon()
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 8c42baf4914e..f66d00b5f7aa 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -24,7 +24,7 @@
ShutOffDoomsdayDevice()
if(explosive)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, loc, 3, 6, 12, 15), 1 SECONDS)
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), loc, 3, 6, 12, 15), 1 SECONDS)
if(src.key)
for(var/each in GLOB.ai_status_displays) //change status
diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
index 4591720b7986..124028009116 100644
--- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
@@ -50,7 +50,7 @@
/datum/camerachunk/proc/hasChanged(update_now = 0)
if(seenby.len || update_now)
- addtimer(CALLBACK(src, .proc/update), UPDATE_BUFFER, TIMER_UNIQUE)
+ addtimer(CALLBACK(src, PROC_REF(update)), UPDATE_BUFFER, TIMER_UNIQUE)
else
changed = 1
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 85b20d068be2..b8af19155f09 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -170,4 +170,4 @@
blind_eyes(1)
update_sight()
to_chat(src, "You've lost power!")
- addtimer(CALLBACK(src, .proc/start_RestorePowerRoutine), 20)
+ addtimer(CALLBACK(src, PROC_REF(start_RestorePowerRoutine)), 20)
diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm
index ca35a7544222..30c7cd435068 100644
--- a/code/modules/mob/living/silicon/laws.dm
+++ b/code/modules/mob/living/silicon/laws.dm
@@ -15,8 +15,8 @@
if(announce && last_lawchange_announce != world.time)
to_chat(src, "Your laws have been changed.")
// lawset modules cause this function to be executed multiple times in a tick, so we wait for the next tick in order to be able to see the entire lawset
- addtimer(CALLBACK(src, .proc/show_laws), 0)
- addtimer(CALLBACK(src, .proc/deadchat_lawchange), 0)
+ addtimer(CALLBACK(src, PROC_REF(show_laws)), 0)
+ addtimer(CALLBACK(src, PROC_REF(deadchat_lawchange)), 0)
last_lawchange_announce = world.time
/mob/living/silicon/proc/set_law_sixsixsix(law, announce = TRUE)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index cc646cfcc98c..be79cf7184ab 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -121,12 +121,12 @@
aicamera = new /obj/item/camera/siliconcam/ai_camera(src)
aicamera.flash_enabled = TRUE
- addtimer(CALLBACK(src, .proc/pdaconfig), 5)
+ addtimer(CALLBACK(src, PROC_REF(pdaconfig)), 5)
. = ..()
emittersemicd = TRUE
- addtimer(CALLBACK(src, .proc/emittercool), 600)
+ addtimer(CALLBACK(src, PROC_REF(emittercool)), 600)
if(!holoform)
ADD_TRAIT(src, TRAIT_IMMOBILIZED, PAI_FOLDED)
diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm
index 279d37045cc5..ca65a416691c 100644
--- a/code/modules/mob/living/silicon/pai/pai_shell.dm
+++ b/code/modules/mob/living/silicon/pai/pai_shell.dm
@@ -17,7 +17,7 @@
return FALSE
emittersemicd = TRUE
- addtimer(CALLBACK(src, .proc/emittercool), emittercd)
+ addtimer(CALLBACK(src, PROC_REF(emittercool)), emittercd)
REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, PAI_FOLDED)
REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, PAI_FOLDED)
density = TRUE
@@ -47,9 +47,9 @@
/mob/living/silicon/pai/proc/fold_in(force = FALSE)
emittersemicd = TRUE
if(!force)
- addtimer(CALLBACK(src, .proc/emittercool), emittercd)
+ addtimer(CALLBACK(src, PROC_REF(emittercool)), emittercd)
else
- addtimer(CALLBACK(src, .proc/emittercool), emitteroverloadcd)
+ addtimer(CALLBACK(src, PROC_REF(emittercool)), emitteroverloadcd)
icon_state = "[chassis]"
if(!holoform)
. = fold_out(force)
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index cbcf7c6f2129..a099c05488fa 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -5,20 +5,52 @@
// - Camera jack
GLOBAL_LIST_INIT(pai_faces, list(
+ ":>",
+ "=_=",
+ "angry",
+ "ashamed",
+ "bookworm",
+ "boykisser",
+ "cat",
+ "clueless",
+ "concerned",
+ "dread",
+ "estatic",
+ "exclaim",
+ "eye",
+ "eyewall",
+ "face",
+ "fangs",
+ "flushed",
+ "foureyes",
+ "greenjary",
+ "happy",
+ "heart",
+ "laugh",
+ "lenny",
+ "loss",
+ "michevious",
+ "missingno",
+ "mistake",
+ "moth",
+ "moyai",
+ "neko",
"null",
- "what",
- "sad",
+ "o.o",
"off",
- "laugh",
- "happy",
- "face",
- "estatic",
- "cat",
- "angry",
+ "pleading",
+ "question",
+ "sadcat",
+ "smug",
+ "snek",
+ "spiral",
"sunglasses",
+ "syndisnake", //EVILLL PAI
+ "twoeyes",
+ "T_T",
+ "what",
+ "wink",
"woozy",
- "bookworm",
- "greenjary",
))
diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm
index b35afb1558e6..df62df082751 100644
--- a/code/modules/mob/living/silicon/robot/laws.dm
+++ b/code/modules/mob/living/silicon/robot/laws.dm
@@ -84,4 +84,4 @@
/mob/living/silicon/robot/post_lawchange(announce = TRUE)
. = ..()
- addtimer(CALLBACK(src, .proc/logevent,"Law update processed."), 0, TIMER_UNIQUE | TIMER_OVERRIDE) //Post_Lawchange gets spammed by some law boards, so let's wait it out
+ addtimer(CALLBACK(src, PROC_REF(logevent),"Law update processed."), 0, TIMER_UNIQUE | TIMER_OVERRIDE) //Post_Lawchange gets spammed by some law boards, so let's wait it out
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 1af879fc878e..44bfe5626754 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -111,7 +111,7 @@
wires = new /datum/wires/robot(src)
AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES)
- RegisterSignal(src, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge)
+ RegisterSignal(src, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(charge))
robot_modules_background = new()
robot_modules_background.icon_state = "block"
@@ -157,7 +157,7 @@
mmi.brainmob.container = mmi
mmi.update_appearance()
- INVOKE_ASYNC(src, .proc/updatename)
+ INVOKE_ASYNC(src, PROC_REF(updatename))
playsound(loc, 'sound/voice/liveagain.ogg', 75, TRUE)
aicamera = new/obj/item/camera/siliconcam/robot_camera(src)
@@ -498,6 +498,9 @@
set category = "IC"
set src = usr
+ return ..()
+
+/mob/living/silicon/robot/execute_mode()
if(incapacitated())
return
var/obj/item/W = get_active_held_item()
@@ -687,7 +690,7 @@
/mob/living/silicon/robot/modules/syndicate/Initialize()
. = ..()
laws = new /datum/ai_laws/syndicate_override()
- addtimer(CALLBACK(src, .proc/show_playstyle), 5)
+ addtimer(CALLBACK(src, PROC_REF(show_playstyle)), 5)
/mob/living/silicon/robot/modules/syndicate/create_modularInterface()
if(!modularInterface)
@@ -720,7 +723,7 @@
/mob/living/silicon/robot/modules/syndicateproto/Initialize()
. = ..()
laws = new /datum/ai_laws/syndproto_override()
- addtimer(CALLBACK(src, .proc/show_playstyle), 5)
+ addtimer(CALLBACK(src, PROC_REF(show_playstyle)), 5)
/mob/living/silicon/robot/modules/syndicateproto/create_modularInterface()
if(!modularInterface)
@@ -923,7 +926,7 @@
hat_offset = module.hat_offset
magpulse = module.magpulsing
- INVOKE_ASYNC(src, .proc/updatename)
+ INVOKE_ASYNC(src, PROC_REF(updatename))
/mob/living/silicon/robot/proc/place_on_head(obj/item/new_hat)
@@ -1091,12 +1094,11 @@
riding_datum.restore_position(user)
. = ..(user)
-/mob/living/silicon/robot/resist()
+/mob/living/silicon/robot/execute_resist()
. = ..()
if(!has_buckled_mobs())
return
- for(var/i in buckled_mobs)
- var/mob/unbuckle_me_now = i
+ for(var/mob/unbuckle_me_now as anything in buckled_mobs)
unbuckle_mob(unbuckle_me_now, FALSE)
diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm
index 433c735a2784..39a0ede9334f 100644
--- a/code/modules/mob/living/silicon/robot/robot_defense.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defense.dm
@@ -308,7 +308,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
return
spark_system.start()
step_away(src, user, 15)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/_step_away, src, get_turf(user), 15), 3)
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(_step_away), src, get_turf(user), 15), 3)
/mob/living/silicon/robot/fire_act()
if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index dee91ab20f81..27819d97cf15 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -182,7 +182,7 @@
R.module = RM
R.update_module_innate()
RM.rebuild_modules()
- INVOKE_ASYNC(RM, .proc/do_transform_animation)
+ INVOKE_ASYNC(RM, PROC_REF(do_transform_animation))
qdel(src)
return RM
@@ -281,7 +281,7 @@
"R34 - STR4a 'Durin'" = image(icon = 'icons/mob/robots.dmi', icon_state = "durin"),
)
default_icons = sortList(default_icons)
- var/default_borg_icon = show_radial_menu(R, R , default_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE)
+ var/default_borg_icon = show_radial_menu(R, R , default_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), R), radius = 42, require_near = TRUE)
switch(default_borg_icon)
if("Default")
cyborg_base_icon = "robot"
@@ -371,7 +371,7 @@
"Qualified Doctor" = image(icon = 'icons/mob/robots.dmi', icon_state = "qualified_doctor")
)
med_icons = sortList(med_icons)
- var/med_borg_icon = show_radial_menu(R, R , med_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE)
+ var/med_borg_icon = show_radial_menu(R, R , med_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), R), radius = 42, require_near = TRUE)
switch(med_borg_icon)
if("Antique")
cyborg_base_icon = "medbot"
@@ -475,7 +475,7 @@
"R34 - ENG7a 'Conagher'" = image(icon = 'icons/mob/robots.dmi', icon_state = "conagher"),
)
engi_icons = sortList(engi_icons)
- var/engi_borg_icon = show_radial_menu(R, R , engi_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE)
+ var/engi_borg_icon = show_radial_menu(R, R , engi_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), R), radius = 42, require_near = TRUE)
switch(engi_borg_icon)
if("Antique")
cyborg_base_icon = "engibot"
@@ -557,7 +557,7 @@
"R34 - SEC10a 'Woody'" = image(icon = 'icons/mob/robots.dmi', icon_state = "woody"),
)
sec_icons = sortList(sec_icons)
- var/sec_borg_icon = show_radial_menu(R, R , sec_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE)
+ var/sec_borg_icon = show_radial_menu(R, R , sec_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), R), radius = 42, require_near = TRUE)
switch(sec_borg_icon)
if("Antique")
cyborg_base_icon = "secbot"
@@ -681,7 +681,7 @@
"R34 - CUS3a 'Flynn'" = image(icon = 'icons/mob/robots.dmi', icon_state = "flynn"),
)
jan_icons = sortList(jan_icons)
- var/jan_borg_icon = show_radial_menu(R, R , jan_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE)
+ var/jan_borg_icon = show_radial_menu(R, R , jan_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), R), radius = 42, require_near = TRUE)
switch(jan_borg_icon)
if("Antique")
cyborg_base_icon = "janbot"
@@ -830,7 +830,7 @@
"R34 - SRV9a 'Llyod'" = image(icon = 'icons/mob/robots.dmi', icon_state = "lloyd"),
)
service_icons = sortList(service_icons)
- var/service_robot_icon = show_radial_menu(R, R , service_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE)
+ var/service_robot_icon = show_radial_menu(R, R , service_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), R), radius = 42, require_near = TRUE)
switch(service_robot_icon)
if("Default - 'Waitress'")
cyborg_base_icon = "service_f"
@@ -918,7 +918,7 @@
"R34 - MIN2a 'Ishimura'" = image(icon = 'icons/mob/robots.dmi', icon_state = "ishimura")
)
mining_icons = sortList(mining_icons)
- var/mining_borg_icon = show_radial_menu(R, R , mining_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE)
+ var/mining_borg_icon = show_radial_menu(R, R , mining_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), R), radius = 42, require_near = TRUE)
switch(mining_borg_icon)
if("Antique")
cyborg_base_icon = "minerbot"
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 1923df3b50eb..347ec71e84e4 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -99,7 +99,7 @@
if(in_cooldown)
return
- addtimer(CALLBACK(src, .proc/show_alarms), 3 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(show_alarms)), 3 SECONDS)
/mob/living/silicon/proc/show_alarms()
if(alarms_to_show.len < 5)
diff --git a/code/modules/mob/living/silicon/silicon_movement.dm b/code/modules/mob/living/silicon/silicon_movement.dm
index 590326eda1b1..cc0a01aa375f 100644
--- a/code/modules/mob/living/silicon/silicon_movement.dm
+++ b/code/modules/mob/living/silicon/silicon_movement.dm
@@ -18,5 +18,5 @@
oldLoc = get_turf(oldLoc)
if(!QDELETED(builtInCamera) && !updating && oldLoc != get_turf(src))
updating = TRUE
- addtimer(CALLBACK(src, .proc/do_camera_update, oldLoc), SILICON_CAMERA_BUFFER)
+ addtimer(CALLBACK(src, PROC_REF(do_camera_update), oldLoc), SILICON_CAMERA_BUFFER)
#undef SILICON_CAMERA_BUFFER
diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm
index b0c583b9c247..52346fd7cddd 100644
--- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm
+++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm
@@ -29,11 +29,11 @@
if(ismob(AM) && AM == target)
visible_message("[src] flails his swords and cuts [AM]!")
playsound(src,'sound/effects/beepskyspinsabre.ogg',100,TRUE,-1)
- INVOKE_ASYNC(src, .proc/stun_attack, AM)
+ INVOKE_ASYNC(src, PROC_REF(stun_attack), AM)
/mob/living/simple_animal/bot/secbot/grievous/Initialize()
. = ..()
- INVOKE_ASYNC(weapon, /obj/item.proc/attack_self, src)
+ INVOKE_ASYNC(weapon, TYPE_PROC_REF(/obj/item, attack_self), src)
/mob/living/simple_animal/bot/secbot/grievous/Destroy()
QDEL_NULL(weapon)
@@ -51,7 +51,7 @@
weapon.attack(C, src)
playsound(src, 'sound/weapons/blade1.ogg', 50, TRUE, -1)
if(C.stat == DEAD)
- addtimer(CALLBACK(src, /atom/.proc/update_appearance), 2)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_appearance)), 2)
back_to_idle()
@@ -107,7 +107,7 @@
if((C.name == oldtarget_name) && (world.time < last_found + 100))
continue
- threatlevel = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
+ threatlevel = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, PROC_REF(check_for_weapons)))
if(!threatlevel)
continue
@@ -122,7 +122,7 @@
icon_state = "grievous-c"
visible_message("[src] points at [C.name]!")
mode = BOT_HUNT
- INVOKE_ASYNC(src, .proc/handle_automated_action)
+ INVOKE_ASYNC(src, PROC_REF(handle_automated_action))
break
else
continue
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 5b4d66893f5b..1c25a67c1dbe 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -384,7 +384,7 @@
ejectpai(0)
if(on)
turn_off()
- addtimer(CALLBACK(src, .proc/emp_reset, was_on), severity*30 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(emp_reset), was_on), severity*30 SECONDS)
/mob/living/simple_animal/bot/proc/emp_reset(was_on)
stat &= ~EMPED
@@ -529,7 +529,7 @@ Pass a positive integer as an argument to override a bot's default speed.
if(step_count >= 1 && tries < BOT_STEP_MAX_RETRIES)
for(var/step_number = 0, step_number < step_count,step_number++)
- addtimer(CALLBACK(src, .proc/bot_step, dest), BOT_STEP_DELAY*step_number)
+ addtimer(CALLBACK(src, PROC_REF(bot_step), dest), BOT_STEP_DELAY*step_number)
else
return FALSE
return TRUE
@@ -574,7 +574,7 @@ Pass a positive integer as an argument to override a bot's default speed.
turn_on() //Saves the AI the hassle of having to activate a bot manually.
access_card = all_access //Give the bot all-access while under the AI's command.
if(client)
- reset_access_timer_id = addtimer(CALLBACK (src, .proc/bot_reset), 600, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) //if the bot is player controlled, they get the extra access for a limited time
+ reset_access_timer_id = addtimer(CALLBACK (src, PROC_REF(bot_reset)), 600, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) //if the bot is player controlled, they get the extra access for a limited time
to_chat(src, "Priority waypoint set by [icon2html(calling_ai, src)] [caller]. Proceed to [end_area].
[path.len-1] meters to destination. You have been granted additional door access for 60 seconds.")
if(message)
to_chat(calling_ai, "[icon2html(src, calling_ai)] [name] called to [end_area]. [path.len-1] meters to destination.")
@@ -621,7 +621,7 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/proc/bot_patrol()
patrol_step()
- addtimer(CALLBACK(src, .proc/do_patrol), 5)
+ addtimer(CALLBACK(src, PROC_REF(do_patrol)), 5)
/mob/living/simple_animal/bot/proc/do_patrol()
if(mode == BOT_PATROL)
@@ -641,7 +641,7 @@ Pass a positive integer as an argument to override a bot's default speed.
return
if(patrol_target) // has patrol target
- INVOKE_ASYNC(src, .proc/target_patrol)
+ INVOKE_ASYNC(src, PROC_REF(target_patrol))
else // no patrol target, so need a new one
speak("Engaging patrol mode.")
find_patrol_target()
@@ -675,7 +675,7 @@ Pass a positive integer as an argument to override a bot's default speed.
var/moved = bot_move(patrol_target)//step_towards(src, next) // attempt to move
if(!moved) //Couldn't proceed the next step of the path BOT_STEP_MAX_RETRIES times
- addtimer(CALLBACK(src, .proc/patrol_step_not_moved), 2)
+ addtimer(CALLBACK(src, PROC_REF(patrol_step_not_moved)), 2)
else // no path, so calculate new one
mode = BOT_START_PATROL
@@ -786,7 +786,7 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/proc/calc_summon_path(turf/avoid)
check_bot_access()
- INVOKE_ASYNC(src, .proc/do_calc_summon_path, avoid)
+ INVOKE_ASYNC(src, PROC_REF(do_calc_summon_path), avoid)
/mob/living/simple_animal/bot/proc/do_calc_summon_path(turf/avoid)
set_path(get_path_to(src, summon_target, /turf/proc/Distance_cardinal, 0, 150, id=access_card, exclude=avoid))
@@ -810,7 +810,7 @@ Pass a positive integer as an argument to override a bot's default speed.
var/moved = bot_move(summon_target, 3) // Move attempt
if(!moved)
- addtimer(CALLBACK(src, .proc/summon_step_not_moved), 2)
+ addtimer(CALLBACK(src, PROC_REF(summon_step_not_moved)), 2)
else // no path, so calculate new one
calc_summon_path()
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index ea8c5bd93540..5229967f0374 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -155,7 +155,7 @@
stolen_valor += C.job
update_titles()
- INVOKE_ASYNC(weapon, /obj/item/proc/attack, C, src)
+ INVOKE_ASYNC(weapon, TYPE_PROC_REF(/obj/item, attack), C, src)
C.Knockdown(20)
/mob/living/simple_animal/bot/cleanbot/attackby(obj/item/W, mob/user, params)
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index c3c046b84727..bd3ad4bbcf17 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -64,7 +64,7 @@
var/threatlevel = 0
if(C.incapacitated())
continue
- threatlevel = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
+ threatlevel = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, PROC_REF(check_for_weapons)))
//speak(C.real_name + text(": threat: []", threatlevel))
if(threatlevel < 4)
continue
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index fa6faaa6a889..d15c20f1aa1d 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -249,7 +249,7 @@
mode = BOT_REPAIRING
F.ReplaceWithLattice()
audible_message("[src] makes an excited booping sound.")
- addtimer(CALLBACK(src, .proc/go_idle), 0.5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(go_idle)), 0.5 SECONDS)
path = list()
return
if(path.len == 0)
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index 02bf813396f8..34ce788c53c5 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -49,14 +49,14 @@
/mob/living/simple_animal/bot/honkbot/proc/sensor_blink()
icon_state = "honkbot-c"
- addtimer(CALLBACK(src, /atom/.proc/update_icon), 5, TIMER_OVERRIDE|TIMER_UNIQUE)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 5, TIMER_OVERRIDE|TIMER_UNIQUE)
//honkbots react with sounds.
/mob/living/simple_animal/bot/honkbot/proc/react_ping()
playsound(src, 'sound/machines/ping.ogg', 50, TRUE, -1) //the first sound upon creation!
spam_flag = TRUE
sensor_blink()
- addtimer(CALLBACK(src, .proc/spam_flag_false), 18) // calibrates before starting the honk
+ addtimer(CALLBACK(src, PROC_REF(spam_flag_false)), 18) // calibrates before starting the honk
/mob/living/simple_animal/bot/honkbot/proc/react_buzz()
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE, -1)
@@ -114,14 +114,14 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
/mob/living/simple_animal/bot/honkbot/attack_hand(mob/living/carbon/human/H)
if(H.a_intent == "harm")
retaliate(H)
- addtimer(CALLBACK(src, .proc/react_buzz), 5)
+ addtimer(CALLBACK(src, PROC_REF(react_buzz)), 5)
return ..()
/mob/living/simple_animal/bot/honkbot/attackby(obj/item/W, mob/user, params)
if(W.tool_behaviour != TOOL_SCREWDRIVER && (W.force) && (!target) && (W.damtype != STAMINA))
retaliate(user)
- addtimer(CALLBACK(src, .proc/react_buzz), 5)
+ addtimer(CALLBACK(src, PROC_REF(react_buzz)), 5)
..()
/mob/living/simple_animal/bot/honkbot/emag_act(mob/user)
@@ -170,21 +170,21 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
playsound(src, honksound, 50, TRUE, -1)
spam_flag = TRUE //prevent spam
sensor_blink()
- addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntimehorn)
+ addtimer(CALLBACK(src, PROC_REF(spam_flag_false)), cooldowntimehorn)
else if (emagged == 2) //emagged honkbots will spam short and memorable sounds.
if (!spam_flag)
playsound(src, "honkbot_e", 50, FALSE)
spam_flag = TRUE // prevent spam
icon_state = "honkbot-e"
- addtimer(CALLBACK(src, /atom/.proc/update_icon), 30, TIMER_OVERRIDE|TIMER_UNIQUE)
- addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntimehorn)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 30, TIMER_OVERRIDE|TIMER_UNIQUE)
+ addtimer(CALLBACK(src, PROC_REF(spam_flag_false)), cooldowntimehorn)
/mob/living/simple_animal/bot/honkbot/proc/honk_attack(mob/living/carbon/C) // horn attack
if(!spam_flag)
playsound(loc, honksound, 50, TRUE, -1)
spam_flag = TRUE // prevent spam
sensor_blink()
- addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntimehorn)
+ addtimer(CALLBACK(src, PROC_REF(spam_flag_false)), cooldowntimehorn)
/mob/living/simple_animal/bot/honkbot/proc/stun_attack(mob/living/carbon/C) // airhorn stun
if(!spam_flag)
@@ -206,7 +206,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
target = oldtarget_name
else // you really don't want to hit an emagged honkbot
threatlevel = 6 // will never let you go
- addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntime)
+ addtimer(CALLBACK(src, PROC_REF(spam_flag_false)), cooldowntime)
log_combat(src,C,"honked")
@@ -215,7 +215,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
else
C.stuttering = 20
C.Paralyze(80)
- addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntime)
+ addtimer(CALLBACK(src, PROC_REF(spam_flag_false)), cooldowntime)
/mob/living/simple_animal/bot/honkbot/handle_automated_action()
@@ -279,13 +279,13 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
target = null
last_found = world.time
frustration = 0
- INVOKE_ASYNC(src, .proc/handle_automated_action) //responds quickly
+ INVOKE_ASYNC(src, PROC_REF(handle_automated_action)) //responds quickly
/mob/living/simple_animal/bot/honkbot/proc/back_to_hunt()
anchored = FALSE
frustration = 0
mode = BOT_HUNT
- INVOKE_ASYNC(src, .proc/handle_automated_action) // responds quickly
+ INVOKE_ASYNC(src, PROC_REF(handle_automated_action)) // responds quickly
/mob/living/simple_animal/bot/honkbot/proc/look_for_perp()
anchored = FALSE
@@ -315,7 +315,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
speak("Honk!")
visible_message("[src] starts chasing [C.name]!")
mode = BOT_HUNT
- INVOKE_ASYNC(src, .proc/handle_automated_action)
+ INVOKE_ASYNC(src, PROC_REF(handle_automated_action))
break
else
continue
@@ -361,7 +361,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
C.Paralyze(10)
playsound(loc, 'sound/misc/sadtrombone.ogg', 50, TRUE, -1)
if(!client)
- INVOKE_ASYNC(src, .proc/speak, "Honk!")
+ INVOKE_ASYNC(src, PROC_REF(speak), "Honk!")
sensor_blink()
return
. = ..()
diff --git a/code/modules/mob/living/simple_animal/bot/hygienebot.dm b/code/modules/mob/living/simple_animal/bot/hygienebot.dm
index af1ce80b2a88..7240027f0853 100644
--- a/code/modules/mob/living/simple_animal/bot/hygienebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/hygienebot.dm
@@ -175,13 +175,13 @@
frustration = 0
last_found = world.time
stop_washing()
- INVOKE_ASYNC(src, .proc/handle_automated_action)
+ INVOKE_ASYNC(src, PROC_REF(handle_automated_action))
/mob/living/simple_animal/bot/hygienebot/proc/back_to_hunt()
frustration = 0
mode = BOT_HUNT
stop_washing()
- INVOKE_ASYNC(src, .proc/handle_automated_action)
+ INVOKE_ASYNC(src, PROC_REF(handle_automated_action))
/mob/living/simple_animal/bot/hygienebot/proc/look_for_lowhygiene()
for (var/mob/living/carbon/human/H in view(7,src)) //Find the NEET
@@ -194,7 +194,7 @@
playsound(loc, 'sound/effects/hygienebot_happy.ogg', 60, 1)
visible_message("[src] points at [H.name]!")
mode = BOT_HUNT
- INVOKE_ASYNC(src, .proc/handle_automated_action)
+ INVOKE_ASYNC(src, PROC_REF(handle_automated_action))
break
else
continue
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index e64b0b362e0a..5191ee1ba0c8 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -578,7 +578,7 @@
buzz(SIGH)
mode = BOT_WAIT_FOR_NAV
blockcount = 0
- addtimer(CALLBACK(src, .proc/process_blocked, next), 2 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(process_blocked), next), 2 SECONDS)
return
return
else
@@ -591,7 +591,7 @@
if(BOT_NAV) // calculate new path
mode = BOT_WAIT_FOR_NAV
- INVOKE_ASYNC(src, .proc/process_nav)
+ INVOKE_ASYNC(src, PROC_REF(process_nav))
/mob/living/simple_animal/bot/mulebot/proc/process_blocked(turf/next)
calc_path(avoid=next)
@@ -639,7 +639,7 @@
/mob/living/simple_animal/bot/mulebot/proc/start_home()
if(!on)
return
- INVOKE_ASYNC(src, .proc/do_start_home)
+ INVOKE_ASYNC(src, PROC_REF(do_start_home))
/mob/living/simple_animal/bot/mulebot/proc/do_start_home()
set_destination(home_destination)
@@ -775,8 +775,8 @@
new /obj/effect/decal/cleanable/oil(loc)
..()
-/mob/living/simple_animal/bot/mulebot/resist()
- ..()
+/mob/living/simple_animal/bot/mulebot/execute_resist()
+ . = ..()
if(load)
unload()
@@ -818,7 +818,7 @@
if(isobserver(AM))
visible_message("A ghostly figure appears on [src]!")
- RegisterSignal(AM, COMSIG_MOVABLE_MOVED, .proc/ghostmoved)
+ RegisterSignal(AM, COMSIG_MOVABLE_MOVED, PROC_REF(ghostmoved))
AM.forceMove(src)
else if(!wires.is_cut(WIRE_LOADCHECK))
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 4629dd87c157..af33ef493167 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -174,7 +174,7 @@ Auto Patrol: []"},
/mob/living/simple_animal/bot/secbot/proc/retaliate(mob/living/carbon/human/H)
var/judgement_criteria = judgement_criteria()
- threatlevel = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
+ threatlevel = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, PROC_REF(check_for_weapons)))
threatlevel += 6
if(threatlevel >= 4)
target = H
@@ -260,7 +260,7 @@ Auto Patrol: []"},
playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2)
C.visible_message("[src] is trying to put zipties on [C]!",\
"[src] is trying to put zipties on you!")
- addtimer(CALLBACK(src, .proc/attempt_handcuff, C), 60)
+ addtimer(CALLBACK(src, PROC_REF(attempt_handcuff), C), 60)
/mob/living/simple_animal/bot/secbot/proc/attempt_handcuff(mob/living/carbon/C)
if(!on || !Adjacent(C) || !isturf(C.loc)) //if he's in a closet or not adjacent, we cancel cuffing.
@@ -275,7 +275,7 @@ Auto Patrol: []"},
var/judgement_criteria = judgement_criteria()
playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1)
icon_state = "[initial(icon_state)]-c"
- addtimer(CALLBACK(src, /atom/.proc/update_icon), 2)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 2)
var/threat = 5
if(harm)
@@ -284,11 +284,11 @@ Auto Patrol: []"},
C.stuttering = 5
C.Paralyze(100)
var/mob/living/carbon/human/H = C
- threat = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
+ threat = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, PROC_REF(check_for_weapons)))
else
C.Paralyze(100)
C.stuttering = 5
- threat = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
+ threat = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, PROC_REF(check_for_weapons)))
log_combat(src,C,"stunned")
if(declare_arrests)
@@ -397,13 +397,13 @@ Auto Patrol: []"},
target = null
last_found = world.time
frustration = 0
- INVOKE_ASYNC(src, .proc/handle_automated_action)
+ INVOKE_ASYNC(src, PROC_REF(handle_automated_action))
/mob/living/simple_animal/bot/secbot/proc/back_to_hunt()
anchored = FALSE
frustration = 0
mode = BOT_HUNT
- INVOKE_ASYNC(src, .proc/handle_automated_action)
+ INVOKE_ASYNC(src, PROC_REF(handle_automated_action))
// look for a criminal in view of the bot
/mob/living/simple_animal/bot/secbot/proc/look_for_perp()
@@ -416,7 +416,7 @@ Auto Patrol: []"},
if((C.name == oldtarget_name) && (world.time < last_found + 100))
continue
- threatlevel = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
+ threatlevel = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, PROC_REF(check_for_weapons)))
if(!threatlevel)
continue
@@ -431,7 +431,7 @@ Auto Patrol: []"},
playsound(src, pick('sound/voice/beepsky/criminal.ogg', 'sound/voice/beepsky/justice.ogg', 'sound/voice/beepsky/freeze.ogg'), 50, FALSE)
visible_message("[src] points at [C.name]!")
mode = BOT_HUNT
- INVOKE_ASYNC(src, .proc/handle_automated_action)
+ INVOKE_ASYNC(src, PROC_REF(handle_automated_action))
break
else
continue
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index de46d55e4f34..04ff8f5f54de 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -100,11 +100,11 @@
/obj/effect/mob_spawn/human/corpse/frontier
name = "Frontiersman"
- outfit = /datum/outfit/russiancorpse
+ outfit = /datum/outfit/frontier
hairstyle = "Bald"
facial_hairstyle = "Shaved"
-/datum/outfit/russiancorpse
+/datum/outfit/frontier
name = "Frontiersman Corpse"
uniform = /obj/item/clothing/under/rank/security/officer/frontier
shoes = /obj/item/clothing/shoes/jackboots
@@ -112,12 +112,12 @@
gloves = /obj/item/clothing/gloves/color/black
/obj/effect/mob_spawn/human/corpse/frontier/ranged
- outfit = /datum/outfit/russiancorpse
+ outfit = /datum/outfit/frontier
/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper
- outfit = /datum/outfit/russiancorpse/trooper
+ outfit = /datum/outfit/frontier/trooper
-/datum/outfit/russiancorpse/trooper
+/datum/outfit/frontier/trooper
name = "Frontiersman Armored Corpse"
suit = /obj/item/clothing/suit/armor/vest/bulletproof/frontier
shoes = /obj/item/clothing/shoes/combat
@@ -128,10 +128,10 @@
/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer
name = "Frontiersman Officer"
- outfit = /datum/outfit/russiancorpse/officer
+ outfit = /datum/outfit/frontier/officer
-/datum/outfit/russiancorpse/officer
- name = "Frontiersman officer Corpse"
+/datum/outfit/frontier/officer
+ name = "Frontiersman Officer Corpse"
uniform = /obj/item/clothing/under/rank/security/officer/frontier/officer
suit = /obj/item/clothing/suit/armor/frontier
shoes = /obj/item/clothing/shoes/combat
@@ -139,14 +139,19 @@
head = /obj/item/clothing/head/caphat/frontier
/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy
- outfit = /datum/outfit/russiancorpse/trooper/heavy
+ outfit = /datum/outfit/frontier/trooper/heavy
-/datum/outfit/russiancorpse/trooper/heavy
+/datum/outfit/frontier/trooper/heavy
name = "Frontiersman Heavy Corpse"
suit = /obj/item/clothing/suit/space/hardsuit/security/independent/frontier
head = /obj/item/clothing/head/beret/sec/frontier/officer
back = /obj/item/minigunpack
+/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless
+ outfit = /datum/outfit/russiancorpse/trooper/heavy/gunless
+
+/datum/outfit/russiancorpse/trooper/heavy/gunless
+ back = null
/obj/effect/mob_spawn/human/corpse/wizard
name = "Space Wizard Corpse"
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index b62bb484c7bf..af5875853ce1 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -73,7 +73,7 @@
if(prob(1))
manual_emote(pick("dances around.","chases its tail!"))
- INVOKE_ASYNC(GLOBAL_PROC, .proc/dance_rotate, src)
+ INVOKE_ASYNC(GLOBAL_PROC, PROC_REF(dance_rotate), src)
//Corgis and pugs are now under one dog subtype
@@ -318,7 +318,7 @@
/mob/living/simple_animal/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/user)
if(istype(item_to_add, /obj/item/grenade/c4)) // last thing he ever wears, I guess
- INVOKE_ASYNC(item_to_add, /obj/item.proc/afterattack, src, user, 1)
+ INVOKE_ASYNC(item_to_add, TYPE_PROC_REF(/obj/item, afterattack), src, user, 1)
return
if(inventory_head)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index e29948aa8b80..8714a3e49191 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -98,38 +98,4 @@
icon_living = icon_state
icon_dead = "[visualAppearance]_dead"
-/obj/effect/mob_spawn/drone/derelict
- name = "derelict drone shell"
- desc = "A long-forgotten drone shell. It seems kind of... Space Russian."
- icon = 'icons/mob/drone.dmi'
- icon_state = "drone_maint_hat"
- mob_name = "derelict drone"
- mob_type = /mob/living/simple_animal/drone/derelict
- anchored = TRUE
- short_desc = "You are a drone on Kosmicheskaya Stantsiya 13."
- flavour_text = "Something has brought you out of hibernation, and the station is in gross disrepair."
- important_info = "Build, repair, maintain and improve the station that housed you on activation."
-
-/mob/living/simple_animal/drone/derelict
- name = "derelict drone"
- default_hatmask = /obj/item/clothing/head/trapper
- laws = \
- "1. You may not involve yourself in the matters of another sentient being outside the station that housed your activation, even if such matters conflict with Law Two or Law Three, unless the other being is another Drone.\n"+\
- "2. You may not harm any sentient being, regardless of intent or circumstance.\n"+\
- "3. Your goals are to actively build, maintain, repair, improve, and provide power to the best of your abilities within the facility that housed your activation."
- flavortext = \
- "\nDO NOT WILLINGLY LEAVE KOSMICHESKAYA STANTSIYA 13 (THE DERELICT)\n"+\
- "Derelict drones are a ghost role that is allowed to roam freely on KS13, with the main goal of repairing and improving it.\n"+\
- "Do not interfere with the round going on outside KS13.\n"+\
- "Actions that constitute interference include, but are not limited to:\n"+\
- " - Going to the main station in search of materials.\n"+\
- " - Interacting with non-drone players outside KS13, dead or alive.\n"+\
- "These rules are at admin discretion and will be heavily enforced.\n"+\
- "If you do not have the regular drone laws, follow your laws to the best of your ability."
-
-/mob/living/simple_animal/drone/derelict/Initialize()
- . = ..()
- AddComponent(/datum/component/stationstuck, TRUE, "Your emergency station return device activates, sending you back to KS13!", "01000110 01010101 01000011 01001011 00100000 01011001 01001111 01010101
WARNING: Dereliction of KS13 detected. Self destruct activated.")
-
-
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm
index a70a9ff5cc64..56d7fefb06c4 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm
@@ -106,7 +106,7 @@
"Repair Drone" = image(icon = 'icons/mob/drone.dmi', icon_state = REPAIRDRONE),
"Scout Drone" = image(icon = 'icons/mob/drone.dmi', icon_state = SCOUTDRONE)
)
- var/picked_icon = show_radial_menu(src, src, drone_icons, custom_check = CALLBACK(src, .proc/check_menu), radius = 38, require_near = TRUE)
+ var/picked_icon = show_radial_menu(src, src, drone_icons, custom_check = CALLBACK(src, PROC_REF(check_menu)), radius = 38, require_near = TRUE)
switch(picked_icon)
if("Maintenance Drone")
visualAppearance = MAINTDRONE
@@ -118,7 +118,7 @@
"pink" = image(icon = 'icons/mob/drone.dmi', icon_state = "[visualAppearance]_pink"),
"red" = image(icon = 'icons/mob/drone.dmi', icon_state = "[visualAppearance]_red")
)
- var/picked_color = show_radial_menu(src, src, drone_colors, custom_check = CALLBACK(src, .proc/check_menu), radius = 38, require_near = TRUE)
+ var/picked_color = show_radial_menu(src, src, drone_colors, custom_check = CALLBACK(src, PROC_REF(check_menu)), radius = 38, require_near = TRUE)
if(picked_color)
icon_state = "[visualAppearance]_[picked_color]"
icon_living = "[visualAppearance]_[picked_color]"
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index e29029ff694d..a1884b76298e 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -152,7 +152,7 @@
to_chat(src, "You are tipped over by [M]!")
Paralyze(60, ignore_canstun = TRUE)
icon_state = icon_dead
- addtimer(CALLBACK(src, .proc/cow_tipped, M), rand(20,50))
+ addtimer(CALLBACK(src, PROC_REF(cow_tipped), M), rand(20,50))
else
..()
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 48f84240c5ac..cf1b0de8ae70 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -198,7 +198,7 @@ GLOBAL_VAR_INIT(mouse_killed, 0)
maxHealth = 30
health = maxHealth
to_chat(src, "You ate cheese! You are now stronger, bigger and faster!")
- addtimer(CALLBACK(src, .proc/cheese_down), 3 MINUTES)
+ addtimer(CALLBACK(src, PROC_REF(cheese_down)), 3 MINUTES)
/mob/living/simple_animal/mouse/proc/cheese_down()
cheesed = FALSE
diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm
index c24271d9b09e..d33fac8f5c00 100644
--- a/code/modules/mob/living/simple_animal/friendly/snake.dm
+++ b/code/modules/mob/living/simple_animal/friendly/snake.dm
@@ -160,7 +160,7 @@
glasses = new /obj/item/clothing/glasses/regular(src)
grant_all_languages()
update_overlays()
- INVOKE_ASYNC(src, .proc/update_phrases)
+ INVOKE_ASYNC(src, PROC_REF(update_phrases))
. = ..()
/mob/living/simple_animal/hostile/retaliate/poison/snake/bookworm/proc/update_phrases()
diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
index 384bbf7e005b..7ebd3c8b3cca 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
@@ -34,7 +34,7 @@
/mob/living/simple_animal/hostile/guardian/charger/Shoot(atom/targeted_atom)
charging = 1
- throw_at(targeted_atom, range, 1, src, FALSE, TRUE, callback = CALLBACK(src, .proc/charging_end))
+ throw_at(targeted_atom, range, 1, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(charging_end)))
/mob/living/simple_animal/hostile/guardian/charger/proc/charging_end()
charging = 0
diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
index 863389b9840a..f93f70d8ffb3 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
@@ -49,9 +49,9 @@
if(bomb_cooldown <= world.time && !stat)
to_chat(src, "Success! Bomb armed!")
bomb_cooldown = world.time + 200
- RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/display_examine)
- RegisterSignal(A, boom_signals, .proc/kaboom)
- addtimer(CALLBACK(src, .proc/disable, A), 600, TIMER_UNIQUE|TIMER_OVERRIDE)
+ RegisterSignal(A, COMSIG_PARENT_EXAMINE, PROC_REF(display_examine))
+ RegisterSignal(A, boom_signals, PROC_REF(kaboom))
+ addtimer(CALLBACK(src, PROC_REF(disable), A), 600, TIMER_UNIQUE|TIMER_OVERRIDE)
else
to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.")
diff --git a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm
index b8a8bbb54366..a86e38db7772 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm
@@ -53,7 +53,7 @@
return
A.AddElement(/datum/element/forced_gravity, new_gravity)
gravito_targets[A] = new_gravity
- RegisterSignal(A, COMSIG_MOVABLE_MOVED, .proc/__distance_check)
+ RegisterSignal(A, COMSIG_MOVABLE_MOVED, PROC_REF(__distance_check))
playsound(src, 'sound/effects/gravhit.ogg', 100, TRUE)
/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/remove_gravity(atom/target)
diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
index d4666873848e..105ae8b35ec8 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
@@ -119,7 +119,7 @@
/obj/effect/snare/Initialize()
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 9afea9921ef6..caf465140231 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -84,7 +84,7 @@
environment_smash = ENVIRONMENT_SMASH_MINERALS
weather_immunities = list("snow")
-/mob/living/simple_animal/hostile/bear/russian
+/mob/living/simple_animal/hostile/bear/frontier
name = "combat bear"
desc = "A ferocious brown bear decked out in armor plating, a red star with yellow outlining details the shoulder plating."
icon_state = "combatbear"
@@ -114,7 +114,7 @@
/obj/item/bear_armor
name = "pile of bear armor"
desc = "A scattered pile of various shaped armor pieces fitted for a bear, some duct tape, and a nail filer. Crude instructions \
- are written on the back of one of the plates in russian. This seems like an awful idea."
+ are written on the back of one of the plates. This seems like an awful idea."
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "bear_armor_upgrade"
@@ -141,7 +141,7 @@
icon_living = "butterbear"
icon_dead = "butterbear_dead"
desc = "I can't believe its not a bear!"
- faction = list("neutral", "russian")
+ faction = list("neutral", "frontiersmen")
obj_damage = 11
melee_damage_lower = 1
melee_damage_upper = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index d079fbed4ce4..676b58a98520 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -325,4 +325,4 @@
/mob/living/simple_animal/hostile/poison/bees/short/Initialize(mapload, timetolive=50 SECONDS)
. = ..()
- addtimer(CALLBACK(src, .proc/death), timetolive)
+ addtimer(CALLBACK(src, PROC_REF(death)), timetolive)
diff --git a/code/modules/mob/living/simple_animal/hostile/frontiersman.dm b/code/modules/mob/living/simple_animal/hostile/frontiersman.dm
index c8e6a1c8d2b4..feeecdb5b43d 100644
--- a/code/modules/mob/living/simple_animal/hostile/frontiersman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/frontiersman.dm
@@ -41,6 +41,8 @@
projectilesound = 'sound/weapons/gun/revolver/shot.ogg'
casingtype = /obj/item/ammo_casing/n762_38
+/mob/living/simple_animal/hostile/frontier/ranged/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged)
/mob/living/simple_animal/hostile/frontier/ranged/mosin
icon_state = "frontiersmanrangedrifle"
@@ -50,6 +52,9 @@
casingtype = /obj/item/ammo_casing/a762_54
projectilesound = 'sound/weapons/gun/rifle/mosin.ogg'
+/mob/living/simple_animal/hostile/frontier/ranged/mosin/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged)
+
/mob/living/simple_animal/hostile/frontier/ranged/trooper
icon_state = "frontiersmanrangedelite"
icon_living = "frontiersmanrangedelite"
@@ -60,6 +65,9 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
/obj/item/gun/ballistic/shotgun/lethal)
+/mob/living/simple_animal/hostile/frontier/ranged/trooper/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
+
/mob/living/simple_animal/hostile/frontier/ranged/trooper/ak47
icon_state = "frontiersmanrangedak47"
icon_living = "frontiersmanrangedak47"
@@ -70,6 +78,9 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
/obj/item/gun/ballistic/automatic/assault/ak47)
+/mob/living/simple_animal/hostile/frontier/ranged/trooper/ak47/neutured
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
+
/mob/living/simple_animal/hostile/frontier/ranged/trooper/rifle
icon_state = "frontiersmanrangedmosin"
icon_living = "frontiersmanrangedmosin"
@@ -79,6 +90,9 @@
casingtype = /obj/item/ammo_casing/a762_54
projectilesound = 'sound/weapons/gun/rifle/mosin.ogg'
+/mob/living/simple_animal/hostile/frontier/ranged/trooper/rifle/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
+
/mob/living/simple_animal/hostile/frontier/ranged/trooper/heavy
icon_state = "frontiersmanrangedminigun"
icon_living = "frontiersmanrangedminigun"
@@ -91,6 +105,9 @@
projectiletype = /obj/projectile/beam/weak/penetrator
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy)
+/mob/living/simple_animal/hostile/frontier/ranged/trooper/heavy/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless)
+
/mob/living/simple_animal/hostile/frontier/ranged/officer
name = "Frontiersman Officer"
icon_state = "frontiersmanofficer"
@@ -102,6 +119,9 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer,
/obj/item/gun/ballistic/automatic/pistol/APS)
+/mob/living/simple_animal/hostile/frontier/ranged/officer/neutured
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer)
+
/mob/living/simple_animal/hostile/frontier/ranged/officer/Aggro()
..()
summon_backup(15)
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 09fdf0d763ba..5e3e8d0b34d5 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -252,7 +252,7 @@
if(!busy && prob(1))
stop_automated_movement = TRUE
Goto(pick(urange(20, src, 1)), move_to_delay)
- addtimer(CALLBACK(src, .proc/do_action), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(do_action)), 5 SECONDS)
return 1
/mob/living/simple_animal/hostile/poison/giant_spider/proc/do_action()
@@ -277,7 +277,7 @@
busy = MOVING_TO_TARGET
Goto(C, move_to_delay)
//give up if we can't reach them after 10 seconds
- addtimer(CALLBACK(src, .proc/GiveUp, C), 10 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(GiveUp), C), 10 SECONDS)
return
//second, spin a sticky spiderweb on this tile
@@ -301,7 +301,7 @@
stop_automated_movement = 1
Goto(O, move_to_delay)
//give up if we can't reach them after 10 seconds
- addtimer(CALLBACK(src, .proc/GiveUp, O), 10 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(GiveUp), O), 10 SECONDS)
else if(busy == MOVING_TO_TARGET && cocoon_target_ref)
var/mob/living/cocoon_target = cocoon_target_ref.resolve()
@@ -443,7 +443,7 @@
if(target_atom.anchored)
return
user.cocoon_target_ref = WEAKREF(target_atom)
- INVOKE_ASYNC(user, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/.proc/cocoon)
+ INVOKE_ASYNC(user, TYPE_PROC_REF(/mob/living/simple_animal/hostile/poison/giant_spider/nurse, cocoon))
remove_ranged_ability()
return TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm
index bf0337488dcb..0d48bdb082e6 100644
--- a/code/modules/mob/living/simple_animal/hostile/goose.dm
+++ b/code/modules/mob/living/simple_animal/hostile/goose.dm
@@ -41,7 +41,7 @@
/mob/living/simple_animal/hostile/retaliate/goose/Initialize()
. = ..()
- RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/goosement)
+ RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(goosement))
/mob/living/simple_animal/hostile/retaliate/goose/Destroy()
UnregisterSignal(src, COMSIG_MOVABLE_MOVED)
@@ -149,7 +149,7 @@
/mob/living/simple_animal/hostile/retaliate/goose/proc/choke(obj/item/reagent_containers/food/plastic)
if(stat == DEAD || choking)
return
- addtimer(CALLBACK(src, .proc/suffocate), 300)
+ addtimer(CALLBACK(src, PROC_REF(suffocate)), 300)
/mob/living/simple_animal/hostile/retaliate/goose/vomit/choke(obj/item/reagent_containers/food/plastic)
if(stat == DEAD || choking)
@@ -157,9 +157,9 @@
if(prob(25))
visible_message("[src] is gagging on \the [plastic]!")
manual_emote("gags!")
- addtimer(CALLBACK(src, .proc/vomit), 300)
+ addtimer(CALLBACK(src, PROC_REF(vomit)), 300)
else
- addtimer(CALLBACK(src, .proc/suffocate), 300)
+ addtimer(CALLBACK(src, PROC_REF(suffocate)), 300)
/mob/living/simple_animal/hostile/retaliate/goose/Life()
. = ..()
@@ -206,13 +206,13 @@
/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit_prestart(duration)
flick("vomit_start",src)
- addtimer(CALLBACK(src, .proc/vomit_start, duration), 13) //13 is the length of the vomit_start animation in gooseloose.dmi
+ addtimer(CALLBACK(src, PROC_REF(vomit_start), duration), 13) //13 is the length of the vomit_start animation in gooseloose.dmi
/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit_start(duration)
vomiting = TRUE
icon_state = "vomit"
vomit()
- addtimer(CALLBACK(src, .proc/vomit_preend), duration)
+ addtimer(CALLBACK(src, PROC_REF(vomit_preend)), duration)
/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit_preend()
for (var/obj/item/consumed in contents) //Get rid of any food left in the poor thing
@@ -241,11 +241,11 @@
/mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/deadchat_plays_goose()
stop_automated_movement = TRUE
AddComponent(/datum/component/deadchat_control, ANARCHY_MODE, list(
- "up" = CALLBACK(GLOBAL_PROC, .proc/_step, src, NORTH),
- "down" = CALLBACK(GLOBAL_PROC, .proc/_step, src, SOUTH),
- "left" = CALLBACK(GLOBAL_PROC, .proc/_step, src, WEST),
- "right" = CALLBACK(GLOBAL_PROC, .proc/_step, src, EAST),
- "vomit" = CALLBACK(src, .proc/vomit_prestart, 25)), 12 SECONDS, 4 SECONDS)
+ "up" = CALLBACK(GLOBAL_PROC, PROC_REF(_step), src, NORTH),
+ "down" = CALLBACK(GLOBAL_PROC, PROC_REF(_step), src, SOUTH),
+ "left" = CALLBACK(GLOBAL_PROC, PROC_REF(_step), src, WEST),
+ "right" = CALLBACK(GLOBAL_PROC, PROC_REF(_step), src, EAST),
+ "vomit" = CALLBACK(src, PROC_REF(vomit_prestart), 25)), 12 SECONDS, 4 SECONDS)
/datum/action/cooldown/vomit
name = "Vomit"
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index 08bb29d32f38..850ff235375f 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -48,7 +48,7 @@
return
Infect(target)
to_chat(src, "With our egg laid, our death approaches rapidly...")
- addtimer(CALLBACK(src, .proc/death), 100)
+ addtimer(CALLBACK(src, PROC_REF(death)), 100)
/obj/item/organ/body_egg/changeling_egg
name = "changeling egg"
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 106c9ad54f60..6eaa0f8ebd5a 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -104,7 +104,7 @@
/mob/living/simple_animal/hostile/handle_automated_movement()
. = ..()
if(dodging && target && in_melee && isturf(loc) && isturf(target.loc))
- var/datum/cb = CALLBACK(src,.proc/sidestep)
+ var/datum/cb = CALLBACK(src, PROC_REF(sidestep))
if(sidestep_per_cycle > 1) //For more than one just spread them equally - this could changed to some sensible distribution later
var/sidestep_delay = SSnpcpool.wait / sidestep_per_cycle
for(var/i in 1 to sidestep_per_cycle)
@@ -263,7 +263,7 @@
//What we do after closing in
/mob/living/simple_animal/hostile/proc/MeleeAction(patience = TRUE)
if(rapid_melee > 1)
- var/datum/callback/cb = CALLBACK(src, .proc/CheckAndAttack)
+ var/datum/callback/cb = CALLBACK(src, PROC_REF(CheckAndAttack))
var/delay = SSnpcpool.wait / rapid_melee
for(var/i in 1 to rapid_melee)
addtimer(cb, (i - 1)*delay)
@@ -408,7 +408,7 @@
if(rapid > 1)
- var/datum/callback/cb = CALLBACK(src, .proc/Shoot, A)
+ var/datum/callback/cb = CALLBACK(src, PROC_REF(Shoot), A)
for(var/i in 1 to rapid)
addtimer(cb, (i - 1)*rapid_fire_delay)
else
@@ -546,7 +546,7 @@
/mob/living/simple_animal/hostile/proc/GainPatience()
if(lose_patience_timeout)
LosePatience()
- lose_patience_timer_id = addtimer(CALLBACK(src, .proc/LoseTarget), lose_patience_timeout, TIMER_STOPPABLE)
+ lose_patience_timer_id = addtimer(CALLBACK(src, PROC_REF(LoseTarget)), lose_patience_timeout, TIMER_STOPPABLE)
/mob/living/simple_animal/hostile/proc/LosePatience()
@@ -557,7 +557,7 @@
/mob/living/simple_animal/hostile/proc/LoseSearchObjects()
search_objects = 0
deltimer(search_objects_timer_id)
- search_objects_timer_id = addtimer(CALLBACK(src, .proc/RegainSearchObjects), search_objects_regain_time, TIMER_STOPPABLE)
+ search_objects_timer_id = addtimer(CALLBACK(src, PROC_REF(RegainSearchObjects)), search_objects_regain_time, TIMER_STOPPABLE)
/mob/living/simple_animal/hostile/proc/RegainSearchObjects(value)
@@ -610,7 +610,7 @@
var/obj/effect/temp_visual/decoy/new_decoy = new /obj/effect/temp_visual/decoy(loc,src)
animate(new_decoy, alpha = 0, color = "#5a5858", transform = matrix()*2, time = 3)
target.visible_message("[src] prepares to pounce!")
- addtimer(CALLBACK(src, .proc/handle_charge_target, target), 1.5 SECONDS, TIMER_STOPPABLE)
+ addtimer(CALLBACK(src, PROC_REF(handle_charge_target), target), 1.5 SECONDS, TIMER_STOPPABLE)
/**
* Proc that checks if the mob can charge attack.
@@ -627,7 +627,7 @@
if(!can_charge_target(target))
return FALSE
charge_state = TRUE
- throw_at(target, charge_distance, 1, src, FALSE, TRUE, callback = CALLBACK(src, .proc/charge_end))
+ throw_at(target, charge_distance, 1, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(charge_end)))
COOLDOWN_START(src, charge_cooldown, charge_frequency)
return TRUE
@@ -683,7 +683,7 @@
UnregisterSignal(target, COMSIG_PARENT_QDELETING)
target = new_target
if(target)
- RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/handle_target_del, TRUE)
+ RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(handle_target_del), TRUE)
/mob/living/simple_animal/hostile/proc/set_camp_faction(tag)
src.faction = list()
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
index c476a5f5cf2b..7fd15ed0b6a1 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
@@ -82,10 +82,10 @@
/obj/structure/leaper_bubble/Initialize()
. = ..()
- INVOKE_ASYNC(src, /atom/movable.proc/float, TRUE)
+ INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, float), TRUE)
QDEL_IN(src, 100)
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -212,7 +212,7 @@
if(AIStatus == AI_ON && ranged_cooldown <= world.time)
projectile_ready = TRUE
update_icons()
- throw_at(new_turf, max(3,get_dist(src,new_turf)), 1, src, FALSE, callback = CALLBACK(src, .proc/FinishHop))
+ throw_at(new_turf, max(3,get_dist(src,new_turf)), 1, src, FALSE, callback = CALLBACK(src, PROC_REF(FinishHop)))
/mob/living/simple_animal/hostile/jungle/leaper/proc/FinishHop()
density = TRUE
@@ -222,18 +222,18 @@
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 100, TRUE)
if(target && AIStatus == AI_ON && projectile_ready && !ckey)
face_atom(target)
- addtimer(CALLBACK(src, .proc/OpenFire, target), 5)
+ addtimer(CALLBACK(src, PROC_REF(OpenFire), target), 5)
/mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlop()
var/turf/new_turf = get_turf(target)
hopping = TRUE
notransform = TRUE
new /obj/effect/temp_visual/leaper_crush(new_turf)
- addtimer(CALLBACK(src, .proc/BellyFlopHop, new_turf), 30)
+ addtimer(CALLBACK(src, PROC_REF(BellyFlopHop), new_turf), 30)
/mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlopHop(turf/T)
density = FALSE
- throw_at(T, get_dist(src,T),1,src, FALSE, callback = CALLBACK(src, .proc/Crush))
+ throw_at(T, get_dist(src,T),1,src, FALSE, callback = CALLBACK(src, PROC_REF(Crush)))
/mob/living/simple_animal/hostile/jungle/leaper/proc/Crush()
hopping = FALSE
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm
index 06b2924033d9..b85da6c2c726 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm
@@ -72,9 +72,9 @@
walk(src,0)
update_icons()
if(prob(50) && get_dist(src,target) <= 3 || forced_slash_combo)
- addtimer(CALLBACK(src, .proc/SlashCombo), ATTACK_INTERMISSION_TIME)
+ addtimer(CALLBACK(src, PROC_REF(SlashCombo)), ATTACK_INTERMISSION_TIME)
return
- addtimer(CALLBACK(src, .proc/LeapAttack), ATTACK_INTERMISSION_TIME + rand(0,3))
+ addtimer(CALLBACK(src, PROC_REF(LeapAttack)), ATTACK_INTERMISSION_TIME + rand(0,3))
return
attack_state = MOOK_ATTACK_RECOVERY
ResetNeutral()
@@ -84,9 +84,9 @@
attack_state = MOOK_ATTACK_ACTIVE
update_icons()
SlashAttack()
- addtimer(CALLBACK(src, .proc/SlashAttack), 3)
- addtimer(CALLBACK(src, .proc/SlashAttack), 6)
- addtimer(CALLBACK(src, .proc/AttackRecovery), 9)
+ addtimer(CALLBACK(src, PROC_REF(SlashAttack)), 3)
+ addtimer(CALLBACK(src, PROC_REF(SlashAttack)), 6)
+ addtimer(CALLBACK(src, PROC_REF(AttackRecovery)), 9)
/mob/living/simple_animal/hostile/jungle/mook/proc/SlashAttack()
if(target && !stat && attack_state == MOOK_ATTACK_ACTIVE)
@@ -115,7 +115,7 @@
playsound(src, 'sound/weapons/thudswoosh.ogg', 25, TRUE)
playsound(src, 'sound/voice/mook_leap_yell.ogg', 100, TRUE)
var/target_turf = get_turf(target)
- throw_at(target_turf, 7, 1, src, FALSE, callback = CALLBACK(src, .proc/AttackRecovery))
+ throw_at(target_turf, 7, 1, src, FALSE, callback = CALLBACK(src, PROC_REF(AttackRecovery)))
return
attack_state = MOOK_ATTACK_RECOVERY
ResetNeutral()
@@ -134,11 +134,11 @@
if(isliving(target))
var/mob/living/L = target
if(L.incapacitated() && L.stat != DEAD)
- addtimer(CALLBACK(src, .proc/WarmupAttack, TRUE), ATTACK_INTERMISSION_TIME)
+ addtimer(CALLBACK(src, PROC_REF(WarmupAttack), TRUE), ATTACK_INTERMISSION_TIME)
return
- addtimer(CALLBACK(src, .proc/WarmupAttack), ATTACK_INTERMISSION_TIME)
+ addtimer(CALLBACK(src, PROC_REF(WarmupAttack)), ATTACK_INTERMISSION_TIME)
return
- addtimer(CALLBACK(src, .proc/ResetNeutral), ATTACK_INTERMISSION_TIME)
+ addtimer(CALLBACK(src, PROC_REF(ResetNeutral)), ATTACK_INTERMISSION_TIME)
/mob/living/simple_animal/hostile/jungle/mook/proc/ResetNeutral()
if(attack_state == MOOK_ATTACK_RECOVERY)
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
index 91da0614fb50..be9ef71562f3 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
@@ -47,7 +47,7 @@
flag = "energy"
light_color = LIGHT_COLOR_YELLOW
hitsound = 'sound/weapons/sear.ogg'
- hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+ hitsound_non_living = 'sound/weapons/effects/searwall.ogg'
nondirectional_sprite = TRUE
/obj/projectile/seedling/Bump(atom/A)//Stops seedlings from destroying other jungle mobs through FF
@@ -134,7 +134,7 @@
if(get_dist(src,target) >= 4 && prob(40))
SolarBeamStartup(target)
return
- addtimer(CALLBACK(src, .proc/Volley), 5)
+ addtimer(CALLBACK(src, PROC_REF(Volley)), 5)
/mob/living/simple_animal/hostile/jungle/seedling/proc/SolarBeamStartup(mob/living/living_target)//It's more like requiem than final spark
if(combatant_state == SEEDLING_STATE_WARMUP && target)
@@ -145,7 +145,7 @@
if(get_dist(src,living_target) > 7)
playsound(living_target,'sound/effects/seedling_chargeup.ogg', 100, FALSE)
solar_beam_identifier = world.time
- addtimer(CALLBACK(src, .proc/Beamu, living_target, solar_beam_identifier), 35)
+ addtimer(CALLBACK(src, PROC_REF(Beamu), living_target, solar_beam_identifier), 35)
/mob/living/simple_animal/hostile/jungle/seedling/proc/Beamu(mob/living/living_target, beam_id = 0)
if(combatant_state == SEEDLING_STATE_ACTIVE && living_target && beam_id == solar_beam_identifier)
@@ -165,7 +165,7 @@
living_target.adjust_fire_stacks(0.2)//Just here for the showmanship
living_target.IgniteMob()
playsound(living_target,'sound/weapons/sear.ogg', 50, TRUE)
- addtimer(CALLBACK(src, .proc/AttackRecovery), 5)
+ addtimer(CALLBACK(src, PROC_REF(AttackRecovery)), 5)
return
AttackRecovery()
@@ -173,10 +173,10 @@
if(combatant_state == SEEDLING_STATE_WARMUP && target)
combatant_state = SEEDLING_STATE_ACTIVE
update_icons()
- var/datum/callback/cb = CALLBACK(src, .proc/InaccurateShot)
+ var/datum/callback/cb = CALLBACK(src, PROC_REF(InaccurateShot))
for(var/i in 1 to 13)
addtimer(cb, i)
- addtimer(CALLBACK(src, .proc/AttackRecovery), 14)
+ addtimer(CALLBACK(src, PROC_REF(AttackRecovery)), 14)
/mob/living/simple_animal/hostile/jungle/seedling/proc/InaccurateShot()
if(!QDELETED(target) && combatant_state == SEEDLING_STATE_ACTIVE && !stat)
@@ -196,7 +196,7 @@
ranged_cooldown = world.time + ranged_cooldown_time
if(target)
face_atom(target)
- addtimer(CALLBACK(src, .proc/ResetNeutral), 10)
+ addtimer(CALLBACK(src, PROC_REF(ResetNeutral)), 10)
/mob/living/simple_animal/hostile/jungle/seedling/proc/ResetNeutral()
combatant_state = SEEDLING_STATE_NEUTRAL
diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
index a4678a69799a..cf8a32af157c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
@@ -65,7 +65,7 @@ Featuring:
if(spawn_mecha_type)
var/obj/mecha/M = new spawn_mecha_type (get_turf(src))
if(istype(M))
- INVOKE_ASYNC(src, .proc/enter_mecha, M)
+ INVOKE_ASYNC(src, PROC_REF(enter_mecha), M)
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/mecha/M)
@@ -232,13 +232,13 @@ Featuring:
if(mecha.defense_action && mecha.defense_action.owner && !mecha.defense_mode)
mecha.leg_overload_mode = 0
mecha.defense_action.Activate(TRUE)
- addtimer(CALLBACK(mecha.defense_action, /datum/action/innate/mecha/mech_defense_mode.proc/Activate, FALSE), 100) //10 seconds of defense, then toggle off
+ addtimer(CALLBACK(mecha.defense_action, TYPE_PROC_REF(/datum/action/innate/mecha/mech_defense_mode, Activate), FALSE), 100) //10 seconds of defense, then toggle off
else if(prob(retreat_chance))
//Speed boost if possible
if(mecha.overload_action && mecha.overload_action.owner && !mecha.leg_overload_mode)
mecha.overload_action.Activate(TRUE)
- addtimer(CALLBACK(mecha.overload_action, /datum/action/innate/mecha/mech_defense_mode.proc/Activate, FALSE), 100) //10 seconds of speeeeed, then toggle off
+ addtimer(CALLBACK(mecha.overload_action, TYPE_PROC_REF(/datum/action/innate/mecha/mech_defense_mode, Activate), FALSE), 100) //10 seconds of speeeeed, then toggle off
retreat_distance = 50
addtimer(VARSET_CALLBACK(src, retreat_distance, 0), 10 SECONDS)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
index 92e76eaa6d6d..5bdc5c882214 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -182,7 +182,7 @@ Difficulty: Medium
wander = TRUE
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/dash_attack()
- INVOKE_ASYNC(src, .proc/dash, target)
+ INVOKE_ASYNC(src, PROC_REF(dash), target)
shoot_ka()
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/shoot_ka()
@@ -264,7 +264,7 @@ Difficulty: Medium
/obj/effect/temp_visual/dir_setting/miner_death/Initialize(mapload, set_dir)
. = ..()
- INVOKE_ASYNC(src, .proc/fade_out)
+ INVOKE_ASYNC(src, PROC_REF(fade_out))
/obj/effect/temp_visual/dir_setting/miner_death/proc/fade_out()
var/matrix/M = new
@@ -285,7 +285,7 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/hunter/AttackingTarget()
. = ..()
if(. && prob(12))
- INVOKE_ASYNC(src, .proc/dash)
+ INVOKE_ASYNC(src, PROC_REF(dash))
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom
name = "hostile-environment miner"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index fd810a352380..d62d695e1be7 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -155,7 +155,7 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/surround_with_hallucinations()
for(var/i = 1 to 5)
- INVOKE_ASYNC(src, .proc/hallucination_charge_around, 2, 8, 2, 0, 4)
+ INVOKE_ASYNC(src, PROC_REF(hallucination_charge_around), 2, 8, 2, 0, 4)
if(ismob(target))
charge(delay = 6)
else
@@ -200,7 +200,7 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack()
var/list/targets = get_mobs_on_blood()
if(targets.len)
- INVOKE_ASYNC(src, .proc/bloodattack, targets, prob(50))
+ INVOKE_ASYNC(src, PROC_REF(bloodattack), targets, prob(50))
return TRUE
return FALSE
@@ -266,7 +266,7 @@ Difficulty: Hard
var/turf/targetturf = get_step(src, dir)
L.forceMove(targetturf)
playsound(targetturf, 'sound/magic/exit_blood.ogg', 100, TRUE, -1)
- addtimer(CALLBACK(src, .proc/devour, L), 2)
+ addtimer(CALLBACK(src, PROC_REF(devour), L), 2)
SLEEP_CHECK_DEATH(1)
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp()
@@ -331,7 +331,7 @@ Difficulty: Hard
update_approach()
change_move_delay(3.75)
add_atom_colour(COLOR_BUBBLEGUM_RED, TEMPORARY_COLOUR_PRIORITY)
- var/datum/callback/cb = CALLBACK(src, .proc/blood_enrage_end)
+ var/datum/callback/cb = CALLBACK(src, PROC_REF(blood_enrage_end))
addtimer(cb, enrage_time)
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_enrage_end()
@@ -378,7 +378,7 @@ Difficulty: Hard
continue
var/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/B = new /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination(src.loc)
B.forceMove(place)
- INVOKE_ASYNC(B, .proc/charge, chargeat, delay, chargepast)
+ INVOKE_ASYNC(B, PROC_REF(charge), chargeat, delay, chargepast)
if(useoriginal)
charge(chargeat, delay, chargepast)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
index 3a2036845298..cca8a649353f 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm
@@ -70,7 +70,7 @@
///LOOT
/obj/effect/spawner/clawloot/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/spawn_loot), 5 SECONDS) //this is because it dies violently exploding, so we dont want to destroy the goodies, you know?
+ addtimer(CALLBACK(src, PROC_REF(spawn_loot)), 5 SECONDS) //this is because it dies violently exploding, so we dont want to destroy the goodies, you know?
/obj/effect/spawner/clawloot/proc/spawn_loot()
new /obj/item/gun/energy/pulse/pistol(get_turf(src))
@@ -127,7 +127,7 @@
/mob/living/simple_animal/hostile/megafauna/claw/phase2/Initialize()
. = ..()
flick("claw-phase2_transform",src) //plays the transforming animation
- addtimer(CALLBACK(src, .proc/unlock_phase2), 4.4 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(unlock_phase2)), 4.4 SECONDS)
/mob/living/simple_animal/hostile/megafauna/claw/Move()
if(shouldnt_move)
@@ -200,7 +200,7 @@
for(var/i in 1 to distance)
new /obj/effect/temp_visual/cult/sparks(next_turf)
next_turf = get_step(next_turf, dir_to_target)
- addtimer(CALLBACK(src, .proc/swift_dash2, dir_to_target, 0, distance), wait_time)
+ addtimer(CALLBACK(src, PROC_REF(swift_dash2), dir_to_target, 0, distance), wait_time)
playsound(src, 'sound/creatures/claw_prepare.ogg', 100, 1)
/mob/living/simple_animal/hostile/megafauna/claw/proc/swift_dash2(move_dir, times_ran, distance_run)
@@ -214,7 +214,7 @@
for(var/mob/living/hit_mob in next_turf.contents - src)
hit_mob.Knockdown(15)
hit_mob.attack_animal(src)
- addtimer(CALLBACK(src, .proc/swift_dash2, move_dir, (times_ran + 1), distance_run), 0.7)
+ addtimer(CALLBACK(src, PROC_REF(swift_dash2), move_dir, (times_ran + 1), distance_run), 0.7)
/////DASH ATTACK END
/////DISSONANT SHREK
@@ -222,7 +222,7 @@
shake_animation(0.5)
visible_message("[src] stops and shudders for a moment... ")
shouldnt_move = TRUE
- addtimer(CALLBACK(src, .proc/emp_pulse2), 1 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(emp_pulse2)), 1 SECONDS)
/mob/living/simple_animal/hostile/megafauna/claw/proc/emp_pulse2()
shake_animation(2)
@@ -247,7 +247,7 @@
flick("claw-phase2_sting_attack_transform", src)
projectiletype = /obj/projectile/claw_projectille
projectilesound = 'sound/effects/splat.ogg'
- addtimer(CALLBACK(src, .proc/sting_attack2, target), 2 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(sting_attack2), target), 2 SECONDS)
/mob/living/simple_animal/hostile/megafauna/claw/proc/sting_attack2(target)
visible_message("[src] shoots all the spikes!")
@@ -274,7 +274,7 @@
shake_animation(20)
visible_message("[src] shudders violently and starts to split a flesh spider from it's body!")
shouldnt_move = TRUE
- addtimer(CALLBACK(src, .proc/summon_creatures2), 2 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(summon_creatures2)), 2 SECONDS)
/mob/living/simple_animal/hostile/megafauna/claw/proc/summon_creatures2()
shake_animation(5)
@@ -291,13 +291,13 @@
/mob/living/simple_animal/hostile/megafauna/claw/proc/on_death()
flick("claw-phase1_transform",src) //woho you won... or did you?
- addtimer(CALLBACK(src, .proc/create_phase2), 30 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(create_phase2)), 30 SECONDS)
/mob/living/simple_animal/hostile/megafauna/claw/phase2/on_death()
icon_state = "claw-phase2_dying"
flick("claw-phase2_to_dying_anim",src)
playsound(src, 'sound/voice/vox/vox_scream_1.ogg', 300, 1, 8, 8)
- addtimer(CALLBACK(src, .proc/phase2_dramatic, src), 3 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(phase2_dramatic), src), 3 SECONDS)
return
/mob/living/simple_animal/hostile/megafauna/claw/proc/create_phase2() //this only exists so the timer can callback to this proc
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 4ded55413f8e..d6b7c68bd958 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -156,8 +156,8 @@ Difficulty: Very Hard
visible_message("\"Die.\"")
SLEEP_CHECK_DEATH(10)
- INVOKE_ASYNC(src, .proc/spiral_shoot, FALSE)
- INVOKE_ASYNC(src, .proc/spiral_shoot, TRUE)
+ INVOKE_ASYNC(src, PROC_REF(spiral_shoot), FALSE)
+ INVOKE_ASYNC(src, PROC_REF(spiral_shoot), TRUE)
/mob/living/simple_animal/hostile/megafauna/colossus/proc/spiral_shoot(negative = pick(TRUE, FALSE), counter_start = 8)
var/turf/start_turf = get_step(src, pick(GLOB.alldirs))
@@ -240,7 +240,7 @@ Difficulty: Very Hard
/obj/effect/temp_visual/at_shield/Initialize(mapload, new_target)
. = ..()
target = new_target
- INVOKE_ASYNC(src, /atom/movable/proc/orbit, target, 0, FALSE, 0, 0, FALSE, TRUE)
+ INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, orbit), target, 0, FALSE, 0, 0, FALSE, TRUE)
/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/projectile/P)
if(!stat)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm
index 4e0b461516bf..96fbc8b5c4ec 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/cult_templar.dm
@@ -252,7 +252,7 @@
for(var/i in 1 to dash_num)
new /obj/effect/temp_visual/dragon_swoop/legionnaire(T)
T = get_step(T, dir_to_target)
- addtimer(CALLBACK(src, .proc/blood_dash_2, dir_to_target, 0), (5 * dash_mod))
+ addtimer(CALLBACK(src, PROC_REF(blood_dash_2), dir_to_target, 0), (5 * dash_mod))
playsound(src,'sound/effects/meteorimpact.ogg', 200, 1)
/mob/living/simple_animal/hostile/megafauna/cult_templar/proc/blood_dash_2(move_dir, times_ran)
@@ -283,7 +283,7 @@
shake_camera(L, 4, 3)
L.adjustBruteLoss(30)
playsound(L,"sound/misc/desceration-[pick(1,2,3)].ogg", 200, 1)
- addtimer(CALLBACK(src, .proc/blood_dash_2, move_dir, (times_ran + 1)), (1.5 * dash_mod))
+ addtimer(CALLBACK(src, PROC_REF(blood_dash_2), move_dir, (times_ran + 1)), (1.5 * dash_mod))
/mob/living/simple_animal/hostile/megafauna/cult_templar/proc/teleport_b(target)
if(charging || teleport_cooldown > world.time)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
index b2265782698d..14849bb58014 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
@@ -103,7 +103,7 @@ Difficulty: Extremely Hard
if(easy_attack)
snowball_machine_gun()
else
- INVOKE_ASYNC(src, .proc/ice_shotgun, 5, list(list(-180, -140, -100, -60, -20, 20, 60, 100, 140), list(-160, -120, -80, -40, 0, 40, 80, 120, 160)))
+ INVOKE_ASYNC(src, PROC_REF(ice_shotgun), 5, list(list(-180, -140, -100, -60, -20, 20, 60, 100, 140), list(-160, -120, -80, -40, 0, 40, 80, 120, 160)))
snowball_machine_gun(5 * 8, 5)
if(3)
if(easy_attack)
@@ -179,7 +179,7 @@ Difficulty: Extremely Hard
P.original = target
P.set_homing_target(target)
P.fire(rand(0, 360))
- addtimer(CALLBACK(P, /obj/projectile/frost_orb/proc/orb_explosion, projectile_speed_multiplier), 20) // make the orbs home in after a second
+ addtimer(CALLBACK(P, TYPE_PROC_REF(/obj/projectile/frost_orb, orb_explosion), projectile_speed_multiplier), 20) // make the orbs home in after a second
SLEEP_CHECK_DEATH(added_delay)
SetRecoveryTime(40, 60)
@@ -306,7 +306,7 @@ Difficulty: Extremely Hard
return
var/reset_turf = T.type
T.ChangeTurf(change_turf, flags = CHANGETURF_INHERIT_AIR)
- addtimer(CALLBACK(T, /turf.proc/ChangeTurf, reset_turf, null, CHANGETURF_INHERIT_AIR), duration, TIMER_OVERRIDE|TIMER_UNIQUE)
+ addtimer(CALLBACK(T, TYPE_PROC_REF(/turf, ChangeTurf), reset_turf, null, CHANGETURF_INHERIT_AIR), duration, TIMER_OVERRIDE|TIMER_UNIQUE)
/obj/item/pickaxe/drill/jackhammer/demonic
name = "demonic jackhammer"
@@ -349,7 +349,7 @@ Difficulty: Extremely Hard
icon_state = "frozen"
/datum/status_effect/ice_block_talisman/on_apply()
- RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, .proc/owner_moved)
+ RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(owner_moved))
if(!owner.stat)
to_chat(owner, "You become frozen in a cube!")
cube = icon('icons/effects/freeze.dmi', "ice_cube")
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 6e12ba91e903..d1a8c3c825aa 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -160,7 +160,7 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/dragon/proc/lava_swoop(amount = 30)
if(health < maxHealth * 0.5)
return swoop_attack(lava_arena = TRUE, swoop_cooldown = 60)
- INVOKE_ASYNC(src, .proc/lava_pools, amount)
+ INVOKE_ASYNC(src, PROC_REF(lava_pools), amount)
swoop_attack(FALSE, target, 1000) // longer cooldown until it gets reset below
SLEEP_CHECK_DEATH(0)
fire_cone()
@@ -179,7 +179,7 @@ Difficulty: Medium
var/increment = 360 / spiral_count
for(var/j = 1 to spiral_count)
var/list/turfs = line_target(j * increment + i * increment / 2, range, src)
- INVOKE_ASYNC(src, .proc/fire_line, turfs)
+ INVOKE_ASYNC(src, PROC_REF(fire_line), turfs)
SLEEP_CHECK_DEATH(25)
SetRecoveryTime(30)
@@ -246,15 +246,15 @@ Difficulty: Medium
playsound(get_turf(src),'sound/magic/fireball.ogg', 200, TRUE)
SLEEP_CHECK_DEATH(0)
if(prob(50) && meteors)
- INVOKE_ASYNC(src, .proc/fire_rain)
+ INVOKE_ASYNC(src, PROC_REF(fire_rain))
var/range = 15
var/list/turfs = list()
turfs = line_target(-40, range, at)
- INVOKE_ASYNC(src, .proc/fire_line, turfs)
+ INVOKE_ASYNC(src, PROC_REF(fire_line), turfs)
turfs = line_target(0, range, at)
- INVOKE_ASYNC(src, .proc/fire_line, turfs)
+ INVOKE_ASYNC(src, PROC_REF(fire_line), turfs)
turfs = line_target(40, range, at)
- INVOKE_ASYNC(src, .proc/fire_line, turfs)
+ INVOKE_ASYNC(src, PROC_REF(fire_line), turfs)
/mob/living/simple_animal/hostile/megafauna/dragon/proc/line_target(offset, range, atom/at = target)
if(!at)
@@ -452,7 +452,7 @@ Difficulty: Medium
/obj/effect/temp_visual/lava_warning/Initialize(mapload, reset_time = 10)
. = ..()
- INVOKE_ASYNC(src, .proc/fall, reset_time)
+ INVOKE_ASYNC(src, PROC_REF(fall), reset_time)
src.alpha = 63.75
animate(src, alpha = 255, time = duration)
@@ -477,7 +477,7 @@ Difficulty: Medium
var/lava_turf = /turf/open/lava/smooth
var/reset_turf = T.type
T.ChangeTurf(lava_turf, flags = CHANGETURF_INHERIT_AIR)
- addtimer(CALLBACK(T, /turf.proc/ChangeTurf, reset_turf, null, CHANGETURF_INHERIT_AIR), reset_time, TIMER_OVERRIDE|TIMER_UNIQUE)
+ addtimer(CALLBACK(T, TYPE_PROC_REF(/turf, ChangeTurf), reset_turf, null, CHANGETURF_INHERIT_AIR), reset_time, TIMER_OVERRIDE|TIMER_UNIQUE)
/obj/effect/temp_visual/drakewall
desc = "An ash drakes true flame."
@@ -519,7 +519,7 @@ Difficulty: Medium
/obj/effect/temp_visual/dragon_flight/Initialize(mapload, negative)
. = ..()
- INVOKE_ASYNC(src, .proc/flight, negative)
+ INVOKE_ASYNC(src, PROC_REF(flight), negative)
/obj/effect/temp_visual/dragon_flight/proc/flight(negative)
if(negative)
@@ -571,7 +571,7 @@ Difficulty: Medium
/obj/effect/temp_visual/target/Initialize(mapload, list/flame_hit)
. = ..()
- INVOKE_ASYNC(src, .proc/fall, flame_hit)
+ INVOKE_ASYNC(src, PROC_REF(fall), flame_hit)
/obj/effect/temp_visual/target/proc/fall(list/flame_hit)
var/turf/T = get_turf(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 1da36f8787d5..4df97bac4a6f 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -194,13 +194,13 @@ Difficulty: Hard
else if(prob(70 - anger_modifier)) //a cross blast of some type
if(prob(anger_modifier * (2 / target_slowness)) && health < maxHealth * 0.5) //we're super angry do it at all dirs
- INVOKE_ASYNC(src, .proc/blasts, target, GLOB.alldirs)
+ INVOKE_ASYNC(src, PROC_REF(blasts), target, GLOB.alldirs)
else if(prob(60))
- INVOKE_ASYNC(src, .proc/blasts, target, GLOB.cardinals)
+ INVOKE_ASYNC(src, PROC_REF(blasts), target, GLOB.cardinals)
else
- INVOKE_ASYNC(src, .proc/blasts, target, GLOB.diagonals)
+ INVOKE_ASYNC(src, PROC_REF(blasts), target, GLOB.diagonals)
else //just release a burst of power
- INVOKE_ASYNC(src, .proc/burst, get_turf(src))
+ INVOKE_ASYNC(src, PROC_REF(burst), get_turf(src))
/mob/living/simple_animal/hostile/megafauna/hierophant/proc/blink_spam(blink_counter, target_slowness, cross_counter)
ranged_cooldown = world.time + max(5, major_attack_cooldown - anger_modifier * 0.75)
@@ -218,7 +218,7 @@ Difficulty: Hard
blinking = TRUE
SLEEP_CHECK_DEATH(4 + target_slowness)
animate(src, color = oldcolor, time = 8)
- addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 8)
SLEEP_CHECK_DEATH(8)
blinking = FALSE
else
@@ -234,12 +234,12 @@ Difficulty: Hard
while(!QDELETED(target) && cross_counter)
cross_counter--
if(prob(60))
- INVOKE_ASYNC(src, .proc/blasts, target, GLOB.cardinals)
+ INVOKE_ASYNC(src, PROC_REF(blasts), target, GLOB.cardinals)
else
- INVOKE_ASYNC(src, .proc/blasts, target, GLOB.diagonals)
+ INVOKE_ASYNC(src, PROC_REF(blasts), target, GLOB.diagonals)
SLEEP_CHECK_DEATH(6 + target_slowness)
animate(src, color = oldcolor, time = 8)
- addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 8)
SLEEP_CHECK_DEATH(8)
blinking = FALSE
@@ -267,7 +267,7 @@ Difficulty: Hard
SLEEP_CHECK_DEATH(8 + target_slowness)
chaser_cooldown = world.time + initial(chaser_cooldown)
animate(src, color = oldcolor, time = 8)
- addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 8)
SLEEP_CHECK_DEATH(8)
blinking = FALSE
@@ -285,7 +285,7 @@ Difficulty: Hard
SLEEP_CHECK_DEATH(2)
new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in directions)
- INVOKE_ASYNC(src, .proc/blast_wall, T, d)
+ INVOKE_ASYNC(src, PROC_REF(blast_wall), T, d)
/mob/living/simple_animal/hostile/megafauna/hierophant/proc/blast_wall(turf/T, set_dir) //make a wall of blasts beam_range tiles long
var/range = beam_range
@@ -304,13 +304,13 @@ Difficulty: Hard
return
arena_cooldown = world.time + initial(arena_cooldown)
for(var/d in GLOB.cardinals)
- INVOKE_ASYNC(src, .proc/arena_squares, T, d)
+ INVOKE_ASYNC(src, PROC_REF(arena_squares), T, d)
for(var/t in RANGE_TURFS(11, T))
if(t && get_dist(t, T) == 11)
new /obj/effect/temp_visual/hierophant/wall(t, src)
new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
if(get_dist(src, T) >= 11) //hey you're out of range I need to get closer to you!
- INVOKE_ASYNC(src, .proc/blink, T)
+ INVOKE_ASYNC(src, PROC_REF(blink), T)
/mob/living/simple_animal/hostile/megafauna/hierophant/proc/arena_squares(turf/T, set_dir) //make a fancy effect extending from the arena target
var/turf/previousturf = T
@@ -453,10 +453,10 @@ Difficulty: Hard
if(ranged_cooldown <= world.time)
calculate_rage()
ranged_cooldown = world.time + max(5, ranged_cooldown_time - anger_modifier * 0.75)
- INVOKE_ASYNC(src, .proc/burst, get_turf(src))
+ INVOKE_ASYNC(src, PROC_REF(burst), get_turf(src))
else
burst_range = 3
- INVOKE_ASYNC(src, .proc/burst, get_turf(src), 0.25) //melee attacks on living mobs cause it to release a fast burst if on cooldown
+ INVOKE_ASYNC(src, PROC_REF(burst), get_turf(src), 0.25) //melee attacks on living mobs cause it to release a fast burst if on cooldown
else
devour(L)
else
@@ -570,7 +570,7 @@ Difficulty: Hard
friendly_fire_check = is_friendly_fire
if(new_speed)
speed = new_speed
- addtimer(CALLBACK(src, .proc/seek_target), 1)
+ addtimer(CALLBACK(src, PROC_REF(seek_target)), 1)
/obj/effect/temp_visual/hierophant/chaser/proc/get_target_dir()
. = get_cardinal_dir(src, targetturf)
@@ -653,9 +653,9 @@ Difficulty: Hard
if(ismineralturf(loc)) //drill mineral turfs
var/turf/closed/mineral/M = loc
M.gets_drilled(caster)
- INVOKE_ASYNC(src, .proc/blast)
+ INVOKE_ASYNC(src, PROC_REF(blast))
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -730,7 +730,7 @@ Difficulty: Hard
if(H.beacon == src)
to_chat(user, "You start removing your hierophant beacon...")
H.timer = world.time + 51
- INVOKE_ASYNC(H, /obj/item/hierophant_club.proc/prepare_icon_update)
+ INVOKE_ASYNC(H, TYPE_PROC_REF(/obj/item/hierophant_club, prepare_icon_update))
if(do_after(user, 50, target = src))
playsound(src,'sound/magic/blind.ogg', 200, TRUE, -4)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(get_turf(src), user)
@@ -740,7 +740,7 @@ Difficulty: Hard
qdel(src)
else
H.timer = world.time
- INVOKE_ASYNC(H, /obj/item/hierophant_club.proc/prepare_icon_update)
+ INVOKE_ASYNC(H, TYPE_PROC_REF(/obj/item/hierophant_club, prepare_icon_update))
else
to_chat(user, "You touch the beacon with the club, but nothing happens.")
else
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index 5159efd266f1..b8f730d87920 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -124,15 +124,15 @@
minimum_distance = 0
set_varspeed(0)
charging = TRUE
- addtimer(CALLBACK(src, .proc/reset_charge), 60)
+ addtimer(CALLBACK(src, PROC_REF(reset_charge)), 60)
var/mob/living/L = target
if(!istype(L) || L.stat != DEAD) //I know, weird syntax, but it just works.
- addtimer(CALLBACK(src, .proc/throw_thyself), 20)
+ addtimer(CALLBACK(src, PROC_REF(throw_thyself)), 20)
///This is the proc that actually does the throwing. Charge only adds a timer for this.
/mob/living/simple_animal/hostile/megafauna/legion/proc/throw_thyself()
playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE)
- throw_at(target, 7, 1.1, src, FALSE, FALSE, CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/effects/meteorimpact.ogg', 50 * size, TRUE, 2), INFINITY)
+ throw_at(target, 7, 1.1, src, FALSE, FALSE, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), src, 'sound/effects/meteorimpact.ogg', 50 * size, TRUE, 2), INFINITY)
///Deals some extra damage on throw impact.
/mob/living/simple_animal/hostile/megafauna/legion/throw_impact(mob/living/hit_atom, datum/thrownthing/throwingdatum)
@@ -341,7 +341,7 @@
/obj/structure/legionturret/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/set_up_shot), initial_firing_time)
+ addtimer(CALLBACK(src, PROC_REF(set_up_shot)), initial_firing_time)
///Handles an extremely basic AI
/obj/structure/legionturret/proc/set_up_shot()
@@ -365,7 +365,7 @@
var/datum/point/vector/V = new(T1.x, T1.y, T1.z, 0, 0, angle)
generate_tracer_between_points(V, V.return_vector_after_increments(6), /obj/effect/projectile/tracer/legion/tracer, 0, shot_delay, 0, 0, 0, null)
playsound(src, 'sound/machines/airlockopen.ogg', 100, TRUE)
- addtimer(CALLBACK(src, .proc/fire_beam, angle), shot_delay)
+ addtimer(CALLBACK(src, PROC_REF(fire_beam), angle), shot_delay)
///Called shot_delay after the turret shot the tracer. Shoots a projectile into the same direction.
/obj/structure/legionturret/proc/fire_beam(angle)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
index 38834a4e5cef..a2cceb5a3aaa 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
@@ -147,7 +147,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
/mob/living/simple_animal/hostile/swarmer/ai/proc/StartAction(deci = 0)
stop_automated_movement = TRUE
AIStatus = AI_OFF
- addtimer(CALLBACK(src, .proc/EndAction), deci)
+ addtimer(CALLBACK(src, PROC_REF(EndAction)), deci)
/mob/living/simple_animal/hostile/swarmer/ai/proc/EndAction()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
index 42836c58cf6b..59a58bd48d16 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
@@ -133,7 +133,7 @@ Difficulty: Hard
. = ..()
stored_move_dirs &= ~direct
if(!stored_move_dirs)
- INVOKE_ASYNC(src, .proc/ground_slam, stomp_range, 1)
+ INVOKE_ASYNC(src, PROC_REF(ground_slam), stomp_range, 1)
/// Slams the ground around the wendigo throwing back enemies caught nearby
/mob/living/simple_animal/hostile/megafauna/wendigo/proc/ground_slam(range, delay)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
index 4376e9e0ae21..eb8302536e50 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -93,7 +93,7 @@
set_varspeed(0)
warmed_up = TRUE
projectiletype = /obj/projectile/temp/basilisk/heated
- addtimer(CALLBACK(src, .proc/cool_down), 3000)
+ addtimer(CALLBACK(src, PROC_REF(cool_down)), 3000)
/mob/living/simple_animal/hostile/asteroid/basilisk/proc/cool_down()
visible_message("[src] appears to be cooling down...")
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
index 45d4114da6e1..1d9f6e174660 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm
@@ -98,7 +98,7 @@
visible_message(span_danger("[src] starts charging!"))
balloon_alert(src, "charging...")
to_chat(src, "You begin to charge up...")
- addtimer(CALLBACK(src, .proc/fire_laser), 1 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(fire_laser)), 1 SECONDS)
COOLDOWN_START(src, ranged_cooldown, ranged_cooldown_time)
/mob/living/simple_animal/hostile/asteroid/brimdemon/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
@@ -143,7 +143,7 @@
last_brimbeam.icon_state = "brimbeam_end"
var/atom/first_brimbeam = beamparts[1]
first_brimbeam.icon_state = "brimbeam_start"
- addtimer(CALLBACK(src, .proc/end_laser), 2 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(end_laser)), 2 SECONDS)
/// Deletes all the brimbeam parts and sets variables back to their initial ones.
/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/end_laser()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
index 33bd3e6ba0f0..fb06bfdf11ca 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
@@ -117,15 +117,15 @@ While using this makes the system rely on OnFire, it still gives options for tim
if(boosted)
mychild.playsound_local(get_turf(mychild), 'sound/effects/magic.ogg', 40, 0)
to_chat(mychild, "Someone has activated your tumor. You will be returned to fight shortly, get ready!")
- addtimer(CALLBACK(src, .proc/return_elite), 30)
- INVOKE_ASYNC(src, .proc/arena_checks)
+ addtimer(CALLBACK(src, PROC_REF(return_elite)), 30)
+ INVOKE_ASYNC(src, PROC_REF(arena_checks))
if(TUMOR_INACTIVE)
activity = TUMOR_ACTIVE
var/mob/dead/observer/elitemind = null
visible_message("[src] begins to convulse. Your instincts tell you to step back.")
activator = user
if(!boosted)
- addtimer(CALLBACK(src, .proc/spawn_elite), 30)
+ addtimer(CALLBACK(src, PROC_REF(spawn_elite)), 30)
return
visible_message("Something within [src] stirs...")
var/list/candidates = pollCandidatesForMob("Do you want to play as a lavaland elite?", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, src, POLL_IGNORE_SENTIENCE_POTION)
@@ -134,7 +134,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
elitemind = pick(candidates)
elitemind.playsound_local(get_turf(elitemind), 'sound/effects/magic.ogg', 40, 0)
to_chat(elitemind, "You have been chosen to play as a Lavaland Elite.\nIn a few seconds, you will be summoned on Lavaland as a monster to fight your activator, in a fight to the death.\nYour attacks can be switched using the buttons on the top left of the HUD, and used by clicking on targets or tiles similar to a gun.\nWhile the opponent might have an upper hand with powerful mining equipment and tools, you have great power normally limited by AI mobs.\nIf you want to win, you'll have to use your powers in creative ways to ensure the kill. It's suggested you try using them all as soon as possible.\nShould you win, you'll receive extra information regarding what to do after. Good luck!")
- addtimer(CALLBACK(src, .proc/spawn_elite, elitemind), 100)
+ addtimer(CALLBACK(src, PROC_REF(spawn_elite), elitemind), 100)
else
visible_message("The stirring stops, and nothing emerges. Perhaps try again later.")
activity = TUMOR_INACTIVE
@@ -150,7 +150,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
mychild.sentience_act()
notify_ghosts("\A [mychild] has been awakened in \the [get_area(src)]!", source = mychild, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Lavaland Elite awakened")
icon_state = "tumor_popped"
- INVOKE_ASYNC(src, .proc/arena_checks)
+ INVOKE_ASYNC(src, PROC_REF(arena_checks))
/obj/structure/elite_tumor/proc/return_elite()
mychild.forceMove(loc)
@@ -198,11 +198,11 @@ While using this makes the system rely on OnFire, it still gives options for tim
/obj/structure/elite_tumor/proc/arena_checks()
if(activity != TUMOR_ACTIVE || QDELETED(src))
return
- INVOKE_ASYNC(src, .proc/fighters_check) //Checks to see if our fighters died.
- INVOKE_ASYNC(src, .proc/arena_trap) //Gets another arena trap queued up for when this one runs out.
- INVOKE_ASYNC(src, .proc/border_check) //Checks to see if our fighters got out of the arena somehow.
+ INVOKE_ASYNC(src, PROC_REF(fighters_check)) //Checks to see if our fighters died.
+ INVOKE_ASYNC(src, PROC_REF(arena_trap)) //Gets another arena trap queued up for when this one runs out.
+ INVOKE_ASYNC(src, PROC_REF(border_check)) //Checks to see if our fighters got out of the arena somehow.
if(!QDELETED(src))
- addtimer(CALLBACK(src, .proc/arena_checks), 50)
+ addtimer(CALLBACK(src, PROC_REF(arena_checks)), 50)
/obj/structure/elite_tumor/proc/fighters_check()
if(activator != null && activator.stat == DEAD || activity == TUMOR_ACTIVE && QDELETED(activator))
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
index 91fdf286aae7..7e2b1c3d990c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
@@ -145,7 +145,7 @@
color = "#FF0000"
set_varspeed(0)
move_to_delay = 3
- addtimer(CALLBACK(src, .proc/reset_rage), 65)
+ addtimer(CALLBACK(src, PROC_REF(reset_rage)), 65)
/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/reset_rage()
color = "#FFFFFF"
@@ -230,11 +230,11 @@
retract()
else
deltimer(timerid)
- timerid = addtimer(CALLBACK(src, .proc/retract), 10, TIMER_STOPPABLE)
+ timerid = addtimer(CALLBACK(src, PROC_REF(retract)), 10, TIMER_STOPPABLE)
/obj/effect/temp_visual/goliath_tentacle/broodmother/patch/Initialize(mapload, new_spawner)
. = ..()
- INVOKE_ASYNC(src, .proc/createpatch)
+ INVOKE_ASYNC(src, PROC_REF(createpatch))
/obj/effect/temp_visual/goliath_tentacle/broodmother/patch/proc/createpatch()
var/tentacle_locs = spiral_range_turfs(1, get_turf(src))
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
index 0ead18b36ad9..ba8ae69093a4 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
@@ -56,7 +56,7 @@
/mob/living/simple_animal/hostile/asteroid/elite/herald/death()
. = ..()
if(!is_mirror)
- addtimer(CALLBACK(src, .proc/become_ghost), 8)
+ addtimer(CALLBACK(src, PROC_REF(become_ghost)), 8)
if(my_mirror != null)
qdel(my_mirror)
@@ -145,13 +145,13 @@
var/target_turf = get_turf(target)
var/angle_to_target = Get_Angle(src, target_turf)
shoot_projectile(target_turf, angle_to_target, FALSE)
- addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 2)
- addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 4)
+ addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE), 2)
+ addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE), 4)
if(health < maxHealth * 0.5)
playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE)
- addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 10)
- addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 12)
- addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 14)
+ addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE), 10)
+ addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE), 12)
+ addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE), 14)
/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_circleshot()
var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315)
@@ -168,11 +168,11 @@
if(!is_mirror)
icon_state = "herald_enraged"
playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE)
- addtimer(CALLBACK(src, .proc/herald_circleshot), 5)
+ addtimer(CALLBACK(src, PROC_REF(herald_circleshot)), 5)
if(health < maxHealth * 0.5)
playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE)
- addtimer(CALLBACK(src, .proc/herald_circleshot), 15)
- addtimer(CALLBACK(src, .proc/unenrage), 20)
+ addtimer(CALLBACK(src, PROC_REF(herald_circleshot)), 15)
+ addtimer(CALLBACK(src, PROC_REF(unenrage)), 20)
/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_teleshot(target)
ranged_cooldown = world.time + 30
@@ -278,4 +278,4 @@
owner.visible_message("[owner]'s [src] emits a loud noise as [owner] is struck!")
var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315)
playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE)
- addtimer(CALLBACK(src, .proc/reactionshot, owner), 10)
+ addtimer(CALLBACK(src, PROC_REF(reactionshot), owner), 10)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
index 8f991a400f18..f0b6dc3e8d54 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
@@ -104,7 +104,7 @@
T = get_step(T, dir_to_target)
playsound(src,'sound/magic/demon_attack1.ogg', 200, 1)
visible_message("[src] prepares to charge!")
- addtimer(CALLBACK(src, .proc/legionnaire_charge_2, dir_to_target, 0), 5)
+ addtimer(CALLBACK(src, PROC_REF(legionnaire_charge_2), dir_to_target, 0), 5)
/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge_2(move_dir, times_ran)
if(times_ran >= 4)
@@ -132,7 +132,7 @@
L.safe_throw_at(throwtarget, 10, 1, src)
L.Paralyze(20)
L.adjustBruteLoss(50)
- addtimer(CALLBACK(src, .proc/legionnaire_charge_2, move_dir, (times_ran + 1)), 2)
+ addtimer(CALLBACK(src, PROC_REF(legionnaire_charge_2), move_dir, (times_ran + 1)), 2)
/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/head_detach(target)
ranged_cooldown = world.time + 10
@@ -160,7 +160,7 @@
/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/onHeadDeath()
myhead = null
- addtimer(CALLBACK(src, .proc/regain_head), 50)
+ addtimer(CALLBACK(src, PROC_REF(regain_head)), 50)
/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/regain_head()
has_head = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
index 33165a4b6dbe..4077f8b58949 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
@@ -122,7 +122,7 @@
new /obj/effect/temp_visual/hierophant/blast/pandora(T, src)
T = get_step(T, angleused)
procsleft = procsleft - 1
- addtimer(CALLBACK(src, .proc/singular_shot_line, procsleft, angleused, T), 2)
+ addtimer(CALLBACK(src, PROC_REF(singular_shot_line), procsleft, angleused, T), 2)
/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/magic_box(target)
ranged_cooldown = world.time + cooldown_time
@@ -138,7 +138,7 @@
new /obj/effect/temp_visual/hierophant/telegraph(T, src)
new /obj/effect/temp_visual/hierophant/telegraph(source, src)
playsound(source,'sound/machines/airlockopen.ogg', 200, 1)
- addtimer(CALLBACK(src, .proc/pandora_teleport_2, T, source), 2)
+ addtimer(CALLBACK(src, PROC_REF(pandora_teleport_2), T, source), 2)
/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_2(turf/T, turf/source)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src)
@@ -150,7 +150,7 @@
animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out
visible_message("[src] fades out!")
density = FALSE
- addtimer(CALLBACK(src, .proc/pandora_teleport_3, T), 2)
+ addtimer(CALLBACK(src, PROC_REF(pandora_teleport_3), T), 2)
/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_3(turf/T)
forceMove(T)
@@ -163,7 +163,7 @@
var/turf/T = get_turf(target)
new /obj/effect/temp_visual/hierophant/blast/pandora(T, src)
var/max_size = 2
- addtimer(CALLBACK(src, .proc/aoe_squares_2, T, 0, max_size), 2)
+ addtimer(CALLBACK(src, PROC_REF(aoe_squares_2), T, 0, max_size), 2)
/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares_2(turf/T, ring, max_size)
if(ring > max_size)
@@ -171,7 +171,7 @@
for(var/t in spiral_range_turfs(ring, T))
if(get_dist(t, T) == ring)
new /obj/effect/temp_visual/hierophant/blast/pandora(t, src)
- addtimer(CALLBACK(src, .proc/aoe_squares_2, T, (ring + 1), max_size), 2)
+ addtimer(CALLBACK(src, PROC_REF(aoe_squares_2), T, (ring + 1), max_size), 2)
/mob/living/simple_animal/hostile/asteroid/elite/pandora/death()
//open all pandora gates
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm
index 91f728b9b4b0..e4eb7122d391 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm
@@ -130,7 +130,7 @@
retreat_distance = 10
minimum_distance = 10
if(will_burrow)
- addtimer(CALLBACK(src, .proc/Burrow), chase_time)
+ addtimer(CALLBACK(src, PROC_REF(Burrow)), chase_time)
/mob/living/simple_animal/hostile/asteroid/goldgrub/AttackingTarget()
if(istype(target, /obj/item/stack/ore))
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index f17070695381..1fa691b85de7 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -306,7 +306,7 @@
var/turf/closed/mineral/M = loc
M.gets_drilled()
deltimer(timerid)
- timerid = addtimer(CALLBACK(src, .proc/tripanim), 7, TIMER_STOPPABLE)
+ timerid = addtimer(CALLBACK(src, PROC_REF(tripanim)), 7, TIMER_STOPPABLE)
if(!recursive)
return
var/list/directions = get_directions()
@@ -321,7 +321,7 @@
/obj/effect/temp_visual/goliath_tentacle/proc/tripanim()
deltimer(timerid)
- timerid = addtimer(CALLBACK(src, .proc/trip), 3, TIMER_STOPPABLE)
+ timerid = addtimer(CALLBACK(src, PROC_REF(trip)), 3, TIMER_STOPPABLE)
/obj/effect/temp_visual/goliath_tentacle/proc/trip()
var/latched = FALSE
@@ -335,7 +335,7 @@
retract()
else
deltimer(timerid)
- timerid = addtimer(CALLBACK(src, .proc/retract), 10, TIMER_STOPPABLE)
+ timerid = addtimer(CALLBACK(src, PROC_REF(retract)), 10, TIMER_STOPPABLE)
/obj/effect/temp_visual/goliath_tentacle/proc/on_hit(mob/living/L)
L.Stun(100)
@@ -392,13 +392,13 @@
shake_animation(20)
visible_message("[src] convulses violently!! Get back!!")
playsound(loc, 'sound/effects/magic.ogg', 100, TRUE)
- addtimer(CALLBACK(src, .proc/open_fire_2), 1 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(open_fire_2)), 1 SECONDS)
/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/crystal/proc/open_fire_2()
if(prob(20) && !(spiral_attack_inprogress))
visible_message("[src] sprays crystalline shards in a circle!")
playsound(loc, 'sound/magic/charge.ogg', 100, TRUE)
- INVOKE_ASYNC(src,.proc/spray_of_crystals)
+ INVOKE_ASYNC(src, PROC_REF(spray_of_crystals))
else
visible_message("[src] expels it's matter, releasing a spray of crystalline shards!")
playsound(loc, 'sound/effects/bamf.ogg', 100, TRUE)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
index 99807cff8210..ee48ed624ee4 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
@@ -48,7 +48,7 @@
/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize()
. = ..()
if(wanted_objects.len)
- AddComponent(/datum/component/udder, /obj/item/udder/gutlunch, CALLBACK(src, .proc/regenerate_icons), CALLBACK(src, .proc/regenerate_icons))
+ AddComponent(/datum/component/udder, /obj/item/udder/gutlunch, CALLBACK(src, PROC_REF(regenerate_icons)), CALLBACK(src, PROC_REF(regenerate_icons)))
/mob/living/simple_animal/hostile/asteroid/gutlunch/CanAttack(atom/the_target) // Gutlunch-specific version of CanAttack to handle stupid stat_exclusive = true crap so we don't have to do it for literally every single simple_animal/hostile except the two that spawn in lavaland
if(isturf(the_target) || !the_target || the_target.type == /atom/movable/lighting_object) // bail out on invalids
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index aa2446ca108a..bdc4124ed929 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -94,7 +94,7 @@
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize(_source)
. = ..()
source = source
- addtimer(CALLBACK(src, .proc/death), 100)
+ addtimer(CALLBACK(src, PROC_REF(death)), 100)
AddComponent(/datum/component/swarming)
//Legion
@@ -222,7 +222,7 @@
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/staff/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/death), 50)
+ addtimer(CALLBACK(src, PROC_REF(death)), 50)
AddComponent(/datum/component/swarming)
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life()
@@ -1036,5 +1036,11 @@
if(prob(75))
backpack_contents += list(/obj/item/ammo_box/c38_box = 1)
if(prob(75))
- backpack_contents += list(pick(/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageash, /obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageice, /obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageshock) = 1)
+ backpack_contents += list(pick(
+ /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/ashwine,
+ /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/icewine,
+ /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/shockwine,
+ /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/hearthwine,
+ /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/forcewine,
+ /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/prismwine,) = 2)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
index 9f458f617c87..2315f6e61a4f 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice demon.dm
@@ -194,7 +194,7 @@
icon_state = "frozen"
/datum/status_effect/ice_crystal/on_apply()
- RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, .proc/owner_moved)
+ RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(owner_moved))
if(!owner.stat)
to_chat(owner, "You become frozen in a cube!")
cube = icon('icons/effects/freeze.dmi', "ice_cube")
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 4c7ddedbbb1d..26a587f7f854 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -88,7 +88,7 @@
/mob/living/simple_animal/hostile/mushroom/adjustHealth(amount, updating_health = TRUE, forced = FALSE) //Possibility to flee from a fight just to make it more visually interesting
if(!retreat_distance && prob(33))
retreat_distance = 5
- addtimer(CALLBACK(src, .proc/stop_retreat), 30)
+ addtimer(CALLBACK(src, PROC_REF(stop_retreat)), 30)
. = ..()
/mob/living/simple_animal/hostile/mushroom/proc/stop_retreat()
@@ -137,7 +137,7 @@
revive(full_heal = TRUE, admin_revive = FALSE)
UpdateMushroomCap()
recovery_cooldown = 1
- addtimer(CALLBACK(src, .proc/recovery_recharge), 300)
+ addtimer(CALLBACK(src, PROC_REF(recovery_recharge)), 300)
/mob/living/simple_animal/hostile/mushroom/proc/recovery_recharge()
recovery_cooldown = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm
index 8c1e47926935..cad59e7369b8 100644
--- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm
@@ -37,7 +37,7 @@
riot = new /datum/action/cooldown/riot
coffer.Grant(src)
riot.Grant(src)
- INVOKE_ASYNC(src, .proc/get_player)
+ INVOKE_ASYNC(src, PROC_REF(get_player))
/mob/living/simple_animal/hostile/regalrat/Destroy()
coffer.Remove(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
index 0eb4232e65fd..7853b478033f 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm
@@ -46,12 +46,12 @@
Retaliate()
/mob/living/simple_animal/hostile/retaliate/proc/add_enemy(new_enemy)
- RegisterSignal(new_enemy, COMSIG_PARENT_QDELETING, .proc/remove_enemy, override = TRUE)
+ RegisterSignal(new_enemy, COMSIG_PARENT_QDELETING, PROC_REF(remove_enemy), override = TRUE)
enemies |= new_enemy
/mob/living/simple_animal/hostile/retaliate/proc/add_enemies(new_enemies)
for(var/new_enemy in new_enemies)
- RegisterSignal(new_enemy, COMSIG_PARENT_QDELETING, .proc/remove_enemy, override = TRUE)
+ RegisterSignal(new_enemy, COMSIG_PARENT_QDELETING, PROC_REF(remove_enemy), override = TRUE)
enemies |= new_enemy
/mob/living/simple_animal/hostile/retaliate/proc/clear_enemies()
diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm
index c43c37a6bd21..3375cd0a7269 100644
--- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm
@@ -198,7 +198,7 @@
if(D.density)
return
delayFire += 1.5
- addtimer(CALLBACK(src, .proc/dragon_fire_line, T), delayFire)
+ addtimer(CALLBACK(src, PROC_REF(dragon_fire_line), T), delayFire)
/**
* What occurs on each tile to actually create the fire.
@@ -279,7 +279,7 @@
fully_heal()
color = "#FF0000"
set_varspeed(-0.5)
- addtimer(CALLBACK(src, .proc/rift_empower, FALSE), 300)
+ addtimer(CALLBACK(src, PROC_REF(rift_empower), FALSE), 300)
else
color = "#FFFFFF"
set_varspeed(0)
@@ -312,7 +312,7 @@
/mob/living/simple_animal/hostile/space_dragon/proc/useGust(timer)
if(timer != 10)
pixel_y = pixel_y + 2;
- addtimer(CALLBACK(src, .proc/useGust, timer + 1), 1.5)
+ addtimer(CALLBACK(src, PROC_REF(useGust), timer + 1), 1.5)
return
pixel_y = 0
icon_state = "spacedragon_gust_2"
@@ -330,7 +330,7 @@
var/throwtarget = get_edge_target_turf(target, dir_to_target)
L.safe_throw_at(throwtarget, 10, 1, src)
L.Paralyze(50)
- addtimer(CALLBACK(src, .proc/reset_status), 4 + ((tiredness * tiredness_mult) / 10))
+ addtimer(CALLBACK(src, PROC_REF(reset_status)), 4 + ((tiredness * tiredness_mult) / 10))
tiredness = tiredness + (30 * tiredness_mult)
/**
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index e518955d91af..52ddcc72963a 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -32,7 +32,7 @@
for(var/turf/T in anchors)
vines += Beam(T, "vine", maxdistance=5, beam_type=/obj/effect/ebeam/vine)
- addtimer(CALLBACK(src, .proc/bear_fruit), growth_time)
+ addtimer(CALLBACK(src, PROC_REF(bear_fruit)), growth_time)
/obj/structure/alien/resin/flower_bud_enemy/Destroy()
QDEL_LIST(vines)
@@ -131,7 +131,7 @@
return
var/datum/beam/newVine = Beam(the_target, icon_state = "vine", maxdistance = vine_grab_distance, beam_type=/obj/effect/ebeam/vine, emissive = FALSE)
- RegisterSignal(newVine, COMSIG_PARENT_QDELETING, .proc/remove_vine, newVine)
+ RegisterSignal(newVine, COMSIG_PARENT_QDELETING, PROC_REF(remove_vine), newVine)
vines += newVine
if(isliving(the_target))
var/mob/living/L = the_target
diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
index 5eb2965fdc0e..b77436c09c89 100644
--- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
+++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
@@ -100,7 +100,7 @@
F.environment_smash = ENVIRONMENT_SMASH_WALLS
F.mob_size = MOB_SIZE_LARGE
F.speed = 1
- addtimer(CALLBACK(F, /mob/living/simple_animal/hostile/asteroid/fugu/proc/Deflate), 100)
+ addtimer(CALLBACK(F, TYPE_PROC_REF(/mob/living/simple_animal/hostile/asteroid/fugu, Deflate)), 100)
/mob/living/simple_animal/hostile/asteroid/fugu/proc/Deflate()
if(wumbo)
diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm
index 2de9fba68678..37be0db7f16c 100644
--- a/code/modules/mob/living/simple_animal/hostile/zombie.dm
+++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm
@@ -26,7 +26,7 @@
/mob/living/simple_animal/hostile/zombie/Initialize(mapload)
. = ..()
- INVOKE_ASYNC(src, .proc/setup_visuals)
+ INVOKE_ASYNC(src, PROC_REF(setup_visuals))
/mob/living/simple_animal/hostile/zombie/proc/setup_visuals()
var/datum/preferences/dummy_prefs = new
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index 5260c76e8a01..b880704c9bf9 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -375,7 +375,7 @@
else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(33))
step(src, pick(GLOB.cardinals))
else if(!AIproc)
- INVOKE_ASYNC(src, .proc/AIprocess)
+ INVOKE_ASYNC(src, PROC_REF(AIprocess))
/mob/living/simple_animal/slime/handle_automated_movement()
return //slime random movement is currently handled in handle_targets()
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index d8d34a804958..cb4b76983563 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -457,7 +457,7 @@
if(user)
step_away(src,user,15)
- addtimer(CALLBACK(src, .proc/slime_move, user), 0.3 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(slime_move), user), 0.3 SECONDS)
/mob/living/simple_animal/slime/proc/slime_move(mob/user)
@@ -490,7 +490,7 @@
if(old_target && !SLIME_CARES_ABOUT(old_target))
UnregisterSignal(old_target, COMSIG_PARENT_QDELETING)
if(Target)
- RegisterSignal(Target, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE)
+ RegisterSignal(Target, COMSIG_PARENT_QDELETING, PROC_REF(clear_memories_of), override = TRUE)
/mob/living/simple_animal/slime/proc/set_leader(new_leader)
var/old_leader = Leader
@@ -498,19 +498,19 @@
if(old_leader && !SLIME_CARES_ABOUT(old_leader))
UnregisterSignal(old_leader, COMSIG_PARENT_QDELETING)
if(Leader)
- RegisterSignal(Leader, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE)
+ RegisterSignal(Leader, COMSIG_PARENT_QDELETING, PROC_REF(clear_memories_of), override = TRUE)
/mob/living/simple_animal/slime/proc/add_friendship(new_friend, amount = 1)
if(!Friends[new_friend])
Friends[new_friend] = 0
Friends[new_friend] += amount
if(new_friend)
- RegisterSignal(new_friend, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE)
+ RegisterSignal(new_friend, COMSIG_PARENT_QDELETING, PROC_REF(clear_memories_of), override = TRUE)
/mob/living/simple_animal/slime/proc/set_friendship(new_friend, amount = 1)
Friends[new_friend] = amount
if(new_friend)
- RegisterSignal(new_friend, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE)
+ RegisterSignal(new_friend, COMSIG_PARENT_QDELETING, PROC_REF(clear_memories_of), override = TRUE)
/mob/living/simple_animal/slime/proc/remove_friend(friend)
Friends -= friend
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 49fe6a0f059e..6e60af7ed244 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -449,32 +449,36 @@
* [this byond forum post](https://secure.byond.com/forum/?post=1326139&page=2#comment8198716)
* for why this isn't atom/verb/examine()
*/
-/mob/verb/examinate(atom/A as mob|obj|turf in view()) //It used to be oview(12), but I can't really say why
+/mob/verb/examinate(atom/examinify as mob|obj|turf in view()) //It used to be oview(12), but I can't really say why
set name = "Examine"
set category = "IC"
- if(isturf(A) && !(sight & SEE_TURFS) && !(A in view(client ? client.view : world.view, src)))
+ DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(run_examinate), examinify))
+
+/mob/proc/run_examinate(atom/examinify)
+
+ if(isturf(examinify) && !(sight & SEE_TURFS) && !(examinify in view(client ? client.view : world.view, src)))
// shift-click catcher may issue examinate() calls for out-of-sight turfs
return
- if(is_blind() && !blind_examine_check(A)) //blind people see things differently (through touch)
+ if(is_blind() && !blind_examine_check(examinify)) //blind people see things differently (through touch)
return
- face_atom(A)
+ face_atom(examinify)
var/list/result
if(client)
LAZYINITLIST(client.recent_examines)
- if(isnull(client.recent_examines[A]) || client.recent_examines[A] < world.time)
- result = A.examine(src)
- client.recent_examines[A] = world.time + EXAMINE_MORE_TIME // set the value to when the examine cooldown ends
- RegisterSignal(A, COMSIG_PARENT_QDELETING, .proc/clear_from_recent_examines, override=TRUE) // to flush the value if deleted early
- addtimer(CALLBACK(src, .proc/clear_from_recent_examines, A), EXAMINE_MORE_TIME)
- handle_eye_contact(A)
+ if(isnull(client.recent_examines[examinify]) || client.recent_examines[examinify] < world.time)
+ result = examinify.examine(src)
+ client.recent_examines[examinify] = world.time + EXAMINE_MORE_TIME // set the value to when the examine cooldown ends
+ RegisterSignal(examinify, COMSIG_PARENT_QDELETING, PROC_REF(clear_from_recent_examines), override=TRUE) // to flush the value if deleted early
+ addtimer(CALLBACK(src, PROC_REF(clear_from_recent_examines), examinify), EXAMINE_MORE_TIME)
+ handle_eye_contact(examinify)
else
- result = A.examine_more(src)
+ result = examinify.examine_more(src)
else
- result = A.examine(src) // if a tree is examined but no client is there to see it, did the tree ever really exist?
+ result = examinify.examine(src) // if a tree is examined but no client is there to see it, did the tree ever really exist?
if(result.len)
for(var/i in 1 to (length(result) - 1))
@@ -482,7 +486,7 @@
to_chat(src, examine_block("[result.Join()]"))
- SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A)
+ SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, examinify)
/mob/proc/blind_examine_check(atom/examined_thing)
@@ -555,11 +559,11 @@
// check to see if their face is blocked or, if not, a signal blocks it
if(examined_mob.is_face_visible() && SEND_SIGNAL(src, COMSIG_MOB_EYECONTACT, examined_mob, TRUE) != COMSIG_BLOCK_EYECONTACT)
var/msg = "You make eye contact with [examined_mob]."
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, src, msg), 3) // so the examine signal has time to fire and this will print after
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), src, msg), 3) // so the examine signal has time to fire and this will print after
if(is_face_visible() && SEND_SIGNAL(examined_mob, COMSIG_MOB_EYECONTACT, src, FALSE) != COMSIG_BLOCK_EYECONTACT)
var/msg = "[src] makes eye contact with you."
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, examined_mob, msg), 3)
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), examined_mob, msg), 3)
///Can this mob resist (default FALSE)
@@ -604,6 +608,10 @@
set category = "Object"
set src = usr
+ DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(execute_mode)))
+
+///proc version to finish /mob/verb/mode() execution. used in case the proc needs to be queued for the tick after its first called
+/mob/proc/execute_mode()
if(ismecha(loc))
return
@@ -615,6 +623,22 @@
I.attack_self(src)
update_inv_hands()
+/mob/verb/do_unique_action()
+ set name = "Do Unique Action"
+ set category = "Object"
+ set src = usr
+
+ if(ismecha(loc))
+ return
+
+ if(incapacitated())
+ return
+
+ var/obj/item/I = get_active_held_item()
+ if(I)
+ I.unique_action(src)
+ update_inv_hands()
+
/**
* Get the notes of this mob
*
@@ -1071,6 +1095,14 @@
return LAZYLEN(match_list)
return FALSE
+/mob/proc/update_joined_player_list(newname, oldname)
+ if(newname == oldname)
+ return
+ if(oldname)
+ GLOB.joined_player_list -= oldname
+ if(newname)
+ GLOB.joined_player_list[newname] = TRUE
+
/**
* Fully update the name of a mob
@@ -1086,6 +1118,9 @@
log_played_names(ckey,newname)
+ if(GLOB.joined_player_list[oldname])
+ update_joined_player_list(newname, oldname)
+
real_name = newname
name = newname
if(mind)
@@ -1160,7 +1195,8 @@
/mob/proc/update_mouse_pointer()
if(!client)
return
- client.mouse_pointer_icon = initial(client.mouse_pointer_icon)
+ if(client.mouse_pointer_icon != initial(client.mouse_pointer_icon))//only send changes to the client if theyre needed
+ client.mouse_pointer_icon = initial(client.mouse_pointer_icon)
if(examine_cursor_icon && client.keys_held["Shift"]) //mouse shit is hardcoded, make this non hard-coded once we make mouse modifiers bindable
client.mouse_pointer_icon = examine_cursor_icon
if(istype(loc, /obj/vehicle/sealed))
@@ -1170,6 +1206,11 @@
if(client.mouse_override_icon)
client.mouse_pointer_icon = client.mouse_override_icon
+/mob/proc/update_names_joined_list(new_name, old_name)
+ if(old_name)
+ GLOB.real_names_joined -= old_name
+ if(new_name)
+ GLOB.real_names_joined[new_name] = TRUE
///This mob is abile to read books
/mob/proc/is_literate()
@@ -1394,7 +1435,7 @@
UnregisterSignal(active_storage, COMSIG_PARENT_QDELETING)
active_storage = new_active_storage
if(active_storage)
- RegisterSignal(active_storage, COMSIG_PARENT_QDELETING, .proc/active_storage_deleted)
+ RegisterSignal(active_storage, COMSIG_PARENT_QDELETING, PROC_REF(active_storage_deleted))
/mob/proc/active_storage_deleted(datum/source)
SIGNAL_HANDLER
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 4c4a58378410..de1cb857ed4e 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -221,23 +221,37 @@
return sanitize(.)
///Shake the camera of the person viewing the mob SO REAL!
-/proc/shake_camera(mob/M, duration, strength=1)
- if(!M || !M.client || duration < 1)
+/proc/shake_camera(mob/recoilster, duration, strength=1)
+ if(!recoilster || !recoilster.client || duration < 1)
return
- var/client/C = M.client
- var/oldx = C.pixel_x
- var/oldy = C.pixel_y
+ var/client/client_to_shake = recoilster.client
+ var/oldx = client_to_shake.pixel_x
+ var/oldy = client_to_shake.pixel_y
var/max = strength*world.icon_size
var/min = -(strength*world.icon_size)
for(var/i in 0 to duration-1)
if (i == 0)
- animate(C, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
+ animate(client_to_shake, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
else
animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
animate(pixel_x=oldx, pixel_y=oldy, time=1)
+/proc/recoil_camera(mob/recoilster, duration, backtime_duration, strength, angle)
+ if(!recoilster || !recoilster.client)
+ return
+ strength *= world.icon_size
+ var/client/client_to_shake = recoilster.client
+ var/oldx = client_to_shake.pixel_x
+ var/oldy = client_to_shake.pixel_y
+
+ //get pixels to move the camera in an angle
+ var/mpx = sin(angle) * strength
+ var/mpy = cos(angle) * strength
+ animate(client_to_shake, pixel_x = oldx+mpx, pixel_y = oldy+mpy, time = duration, flags = ANIMATION_RELATIVE)
+ animate(pixel_x = oldx, pixel_y = oldy, time = backtime_duration, easing = BACK_EASING)
+
///Find if the message has the real name of any user mob in the mob_list
/proc/findname(msg)
if(!istext(msg))
diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm
index 7e70eb0ee159..495f77dc0384 100644
--- a/code/modules/mob/mob_say.dm
+++ b/code/modules/mob/mob_say.dm
@@ -13,7 +13,7 @@
//queue this message because verbs are scheduled to process after SendMaps in the tick and speech is pretty expensive when it happens.
//by queuing this for next tick the mc can compensate for its cost instead of having speech delay the start of the next tick
if(message)
- SSspeech_controller.queue_say_for_mob(src, message, SPEECH_CONTROLLER_QUEUE_SAY_VERB)
+ QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, /atom/movable/proc/say, message), SSspeech_controller)
///Whisper verb
/mob/verb/whisper_verb(message as text)
@@ -24,7 +24,7 @@
to_chat(usr, "Speech is currently admin-disabled.")
return
if(message)
- SSspeech_controller.queue_say_for_mob(src, message, SPEECH_CONTROLLER_QUEUE_WHISPER_VERB)
+ QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, /mob/proc/whisper, message), SSspeech_controller)
///whisper a message
/mob/proc/whisper(message, datum/language/language=null)
@@ -43,7 +43,7 @@
message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN))
- SSspeech_controller.queue_say_for_mob(src, message, SPEECH_CONTROLLER_QUEUE_EMOTE_VERB)
+ QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, /mob/proc/emote, "me", 1, message, TRUE), SSspeech_controller)
///Speak as a dead person (ghost etc)
/mob/proc/say_dead(message)
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 83bb19a33882..d2e6a4f0dda2 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -10,28 +10,22 @@
set src in usr
if(usr != src)
- usr << "No."
+ to_chat(usr, span_warning("You can't set someone else's flavour text!"))
var/msg = sanitize(input(usr,"Set the flavor text in your 'examine' verb. Can also be used for OOC notes about your character.","Flavor Text",html_decode(flavor_text)) as message|null)
- if(msg) //WS edit - "Cancel" does not clear flavor text
+ if(msg)
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
msg = html_encode(msg)
flavor_text = msg
-/mob/proc/warn_flavor_changed()
- if(flavor_text && flavor_text != "") // don't spam people that don't use it!
- src << "OOC Warning:
"
- src << "Your flavor text is likely out of date! Change"
-
/mob/proc/print_flavor_text()
if(flavor_text && flavor_text != "")
var/msg = replacetext(flavor_text, "\n", " ")
if(length(msg) <= 100)
return "[msg]"
else
- return "[copytext(msg, 1, 97)]... More..."
-
+ return "[copytext(msg, 1, 97)]... More..."
/mob/proc/get_top_level_mob()
if(istype(src.loc,/mob)&&src.loc!=src)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index aa8a869da38a..59b64f63d139 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -19,7 +19,7 @@
new /obj/effect/temp_visual/monkeyify(loc)
- transformation_timer = addtimer(CALLBACK(src, .proc/finish_monkeyize, tr_flags), TRANSFORMATION_DURATION, TIMER_UNIQUE)
+ transformation_timer = addtimer(CALLBACK(src, PROC_REF(finish_monkeyize), tr_flags), TRANSFORMATION_DURATION, TIMER_UNIQUE)
/mob/living/carbon/proc/finish_monkeyize(tr_flags)
transformation_timer = null
@@ -189,7 +189,7 @@
invisibility = INVISIBILITY_MAXIMUM
new /obj/effect/temp_visual/monkeyify/humanify(loc)
- transformation_timer = addtimer(CALLBACK(src, .proc/finish_humanize, tr_flags), TRANSFORMATION_DURATION, TIMER_UNIQUE)
+ transformation_timer = addtimer(CALLBACK(src, PROC_REF(finish_humanize), tr_flags), TRANSFORMATION_DURATION, TIMER_UNIQUE)
/mob/living/carbon/proc/finish_humanize(tr_flags)
transformation_timer = null
diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
index 939cafb13f0c..8fdad6474636 100644
--- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
+++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
@@ -21,7 +21,7 @@
if(istype(computer, /obj/item/modular_computer/tablet/integrated)) //If this is a borg's integrated tablet
var/obj/item/modular_computer/tablet/integrated/modularInterface = computer
to_chat(modularInterface.borgo,"SYSTEM PURGE DETECTED/")
- addtimer(CALLBACK(modularInterface.borgo, /mob/living/silicon/robot/.proc/death), 2 SECONDS, TIMER_UNIQUE)
+ addtimer(CALLBACK(modularInterface.borgo, TYPE_PROC_REF(/mob/living/silicon/robot, death)), 2 SECONDS, TIMER_UNIQUE)
return
computer.visible_message("\The [computer]'s screen brightly flashes and loud electrical buzzing is heard.")
diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm
index d1c6335587a4..1506d7512fe0 100644
--- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm
+++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm
@@ -54,7 +54,7 @@
if (!isturf(S.loc) || !S.virtual_z() == T.virtual_z())
continue
supermatters.Add(S)
- RegisterSignal(S, COMSIG_PARENT_QDELETING, .proc/react_to_del)
+ RegisterSignal(S, COMSIG_PARENT_QDELETING, PROC_REF(react_to_del))
/datum/computer_file/program/supermatter_monitor/proc/get_status()
. = SUPERMATTER_INACTIVE
@@ -70,8 +70,8 @@
*/
/datum/computer_file/program/supermatter_monitor/proc/set_signals()
if(active)
- RegisterSignal(active, COMSIG_SUPERMATTER_DELAM_ALARM, .proc/send_alert, override = TRUE)
- RegisterSignal(active, COMSIG_SUPERMATTER_DELAM_START_ALARM, .proc/send_start_alert, override = TRUE)
+ RegisterSignal(active, COMSIG_SUPERMATTER_DELAM_ALARM, PROC_REF(send_alert), override = TRUE)
+ RegisterSignal(active, COMSIG_SUPERMATTER_DELAM_START_ALARM, PROC_REF(send_start_alert), override = TRUE)
/**
* Removes the signal listener for Supermatter delaminations from the selected supermatter.
diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm
index f9ac4410f65d..7d518c0b2f6d 100644
--- a/code/modules/modular_computers/laptop_vendor.dm
+++ b/code/modules/modular_computers/laptop_vendor.dm
@@ -304,6 +304,6 @@
credits -= total_price
say("Enjoy your new product!")
state = 3
- addtimer(CALLBACK(src, .proc/reset_order), 100)
+ addtimer(CALLBACK(src, PROC_REF(reset_order)), 100)
return TRUE
return FALSE
diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm
index 32f5756e0843..b10e25c84e7a 100644
--- a/code/modules/movespeed/modifiers/items.dm
+++ b/code/modules/movespeed/modifiers/items.dm
@@ -11,5 +11,9 @@
/datum/movespeed_modifier/die_of_fate
multiplicative_slowdown = 1
+/datum/movespeed_modifier/gun
+ multiplicative_slowdown = 1
+ variable = TRUE
+
/datum/movespeed_modifier/berserk
multiplicative_slowdown = -0.2
diff --git a/code/modules/movespeed/modifiers/reagent.dm b/code/modules/movespeed/modifiers/reagent.dm
index fb4994f00ad3..d6b0703ccb59 100644
--- a/code/modules/movespeed/modifiers/reagent.dm
+++ b/code/modules/movespeed/modifiers/reagent.dm
@@ -38,4 +38,4 @@
multiplicative_slowdown = -0.45
/datum/movespeed_modifier/reagent/shock_wine
- multiplicative_slowdown = -0.15
+ multiplicative_slowdown = -0.40
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
index 673283bb5d2a..db4267f6849f 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
@@ -16,7 +16,7 @@
a_boost--
to_chat(H, "There are [a_boost] adrenaline boosts remaining.")
s_coold = 3
- addtimer(CALLBACK(src, .proc/ninjaboost_after), 70)
+ addtimer(CALLBACK(src, PROC_REF(ninjaboost_after)), 70)
/obj/item/clothing/suit/space/space_ninja/proc/ninjaboost_after()
var/mob/living/carbon/human/H = affecting
diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm
index bb9f88646a40..cc30ddb9a882 100644
--- a/code/modules/ninja/suit/suit_initialisation.dm
+++ b/code/modules/ninja/suit/suit_initialisation.dm
@@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(ninja_deinitialize_messages, list(
playsound(U, 'sound/effects/sparks1.ogg', 10, TRUE)
if (phase < NINJA_COMPLETE_PHASE)
- addtimer(CALLBACK(src, .proc/ninitialize, delay, U, phase + 1), delay)
+ addtimer(CALLBACK(src, PROC_REF(ninitialize), delay, U, phase + 1), delay)
/**
* Deinitializes the ninja suit
@@ -110,7 +110,7 @@ GLOBAL_LIST_INIT(ninja_deinitialize_messages, list(
playsound(U, 'sound/items/deconstruct.ogg', 10, TRUE)
if (phase < NINJA_COMPLETE_PHASE)
- addtimer(CALLBACK(src, .proc/deinitialize, delay, U, phase + 1), delay)
+ addtimer(CALLBACK(src, PROC_REF(deinitialize), delay, U, phase + 1), delay)
else
unlock_suit()
U.regenerate_icons()
diff --git a/code/modules/overmap/_overmap_datum.dm b/code/modules/overmap/_overmap_datum.dm
index 420b7aad4055..076188f6ec58 100644
--- a/code/modules/overmap/_overmap_datum.dm
+++ b/code/modules/overmap/_overmap_datum.dm
@@ -38,6 +38,9 @@
/// The icon state the token will be set to on init.
var/token_icon_state = "object"
+ /// The current docking ticket of this object, if any
+ var/datum/docking_ticket/current_docking_ticket
+
/datum/overmap/New(position, ...)
SHOULD_NOT_OVERRIDE(TRUE) // Use [/datum/overmap/proc/Initialize] instead.
if(!position)
@@ -64,6 +67,8 @@
/datum/overmap/Destroy(force, ...)
SSovermap.overmap_objects -= src
+ if(current_docking_ticket)
+ QDEL_NULL(current_docking_ticket)
if(docked_to)
docked_to.post_undocked()
docked_to.contents -= src
@@ -219,22 +224,25 @@
if(docked_to)
CRASH("Overmap datum [src] tried to dock to [docked_to] when it is already docked to another overmap datum.")
- if(docking)
- return
+ if(docking || current_docking_ticket)
+ return "Already docking!"
docking = TRUE
var/datum/docking_ticket/ticket = dock_target.pre_docked(src)
- if(!ticket || ticket.docking_error)
+ var/ticket_error = ticket?.docking_error
+ if(!ticket || ticket_error)
+ qdel(ticket)
docking = FALSE
- return ticket?.docking_error || "Unknown docking error!"
+ return ticket_error || "Unknown docking error!"
if(!pre_dock(dock_target, ticket))
+ qdel(ticket)
docking = FALSE
- return
+ return ticket_error
start_dock(dock_target, ticket)
if(dock_time && !force)
- dock_timer_id = addtimer(CALLBACK(src, .proc/complete_dock, dock_target, ticket), dock_time)
+ dock_timer_id = addtimer(CALLBACK(src, PROC_REF(complete_dock), dock_target, ticket), dock_time)
else
complete_dock(dock_target, ticket)
@@ -289,6 +297,9 @@
dock_target.post_docked(src)
docking = FALSE
+ //Clears the docking ticket from both sides
+ qdel(current_docking_ticket)
+
SEND_SIGNAL(src, COMSIG_OVERMAP_DOCK, dock_target)
/**
@@ -312,7 +323,7 @@
docking = TRUE
if(dock_time && !force)
- dock_timer_id = addtimer(CALLBACK(src, .proc/complete_undock), dock_time)
+ dock_timer_id = addtimer(CALLBACK(src, PROC_REF(complete_undock)), dock_time)
else
complete_undock()
@@ -332,7 +343,7 @@
var/datum/overmap/old_docked_to = docked_to
docked_to = null
token.forceMove(OVERMAP_TOKEN_TURF(x, y))
- INVOKE_ASYNC(old_docked_to, .proc/post_undocked, src)
+ INVOKE_ASYNC(old_docked_to, PROC_REF(post_undocked), src)
docking = FALSE
SEND_SIGNAL(src, COMSIG_OVERMAP_UNDOCK, old_docked_to)
diff --git a/code/modules/overmap/docking_ticket.dm b/code/modules/overmap/docking_ticket.dm
index f32ffde39716..4e6465043246 100644
--- a/code/modules/overmap/docking_ticket.dm
+++ b/code/modules/overmap/docking_ticket.dm
@@ -9,7 +9,40 @@
var/docking_error
/datum/docking_ticket/New(_target_port, _issuer, _target, _docking_error)
+ docking_error = _docking_error
+ if(docking_error)
+ return
+
+ if(!_target_port)
+ docking_error = "No target port specified!"
+ return
target_port = _target_port
+ if(target_port.current_docking_ticket)
+ docking_error = "[target_port] is already being docked to!"
+ return
+ target_port.current_docking_ticket = src
+
+ if(!_issuer)
+ docking_error = "No issuer overmap datum specified!"
+ return
issuer = _issuer
+
+ if(!_target)
+ docking_error = "No target overmap datum specified!"
+ return
target = _target
- docking_error = _docking_error
+ if(target.current_docking_ticket)
+ docking_error = "[target] is already docking!"
+ return
+ target.current_docking_ticket = src
+
+
+/datum/docking_ticket/Destroy(force, ...)
+ if(target)
+ target.current_docking_ticket = null
+ target = null
+ if(target_port)
+ target_port.current_docking_ticket = null
+ target_port = null
+
+ return ..()
diff --git a/code/modules/overmap/helm.dm b/code/modules/overmap/helm.dm
index e39b6bc88866..59fdee827907 100644
--- a/code/modules/overmap/helm.dm
+++ b/code/modules/overmap/helm.dm
@@ -66,7 +66,7 @@
if(jump_state != JUMP_STATE_OFF && !inline)
return // This exists to prefent Href exploits to call process_jump more than once by a client
message_admins("[ADMIN_LOOKUPFLW(usr)] has initiated a bluespace jump in [ADMIN_VERBOSEJMP(src)]")
- jump_timer = addtimer(CALLBACK(src, .proc/jump_sequence, TRUE), JUMP_CHARGEUP_TIME, TIMER_STOPPABLE)
+ jump_timer = addtimer(CALLBACK(src, PROC_REF(jump_sequence), TRUE), JUMP_CHARGEUP_TIME, TIMER_STOPPABLE)
priority_announce("Bluespace jump calibration initialized. Calibration completion in [JUMP_CHARGEUP_TIME/600] minutes.", sender_override="[current_ship.name] Bluespace Pylon", zlevel=virtual_z())
calibrating = TRUE
return TRUE
@@ -99,9 +99,9 @@
if(JUMP_STATE_FIRING)
jump_state = JUMP_STATE_FINALIZED
priority_announce("Bluespace Pylon launched.", sender_override = "[current_ship.name] Bluespace Pylon", sound = 'sound/magic/lightning_chargeup.ogg', zlevel = virtual_z())
- addtimer(CALLBACK(src, .proc/do_jump), 10 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(do_jump)), 10 SECONDS)
return
- jump_timer = addtimer(CALLBACK(src, .proc/jump_sequence, TRUE), JUMP_CHARGE_DELAY, TIMER_STOPPABLE)
+ jump_timer = addtimer(CALLBACK(src, PROC_REF(jump_sequence), TRUE), JUMP_CHARGE_DELAY, TIMER_STOPPABLE)
/obj/machinery/computer/helm/proc/do_jump()
priority_announce("Bluespace Jump Initiated.", sender_override = "[current_ship.name] Bluespace Pylon", sound = 'sound/magic/lightningbolt.ogg', zlevel = virtual_z())
diff --git a/code/modules/overmap/missions.dm b/code/modules/overmap/missions.dm
index e3461ced00de..135f6b53ce45 100644
--- a/code/modules/overmap/missions.dm
+++ b/code/modules/overmap/missions.dm
@@ -35,7 +35,7 @@
value = round(rand(value-val_mod, value+val_mod) * (dur_value_scaling ? old_dur / duration : 1), 50)
source_outpost = _outpost
- RegisterSignal(source_outpost, COMSIG_PARENT_QDELETING, .proc/on_vital_delete)
+ RegisterSignal(source_outpost, COMSIG_PARENT_QDELETING, PROC_REF(on_vital_delete))
return ..()
/datum/mission/proc/accept(datum/overmap/ship/controlled/acceptor, turf/accept_loc)
@@ -43,7 +43,7 @@
servant = acceptor
LAZYREMOVE(source_outpost.missions, src)
LAZYADD(servant.missions, src)
- RegisterSignal(servant, COMSIG_PARENT_QDELETING, .proc/on_vital_delete)
+ RegisterSignal(servant, COMSIG_PARENT_QDELETING, PROC_REF(on_vital_delete))
dur_timer = addtimer(VARSET_CALLBACK(src, failed, TRUE), duration, TIMER_STOPPABLE)
/datum/mission/proc/on_vital_delete()
@@ -117,7 +117,7 @@
if(sparks)
do_sparks(3, FALSE, get_turf(bound))
LAZYSET(bound_atoms, bound, list(fail_on_delete, destroy_cb))
- RegisterSignal(bound, COMSIG_PARENT_QDELETING, .proc/bound_deleted)
+ RegisterSignal(bound, COMSIG_PARENT_QDELETING, PROC_REF(bound_deleted))
return bound
/**
diff --git a/code/modules/overmap/missions/research_mission.dm b/code/modules/overmap/missions/research_mission.dm
index c80686039f8d..0e4996f7719d 100644
--- a/code/modules/overmap/missions/research_mission.dm
+++ b/code/modules/overmap/missions/research_mission.dm
@@ -20,7 +20,7 @@
/datum/mission/research/accept(datum/overmap/ship/controlled/acceptor, turf/accept_loc)
. = ..()
scanner = spawn_bound(/obj/machinery/mission_scanner, accept_loc, VARSET_CALLBACK(src, scanner, null))
- RegisterSignal(servant, COMSIG_OVERMAP_MOVED, .proc/ship_moved)
+ RegisterSignal(servant, COMSIG_OVERMAP_MOVED, PROC_REF(ship_moved))
/datum/mission/research/Destroy()
scanner = null
@@ -129,7 +129,7 @@
use_power = NO_POWER_USE
power_change() // calls update_appearance(), makes sure we're powered
-/obj/machinery/mission_scanner/update_icon_state()
+/obj/machinery/mission_scanner/update_appearance(updates)
. = ..()
if(is_operational)
icon_state = "scanner_power"
diff --git a/code/modules/overmap/objects/dynamic_datum.dm b/code/modules/overmap/objects/dynamic_datum.dm
index c6f0ed4a193e..82b77b513469 100644
--- a/code/modules/overmap/objects/dynamic_datum.dm
+++ b/code/modules/overmap/objects/dynamic_datum.dm
@@ -27,6 +27,8 @@
var/ruin_type
/// list of ruins and their target turf, indexed by name
var/list/ruin_turfs
+ /// Whether or not the level is currently loading.
+ var/loading = FALSE
/// The mapgenerator itself. SHOULD NOT BE NULL if the datum ever creates an encounter
var/datum/map_generator/mapgen = /datum/map_generator/single_turf/space
@@ -68,6 +70,8 @@
return get_turf(pick(reserve_docks))
/datum/overmap/dynamic/pre_docked(datum/overmap/ship/controlled/dock_requester)
+ if(loading)
+ return new /datum/docking_ticket(_docking_error = "[src] is currently being scanned for suitable docking locations by another ship. Please wait.")
if(!load_level())
return new /datum/docking_ticket(_docking_error = "[src] cannot be docked to.")
else
@@ -177,15 +181,21 @@
return FALSE
if(mapzone)
return TRUE
+
+ loading = TRUE
log_shuttle("[src] [REF(src)] LEVEL_INIT")
+
// use the ruin type in template if it exists, or pick from ruin list if IT exists; otherwise null
var/selected_ruin = template || (ruin_type ? pickweightAllowZero(SSmapping.ruin_types_probabilities[ruin_type]) : null)
var/list/dynamic_encounter_values = SSovermap.spawn_dynamic_encounter(src, selected_ruin)
if(!length(dynamic_encounter_values))
return FALSE
+
mapzone = dynamic_encounter_values[1]
reserve_docks = dynamic_encounter_values[2]
ruin_turfs = dynamic_encounter_values[3]
+
+ loading = FALSE
return TRUE
/datum/overmap/dynamic/empty
diff --git a/code/modules/overmap/objects/outpost/elevator/elevator_machines.dm b/code/modules/overmap/objects/outpost/elevator/elevator_machines.dm
index e4e32492e1de..bcd6f98a4d8e 100644
--- a/code/modules/overmap/objects/outpost/elevator/elevator_machines.dm
+++ b/code/modules/overmap/objects/outpost/elevator/elevator_machines.dm
@@ -50,7 +50,7 @@
var/down_arrow = my_floor.calls & DOWN ? "green_arrow" : "red_arrow"
opts["Down"] = image(icon = 'icons/misc/arrows.dmi', icon_state = down_arrow, dir = SOUTH)
- var/result = show_radial_menu(user, src, opts, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = !(issilicon(user) || isAdminGhostAI(user)), tooltips = TRUE)
+ var/result = show_radial_menu(user, src, opts, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = !(issilicon(user) || isAdminGhostAI(user)), tooltips = TRUE)
if(!result || !my_floor || !my_floor.master)
return
switch(result)
diff --git a/code/modules/overmap/objects/outpost/elevator/elevator_master.dm b/code/modules/overmap/objects/outpost/elevator/elevator_master.dm
index 9bbc5e29d25d..2c934bb94aab 100644
--- a/code/modules/overmap/objects/outpost/elevator/elevator_master.dm
+++ b/code/modules/overmap/objects/outpost/elevator/elevator_master.dm
@@ -174,7 +174,7 @@
if(next_move != NONE)
// sets in motion a chain of procs that will, after a bit, call check_move() again.
- addtimer(CALLBACK(src, .proc/move_elevator, next_move), floor_move_time)
+ addtimer(CALLBACK(src, PROC_REF(move_elevator), next_move), floor_move_time)
return
// This is the only way the elevator may become idle: if it does not find anywhere to go on check_move().
@@ -255,10 +255,10 @@
cur_floor.calls &= ~seeking_dir
cur_floor.button?.update_icon()
- addtimer(CALLBACK(src, .proc/open_doors, cur_floor), door_open_time)
- addtimer(CALLBACK(src, .proc/close_doors, cur_floor), door_open_time+floor_idle_time)
+ addtimer(CALLBACK(src, PROC_REF(open_doors), cur_floor), door_open_time)
+ addtimer(CALLBACK(src, PROC_REF(close_doors), cur_floor), door_open_time+floor_idle_time)
// Continue the check_move() chain.
- addtimer(CALLBACK(src, .proc/check_move), door_open_time+floor_idle_time+(1 SECONDS))
+ addtimer(CALLBACK(src, PROC_REF(check_move)), door_open_time+floor_idle_time+(1 SECONDS))
/datum/elevator_master/proc/open_doors(datum/floor/d_floor)
for(var/obj/machinery/door/fl_door as anything in d_floor.doors)
@@ -267,13 +267,13 @@
if(!fl_door.wires.is_cut(WIRE_BOLTS))
fl_door.unlock()
fl_door.autoclose = FALSE
- INVOKE_ASYNC(fl_door, /obj/machinery/door.proc/open)
+ INVOKE_ASYNC(fl_door, TYPE_PROC_REF(/obj/machinery/door, open))
/datum/elevator_master/proc/close_doors(datum/floor/d_floor)
for(var/obj/machinery/door/fl_door as anything in d_floor.doors)
// respect the cut wire
fl_door.autoclose = fl_door.wires.is_cut(WIRE_TIMING)
- INVOKE_ASYNC(fl_door, /obj/machinery/door.proc/close)
+ INVOKE_ASYNC(fl_door, TYPE_PROC_REF(/obj/machinery/door, close))
// bolts can be lowered without power, or a cut wire (since if wire is cut they're automatically down)
fl_door.lock()
@@ -350,7 +350,7 @@
// you can always lower the bolts; doors are locked on floor creation to ensure no entry into shaft
fl_door.lock()
// don't want door refs hanging around
- RegisterSignal(fl_door, COMSIG_PARENT_QDELETING, .proc/door_qdelete)
+ RegisterSignal(fl_door, COMSIG_PARENT_QDELETING, PROC_REF(door_qdelete))
// Deletion via means other than /datum/elevator_master/remove_floor() are likely to cause nasty elevator desyncs.
/datum/floor/Destroy()
diff --git a/code/modules/overmap/objects/outpost/elevator/elevator_platform.dm b/code/modules/overmap/objects/outpost/elevator/elevator_platform.dm
index b530ee7e0435..03c8c66e4838 100644
--- a/code/modules/overmap/objects/outpost/elevator/elevator_platform.dm
+++ b/code/modules/overmap/objects/outpost/elevator/elevator_platform.dm
@@ -30,9 +30,9 @@
. = ..()
var/static/list/connections = list(
- COMSIG_ATOM_ENTERED = .proc/AddItemOnPlat,
- COMSIG_ATOM_CREATED = .proc/AddItemOnPlat,
- COMSIG_ATOM_EXITED = .proc/RemoveItemFromPlat
+ COMSIG_ATOM_ENTERED = PROC_REF(AddItemOnPlat),
+ COMSIG_ATOM_CREATED = PROC_REF(AddItemOnPlat),
+ COMSIG_ATOM_EXITED = PROC_REF(RemoveItemFromPlat)
)
AddElement(/datum/element/connect_loc, connections)
@@ -62,7 +62,7 @@
if(AM in lift_load)
return
LAZYADD(lift_load, AM)
- RegisterSignal(AM, COMSIG_PARENT_QDELETING, .proc/RemoveItemFromPlat)
+ RegisterSignal(AM, COMSIG_PARENT_QDELETING, PROC_REF(RemoveItemFromPlat))
/obj/structure/elevator_platform/proc/RemoveItemFromPlat(datum/source, atom/movable/AM)
SIGNAL_HANDLER
diff --git a/code/modules/overmap/objects/outpost/outpost.dm b/code/modules/overmap/objects/outpost/outpost.dm
index 25da722e6509..2d493a12b64a 100644
--- a/code/modules/overmap/objects/outpost/outpost.dm
+++ b/code/modules/overmap/objects/outpost/outpost.dm
@@ -15,11 +15,11 @@
/// and tall hangars (with a greater height than width) in the list is discouraged; it is possible that a large hangar will "hide" a
/// smaller one by appearing earlier in the sorted list.
var/list/datum/map_template/outpost/hangar/hangar_templates = list(
- /datum/map_template/outpost/hangar/test_20x20,
- /datum/map_template/outpost/hangar/test_40x20,
- /datum/map_template/outpost/hangar/test_40x40,
- /datum/map_template/outpost/hangar/test_56x20,
- /datum/map_template/outpost/hangar/test_56x40
+ /datum/map_template/outpost/hangar/indie_space_20x20,
+ /datum/map_template/outpost/hangar/indie_space_40x20,
+ /datum/map_template/outpost/hangar/indie_space_40x40,
+ /datum/map_template/outpost/hangar/indie_space_56x20,
+ /datum/map_template/outpost/hangar/indie_space_56x40
)
// NOTE: "planetary" outposts should use baseturf specification and possibly different ztrait sun type, for both hangars and main level.
var/list/main_level_ztraits = list(
@@ -33,9 +33,6 @@
/// The mapzone used by the outpost level and hangars. Using a single mapzone means networked radio messages.
var/datum/map_zone/mapzone
var/list/datum/hangar_shaft/shaft_datums = list()
- /// A list keeping track of the docks that're currently being landed at. Helps to prevent SGTs,
- /// as at time of writing there's no protection against a ship docking with a port that's already being docked to.
- var/list/landing_in_progress_docks = list() // TODO: generalize this approach to prevent simultaneous-dock ship-overlap SGTs
/// The maximum number of missions that may be offered by the outpost at one time.
/// Missions which have been accepted do not count against this limit.
@@ -65,7 +62,7 @@
Rename(gen_outpost_name())
fill_missions()
- addtimer(CALLBACK(src, .proc/fill_missions), 10 MINUTES, TIMER_STOPPABLE|TIMER_LOOP|TIMER_DELETE_ME)
+ addtimer(CALLBACK(src, PROC_REF(fill_missions)), 10 MINUTES, TIMER_STOPPABLE|TIMER_LOOP|TIMER_DELETE_ME)
/datum/overmap/outpost/Destroy(...)
// cleanup our data structures. behavior here is currently relatively restrained; may be made more expansive in the future
@@ -214,14 +211,10 @@
)
return FALSE
- landing_in_progress_docks += h_dock
adjust_dock_to_shuttle(h_dock, dock_requester.shuttle_port)
return new /datum/docking_ticket(h_dock, src, dock_requester)
/datum/overmap/outpost/post_docked(datum/overmap/ship/controlled/dock_requester)
- // removes the stationary dock from the list, so that we don't have to worry about it causing merge SGTs
- landing_in_progress_docks -= dock_requester.shuttle_port.docked
-
for(var/mob/M as anything in GLOB.player_list)
if(dock_requester.shuttle_port.is_in_shuttle_bounds(M))
M.play_screen_text("[name]
[station_time_timestamp_fancy("hh:mm")]")
@@ -288,7 +281,7 @@
// a dock/undock cycle may leave the stationary port w/ flipped width and height,
// due to adjust_dock_to_shuttle(). so we need to check both orderings of the list.
if( \
- !(h_dock in landing_in_progress_docks) && !h_dock.docked && \
+ !h_dock.current_docking_ticket && !h_dock.docked && \
( \
(h_dock.width == h_template.dock_width && h_dock.height == h_template.dock_height) || \
(h_dock.width == h_template.dock_height && h_dock.height == h_template.dock_width) \
diff --git a/code/modules/overmap/objects/outpost/outpost_types.dm b/code/modules/overmap/objects/outpost/outpost_types.dm
index 6a37077d0289..fb707213e5eb 100644
--- a/code/modules/overmap/objects/outpost/outpost_types.dm
+++ b/code/modules/overmap/objects/outpost/outpost_types.dm
@@ -9,90 +9,96 @@
var/dock_width
var/dock_height
-
-/datum/map_template/outpost/outpost_test_1
- name = "outpost_test_1"
-
-/datum/map_template/outpost/outpost_test_2
- name = "outpost_test_2"
-
/datum/map_template/outpost/elevator_test
name = "elevator_test"
+/datum/map_template/outpost/elevator_indie
+ name = "elevator_indie"
+
+
+/*
+ Independent Space Outpost //creative name!
+*/
+/datum/map_template/outpost/indie_space
+ name = "indie_space"
-/datum/map_template/outpost/hangar/test_20x20
- name = "hangar/test_20x20"
+/datum/map_template/outpost/hangar/indie_space_20x20
+ name = "hangar/indie_space_20x20"
dock_width = 20
dock_height = 20
-/datum/map_template/outpost/hangar/test_40x20
- name = "hangar/test_40x20"
+/datum/map_template/outpost/hangar/indie_space_40x20
+ name = "hangar/indie_space_40x20"
dock_width = 40
dock_height = 20
-/datum/map_template/outpost/hangar/test_40x40
- name = "hangar/test_40x40"
+/datum/map_template/outpost/hangar/indie_space_40x40
+ name = "hangar/indie_space_40x40"
dock_width = 40
dock_height = 40
-/datum/map_template/outpost/hangar/test_56x20
- name = "hangar/test_56x20"
+/datum/map_template/outpost/hangar/indie_space_56x20
+ name = "hangar/indie_space_56x20"
dock_width = 56
dock_height = 20
-/datum/map_template/outpost/hangar/test_56x40
- name = "hangar/test_56x40"
+/datum/map_template/outpost/hangar/indie_space_56x40
+ name = "hangar/indie_space_56x40"
dock_width = 56
dock_height = 40
+/*
+ Nanotrasen Ice Asteroid
+*/
+/datum/map_template/outpost/nt_asteroid
+ name = "nanotrasen_asteroid"
-/datum/map_template/outpost/hangar/test_2_20x20
- name = "hangar/test_2_20x20"
+/datum/map_template/outpost/hangar/nt_asteroid_20x20
+ name = "hangar/nt_asteroid_20x20"
dock_width = 20
dock_height = 20
-/datum/map_template/outpost/hangar/test_2_40x20
- name = "hangar/test_2_40x20"
+/datum/map_template/outpost/hangar/nt_asteroid_40x20
+ name = "hangar/nt_asteroid_40x20"
dock_width = 40
dock_height = 20
-/datum/map_template/outpost/hangar/test_2_40x40
- name = "hangar/test_2_40x40"
+/datum/map_template/outpost/hangar/nt_asteroid_40x40
+ name = "hangar/nt_asteroid_40x40"
dock_width = 40
dock_height = 40
-/datum/map_template/outpost/hangar/test_2_56x20
- name = "hangar/test_2_56x20"
+/datum/map_template/outpost/hangar/nt_asteroid_56x20
+ name = "hangar/nt_asteroid_56x20"
dock_width = 56
dock_height = 20
-// does not currently exist
-// /datum/map_template/outpost/hangar/test_2_56x40
-// name = "hangar/test_2_56x40"
-// dock_width = 56
-// dock_height = 40
+/datum/map_template/outpost/hangar/nt_asteroid_56x40
+ name = "hangar/nt_asteroid_56x40"
+ dock_width = 56
+ dock_height = 40
/*
/datum/overmap/outpost subtypes
*/
-/datum/overmap/outpost/test_1
+/datum/overmap/outpost/indie_space
token_icon_state = "station_1"
- main_template = /datum/map_template/outpost/outpost_test_1
- elevator_template = /datum/map_template/outpost/elevator_test
- // Uses "test" hangars.
+ main_template = /datum/map_template/outpost/indie_space
+ elevator_template = /datum/map_template/outpost/elevator_indie
+ // Uses "default" hangars (indie_space).
-/datum/overmap/outpost/test_2
+/datum/overmap/outpost/nanotrasen_asteroid
token_icon_state = "station_asteroid_0"
- main_template = /datum/map_template/outpost/outpost_test_2
+ main_template = /datum/map_template/outpost/nt_asteroid
elevator_template = /datum/map_template/outpost/elevator_test
- // Using an (incomplete) second list of hangar templates. Note that the 56x40 hangar is the first skin.
+ // Using a second list of hangar templates.
hangar_templates = list(
- /datum/map_template/outpost/hangar/test_2_20x20,
- /datum/map_template/outpost/hangar/test_2_40x20,
- /datum/map_template/outpost/hangar/test_2_40x40,
- /datum/map_template/outpost/hangar/test_2_56x20,
- /datum/map_template/outpost/hangar/test_56x40
+ /datum/map_template/outpost/hangar/nt_asteroid_20x20,
+ /datum/map_template/outpost/hangar/nt_asteroid_40x20,
+ /datum/map_template/outpost/hangar/nt_asteroid_40x40,
+ /datum/map_template/outpost/hangar/nt_asteroid_56x20,
+ /datum/map_template/outpost/hangar/nt_asteroid_56x40
)
/datum/overmap/outpost/no_main_level // For example and adminspawn.
diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm
index a04355197dd6..4397919593aa 100644
--- a/code/modules/overmap/ships/controlled_ship_datum.dm
+++ b/code/modules/overmap/ships/controlled_ship_datum.dm
@@ -77,7 +77,9 @@
shuttle_area.rename_area("[new_name] [initial(shuttle_area.name)]")
if(!force)
COOLDOWN_START(src, rename_cooldown, 5 MINUTES)
- priority_announce("The [oldname] has been renamed to the [new_name].", "Docking Announcement", sender_override = new_name, zlevel = shuttle_port.virtual_z())
+ if(shuttle_port?.virtual_z() == null)
+ return TRUE
+ priority_announce("The [oldname] has been renamed to the [new_name].", "Docking Announcement", sender_override = new_name, zlevel = shuttle_port?.virtual_z())
return TRUE
/**
@@ -103,7 +105,7 @@
ship_account = new(name, source_template.starting_funds)
#ifdef UNIT_TESTS
- Rename("[source_template]")
+ Rename("[source_template]", TRUE)
#else
Rename("[source_template.prefix] [pick_list_replacements(SHIP_NAMES_FILE, pick(source_template.name_categories))]", TRUE)
#endif
@@ -139,8 +141,10 @@
/datum/overmap/ship/controlled/pre_dock(datum/overmap/to_dock, datum/docking_ticket/ticket)
if(ticket.target != src || ticket.issuer != to_dock)
+ ticket.docking_error = "Invalid target."
return FALSE
if(!shuttle_port.check_dock(ticket.target_port))
+ ticket.docking_error = "Targeted docking port invalid."
return FALSE
return TRUE
@@ -285,7 +289,7 @@
)
LAZYSET(owner_candidates, H.mind, mind_info)
H.mind.original_ship = WEAKREF(src)
- RegisterSignal(H.mind, COMSIG_PARENT_QDELETING, .proc/crew_mind_deleting)
+ RegisterSignal(H.mind, COMSIG_PARENT_QDELETING, PROC_REF(crew_mind_deleting))
if(!owner_mob)
set_owner_mob(H)
@@ -312,7 +316,7 @@
// turns out that timers don't get added to active_timers if the datum is getting qdeleted.
// so this timer was sitting around after deletion and clogging up runtime logs. thus, the QDELING() check. oops!
if(!owner_check_timer_id && !QDELING(src))
- owner_check_timer_id = addtimer(CALLBACK(src, .proc/check_owner), 5 MINUTES, TIMER_STOPPABLE|TIMER_LOOP|TIMER_DELETE_ME)
+ owner_check_timer_id = addtimer(CALLBACK(src, PROC_REF(check_owner)), 5 MINUTES, TIMER_STOPPABLE|TIMER_LOOP|TIMER_DELETE_ME)
return
owner_mob = new_owner
@@ -326,8 +330,8 @@
if(!(owner_mind in owner_candidates))
stack_trace("[src] tried to set ship owner to [new_owner] despite its mind [new_owner.mind] not being in owner_candidates!")
- RegisterSignal(owner_mob, COMSIG_MOB_LOGOUT, .proc/owner_mob_logout)
- RegisterSignal(owner_mob, COMSIG_MOB_GO_INACTIVE, .proc/owner_mob_afk)
+ RegisterSignal(owner_mob, COMSIG_MOB_LOGOUT, PROC_REF(owner_mob_logout))
+ RegisterSignal(owner_mob, COMSIG_MOB_GO_INACTIVE, PROC_REF(owner_mob_afk))
if(!owner_act)
owner_act = new(src)
owner_act.Grant(owner_mob)
diff --git a/code/modules/overmap/ships/ship_application.dm b/code/modules/overmap/ships/ship_application.dm
index cd8a1f48f5e9..7389759ea7ed 100644
--- a/code/modules/overmap/ships/ship_application.dm
+++ b/code/modules/overmap/ships/ship_application.dm
@@ -26,8 +26,8 @@
// these are registered so we can cancel the application fill-out if the ship
// gets deleted before the application is finalized, or the character spawns in.
// your currently-open tgui windows don't get removed if you spawn into a body
- RegisterSignal(app_mob, COMSIG_PARENT_QDELETING, .proc/applicant_deleting)
- RegisterSignal(parent_ship, COMSIG_PARENT_QDELETING, .proc/important_deleting_during_apply)
+ RegisterSignal(app_mob, COMSIG_PARENT_QDELETING, PROC_REF(applicant_deleting))
+ RegisterSignal(parent_ship, COMSIG_PARENT_QDELETING, PROC_REF(important_deleting_during_apply))
/datum/ship_application/Destroy()
SStgui.close_uis(src)
diff --git a/code/modules/overmap/ships/ship_datum.dm b/code/modules/overmap/ships/ship_datum.dm
index 9c68b0ed8ae2..ed8f40a28f64 100644
--- a/code/modules/overmap/ships/ship_datum.dm
+++ b/code/modules/overmap/ships/ship_datum.dm
@@ -30,7 +30,7 @@
/datum/overmap/ship/Initialize(position, ...)
. = ..()
if(docked_to)
- RegisterSignal(docked_to, COMSIG_OVERMAP_MOVED, .proc/on_docked_to_moved)
+ RegisterSignal(docked_to, COMSIG_OVERMAP_MOVED, PROC_REF(on_docked_to_moved))
/datum/overmap/ship/Destroy()
if(movement_callback_id)
@@ -40,7 +40,7 @@
/datum/overmap/ship/complete_dock(datum/overmap/dock_target, datum/docking_ticket/ticket)
. = ..()
// override prevents runtime on controlled ship init due to docking after initializing at a position
- RegisterSignal(dock_target, COMSIG_OVERMAP_MOVED, .proc/on_docked_to_moved, override = TRUE)
+ RegisterSignal(dock_target, COMSIG_OVERMAP_MOVED, PROC_REF(on_docked_to_moved), override = TRUE)
/datum/overmap/ship/complete_undock()
UnregisterSignal(docked_to, COMSIG_OVERMAP_MOVED)
@@ -83,7 +83,7 @@
return
var/timer = 1 / MAGNITUDE(speed_x, speed_y) * offset
- movement_callback_id = addtimer(CALLBACK(src, .proc/tick_move), timer, TIMER_STOPPABLE, SSovermap_movement)
+ movement_callback_id = addtimer(CALLBACK(src, PROC_REF(tick_move)), timer, TIMER_STOPPABLE, SSovermap_movement)
/**
* Called by [/datum/overmap/ship/proc/adjust_speed], this continually moves the ship according to its speed
@@ -106,7 +106,7 @@
return
var/timer = 1 / current_speed
- movement_callback_id = addtimer(CALLBACK(src, .proc/tick_move), timer, TIMER_STOPPABLE, SSovermap_movement)
+ movement_callback_id = addtimer(CALLBACK(src, PROC_REF(tick_move)), timer, TIMER_STOPPABLE, SSovermap_movement)
token.update_screen()
/**
diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm
index b919078a97f7..0dd736ce9936 100644
--- a/code/modules/paperwork/contract.dm
+++ b/code/modules/paperwork/contract.dm
@@ -244,7 +244,7 @@
user.visible_message("With a sudden blaze, [H] stands back up.")
H.fakefire()
fulfillContract(H, TRUE)//Revival contracts are always signed in blood
- addtimer(CALLBACK(H, /mob/living/carbon/human.proc/fakefireextinguish), 5, TIMER_UNIQUE)
+ addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon/human, fakefireextinguish)), 5, TIMER_UNIQUE)
addtimer(CALLBACK(src, "resetcooldown"), 300, TIMER_UNIQUE)
else
..()
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index bd232fd566e3..f85bd0bc77f9 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -133,23 +133,23 @@
return FALSE
// Basic paper
if(istype(paper_copy, /obj/item/paper))
- do_copy_loop(CALLBACK(src, .proc/make_paper_copy), usr)
+ do_copy_loop(CALLBACK(src, PROC_REF(make_paper_copy)), usr)
return TRUE
// Devil contract paper.
if(istype(paper_copy, /obj/item/paper/contract/employment))
- do_copy_loop(CALLBACK(src, .proc/make_devil_paper_copy), usr)
+ do_copy_loop(CALLBACK(src, PROC_REF(make_devil_paper_copy)), usr)
return TRUE
// Copying photo.
if(photo_copy)
- do_copy_loop(CALLBACK(src, .proc/make_photo_copy), usr)
+ do_copy_loop(CALLBACK(src, PROC_REF(make_photo_copy)), usr)
return TRUE
// Copying Documents.
if(document_copy)
- do_copy_loop(CALLBACK(src, .proc/make_document_copy), usr)
+ do_copy_loop(CALLBACK(src, PROC_REF(make_document_copy)), usr)
return TRUE
// ASS COPY. By Miauw
if(ass)
- do_copy_loop(CALLBACK(src, .proc/make_ass_copy), usr)
+ do_copy_loop(CALLBACK(src, PROC_REF(make_ass_copy)), usr)
return TRUE
// Remove the paper/photo/document from the photocopier.
@@ -211,7 +211,7 @@
if (toner_cartridge.charges - PAPER_TONER_USE < 0)
to_chat(usr, span_warning("There is not enough toner in [src] to print the form, please replace the cartridge."))
return FALSE
- do_copy_loop(CALLBACK(src, .proc/make_blank_print), usr)
+ do_copy_loop(CALLBACK(src, PROC_REF(make_blank_print)), usr)
var/obj/item/paper/printblank = new /obj/item/paper (loc)
var/printname = params["name"]
var/list/printinfo
@@ -248,7 +248,7 @@
var/i
for(i in 1 to copies)
addtimer(copy_cb, i SECONDS)
- addtimer(CALLBACK(src, .proc/reset_busy), i SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(reset_busy)), i SECONDS)
/**
* Sets busy to `FALSE`. Created as a proc so it can be used in callbacks.
diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm
index 24a256282fad..c645b3108b47 100644
--- a/code/modules/paperwork/ticketmachine.dm
+++ b/code/modules/paperwork/ticketmachine.dm
@@ -187,7 +187,7 @@
tickets += theirticket
if(obj_flags & EMAGGED) //Emag the machine to destroy the HOP's life.
ready = FALSE
- addtimer(CALLBACK(src, .proc/reset_cooldown), cooldown)//Small cooldown to prevent piles of flaming tickets
+ addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), cooldown)//Small cooldown to prevent piles of flaming tickets
theirticket.fire_act()
user.dropItemToGround(theirticket)
user.adjust_fire_stacks(1)
diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm
index 7ef48e8e8240..93b8319dbed7 100644
--- a/code/modules/photography/camera/camera.dm
+++ b/code/modules/photography/camera/camera.dm
@@ -144,11 +144,11 @@
var/mob/living/carbon/human/H = user
if (HAS_TRAIT(H, TRAIT_PHOTOGRAPHER))
realcooldown *= 0.5
- addtimer(CALLBACK(src, .proc/cooldown), realcooldown)
+ addtimer(CALLBACK(src, PROC_REF(cooldown)), realcooldown)
icon_state = state_off
- INVOKE_ASYNC(src, .proc/captureimage, target, user, flag, picture_size_x - 1, picture_size_y - 1)
+ INVOKE_ASYNC(src, PROC_REF(captureimage), target, user, flag, picture_size_x - 1, picture_size_y - 1)
/obj/item/camera/proc/cooldown()
@@ -166,7 +166,7 @@
/obj/item/camera/proc/captureimage(atom/target, mob/user, flag, size_x = 1, size_y = 1)
if(flash_enabled)
set_light_on(TRUE)
- addtimer(CALLBACK(src, .proc/flash_end), FLASH_LIGHT_DURATION, TIMER_OVERRIDE|TIMER_UNIQUE)
+ addtimer(CALLBACK(src, PROC_REF(flash_end)), FLASH_LIGHT_DURATION, TIMER_OVERRIDE|TIMER_UNIQUE)
blending = TRUE
var/turf/target_turf = get_turf(target)
if(!isturf(target_turf))
diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm
index 19bc21239ac4..5a9d9192dbbf 100644
--- a/code/modules/plumbing/plumbers/_plumb_machinery.dm
+++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm
@@ -26,7 +26,7 @@
. = ..()
anchored = bolt
create_reagents(buffer, reagent_flags)
- AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated))
+ AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, PROC_REF(can_be_rotated)))
/obj/machinery/plumbing/proc/can_be_rotated(mob/user,rotation_type)
return !anchored
diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm
index 4a9be6160916..e192c54673c7 100644
--- a/code/modules/plumbing/plumbers/grinder_chemical.dm
+++ b/code/modules/plumbing/plumbers/grinder_chemical.dm
@@ -13,7 +13,7 @@
. = ..()
AddComponent(/datum/component/plumbing/simple_supply, bolt)
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/point/point.dm b/code/modules/point/point.dm
index 8e311c339fde..e959304efe4f 100644
--- a/code/modules/point/point.dm
+++ b/code/modules/point/point.dm
@@ -98,10 +98,19 @@
/mob/verb/pointed(atom/A as mob|obj|turf in view())
set name = "Point To"
set category = "Object"
- if(client && !(A in view(client.view, src)))
- return FALSE
+
if(istype(A, /obj/effect/temp_visual/point))
return FALSE
- point_at(A)
- SEND_SIGNAL(src, COMSIG_MOB_POINTED, A)
+
+ DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(_pointed), A))
+
+/// possibly delayed verb that finishes the pointing process starting in [/mob/verb/pointed()].
+/// either called immediately or in the tick after pointed() was called, as per the [DEFAULT_QUEUE_OR_CALL_VERB()] macro
+/mob/proc/_pointed(atom/pointing_at)
+ if(client && !(pointing_at in view(client.view, src)))
+ return FALSE
+
+ point_at(pointing_at)
+
+ SEND_SIGNAL(src, COMSIG_MOB_POINTED, pointing_at)
return TRUE
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index f8156a97a5d4..ec83de125baa 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -243,7 +243,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
name = "\improper [get_area_name(area, TRUE)] APC"
set_machine_stat(machine_stat | MAINT)
update_appearance()
- addtimer(CALLBACK(src, .proc/update), 5)
+ addtimer(CALLBACK(src, PROC_REF(update)), 5)
/obj/machinery/power/apc/Destroy()
GLOB.apcs_list -= src
@@ -307,7 +307,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
make_terminal()
- addtimer(CALLBACK(src, .proc/update), 5)
+ addtimer(CALLBACK(src, PROC_REF(update)), 5)
/obj/machinery/power/apc/examine(mob/user)
. = ..()
@@ -1083,7 +1083,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
for(var/obj/machinery/light/L in area)
if(!initial(L.no_emergency)) //If there was an override set on creation, keep that override
L.no_emergency = emergency_lights
- INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE)
+ INVOKE_ASYNC(L, TYPE_PROC_REF(/obj/machinery/light, update), FALSE)
CHECK_TICK
return 1
@@ -1106,7 +1106,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
return
to_chat(malf, "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process.")
malf.malfhack = src
- malf.malfhacking = addtimer(CALLBACK(malf, /mob/living/silicon/ai/.proc/malfhacked, src), 600, TIMER_STOPPABLE)
+ malf.malfhacking = addtimer(CALLBACK(malf, TYPE_PROC_REF(/mob/living/silicon/ai, malfhacked), src), 600, TIMER_STOPPABLE)
var/atom/movable/screen/alert/hackingapc/A
A = malf.throw_alert("hackingapc", /atom/movable/screen/alert/hackingapc)
@@ -1129,7 +1129,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
to_chat(malf, "Temporarily masking AI subroutines in APC. Expected duration: [duration] seconds")
malf.malfhack = src
- malf.malfhacking = addtimer(CALLBACK(src, /obj/machinery/power/apc/proc/malfunhidehack, malf), duration, TIMER_STOPPABLE)
+ malf.malfhacking = addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/power/apc, malfunhidehack), malf), duration, TIMER_STOPPABLE)
var/atom/movable/screen/alert/hackingapc/A
A = malf.throw_alert("hackingapc", /atom/movable/screen/alert/hackingapc)
@@ -1146,7 +1146,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
malf.clear_alert("hackingapc")
malfhackhide = -1
- malfhackhidecooldown = addtimer(CALLBACK(src, /obj/machinery/power/apc/proc/malfhiderestore, malf), 600, TIMER_STOPPABLE)
+ malfhackhidecooldown = addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/power/apc, malfhiderestore), malf), 600, TIMER_STOPPABLE)
/obj/machinery/power/apc/proc/malfhiderestore(mob/living/silicon/ai/malf)
if(src.machine_stat & BROKEN)
@@ -1494,7 +1494,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
environ = APC_CHANNEL_OFF
update_appearance()
update()
- addtimer(CALLBACK(src, .proc/reset, APC_RESET_EMP), 600)
+ addtimer(CALLBACK(src, PROC_REF(reset), APC_RESET_EMP), 600)
/obj/machinery/power/apc/blob_act(obj/structure/blob/B)
set_broken()
@@ -1520,7 +1520,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
return
if(cell && cell.charge>=20)
cell.use(20)
- INVOKE_ASYNC(src, .proc/break_lights)
+ INVOKE_ASYNC(src, PROC_REF(break_lights))
/obj/machinery/power/apc/proc/break_lights()
for(var/obj/machinery/light/L in area)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index cec3440d1319..3f85acdddfe6 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -457,7 +457,7 @@ GLOBAL_LIST_INIT(cable_colors, list(
moveToNullspace()
powernet.remove_cable(src) //remove the cut cable from its powernet
- addtimer(CALLBACK(O, .proc/auto_propogate_cut_cable, O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
+ addtimer(CALLBACK(O, PROC_REF(auto_propogate_cut_cable), O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
// Disconnect machines connected to nodes
if(d1 == 0) // if we cut a node (O-X) cable
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 66f1f74f11c1..0f84b5571382 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -412,7 +412,7 @@
maxcharge = 10000
custom_materials = list(/datum/material/glass=60)
chargerate = 1500
- rating = 0 //gun batteries now incompatible with RPED WS edit
+ rating = 0 //Makes it incompatible with RPED
/obj/item/stock_parts/cell/gun/empty/Initialize()
. = ..()
@@ -476,6 +476,19 @@
charge = 0
update_appearance()
+/obj/item/stock_parts/cell/gun/kalix
+ name = "Etherbor EWC-5"
+ desc = "Brought to you by Etherbor Industries, proudly based within the PGF, is the EWC-5, an energy cell compatible with any Etherbor Industries energy weapons."
+ icon_state = "kalix-cell"
+ maxcharge = 12750 // 15 shots at 850 energy per
+ chargerate = 1750
+
+/obj/item/stock_parts/cell/gun/pgf
+ name = "Etherbor EWC-6m"
+ desc = "Exclusive only to the PGF military, the EWC-6m is an Etherbor energy weapon cell designed for military-grade use, including expanded capacity and output."
+ icon_state = "pgf-cell"
+ maxcharge = 20000 // 20 shots at 1000 energy per
+ chargerate = 2000
#undef CELL_DRAIN_TIME
#undef CELL_POWER_GAIN
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 7f2f3c3efbe9..24b106f0241f 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -357,7 +357,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/built, 28)
brightness = 4
if(prob(5))
break_light_tube(1)
- addtimer(CALLBACK(src, .proc/update, 0), 1)
+ addtimer(CALLBACK(src, PROC_REF(update), 0), 1)
/obj/machinery/light/Destroy()
var/area/A = get_area(src)
@@ -451,7 +451,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/built, 28)
if(!start_only)
do_sparks(3, TRUE, src)
var/delay = rand(BROKEN_SPARKS_MIN, BROKEN_SPARKS_MAX)
- addtimer(CALLBACK(src, .proc/broken_sparks), delay, TIMER_UNIQUE | TIMER_NO_HASH_WAIT)
+ addtimer(CALLBACK(src, PROC_REF(broken_sparks)), delay, TIMER_UNIQUE | TIMER_NO_HASH_WAIT)
/obj/machinery/light/process()
if (!cell)
@@ -877,7 +877,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/built, 28)
. = ..()
update()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm
index 2ce27c356cfd..b98f107055cb 100644
--- a/code/modules/power/multiz.dm
+++ b/code/modules/power/multiz.dm
@@ -110,7 +110,7 @@
/obj/machinery/power/deck_relay/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/find_relays), 30)
+ addtimer(CALLBACK(src, PROC_REF(find_relays)), 30)
///Handles re-acquiring + merging powernets found by find_relays()
/obj/machinery/power/deck_relay/proc/refresh()
@@ -152,5 +152,5 @@
above.below = src
if(below)
below.above = src
- addtimer(CALLBACK(src, .proc/refresh), 20) //Wait a bit so we can find the one below, then get powering
+ addtimer(CALLBACK(src, PROC_REF(refresh)), 20) //Wait a bit so we can find the one below, then get powering
return TRUE
diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm
index b5c2a2a35b89..1645afe9832b 100644
--- a/code/modules/power/rtg.dm
+++ b/code/modules/power/rtg.dm
@@ -76,7 +76,7 @@
"You hear a loud electrical crack!")
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
tesla_zap(src, 5, power_gen * 0.05)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, get_turf(src), 2, 3, 4, 8), 100) // Not a normal explosion.
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), get_turf(src), 2, 3, 4, 8), 100) // Not a normal explosion.
/obj/machinery/power/rtg/abductor/bullet_act(obj/projectile/Proj)
. = ..()
diff --git a/code/modules/power/singularity/boh_tear.dm b/code/modules/power/singularity/boh_tear.dm
index a0a90a4a1045..7d870f8523c8 100644
--- a/code/modules/power/singularity/boh_tear.dm
+++ b/code/modules/power/singularity/boh_tear.dm
@@ -45,4 +45,4 @@
to_chat(user, "You don't feel like you are real anymore.")
user.dust_animation()
user.spawn_dust()
- addtimer(CALLBACK(src, .proc/consume, user), 5)
+ addtimer(CALLBACK(src, PROC_REF(consume), user), 5)
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 289c43c3e3bc..77c400ae2b07 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -22,7 +22,7 @@
air_update_turf(TRUE)
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -149,4 +149,4 @@
do_sparks(5, TRUE, AM.loc)
var/atom/target = get_edge_target_turf(AM, get_dir(src, get_step_away(AM, src)))
AM.throw_at(target, 200, 4)
- addtimer(CALLBACK(src, .proc/clear_shock), 5)
+ addtimer(CALLBACK(src, PROC_REF(clear_shock)), 5)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 05bd1e648032..0a38f45c49ad 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -113,7 +113,7 @@
/obj/machinery/power/emitter/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated))
+ AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, PROC_REF(can_be_rotated)))
/obj/machinery/power/emitter/proc/can_be_rotated(mob/user,rotation_type)
if (anchored)
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index d11479a5ac74..d3e7a31d4cb9 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -193,8 +193,8 @@ field_generator power level display
active = FG_OFFLINE
CanAtmosPass = ATMOS_PASS_YES
air_update_turf(TRUE)
- INVOKE_ASYNC(src, .proc/cleanup)
- addtimer(CALLBACK(src, .proc/cool_down), 50)
+ INVOKE_ASYNC(src, PROC_REF(cleanup))
+ addtimer(CALLBACK(src, PROC_REF(cool_down)), 50)
/obj/machinery/field/generator/proc/cool_down()
if(active || warming_up <= 0)
@@ -202,11 +202,11 @@ field_generator power level display
warming_up--
update_appearance()
if(warming_up > 0)
- addtimer(CALLBACK(src, .proc/cool_down), 50)
+ addtimer(CALLBACK(src, PROC_REF(cool_down)), 50)
/obj/machinery/field/generator/proc/turn_on()
active = FG_CHARGING
- addtimer(CALLBACK(src, .proc/warm_up), 50)
+ addtimer(CALLBACK(src, PROC_REF(warm_up)), 50)
/obj/machinery/field/generator/proc/warm_up()
if(!active)
@@ -216,7 +216,7 @@ field_generator power level display
if(warming_up >= 3)
start_fields()
else
- addtimer(CALLBACK(src, .proc/warm_up), 50)
+ addtimer(CALLBACK(src, PROC_REF(warm_up)), 50)
/obj/machinery/field/generator/proc/calc_power(set_power_draw)
var/power_draw = 2 + fields.len
@@ -271,10 +271,10 @@ field_generator power level display
move_resist = INFINITY
CanAtmosPass = ATMOS_PASS_NO
air_update_turf(TRUE)
- addtimer(CALLBACK(src, .proc/setup_field, 1), 1)
- addtimer(CALLBACK(src, .proc/setup_field, 2), 2)
- addtimer(CALLBACK(src, .proc/setup_field, 4), 3)
- addtimer(CALLBACK(src, .proc/setup_field, 8), 4)
+ addtimer(CALLBACK(src, PROC_REF(setup_field), 1), 1)
+ addtimer(CALLBACK(src, PROC_REF(setup_field), 2), 2)
+ addtimer(CALLBACK(src, PROC_REF(setup_field), 4), 3)
+ addtimer(CALLBACK(src, PROC_REF(setup_field), 8), 4)
addtimer(VARSET_CALLBACK(src, active, FG_ONLINE), 5)
/obj/machinery/field/generator/proc/setup_field(NSEW)
@@ -348,7 +348,7 @@ field_generator power level display
//This is here to help fight the "hurr durr, release singulo cos nobody will notice before the
//singulo eats the evidence". It's not fool-proof but better than nothing.
//I want to avoid using global variables.
- INVOKE_ASYNC(src, .proc/notify_admins)
+ INVOKE_ASYNC(src, PROC_REF(notify_admins))
move_resist = initial(move_resist)
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index ee61bccbad51..81f12838c0d3 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -68,7 +68,7 @@
if(player.stat != DEAD && player.loc && !iscultist(player) && !isanimal(player))
souls_needed[player] = TRUE
soul_goal = round(1 + LAZYLEN(souls_needed) * 0.75)
- INVOKE_ASYNC(GLOBAL_PROC, .proc/begin_the_end)
+ INVOKE_ASYNC(GLOBAL_PROC, PROC_REF(begin_the_end))
/proc/begin_the_end()
SSredbot.send_discord_message("admin","Nar'sie has been summoned.","round ending event")
@@ -77,7 +77,7 @@
priority_announce("Status report? We detected a anomaly, but it disappeared almost immediately.","Central Command Higher Dimensional Affairs", 'sound/misc/notice1.ogg')
GLOB.cult_narsie = null
sleep(20)
- INVOKE_ASYNC(GLOBAL_PROC, .proc/cult_ending_helper, 2)
+ INVOKE_ASYNC(GLOBAL_PROC, PROC_REF(cult_ending_helper), 2)
return
priority_announce("An acausal dimensional event has been detected in your sector. Event has been flagged EXTINCTION-CLASS. Directing all available assets toward simulating solutions. SOLUTION ETA: 60 SECONDS.","Central Command Higher Dimensional Affairs", 'sound/misc/airraid.ogg')
sleep(500)
@@ -85,7 +85,7 @@
priority_announce("Simulations aborted, sensors report that the acasual event is normalizing. Good work, crew.","Central Command Higher Dimensional Affairs", 'sound/misc/notice1.ogg')
GLOB.cult_narsie = null
sleep(20)
- INVOKE_ASYNC(GLOBAL_PROC, .proc/cult_ending_helper, 2)
+ INVOKE_ASYNC(GLOBAL_PROC, PROC_REF(cult_ending_helper), 2)
return
priority_announce("Simulations on acausal dimensional event complete. Deploying solution package now. Deployment ETA: ONE MINUTE. ","Central Command Higher Dimensional Affairs")
sleep(50)
@@ -98,12 +98,12 @@
sleep(20)
set_security_level("red")
SSshuttle.lockdown = FALSE
- INVOKE_ASYNC(GLOBAL_PROC, .proc/cult_ending_helper, 2)
+ INVOKE_ASYNC(GLOBAL_PROC, PROC_REF(cult_ending_helper), 2)
return
if(GLOB.cult_narsie.resolved == FALSE)
GLOB.cult_narsie.resolved = TRUE
sound_to_playing_players('sound/machines/alarm.ogg')
- addtimer(CALLBACK(GLOBAL_PROC, .proc/cult_ending_helper), 120)
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(cult_ending_helper)), 120)
/obj/singularity/narsie/large/cult/Destroy()
send_to_playing_players("\"[pick("Nooooo...", "Not die. How-", "Die. Mort-", "Sas tyen re-")]\"")
@@ -125,11 +125,11 @@
/proc/cult_ending_helper(ending_type = 0)
if(ending_type == 2) //narsie fukkin died
- Cinematic(CINEMATIC_CULT_FAIL,world,CALLBACK(GLOBAL_PROC,/proc/ending_helper))
+ Cinematic(CINEMATIC_CULT_FAIL,world,CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)))
else if(ending_type) //no explosion
- Cinematic(CINEMATIC_CULT,world,CALLBACK(GLOBAL_PROC,/proc/ending_helper))
+ Cinematic(CINEMATIC_CULT,world,CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)))
else // explosion
- Cinematic(CINEMATIC_CULT_NUKE,world,CALLBACK(GLOBAL_PROC,/proc/ending_helper))
+ Cinematic(CINEMATIC_CULT_NUKE,world,CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)))
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
@@ -230,7 +230,7 @@
setDir(SOUTH)
move_self = FALSE
flick("narsie_spawn_anim",src)
- addtimer(CALLBACK(src, .proc/narsie_spawn_animation_end), 3.5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(narsie_spawn_animation_end)), 3.5 SECONDS)
/obj/singularity/narsie/proc/narsie_spawn_animation_end()
move_self = TRUE
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index 01e4d0324857..b593d3f546bb 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -23,10 +23,10 @@
/obj/effect/accelerated_particle/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/move), 1)
+ addtimer(CALLBACK(src, PROC_REF(move)), 1)
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index d14bacdf0a0e..93ed8a5d606d 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -45,9 +45,9 @@
target = singubeacon
break
AddElement(/datum/element/bsa_blocker)
- RegisterSignal(src, COMSIG_ATOM_BSA_BEAM, .proc/bluespace_reaction)
+ RegisterSignal(src, COMSIG_ATOM_BSA_BEAM, PROC_REF(bluespace_reaction))
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -480,7 +480,7 @@
/obj/singularity/deadchat_controlled/Initialize(mapload, starting_energy)
. = ..()
AddComponent(/datum/component/deadchat_control, DEMOCRACY_MODE, list(
- "up" = CALLBACK(GLOBAL_PROC, .proc/_step, src, NORTH),
- "down" = CALLBACK(GLOBAL_PROC, .proc/_step, src, SOUTH),
- "left" = CALLBACK(GLOBAL_PROC, .proc/_step, src, WEST),
- "right" = CALLBACK(GLOBAL_PROC, .proc/_step, src, EAST)))
+ "up" = CALLBACK(GLOBAL_PROC, PROC_REF(_step), src, NORTH),
+ "down" = CALLBACK(GLOBAL_PROC, PROC_REF(_step), src, SOUTH),
+ "left" = CALLBACK(GLOBAL_PROC, PROC_REF(_step), src, WEST),
+ "right" = CALLBACK(GLOBAL_PROC, PROC_REF(_step), src, EAST)))
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index dfe24e46cb5b..6068b8725f10 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -440,7 +440,7 @@
. = ..()
if(. & EMP_PROTECT_SELF)
return
- emp_timer = addtimer(CALLBACK(src, .proc/emp_end, output_attempt), SMESEMPTIME, TIMER_UNIQUE | TIMER_OVERRIDE)
+ emp_timer = addtimer(CALLBACK(src, PROC_REF(emp_end), output_attempt), SMESEMPTIME, TIMER_UNIQUE | TIMER_OVERRIDE)
is_emped = TRUE
input_attempt = rand(0,1)
inputting = input_attempt
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index b35974b8b930..8ca409051d6c 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -33,7 +33,7 @@
panel.layer = FLY_LAYER
Make(S)
connect_to_network()
- RegisterSignal(SSsun, COMSIG_SUN_MOVED, .proc/queue_update_solar_exposure)
+ RegisterSignal(SSsun, COMSIG_SUN_MOVED, PROC_REF(queue_update_solar_exposure))
/obj/machinery/power/solar/Destroy()
UnregisterSignal(SSsun, COMSIG_SUN_MOVED)
@@ -343,7 +343,7 @@
/obj/machinery/power/solar_control/Initialize()
. = ..()
azimuth_rate = SSsun.base_rotation
- RegisterSignal(SSsun, COMSIG_SUN_MOVED, .proc/timed_track)
+ RegisterSignal(SSsun, COMSIG_SUN_MOVED, PROC_REF(timed_track))
connect_to_network()
if(powernet)
set_panels(azimuth_target)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index f34a268738d5..5593744219d0 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -285,7 +285,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
GLOB.main_supermatter_engine = src
AddElement(/datum/element/bsa_blocker)
- RegisterSignal(src, COMSIG_ATOM_BSA_BEAM, .proc/call_explode)
+ RegisterSignal(src, COMSIG_ATOM_BSA_BEAM, PROC_REF(call_explode))
soundloop = new(list(src), TRUE)
@@ -1111,7 +1111,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
else if(isliving(target))//If we got a fleshbag on our hands
var/mob/living/creature = target
creature.set_shocked()
- addtimer(CALLBACK(creature, /mob/living/proc/reset_shocked), 10)
+ addtimer(CALLBACK(creature, TYPE_PROC_REF(/mob/living, reset_shocked)), 10)
//3 shots a human with no resistance. 2 to crit, one to death. This is at at least 10000 power.
//There's no increase after that because the input power is effectivly capped at 10k
//Does 1.5 damage at the least
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index f7ae1b53bb98..82372d221baf 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -101,7 +101,7 @@
D.adjust_money(min(power_produced, 1))
if(istype(linked_techweb) && (zap_flags & ZAP_GIVES_RESEARCH) && can_generate_research)
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min(power_produced, 3)) // x4 coils = 12 points a shock for RND, if they even bothered to link the server.
- addtimer(CALLBACK(src, .proc/reset_shocked), 10)
+ addtimer(CALLBACK(src, PROC_REF(reset_shocked)), 10)
zap_buckle_check(power)
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
return power_produced
@@ -140,7 +140,7 @@
D.adjust_money(min(power_produced, 12))
if(istype(linked_techweb) && (zap_flags & ZAP_GIVES_RESEARCH))
linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min(power_produced, 25)) // x4 coils = 100 points per shock, which is a good reward for building a research tesla or electrical storm harvest ship
- addtimer(CALLBACK(src, .proc/reset_shocked), 10)
+ addtimer(CALLBACK(src, PROC_REF(reset_shocked)), 10)
zap_buckle_check(power)
playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
return power_produced
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 88762101c32f..fbece73764a4 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -107,7 +107,7 @@
energy_to_raise = energy_to_raise * 1.25
playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, TRUE, extrarange = 30)
- addtimer(CALLBACK(src, .proc/new_mini_ball), 100)
+ addtimer(CALLBACK(src, PROC_REF(new_mini_ball)), 100)
else if(energy < energy_to_lower && orbiting_balls.len)
energy_to_raise = energy_to_raise / 1.25
@@ -313,7 +313,7 @@
if(closest_type == LIVING)
var/mob/living/closest_mob = closest_atom
closest_mob.set_shocked()
- addtimer(CALLBACK(closest_mob, /mob/living/proc/reset_shocked), 10)
+ addtimer(CALLBACK(closest_mob, TYPE_PROC_REF(/mob/living, reset_shocked)), 10)
var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE) ? (min(round(power/600), 90) + rand(-5, 5)) : 0
closest_mob.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((zap_flags & ZAP_MOB_STUN) ? NONE : SHOCK_NOSTUN))
if(issilicon(closest_mob))
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 4b3f9b760fd6..bfd0464f5e13 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -20,7 +20,7 @@
. = ..()
Make(S)
connect_to_network()
- RegisterSignal(SSsun, COMSIG_SUN_MOVED, .proc/sun_update)
+ RegisterSignal(SSsun, COMSIG_SUN_MOVED, PROC_REF(sun_update))
/obj/machinery/power/tracker/Destroy()
unset_control() //remove from control computer
diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm
index 6222f147861e..e0b5c0608b9d 100644
--- a/code/modules/projectiles/ammunition/_ammunition.dm
+++ b/code/modules/projectiles/ammunition/_ammunition.dm
@@ -23,7 +23,7 @@
/// The sound played when this ammo is fired by an energy gun.
var/fire_sound = null
/// The visual effect that appears when the ammo is fired.
- var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect
+ var/firing_effect_type
/// Enables casing spinning and sizzling after being ejected from a gun.
var/heavy_metal = TRUE
/// If true, the casing's sprite will automatically be transformed in Initialize().
@@ -36,6 +36,8 @@
var/delay = 0 //Delay for energy weapons
var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
+ var/list/bounce_sfx_override // if true, overrides the bouncing sfx from the turf to this one
+
/obj/item/ammo_casing/spent
name = "spent bullet casing"
@@ -104,7 +106,10 @@
update_appearance()
SpinAnimation(10, 1)
var/turf/T = get_turf(src)
+ if(bounce_sfx_override)
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(playsound), src, pick(bounce_sfx_override), 20, 1), bounce_delay) //Soft / non-solid turfs that shouldn't make a sound when a shell casing is ejected over them.
+ return
if(still_warm && T && T.bullet_sizzle)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/items/welder.ogg', 20, 1), bounce_delay) //If the turf is made of water and the shell casing is still hot, make a sizzling sound when it's ejected.
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), src, 'sound/items/welder.ogg', 20, 1), bounce_delay) //If the turf is made of water and the shell casing is still hot, make a sizzling sound when it's ejected.
else if(T && T.bullet_bounce_sound)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, T.bullet_bounce_sound, 20, 1), bounce_delay) //Soft / non-solid turfs that shouldn't make a sound when a shell casing is ejected over them.
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), src, pick(T.bullet_bounce_sound), 20, 1), bounce_delay) //Soft / non-solid turfs that shouldn't make a sound when a shell casing is ejected over them.
diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm
index 15abfdb02e10..b9237ea91b4d 100644
--- a/code/modules/projectiles/ammunition/ballistic/pistol.dm
+++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm
@@ -127,3 +127,11 @@
name = ".50 AE hollow point bullet casing"
desc = "A .50 AE hollow point bullet casing."
projectile_type = /obj/projectile/bullet/a50AE/hp
+
+// .22 LR (Himehabu)
+/obj/item/ammo_casing/c22lr
+ name = ".22 LR bullet casing"
+ desc = "A .22 LR bullet casing."
+ projectile_type = /obj/projectile/bullet/c22lr
+ caliber = "22lr"
+
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index 9f74727086e5..b297ee30e776 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -9,6 +9,8 @@
custom_materials = list(/datum/material/iron=4000)
projectile_type = /obj/projectile/bullet/slug
+ bounce_sfx_override = 'sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg'
+
/obj/item/ammo_casing/shotgun/update_icon_state()
icon_state = "[initial(icon_state)][BB ? "" : "-spent"]"
return ..()
diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm
index 05653dab0bd8..ef8d63ff65a8 100644
--- a/code/modules/projectiles/ammunition/energy/laser.dm
+++ b/code/modules/projectiles/ammunition/energy/laser.dm
@@ -7,7 +7,7 @@
e_cost = 830
select_name = "kill"
-/obj/item/ammo_casing/energy/laser/smg //WS edit: fun
+/obj/item/ammo_casing/energy/laser/smg
projectile_type = /obj/projectile/beam/laser/weak/negative_ap
e_cost = 799 //12 shots with a normal power cell, 25 with an upgraded
select_name = "kill"
@@ -151,4 +151,5 @@
select_name = "kill"
projectile_type = /obj/projectile/beam/weak/penetrator
variance = 0.8
+ delay = 0.5
fire_sound = 'sound/weapons/laser4.ogg'
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index 932c438ff169..c3989e7a4952 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -127,7 +127,8 @@
return
A.forceMove(drop_location())
- if(!user.is_holding(src) || !user.put_in_hands(A)) //incase they're using TK
+ var/mob/living/carbon/human/H = user
+ if(!(user.is_holding(src) || H.l_store == src || H.r_store == src) || !user.put_in_hands(A)) //incase they're using TK
A.bounce_away(FALSE, NONE)
playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
to_chat(user, "You remove a round from [src]!")
@@ -159,6 +160,19 @@
temp_materials[material] = (bullet_cost[material] * stored_ammo.len) + base_cost[material]
set_custom_materials(temp_materials)
+/obj/item/ammo_box/AltClick(mob/user)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if((user.is_holding(src) ||H.l_store == src || H.r_store == src) && !(caliber || istype(src, /obj/item/ammo_box/magazine) || instant_load)) //caliber because boxes have none, instant load because speedloaders use the base ammo box type with instant load on, and magazine for the obvious.
+ attack_self(user)
+ return
+ ..()
+
+/obj/item/ammo_box/examine(mob/user)
+ . = ..()
+ if(!(caliber || istype(src, /obj/item/ammo_box/magazine) || instant_load))
+ . += "Alt-click on [src] while it in a pocket or your off-hand to take out a round while it is there."
+
/obj/item/ammo_box/magazine
w_class = WEIGHT_CLASS_SMALL //Default magazine weight, only differs for tiny mags and drums
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 0336744ec748..e8c47f60f85b 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -150,6 +150,7 @@
max_ammo = 22
multiple_sprites = AMMO_BOX_FULL_EMPTY
item_flags = NO_MAT_REDEMPTION
+ instant_load = TRUE
// Ammo Boxes
@@ -366,3 +367,21 @@
icon_state = "foambox_riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
custom_materials = list(/datum/material/iron = 50000)
+
+/obj/item/ammo_box/c22lr_box
+ name = "ammo box (.22 LR)"
+ desc = "A box of standard .22 LR ammo."
+ icon_state = "22lrbox"
+ ammo_type = /obj/item/ammo_casing/c22lr
+ max_ammo = 75
+
+/obj/item/ammo_box/c45_speedloader
+ name = "speed loader (.45)"
+ desc = "Designed to quickly reload revolvers."
+ icon_state = "38"
+ ammo_type = /obj/item/ammo_casing/c45
+ max_ammo = 6
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ custom_materials = list(/datum/material/iron = 15000)
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
diff --git a/code/modules/projectiles/boxes_magazines/external/gauss.dm b/code/modules/projectiles/boxes_magazines/external/gauss.dm
index ca497d6560cb..fa3797707ce6 100644
--- a/code/modules/projectiles/boxes_magazines/external/gauss.dm
+++ b/code/modules/projectiles/boxes_magazines/external/gauss.dm
@@ -9,7 +9,7 @@
/obj/item/ammo_box/magazine/modelh
name = "Model H magazine (ferromagnetic slugs)"
- desc = "A 10-round magazine for the Model H pistol. Ferromagnetic slugs are slow, but do incredible damage with significant armor penetration."
+ desc = "A 10-round magazine for the Model H pistol. Ferromagnetic slugs are slow and incredibly powerful bullets, but are easily stopped by even a sliver of armor."
icon_state = "smallmagmag"
ammo_type = /obj/item/ammo_casing/caseless/gauss/slug
caliber = "slug"
diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm
index 192a9f723857..402db1502853 100644
--- a/code/modules/projectiles/boxes_magazines/external/lmg.dm
+++ b/code/modules/projectiles/boxes_magazines/external/lmg.dm
@@ -5,7 +5,7 @@
base_icon_state = "a762"
ammo_type = /obj/item/ammo_casing/mm712x82
caliber = "7.12x82mm"
- max_ammo = 50
+ max_ammo = 100
w_class = WEIGHT_CLASS_NORMAL
/obj/item/ammo_box/magazine/mm712x82/hollow
@@ -30,4 +30,4 @@
/obj/item/ammo_box/magazine/mm712x82/update_icon_state()
. = ..()
- icon_state = "[base_icon_state]-[round(ammo_count(), 10)]"
+ icon_state = "[base_icon_state]-[round(ammo_count(), 20)]"
diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm
index ca4702b641d7..cc92a758eba0 100644
--- a/code/modules/projectiles/boxes_magazines/external/pistol.dm
+++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm
@@ -136,3 +136,12 @@
caliber = "9mm"
max_ammo = 4
custom_materials = list(/datum/material/iron = 20000)
+
+/obj/item/ammo_box/magazine/m22lr
+ name = "pistol magazine (.22 LR)"
+ desc = "A single-stack handgun magazine designed to chamber .22 LR. It's rather tiny, all things considered."
+ icon_state = "pistol_22lr"
+ ammo_type = /obj/item/ammo_casing/c22lr
+ caliber = "22lr"
+ max_ammo = 10
+ w_class = WEIGHT_CLASS_TINY
diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm
index 86fef186652b..9ae63763593b 100644
--- a/code/modules/projectiles/boxes_magazines/external/rifle.dm
+++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm
@@ -27,7 +27,7 @@
base_icon_state = "47x33mm"
ammo_type = /obj/item/ammo_casing/caseless/c47x33mm
caliber = "4.73x33mm caseless"
- max_ammo = 50 //brrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
+ max_ammo = 100 //brrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
w_class = WEIGHT_CLASS_NORMAL
/obj/item/ammo_box/magazine/rifle47x33mm/update_icon_state()
@@ -64,7 +64,7 @@
icon_state = "ak47_mag"
ammo_type = /obj/item/ammo_casing/a762_39
caliber = "7.62x39mm"
- max_ammo = 20
+ max_ammo = 30
/obj/item/ammo_box/magazine/ak47/update_icon_state()
. = ..()
diff --git a/code/modules/projectiles/boxes_magazines/internal/gauss.dm b/code/modules/projectiles/boxes_magazines/internal/gauss.dm
index 06527ae49197..6e561f6d26d5 100644
--- a/code/modules/projectiles/boxes_magazines/internal/gauss.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/gauss.dm
@@ -3,3 +3,4 @@
ammo_type = /obj/item/ammo_casing/caseless/gauss
caliber = "pellet"
max_ammo = 22
+ instant_load = TRUE
diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
index 13b007e229e0..7715d31b1323 100644
--- a/code/modules/projectiles/boxes_magazines/internal/revolver.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
@@ -32,3 +32,10 @@
/obj/item/ammo_box/magazine/internal/cylinder/pepperbox
name = "pepperbox revolver cylinder"
max_ammo = 5
+
+/obj/item/ammo_box/magazine/internal/cylinder/rev45
+ name = "cattleman revolver cylinder"
+ ammo_type = /obj/item/ammo_casing/c45
+ caliber = ".45"
+ max_ammo = 6
+ instant_load = TRUE
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index f91fa467cfef..628fd38d2e5e 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -25,28 +25,26 @@
var/vary_fire_sound = TRUE
var/fire_sound_volume = 50
var/dry_fire_sound = 'sound/weapons/gun/general/dry_fire.ogg'
- var/dry_fire_text = "click" //change this on non-gun things WS Edit - Dry firing
+ var/dry_fire_text = "click" //change this on non-gun things
var/suppressed = null //whether or not a message is displayed when fired
var/can_suppress = FALSE
var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
var/suppressed_volume = 60
var/can_unsuppress = TRUE
- var/recoil = 0 //boom boom shake the room
var/clumsy_check = TRUE
var/obj/item/ammo_casing/chambered = null
trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers
- var/sawn_desc = null //description change if weapon is sawn-off
+ var/sawn_desc = null //description change if weapon is sawn-off
var/sawn_off = FALSE
- var/burst_size = 1 //how large a burst is
- var/fire_delay = 0 //rate of fire for burst firing and semi auto
- var/firing_burst = 0 //Prevent the weapon from firing again while already firing
- var/semicd = 0 //cooldown handler
+ var/burst_size = 1 //how large a burst is
+ var/fire_delay = 0 //rate of fire for burst firing and semi auto
+ var/firing_burst = 0 //Prevent the weapon from firing again while already firing
+ var/semicd = 0 //cooldown handler
var/weapon_weight = WEAPON_LIGHT
var/dual_wield_spread = 24 //additional spread when dual wielding
- var/spread = 0 //Spread induced by the gun itself.
var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
- var/projectile_damage_multiplier = 1 //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo.
+ var/projectile_damage_multiplier = 1 //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo.
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
@@ -77,14 +75,84 @@
var/pb_knockback = 0
+ var/wielded = FALSE // true if the gun is wielded via twohanded component, shouldnt affect anything else
+
+ var/wielded_fully = FALSE // true if the gun is wielded after delay, should affects accuracy
+
+ ///How much the bullet scatters when fired while wielded.
+ var/spread = 4
+ ///How much the bullet scatters when fired while unwielded.
+ var/spread_unwielded = 12
+
+ ///Screen shake when the weapon is fired while wielded.
+ var/recoil = 0
+ ///Screen shake when the weapon is fired while unwielded.
+ var/recoil_unwielded = 0
+ ///a multiplier of the duration the recoil takes to go back to normal view, this is (recoil*recoil_backtime_multiplier)+1
+ var/recoil_backtime_multiplier = 2
+ ///this is how much deviation the gun recoil can have, recoil pushes the screen towards the reverse angle you shot + some deviation which this is the max.
+ var/recoil_deviation = 22.5
+
+ ///Slowdown for wielding
+ var/wield_slowdown = 0.1
+ ///How long between wielding and firing in tenths of seconds
+ var/wield_delay = 0.4 SECONDS
+ ///Storing value for above
+ var/wield_time = 0
+
+ ///Effect for the muzzle flash of the gun.
+ var/obj/effect/muzzle_flash/muzzle_flash
+ ///Icon state of the muzzle flash effect.
+ var/muzzleflash_iconstate
+ ///Brightness of the muzzle flash effect.
+ var/muzzle_flash_lum = 3
+ ///Color of the muzzle flash effect.
+ var/muzzle_flash_color = COLOR_VERY_SOFT_YELLOW
+
+ //gun saftey
+ ///Does this gun have a saftey and thus can toggle it?
+ var/has_safety = FALSE
+ ///If the saftey on? If so, we can't fire the weapon
+ var/safety = FALSE
+
/obj/item/gun/Initialize()
. = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
if(pin)
pin = new pin(src)
if(gun_light)
alight = new(src)
+ muzzle_flash = new(src, muzzleflash_iconstate)
build_zooming()
+/obj/item/gun/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed)
+
+/// triggered on wield of two handed item
+/obj/item/gun/proc/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+ INVOKE_ASYNC(src, .proc.do_wield, user)
+
+/obj/item/gun/proc/do_wield(mob/user)
+ user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown)
+ wield_time = world.time + wield_delay
+ if(wield_time > 0)
+ if(do_mob(user, user, wield_delay, FALSE, TRUE, CALLBACK(src, PROC_REF(is_wielded)), ignore_loc_change = TRUE))
+ wielded_fully = TRUE
+ else
+ wielded_fully = TRUE
+
+/obj/item/gun/proc/is_wielded()
+ return wielded
+
+/// triggered on unwield of two handed item
+/obj/item/gun/proc/on_unwield(obj/item/source, mob/user)
+ wielded = FALSE
+ wielded_fully = FALSE
+ user.remove_movespeed_modifier(/datum/movespeed_modifier/gun)
+
/obj/item/gun/Destroy()
if(isobj(pin)) //Can still be the initial path, then we skip
QDEL_NULL(pin)
@@ -98,6 +166,8 @@
QDEL_NULL(azoom)
if(isatom(suppressed)) //SUPPRESSED IS USED AS BOTH A TRUE/FALSE AND AS A REF, WHAT THE FUCKKKKKKKKKKKKKKKKK
QDEL_NULL(suppressed)
+ if(muzzle_flash)
+ QDEL_NULL(muzzle_flash)
return ..()
/obj/item/gun/handle_atom_del(atom/A)
@@ -134,6 +204,9 @@
else if(can_bayonet)
. += "It has a bayonet lug on it."
+ if(has_safety)
+ . += "The safety is [safety ? "ON" : "OFF"]. Ctrl-Click to toggle the safety."
+
/obj/item/gun/equipped(mob/living/user, slot)
. = ..()
if(zoomed && user.get_active_held_item() != src)
@@ -146,16 +219,28 @@
//check if there's enough ammo/energy/whatever to shoot one time
//i.e if clicking would make it shoot
/obj/item/gun/proc/can_shoot()
+ if(safety)
+ return FALSE
return TRUE
/obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
- to_chat(user, "*[dry_fire_text]*") //WS Edit - Dry firing
- playsound(src, dry_fire_sound, 30, TRUE)
+ if(!safety)
+ to_chat(user, "*[dry_fire_text]*")
+ playsound(src, dry_fire_sound, 30, TRUE)
+ return
+ to_chat(user, "Safeties are active on the [src]! Turn them off to fire!")
/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1)
- if(recoil)
- shake_camera(user, recoil + 1, recoil)
+ var/actual_angle = get_angle_with_scatter((user || get_turf(src)), pbtarget, rand(-recoil_deviation, recoil_deviation) + 180)
+ var/muzzle_angle = Get_Angle(get_turf(src), pbtarget)
+ if(muzzle_flash && !muzzle_flash.applied)
+ handle_muzzle_flash(user, muzzle_angle)
+
+ if(wielded_fully && recoil)
+ simulate_recoil(user, recoil, actual_angle)
+ else if(!wielded_fully && recoil_unwielded)
+ simulate_recoil(user, recoil_unwielded, actual_angle)
if(suppressed)
playsound(user, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
@@ -224,9 +309,8 @@
if(check_botched(user))
return
- var/obj/item/bodypart/other_hand = user.has_hand_for_held_index(user.get_inactive_hand_index()) //returns non-disabled inactive hands
- if(weapon_weight == WEAPON_HEAVY && (user.get_inactive_held_item() || !other_hand))
- to_chat(user, "You need two hands to fire [src]!")
+ if(weapon_weight == WEAPON_HEAVY && (!wielded))
+ to_chat(user, "You need a more secure grip to fire [src]!")
return
//DUAL (or more!) WIELDING
var/bonus_spread = 0
@@ -239,7 +323,7 @@
else if(G.can_trigger_gun(user))
bonus_spread += dual_wield_spread
loop_counter++
- addtimer(CALLBACK(G, /obj/item/gun.proc/process_fire, target, user, TRUE, params, null, bonus_spread), loop_counter)
+ addtimer(CALLBACK(G, TYPE_PROC_REF(/obj/item/gun, process_fire), target, user, TRUE, params, null, bonus_spread), loop_counter)
return process_fire(target, user, TRUE, params, null, bonus_spread)
@@ -322,8 +406,12 @@
var/sprd = 0
var/randomized_gun_spread = 0
var/rand_spr = rand()
- if(spread)
+
+ if(wielded_fully && spread)
randomized_gun_spread = rand(0,spread)
+ else if(!wielded_fully && spread_unwielded)
+ randomized_gun_spread = rand(0,spread_unwielded)
+
if(HAS_TRAIT(user, TRAIT_POOR_AIM)) //nice shootin' tex
bonus_spread += 25
var/randomized_bonus_spread = rand(0, bonus_spread)
@@ -331,7 +419,7 @@
if(burst_size > 1)
firing_burst = TRUE
for(var/i = 1 to burst_size)
- addtimer(CALLBACK(src, .proc/process_burst, user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), fire_delay * (i - 1))
+ addtimer(CALLBACK(src, PROC_REF(process_burst), user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), fire_delay * (i - 1))
else
if(chambered)
if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal.
@@ -353,8 +441,9 @@
return
process_chamber()
update_appearance()
- semicd = TRUE
- addtimer(CALLBACK(src, .proc/reset_semicd), fire_delay)
+ if(fire_delay)
+ semicd = TRUE
+ addtimer(CALLBACK(src, PROC_REF(reset_semicd)), fire_delay)
if(user)
user.update_inv_hands()
@@ -409,6 +498,25 @@
else
return ..()
+/obj/item/gun/CtrlClick(mob/user)
+ . = ..()
+ if(!has_safety)
+ return
+
+ if(src == !user.get_active_held_item())
+ return
+
+ playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
+ safety = !safety
+
+ user.visible_message(
+ span_notice("[user] turns the safety on [src] [safety ? "ON" : "OFF"]."),
+ span_notice("You turn the safety on [src] [safety ? "ON" : "OFF"]."),
+ vision_distance = COMBAT_MESSAGE_RANGE
+ )
+ update_appearance()
+
+
/obj/item/gun/screwdriver_act(mob/living/user, obj/item/I)
. = ..()
if(.)
@@ -550,7 +658,7 @@
gun_light.update_brightness()
to_chat(user, "You toggle the gunlight [gun_light.on ? "on":"off"].")
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
+ playsound(user, gun_light.on ? gun_light.toggle_on_sound : gun_light.toggle_off_sound, 40, TRUE)
update_gunlight()
/obj/item/gun/proc/update_gunlight()
@@ -559,13 +667,19 @@
var/datum/action/A = X
A.UpdateButtonIcon()
+/obj/item/gun/attack_hand(mob/user)
+ . = ..()
+ update_appearance()
+
/obj/item/gun/pickup(mob/user)
- ..()
+ . = ..()
+ update_appearance()
if(azoom)
azoom.Grant(user)
/obj/item/gun/dropped(mob/user)
. = ..()
+ update_appearance()
if(azoom)
azoom.Remove(user)
if(zoomed)
@@ -594,6 +708,15 @@
knife_overlay.pixel_y = knife_y_offset
. += knife_overlay
+ if(ismob(loc) && has_safety)
+ var/mutable_appearance/safety_overlay
+ safety_overlay = mutable_appearance('icons/obj/guns/safety.dmi')
+ if(safety)
+ safety_overlay.icon_state = "safety-on"
+ else
+ safety_overlay.icon_state = "safety-off"
+ . += safety_overlay
+
/obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer)
if(!ishuman(user) || !ishuman(target))
return
@@ -637,6 +760,111 @@
/obj/item/gun/proc/before_firing(atom/target,mob/user)
return
+/obj/item/gun/proc/simulate_recoil(mob/living/user, recoil_bonus = 0, firing_angle)
+ var/total_recoil = recoil_bonus
+
+ var/actual_angle = firing_angle + rand(-recoil_deviation, recoil_deviation) + 180
+ if(actual_angle > 360)
+ actual_angle -= 360
+ if(total_recoil > 0)
+ recoil_camera(user, total_recoil + 1, (total_recoil * recoil_backtime_multiplier)+1, total_recoil, actual_angle)
+ return TRUE
+
+/obj/item/gun/proc/handle_muzzle_flash(mob/living/user, firing_angle)
+ var/atom/movable/flash_loc = user
+ var/prev_light = light_range
+ if(!light_on && (light_range <= muzzle_flash_lum))
+ set_light_range(muzzle_flash_lum)
+ set_light_color(muzzle_flash_color)
+ set_light_on(TRUE)
+ update_light()
+ addtimer(CALLBACK(src, PROC_REF(reset_light_range), prev_light), 1 SECONDS)
+ //Offset the pixels.
+ switch(firing_angle)
+ if(0, 360)
+ muzzle_flash.pixel_x = 0
+ muzzle_flash.pixel_y = 8
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(1 to 44)
+ muzzle_flash.pixel_x = round(4 * ((firing_angle) / 45))
+ muzzle_flash.pixel_y = 8
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(45)
+ muzzle_flash.pixel_x = 8
+ muzzle_flash.pixel_y = 8
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(46 to 89)
+ muzzle_flash.pixel_x = 8
+ muzzle_flash.pixel_y = round(4 * ((90 - firing_angle) / 45))
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(90)
+ muzzle_flash.pixel_x = 8
+ muzzle_flash.pixel_y = 0
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(91 to 134)
+ muzzle_flash.pixel_x = 8
+ muzzle_flash.pixel_y = round(-3 * ((firing_angle - 90) / 45))
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(135)
+ muzzle_flash.pixel_x = 8
+ muzzle_flash.pixel_y = -6
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(136 to 179)
+ muzzle_flash.pixel_x = round(4 * ((180 - firing_angle) / 45))
+ muzzle_flash.pixel_y = -6
+ muzzle_flash.layer = ABOVE_MOB_LAYER
+ if(180)
+ muzzle_flash.pixel_x = 0
+ muzzle_flash.pixel_y = -6
+ muzzle_flash.layer = ABOVE_MOB_LAYER
+ if(181 to 224)
+ muzzle_flash.pixel_x = round(-6 * ((firing_angle - 180) / 45))
+ muzzle_flash.pixel_y = -6
+ muzzle_flash.layer = ABOVE_MOB_LAYER
+ if(225)
+ muzzle_flash.pixel_x = -6
+ muzzle_flash.pixel_y = -6
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(226 to 269)
+ muzzle_flash.pixel_x = -6
+ muzzle_flash.pixel_y = round(-6 * ((270 - firing_angle) / 45))
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(270)
+ muzzle_flash.pixel_x = -6
+ muzzle_flash.pixel_y = 0
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(271 to 314)
+ muzzle_flash.pixel_x = -6
+ muzzle_flash.pixel_y = round(8 * ((firing_angle - 270) / 45))
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(315)
+ muzzle_flash.pixel_x = -6
+ muzzle_flash.pixel_y = 8
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(316 to 359)
+ muzzle_flash.pixel_x = round(-6 * ((360 - firing_angle) / 45))
+ muzzle_flash.pixel_y = 8
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+
+ muzzle_flash.transform = null
+ muzzle_flash.transform = turn(muzzle_flash.transform, firing_angle)
+ flash_loc.vis_contents += muzzle_flash
+ muzzle_flash.applied = TRUE
+
+ addtimer(CALLBACK(src, PROC_REF(remove_muzzle_flash), flash_loc, muzzle_flash), 0.2 SECONDS)
+
+/obj/item/gun/proc/reset_light_range(lightrange)
+ set_light_range(lightrange)
+ set_light_color(initial(light_color))
+ if(lightrange <= 0)
+ set_light_on(FALSE)
+ update_light()
+
+/obj/item/gun/proc/remove_muzzle_flash(atom/movable/flash_loc, obj/effect/muzzle_flash/muzzle_flash)
+ if(!QDELETED(flash_loc))
+ flash_loc.vis_contents -= muzzle_flash
+ muzzle_flash.applied = FALSE
+
/////////////
// ZOOMING //
/////////////
@@ -677,7 +905,7 @@
zoomed = forced_zoom
if(zoomed)
- RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, .proc/rotate)
+ RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate))
user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, direc)
else
UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 9efbc6169b25..a8e2a201c81a 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -6,6 +6,9 @@
icon_state = "pistol"
w_class = WEIGHT_CLASS_NORMAL
+ has_safety = TRUE
+ safety = TRUE
+
///sound when inserting magazine
var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg'
///sound when inserting an empty magazine
@@ -81,12 +84,15 @@
var/rack_delay = 5
///time of the most recent rack, used for cooldown purposes
var/recent_rack = 0
- ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it
- var/tac_reloads = TRUE //Snowflake mechanic no more.
///Whether the gun can be sawn off by sawing tools
var/can_be_sawn_off = FALSE
var/flip_cooldown = 0
+ ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it
+ var/tac_reloads = TRUE //Snowflake mechanic no more.
+ ///If we have the 'snowflake mechanic,' how long should it take to reload?
+ var/tactical_reload_delay = 1 SECONDS
+
/obj/item/gun/ballistic/Initialize()
. = ..()
if (!spawnwithmagazine)
@@ -220,21 +226,27 @@
playsound(src, eject_empty_sound, eject_sound_volume, eject_sound_vary)
magazine.forceMove(drop_location())
var/obj/item/ammo_box/magazine/old_mag = magazine
- if (tac_load)
- if (insert_magazine(user, tac_load, FALSE))
- to_chat(user, "You perform a tactical reload on \the [src].")
- else
- to_chat(user, "You dropped the old [magazine_wording], but the new one doesn't fit. How embarassing.")
- magazine = null
- else
- magazine = null
- user.put_in_hands(old_mag)
old_mag.update_appearance()
+ magazine = null
if (display_message)
to_chat(user, "You pull the [magazine_wording] out of \the [src].")
update_appearance()
+ if (tac_load)
+ if(do_after(user, tactical_reload_delay, TRUE, src))
+ if (insert_magazine(user, tac_load, FALSE))
+ to_chat(user, "You perform a tactical reload on \the [src].")
+ else
+ to_chat(user, "You dropped the old [magazine_wording], but the new one doesn't fit. How embarassing.")
+ else
+ to_chat(user, "Your reload was interupted!")
+ return
+
+ user.put_in_hands(old_mag)
+ update_appearance()
/obj/item/gun/ballistic/can_shoot()
+ if(safety)
+ return FALSE
return chambered
/obj/item/gun/ballistic/attackby(obj/item/A, mob/user, params)
@@ -342,7 +354,7 @@
return
return ..()
-/obj/item/gun/ballistic/attack_self(mob/living/user)
+/obj/item/gun/ballistic/unique_action(mob/living/user)
if(HAS_TRAIT(user, TRAIT_GUNFLIP))
if(flip_cooldown <= world.time)
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40))
@@ -352,13 +364,10 @@
user.dropItemToGround(src, TRUE)
return
flip_cooldown = (world.time + 30)
+ SpinAnimation(7,1)
user.visible_message("[user] spins the [src] around their finger by the trigger. That’s pretty badass.")
playsound(src, 'sound/items/handling/ammobox_pickup.ogg', 20, FALSE)
return
- if(!internal_magazine && magazine)
- if(!magazine.ammo_count())
- eject_magazine(user)
- return
if(bolt_type == BOLT_TYPE_NO_BOLT)
chambered = null
var/num_unloaded = 0
diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm
index 7ec610bbc33c..5b3ced3e8100 100644
--- a/code/modules/projectiles/guns/ballistic/assault.dm
+++ b/code/modules/projectiles/guns/ballistic/assault.dm
@@ -1,12 +1,31 @@
/obj/item/gun/ballistic/automatic/assault
burst_size = 1
actions_types = list()
+ wield_delay = 0.7 SECONDS
+ wield_slowdown = 0.6
+
+ fire_delay = 1
+
+ load_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
+ eject_sound = 'sound/weapons/gun/rifle/ar_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/rifle/ar_unload.ogg'
+
+ rack_sound = 'sound/weapons/gun/rifle/ar_cock.ogg'
+ spread_unwielded = 20
/obj/item/gun/ballistic/automatic/assault/ak47
name = "\improper SVG-67"
desc = "A Frontier-built assault rifle descended from a pattern of unknown provenance. Its low cost, ease of maintenance, and powerful 7.62x39mm cartridge make it a popular choice among a wide variety of outlaws."
icon = 'icons/obj/guns/48x32guns.dmi'
fire_sound = 'sound/weapons/gun/rifle/ak47.ogg'
+
+ rack_sound = 'sound/weapons/gun/rifle/ak47_cocked.ogg'
+ load_sound = 'sound/weapons/gun/rifle/ak47_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/rifle/ak47_reload.ogg'
+ eject_sound = 'sound/weapons/gun/rifle/ak47_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/rifle/ak47_unload.ogg'
+
icon_state = "ak47"
item_state = "ak47"
mag_display = TRUE
@@ -14,6 +33,8 @@
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
mag_type = /obj/item/ammo_box/magazine/ak47
+ spread = 0
+ wield_delay = 0.7 SECONDS
/obj/item/gun/ballistic/automatic/assault/ak47/ComponentInitialize()
. = ..()
@@ -89,6 +110,13 @@
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
mag_type = /obj/item/ammo_box/magazine/p16
+ spread = 2
+ wield_delay = 0.5 SECONDS
+ rack_sound = 'sound/weapons/gun/rifle/m16_cocked.ogg'
+ load_sound = 'sound/weapons/gun/rifle/m16_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/rifle/m16_reload.ogg'
+ eject_sound = 'sound/weapons/gun/rifle/m16_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/rifle/m16_unload.ogg'
/obj/item/gun/ballistic/automatic/assault/p16/ComponentInitialize()
. = ..()
@@ -133,6 +161,8 @@
slot_flags = ITEM_SLOT_BACK
mag_type = /obj/item/ammo_box/magazine/swiss
actions_types = list(/datum/action/item_action/toggle_firemode)
+ spread = 8
+ spread_unwielded = 15
/obj/item/gun/ballistic/automatic/assault/swiss_cheese/ComponentInitialize()
. = ..()
@@ -157,7 +187,7 @@
fire_delay = initial(fire_delay)
to_chat(user, "You switch to [burst_size]-rnd Matter.")
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
+ playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
update_appearance()
for(var/datum/action/action as anything in actions)
action.UpdateButtonIcon()
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index b159376b547b..ed45f24a7625 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -14,6 +14,13 @@
weapon_weight = WEAPON_MEDIUM
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
+ wield_delay = 1 SECONDS
+ spread = 0
+ spread_unwielded = 13
+ recoil = 0
+ recoil_unwielded = 4
+ wield_slowdown = 0.35
+
/obj/item/gun/ballistic/automatic/update_overlays()
. = ..()
if(!select)
@@ -39,7 +46,7 @@
fire_delay = initial(fire_delay)
to_chat(user, "You switch to [burst_size]-rnd burst.")
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
+ playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
update_appearance()
for(var/X in actions)
var/datum/action/A = X
@@ -71,6 +78,13 @@
actions_types = list()
mag_display = TRUE
+ spread = -5
+ spread_unwielded = 20
+ recoil = 0
+ recoil_unwielded = 4
+ wield_slowdown = 1
+ wield_delay = 1.3 SECONDS
+
/obj/item/gun/ballistic/automatic/sniper_rifle/syndicate
name = "syndicate sniper rifle"
desc = "A heavily-modified .50 BMG anti-material rifle utilized by Syndicate agents. Requires both hands to fire."
@@ -117,7 +131,6 @@
icon = 'icons/obj/guns/48x32guns.dmi'
lefthand_file = 'icons/mob/inhands/weapons/64x_guns_left.dmi'
righthand_file = 'icons/mob/inhands/weapons/64x_guns_right.dmi'
- fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
icon_state = "ebr"
item_state = "ebr"
mag_display = TRUE
@@ -128,6 +141,9 @@
burst_size = 0
actions_types = list()
+ wield_slowdown = 2
+ spread = -4
+
/obj/item/gun/ballistic/automatic/gal
name = "\improper CM-GAL-S"
desc = "The standard issue DMR of the CMM. Dates back to the Xenofauna War, this particular model is in a carbine configuration, and, as such, is shorter than the standard model. Chambered in .308."
@@ -143,6 +159,9 @@
burst_size = 0
actions_types = list()
+ wield_slowdown = 2
+ spread = -4
+
/obj/item/gun/ballistic/automatic/gal/inteq
name = "\improper SsG-04"
desc = "A marksman rifle purchased from the Colonial Minutemen and modified to suit IRMG's needs. Chambered in .308."
diff --git a/code/modules/projectiles/guns/ballistic/gauss.dm b/code/modules/projectiles/guns/ballistic/gauss.dm
index 993c616f885f..32cee65317cf 100644
--- a/code/modules/projectiles/guns/ballistic/gauss.dm
+++ b/code/modules/projectiles/guns/ballistic/gauss.dm
@@ -18,6 +18,13 @@
charge_sections = 4
ammo_x_offset = 2
+ spread = 0
+ spread_unwielded = 25
+ recoil = 0
+ recoil_unwielded = 4
+ wield_slowdown = 0.75
+ wield_delay = 1 SECONDS
+
/obj/item/gun/ballistic/automatic/powered/gauss/modelh
name = "Model H"
desc = "Standard-issue pistol of the Solarian Confederation. Fires slow ferromagnetic slugs at a high energy cost, though they rend flesh with ease."
@@ -32,6 +39,11 @@
fire_delay = 0 //pistol
mag_display = FALSE
empty_indicator = FALSE
+ recoil = 1
+ recoil_unwielded = 2
+ spread = 3
+ spread_unwielded = 6
+
/obj/item/gun/ballistic/automatic/powered/gauss/claris
name = "Claris"
@@ -65,6 +77,9 @@
actions_types = list()
empty_indicator = FALSE
+ wield_delay = 0.7 SECONDS
+ fire_delay = 1
+
/obj/item/gun/ballistic/automatic/powered/gauss/gar/ComponentInitialize()
. = ..()
AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) //setiting this to 0.1 breaks auotfire, not sure why, so we use the standard fire rate but in 2 shot bursts to shoot 'faster'
diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm
index dfe8a52cde19..29d4b7914395 100644
--- a/code/modules/projectiles/guns/ballistic/hmg.dm
+++ b/code/modules/projectiles/guns/ballistic/hmg.dm
@@ -6,6 +6,13 @@
actions_types = list()
slowdown = 1
drag_slowdown = 1.5
+ fire_delay = 1
+
+ spread = 2
+ spread_unwielded = 80
+ recoil = 1
+ recoil_unwielded = 4
+ wield_slowdown = 4
// L6 SAW //
@@ -29,7 +36,7 @@
/obj/item/gun/ballistic/automatic/hmg/l6_saw/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
/obj/item/gun/ballistic/automatic/hmg/l6_saw/examine(mob/user)
. = ..()
@@ -86,4 +93,4 @@
/obj/item/gun/ballistic/automatic/hmg/solar/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index 18030833e6cd..eafe30f362a8 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -50,6 +50,7 @@
item_state = "rocketlauncher"
mag_type = /obj/item/ammo_box/magazine/internal/rocketlauncher
fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg'
+ load_sound = 'sound/weapons/gun/general/rocket_load.ogg'
w_class = WEIGHT_CLASS_BULKY
can_suppress = FALSE
pin = /obj/item/firing_pin
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index d03b3992b741..591bc7eafa3d 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -1,21 +1,21 @@
/obj/item/gun/ballistic/automatic/pistol
- name = "stechkin pistol"
+ name = "Stechkin"
desc = "A small, easily concealable 10mm handgun that bears Scarborough Arms stamps. Has a threaded barrel for suppressors."
icon_state = "pistol"
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/m10mm
can_suppress = TRUE
burst_size = 1
- fire_delay = 0
+ fire_delay = 0 //spam it as fast as you can
actions_types = list()
bolt_type = BOLT_TYPE_LOCKING
fire_sound = 'sound/weapons/gun/pistol/shot.ogg'
dry_fire_sound = 'sound/weapons/gun/pistol/dry_fire.ogg'
suppressed_sound = 'sound/weapons/gun/pistol/shot_suppressed.ogg'
- load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
- load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
- eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
- eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ load_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
vary_fire_sound = FALSE
rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg'
lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg'
@@ -24,7 +24,13 @@
bolt_wording = "slide"
weapon_weight = WEAPON_LIGHT
pickup_sound = 'sound/items/handling/gun_pickup.ogg'
- fire_delay = 1
+
+ wield_delay = 0.2 SECONDS
+ spread = -2
+ spread_unwielded = 4
+ wield_slowdown = 0.15
+
+ muzzleflash_iconstate = "muzzle_flash_light"
/obj/item/gun/ballistic/automatic/pistol/no_mag
spawnwithmagazine = FALSE
@@ -35,16 +41,21 @@
install_suppressor(S)
/obj/item/gun/ballistic/automatic/pistol/m1911
- name = "\improper M1911"
+ name = "\improper M1911A8"
desc = "A classic .45 handgun. An engraving on the slide marks it as a product of Hunter's Pride."
icon_state = "m1911"
w_class = WEIGHT_CLASS_NORMAL
mag_type = /obj/item/ammo_box/magazine/m45
can_suppress = FALSE
- fire_sound = 'sound/weapons/gun/pistol/shot.ogg'
- rack_sound = 'sound/weapons/gun/pistol/rack.ogg'
+ fire_sound = 'sound/weapons/gun/pistol/m1911.ogg'
+ rack_sound = 'sound/weapons/gun/pistol/m1911_cocked.ogg'
lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg'
+ load_sound = 'sound/weapons/gun/pistol/m1911_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/m1911_reload.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/m1911_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/m1911_unload.ogg'
+ recoil = -2
/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag
spawnwithmagazine = FALSE
@@ -57,10 +68,19 @@
mag_type = /obj/item/ammo_box/magazine/m50
can_suppress = FALSE
mag_display = TRUE
- fire_sound = 'sound/weapons/gun/rifle/shot_alt.ogg'
+ fire_sound = 'sound/weapons/gun/pistol/deagle.ogg'
rack_sound = 'sound/weapons/gun/pistol/rack.ogg'
lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg'
+ load_sound = 'sound/weapons/gun/pistol/deagle_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/deagle_reload.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/deagle_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/deagle_unload.ogg'
+ fire_delay = 0.7 SECONDS
+ recoil = 1
+ recoil_unwielded = 2
+ spread = 4
+ spread_unwielded = 7
/obj/item/gun/ballistic/automatic/pistol/deagle/gold
desc = "A gold-plated Desert Eagle folded over a million times by superior Martian gunsmiths. Uses .50 AE ammo."
@@ -106,6 +126,11 @@
w_class = WEIGHT_CLASS_NORMAL
mag_type = /obj/item/ammo_box/magazine/co9mm
can_suppress = FALSE
+ fire_sound = 'sound/weapons/gun/pistol/commander.ogg'
+ load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
/obj/item/gun/ballistic/automatic/pistol/commander/no_mag
spawnwithmagazine = FALSE
@@ -128,6 +153,10 @@
can_suppress = FALSE
var/funnysounds = TRUE
var/cooldown = 0
+ load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
/obj/item/gun/ballistic/automatic/pistol/commissar/equipped(mob/living/user, slot)
..()
@@ -177,6 +206,10 @@
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/pistol556mm
fire_sound = 'sound/weapons/gun/pistol/pistolec.ogg'
+ load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
/obj/item/gun/ballistic/automatic/pistol/solgov/old
icon_state = "pistole-c-old"
@@ -189,6 +222,10 @@
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/tec9
mag_display = TRUE
+ load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
/obj/item/gun/ballistic/automatic/pistol/disposable
name = "disposable gun"
@@ -200,6 +237,9 @@
can_suppress = FALSE
var/random_icon = TRUE
+ has_safety = FALSE //thing barely costs anything, why would it have a safety?
+ safety = FALSE
+
/obj/item/gun/ballistic/automatic/pistol/disposable/Initialize()
. = ..()
var/picked = pick("none","red","purple","yellow","green","dark")
@@ -265,3 +305,17 @@
desc = "The golden sheen is somewhat counter-intuitive on a holdout weapon, but it looks cool. Uses .357 ammo."
icon_state = "derringer_gold"
mag_type = /obj/item/ammo_box/magazine/internal/derr357
+
+/obj/item/gun/ballistic/automatic/pistol/himehabu
+ name = "\improper Himehabu"
+ desc = "A very small .22 LR pistol. The long awaited successor to the Stechkin; It has become a favorite among syndicate spies. Chambered in .22 LR."
+ icon_state = "himehabu"
+ w_class = WEIGHT_CLASS_TINY
+ mag_type = /obj/item/ammo_box/magazine/m22lr
+ can_suppress = FALSE
+ fire_sound = 'sound/weapons/gun/pistol/himehabu.ogg'
+
+ recoil = -2
+ recoil_unwielded = -2
+ spread_unwielded = 0
+ wield_slowdown = 0
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index b1c70e7a73b6..74c7f95d0db2 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -4,6 +4,7 @@
icon_state = "revolver"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder
fire_sound = 'sound/weapons/gun/revolver/shot.ogg'
+ rack_sound = 'sound/weapons/gun/revolver/revolver_prime.ogg'
load_sound = 'sound/weapons/gun/revolver/load_bullet.ogg'
eject_sound = 'sound/weapons/gun/revolver/empty.ogg'
vary_fire_sound = FALSE
@@ -15,7 +16,53 @@
tac_reloads = FALSE
var/spin_delay = 10
var/recent_spin = 0
- fire_delay = 7
+ fire_delay = 2
+ spread_unwielded = 15
+ recoil = 0.5
+ recoil_unwielded = 1
+ semi_auto = FALSE
+ bolt_wording = "hammer"
+ wield_slowdown = 0.3
+
+ has_safety = FALSE //irl revolvers dont have safetys. i think. maybe
+ safety = FALSE
+
+/obj/item/gun/ballistic/revolver/examine(mob/user)
+ . = ..()
+ . += "You can use the revolver with your other empty hand to empty the cylinder."
+
+/obj/item/gun/ballistic/revolver/attack_hand(mob/user)
+ if(loc == user && user.is_holding(src))
+ chambered = null
+ var/num_unloaded = 0
+ for(var/obj/item/ammo_casing/CB in get_ammo_list(FALSE, TRUE))
+ CB.forceMove(drop_location())
+ CB.bounce_away(FALSE, NONE)
+ num_unloaded++
+ SSblackbox.record_feedback("tally", "station_mess_created", 1, CB.name)
+ if (num_unloaded)
+ to_chat(user, "You unload [num_unloaded] [cartridge_wording]\s from [src].")
+ playsound(user, eject_sound, eject_sound_volume, eject_sound_vary)
+ update_appearance()
+ return
+ else
+ return ..()
+ else
+ return ..()
+
+
+/obj/item/gun/ballistic/revolver/unique_action(mob/living/user)
+ rack(user)
+ return
+
+///updates a bunch of racking related stuff and also handles the sound effects and the like
+/obj/item/gun/ballistic/revolver/rack(mob/user = null)
+ if(user)
+ to_chat(user, "You rack the [bolt_wording] of \the [src].")
+ chamber_round(TRUE)
+ playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
+ update_appearance()
+
/obj/item/gun/ballistic/revolver/chamber_round(spin_cylinder = TRUE)
if(spin_cylinder)
@@ -23,10 +70,6 @@
else
chambered = magazine.stored_ammo[1]
-/obj/item/gun/ballistic/revolver/shoot_with_empty_chamber(mob/living/user as mob|obj)
- ..()
- chamber_round(TRUE)
-
/obj/item/gun/ballistic/revolver/AltClick(mob/user)
..()
spin()
@@ -76,7 +119,7 @@
/obj/item/gun/ballistic/revolver/detective
name = "\improper Colt Detective Special"
desc = "A compact and ridiculously old-fashioned law enforcement firearm. Uses .38 special rounds."
- fire_sound = 'sound/weapons/gun/revolver/shot.ogg'
+ fire_sound = 'sound/weapons/gun/revolver/shot_light.ogg'
icon_state = "detective"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38
obj_flags = UNIQUE_RENAME
@@ -91,6 +134,8 @@
"Black Panther" = "detective_panther"
)
+ recoil = 0 //weaker than normal revovler, no recoil
+
/obj/item/gun/ballistic/revolver/detective/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
if(magazine.caliber != initial(magazine.caliber))
if(prob(100 - (magazine.ammo_count() * 5))) //minimum probability of 70, maximum of 95
@@ -140,6 +185,9 @@
name = "\improper Unica 6 auto-revolver"
desc = "A high-powered revolver with a unique auto-reloading system. Uses .357 ammo."
icon_state = "mateba"
+ semi_auto = TRUE
+ spread = 0
+ spread_unwielded = 7
/obj/item/gun/ballistic/revolver/golden
name = "\improper Golden revolver"
@@ -154,6 +202,9 @@
desc = "An ancient model of revolver with notoriously poor ergonomics, chambered in 7.62x38mmR. Uniquely able to be suppressed."
icon_state = "nagant"
can_suppress = TRUE
+ spread_unwielded = 12
+ recoil = 0
+ recoil_unwielded = 0
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev762
@@ -163,6 +214,12 @@
desc = "A massive, long-barreled revolver designed for the most dangerous game. Can only be reloaded one cartridge at a time due to its reinforced frame. Uses .45-70 ammo."
icon_state = "hunting"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev4570
+ fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg'
+ wield_slowdown = 0.5
+ spread_unwielded = 5
+ spread = 2
+ recoil = 2
+ recoil_unwielded = 3
// A gun to play Russian Roulette!
// You can spin the chamber to randomize the position of the bullet.
@@ -277,4 +334,21 @@
icon_state = "pepperbox"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/pepperbox
spread = 20
- fire_delay = 4
+ spread_unwielded = 50
+ fire_delay = 0
+ semi_auto = TRUE
+
+/obj/item/gun/ballistic/revolver/cattleman
+ name = "\improper Cattleman"
+ desc = "A strangely ancient revolver. Despite the age, it is a favorite of fast drawing spacers and officers in various militaries, but sometimes very rarely used in small colonial police units. Uses .45 ACP."
+ fire_sound = 'sound/weapons/gun/revolver/cattleman.ogg'
+ icon = 'icons/obj/guns/48x32guns.dmi'
+ icon_state = "cattleman"
+ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev45
+ obj_flags = UNIQUE_RENAME
+ unique_reskin = list("Default" = "cattleman",
+ "Army" = "cattleman_army",
+ "General" = "cattleman_general"
+ )
+
+ recoil = 0 //weaker than normal revovler, no recoil
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index ac80dc47e890..5d29a26a84a8 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -17,6 +17,13 @@
weapon_weight = WEAPON_MEDIUM
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
+ spread = -1
+ spread_unwielded = 12
+ recoil = -3
+ recoil_unwielded = 4
+ wield_slowdown = 1
+ wield_delay = 1.2 SECONDS
+
/obj/item/gun/ballistic/rifle/update_overlays()
. = ..()
. += "[icon_state]_bolt[bolt_locked ? "_locked" : ""]"
@@ -89,6 +96,13 @@
fire_sound = 'sound/weapons/gun/rifle/ssg669c.ogg'
can_be_sawn_off = FALSE
+ spread = -5
+ spread_unwielded = 20
+ recoil = 0
+ recoil_unwielded = 4
+ wield_slowdown = 1
+ wield_delay = 1.3 SECONDS
+
/obj/item/gun/ballistic/rifle/boltaction/roumain
name = "standard-issue 'Smile' rifle"
desc = "A bolt-action rifle usually given to mercenary hunters of the Saint-Roumain Militia. Chambered in .300 Magnum."
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index e333122e2e0a..5f9db248d6af 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -27,6 +27,14 @@
fire_delay = 7
pb_knockback = 2
+ wield_slowdown = 0.45
+ wield_delay = 0.6 SECONDS //Shotguns are really easy to put up to fire, since they are designed for CQC (at least compared to a rifle)
+
+ spread = 4
+ spread_unwielded = 10
+ recoil = 2
+ recoil_unwielded = 4
+
/obj/item/gun/ballistic/shotgun/blow_up(mob/user)
. = 0
if(chambered && chambered.BB)
@@ -41,13 +49,34 @@
/obj/item/gun/ballistic/shotgun/riot //for spawn in the armory
name = "riot shotgun"
desc = "A sturdy shotgun with a six-shell tube and a fixed wooden stock designed for non-lethal riot control."
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "riotshotgun"
item_state = "shotgun"
mag_type = /obj/item/ammo_box/magazine/internal/shot/riot
sawn_desc = "Come with me if you want to live."
can_be_sawn_off = TRUE
+ rack_sound = 'sound/weapons/gun/shotgun/rack_alt.ogg'
+ fire_delay = 1
+
+/obj/item/gun/ballistic/shotgun/riot/sawoff(mob/user)
+ . = ..()
+ if(.)
+ weapon_weight = WEAPON_MEDIUM
+ wield_slowdown = 0.25
+ wield_delay = 0.3 SECONDS //OP? maybe
+
+ spread = 8
+ spread_unwielded = 15
+ recoil = 3 //or not
+ recoil_unwielded = 5
// Automatic Shotguns//
+/obj/item/gun/ballistic/shotgun/automatic
+ spread = 4
+ spread_unwielded = 16
+ recoil = 1
+ recoil_unwielded = 4
+ wield_delay = 0.65 SECONDS
/obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user)
..()
@@ -146,6 +175,13 @@
tac_reloads = TRUE
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
+ spread = 4
+ spread_unwielded = 16
+ recoil = 1
+ recoil_unwielded = 4
+ wield_slowdown = 0.6
+ wield_delay = 0.65 SECONDS
+
/obj/item/gun/ballistic/shotgun/bulldog/unrestricted
pin = /obj/item/firing_pin
@@ -208,6 +244,13 @@
. = ..()
if(.)
weapon_weight = WEAPON_MEDIUM
+ wield_slowdown = 0.25
+ wield_delay = 0.3 SECONDS //OP? maybe
+
+ spread = 8
+ spread_unwielded = 15
+ recoil = 3 //or not
+ recoil_unwielded = 5
// IMPROVISED SHOTGUN //
@@ -372,6 +415,7 @@
attack_verb = list("bludgeoned", "smashed")
mag_type = /obj/item/ammo_box/magazine/internal/shot/sex
burst_size = 6
+ fire_delay = 0.1
pb_knockback = 12
unique_reskin = null
recoil = 10
@@ -420,10 +464,21 @@
inhand_y_dimension = 32
mag_type = /obj/item/ammo_box/magazine/internal/shot/winchester
fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
- rack_sound = 'sound/weapons/gun/rifle/winchester_cocked.ogg'
+ rack_sound = 'sound/weapons/gun/rifle/ak47_cocked.ogg'
bolt_wording = "lever"
cartridge_wording = "bullet"
+ spread = -5
+ spread_unwielded = 7
+ recoil = 0
+ recoil_unwielded = 2
+ wield_slowdown = 0.5
+
+/obj/item/gun/ballistic/shotgun/winchester/rack(mob/user = null)
+ . = ..()
+ if(!wielded)
+ SpinAnimation(7,1)
+
/obj/item/gun/ballistic/shotgun/winchester/mk1
name = "Winchester MK.1"
desc = "A sturdy lever-action rifle. This antique pattern appears to be in excellent condition despite its age."
@@ -469,7 +524,7 @@
inhand_x_dimension = 32
inhand_y_dimension = 32
mag_type = /obj/item/ammo_box/magazine/internal/shot/contender
- fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
+ fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg'
can_be_sawn_off=TRUE
sawn_desc= "A single-shot pistol. It's hard to aim without a front sight."
w_class = WEIGHT_CLASS_BULKY
@@ -483,9 +538,22 @@
bolt_type = BOLT_TYPE_NO_BOLT
can_be_sawn_off = TRUE
pb_knockback = 3
+ wield_slowdown = 0.7
+ spread_unwielded = 15
+ spread = 0
+ recoil = 0
+ recoil_unwielded = 5
+
/obj/item/gun/ballistic/shotgun/contender/sawoff(mob/user)
. = ..()
if(.)
item_state = "contender_sawn"
+ wield_slowdown = 0.5
+ wield_delay = 0.5 SECONDS
+
+ spread_unwielded = 5 //mostly the hunting revolver stats
+ spread = 2
+ recoil = 2
+ recoil_unwielded = 3
diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm
index e617173c932e..8ffe9be41bf2 100644
--- a/code/modules/projectiles/guns/ballistic/smg.dm
+++ b/code/modules/projectiles/guns/ballistic/smg.dm
@@ -1,6 +1,16 @@
/obj/item/gun/ballistic/automatic/smg
burst_size = 1
actions_types = list()
+ fire_delay = 1
+ spread = 4
+ spread_unwielded = 10
+ wield_slowdown = 0.35
+ recoil_unwielded = 0.5
+
+ load_sound = 'sound/weapons/gun/smg/smg_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/smg/smg_reload.ogg'
+ eject_sound = 'sound/weapons/gun/smg/smg_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/smg/smg_unload.ogg'
/obj/item/gun/ballistic/automatic/smg/proto
name = "\improper Nanotrasen Saber SMG"
@@ -14,7 +24,7 @@
/obj/item/gun/ballistic/automatic/smg/proto/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/proto/unrestricted
pin = /obj/item/firing_pin
@@ -35,7 +45,7 @@
/obj/item/gun/ballistic/automatic/smg/c20r/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/c20r/unrestricted
pin = /obj/item/firing_pin
@@ -56,6 +66,7 @@
desc = "An extreme modification of an obsolete assault rifle, converted into a compact submachine gun by IRMG. Chambered in 10mm."
icon_state = "inteqsmg"
item_state = "inteqsmg"
+ fire_sound = 'sound/weapons/gun/smg/vector_fire.ogg'
mag_type = /obj/item/ammo_box/magazine/smgm10mm
can_bayonet = FALSE
can_flashlight = TRUE
@@ -66,7 +77,7 @@
/obj/item/gun/ballistic/automatic/smg/inteq/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/wt550
name = "\improper WT-550 Automatic Rifle"
@@ -84,38 +95,51 @@
mag_display = TRUE
mag_display_ammo = TRUE
empty_indicator = TRUE
+ fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg'
/obj/item/gun/ballistic/automatic/smg/wt550/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/mini_uzi
name = "\improper Type U3 Uzi"
desc = "A lightweight submachine gun, for when you really want someone dead. Uses 9mm rounds."
icon_state = "uzi"
mag_type = /obj/item/ammo_box/magazine/uzim9mm
- burst_size = 2
bolt_type = BOLT_TYPE_OPEN
mag_display = TRUE
- rack_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
+
+ fire_sound = 'sound/weapons/gun/smg/uzi.ogg'
+ rack_sound = 'sound/weapons/gun/smg/uzi_cocked.ogg'
+
+ load_sound = 'sound/weapons/gun/smg/uzi_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/smg/uzi_reload.ogg'
+ eject_sound = 'sound/weapons/gun/smg/uzi_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/smg/uzi_unload.ogg'
+
+ spread = 4
+ spread_unwielded = 8
+ wield_slowdown = 0.25
+ wield_delay = 0.2 SECONDS
/obj/item/gun/ballistic/automatic/smg/mini_uzi/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
/obj/item/gun/ballistic/automatic/smg/vector
name = "\improper Vector carbine"
desc = "A police carbine based on a pre-Night of Fire SMG design. Most of the complex workings have been removed for reliability. Chambered in 9mm."
icon_state = "vector"
item_state = "vector"
- mag_type = /obj/item/ammo_box/magazine/smgm9mm/rubber //you guys remember when the autorifle was chambered in 9mm
+ mag_type = /obj/item/ammo_box/magazine/smgm9mm //you guys remember when the autorifle was chambered in 9mm
bolt_type = BOLT_TYPE_LOCKING
mag_display = TRUE
weapon_weight = WEAPON_LIGHT
+ fire_sound = 'sound/weapons/gun/smg/vector_fire.ogg'
/obj/item/gun/ballistic/automatic/smg/vector/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/m90
name = "\improper M-90gl Carbine"
@@ -133,6 +157,10 @@
empty_indicator = TRUE
fire_sound = 'sound/weapons/gun/rifle/shot_alt.ogg'
+ spread = 1
+ spread_unwielded = 8
+ wield_slowdown = 0.4
+
/obj/item/gun/ballistic/automatic/smg/m90/Initialize()
. = ..()
underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src)
@@ -186,7 +214,7 @@
burst_size = 1
fire_delay = 0
to_chat(user, "You switch to semi-auto.")
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
+ playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
update_appearance()
return
@@ -203,10 +231,11 @@
actions_types = list()
fire_delay = 1
bolt_type = BOLT_TYPE_OPEN
+ wield_slowdown = 0.4
/obj/item/gun/ballistic/automatic/smg/thompson/Initialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/thompson/drum
name = "\improper Chicago Typewriter"
@@ -220,11 +249,11 @@
item_state = "cm5"
mag_type = /obj/item/ammo_box/magazine/smgm9mm
weapon_weight = WEAPON_LIGHT
- fire_sound = 'sound/weapons/gun/smg/smg_light.ogg'
+ fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg'
/obj/item/gun/ballistic/automatic/smg/cm5/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/aks74u
name = "\improper AKS-74U"
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index b186569afad4..681d79338a52 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -4,6 +4,12 @@
desc = "A basic energy-based gun."
icon = 'icons/obj/guns/energy.dmi'
+ muzzleflash_iconstate = "muzzle_flash_laser"
+ muzzle_flash_color = COLOR_SOFT_RED
+
+ has_safety = TRUE
+ safety = TRUE
+
var/obj/item/stock_parts/cell/gun/cell //What type of power cell this uses
var/cell_type = /obj/item/stock_parts/cell/gun
var/modifystate = 0
@@ -93,7 +99,7 @@
recharge_newshot(TRUE)
update_appearance()
-/obj/item/gun/energy/attack_self(mob/living/user as mob)
+/obj/item/gun/energy/unique_action(mob/living/user)
if(ammo_type.len > 1)
select_fire(user)
update_appearance()
@@ -144,7 +150,9 @@
eject_cell(user)
return ..()
-/obj/item/gun/energy/can_shoot()
+/obj/item/gun/energy/can_shoot(visuals)
+ if(safety && !visuals)
+ return FALSE
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
return !QDELETED(cell) ? (cell.charge >= shot.e_cost) : FALSE
@@ -196,6 +204,7 @@
if (shot.select_name)
to_chat(user, "[src] is now set to [shot.select_name].")
chambered = null
+ playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
recharge_newshot(TRUE)
update_appearance()
return
@@ -217,10 +226,15 @@
. = ..()
if(!automatic_charge_overlays || QDELETED(src))
return
- // Every time I see code this "flexible", a kitten fucking dies
+ // Every time I see code this "flexible", a kitten fucking dies //it got worse
+ //todo: refactor this a bit to allow showing of charge on a gun's cell
var/overlay_icon_state = "[icon_state]_charge"
var/obj/item/ammo_casing/energy/shot = ammo_type[modifystate ? select : 1]
var/ratio = get_charge_ratio()
+ if(cell)
+ . += "[icon_state]_cell"
+ if(ratio == 0)
+ . += "[icon_state]_cellempty"
if(ratio == 0)
if(modifystate)
. += "[icon_state]_[shot.select_name]"
@@ -243,7 +257,7 @@
///Used by update_icon_state() and update_overlays()
/obj/item/gun/energy/proc/get_charge_ratio()
- return can_shoot() ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0
+ return can_shoot(visuals = TRUE) ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0
// Sets the ratio to 0 if the gun doesn't have enough charge to fire, or if its power cell is removed.
/obj/item/gun/energy/vv_edit_var(var_name, var_value)
@@ -268,18 +282,18 @@
else if(BB.nodamage || !BB.damage || BB.damage_type == STAMINA)
user.visible_message("[user] tries to light [user.p_their()] [A.name] with [src], but it doesn't do anything. Dumbass.")
playsound(user, E.fire_sound, 50, TRUE)
- playsound(user, BB.hitsound, 50, TRUE)
+ playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
. = ""
else if(BB.damage_type != BURN)
user.visible_message("[user] tries to light [user.p_their()] [A.name] with [src], but only succeeds in utterly destroying it. Dumbass.")
playsound(user, E.fire_sound, 50, TRUE)
- playsound(user, BB.hitsound, 50, TRUE)
+ playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
qdel(A)
. = ""
else
playsound(user, E.fire_sound, 50, TRUE)
- playsound(user, BB.hitsound, 50, TRUE)
+ playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
. = "[user] casually lights their [A.name] with [src]. Damn."
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 7928094cab13..8a829153fcfd 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -18,6 +18,10 @@
internal_cell = TRUE
custom_price = 750
w_class = WEIGHT_CLASS_BULKY
+
+ muzzleflash_iconstate = "muzzle_flash_light"
+ muzzle_flash_color = COLOR_WHITE
+
var/overheat_time = 16
var/holds_charge = FALSE
var/unique_frequency = FALSE // modified by KA modkits
@@ -113,7 +117,7 @@
if(!QDELING(src) && !holds_charge)
// Put it on a delay because moving item from slot to hand
// calls dropped().
- addtimer(CALLBACK(src, .proc/empty_if_not_held), 2)
+ addtimer(CALLBACK(src, PROC_REF(empty_if_not_held)), 2)
/obj/item/gun/energy/kinetic_accelerator/proc/empty_if_not_held()
if(!ismob(loc))
@@ -144,7 +148,7 @@
carried = 1
deltimer(recharge_timerid)
- recharge_timerid = addtimer(CALLBACK(src, .proc/reload), recharge_time * carried, TIMER_STOPPABLE)
+ recharge_timerid = addtimer(CALLBACK(src, PROC_REF(reload)), recharge_time * carried, TIMER_STOPPABLE)
/obj/item/gun/energy/kinetic_accelerator/emp_act(severity)
return
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 4551014cafea..5a4caeefc373 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -10,6 +10,9 @@
shaded_charge = 1
supports_variations = VOX_VARIATION
+ spread = 0
+ spread_unwielded = 10
+
/obj/item/gun/energy/laser/practice
name = "practice laser gun"
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm
index 029c5f8a2693..b21e176b92e8 100644
--- a/code/modules/projectiles/guns/energy/laser_gatling.dm
+++ b/code/modules/projectiles/guns/energy/laser_gatling.dm
@@ -22,6 +22,7 @@
. = ..()
gun = new(src)
battery = new(src)
+ gun.cell = battery
START_PROCESSING(SSobj, src)
/obj/item/minigunpack/Destroy()
@@ -107,7 +108,7 @@
slot_flags = null
w_class = WEIGHT_CLASS_HUGE
custom_materials = null
- weapon_weight = WEAPON_HEAVY
+ weapon_weight = WEAPON_MEDIUM
ammo_type = list(/obj/item/ammo_casing/energy/laser/minigun)
cell_type = /obj/item/stock_parts/cell/crap
item_flags = NEEDS_PERMIT | SLOWS_WHILE_IN_HAND
@@ -120,7 +121,7 @@
ammo_pack = loc
AddElement(/datum/element/update_icon_blocker)
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
return ..()
/obj/item/gun/energy/minigun/Destroy()
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index a4d252107fc6..83a33691008b 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -12,6 +12,11 @@
internal_cell = TRUE //prevents you from giving it an OP cell - WS Edit
cell_type = "/obj/item/stock_parts/cell/pulse"
+ spread_unwielded = 25
+
+ muzzleflash_iconstate = "muzzle_flash_pulse"
+ muzzle_flash_color = COLOR_BRIGHT_BLUE
+
/obj/item/gun/energy/pulse/emp_act(severity)
return
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 44c667892e4a..2037e77fbed0 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -260,7 +260,7 @@
/obj/item/gun/energy/wormhole_projector/proc/create_portal(obj/projectile/beam/wormhole/W, turf/target)
var/obj/effect/portal/P = new /obj/effect/portal(target, 300, null, FALSE, null, atmos_link)
- RegisterSignal(P, COMSIG_PARENT_QDELETING, .proc/on_portal_destroy)
+ RegisterSignal(P, COMSIG_PARENT_QDELETING, PROC_REF(on_portal_destroy))
if(istype(W, /obj/projectile/beam/wormhole/orange))
qdel(p_orange)
p_orange = P
@@ -384,7 +384,7 @@
return
return ..()
-/obj/item/gun/energy/gravity_gun/can_shoot()
+/obj/item/gun/energy/gravity_gun/can_shoot(visuals)
if(!firing_core)
return FALSE
return ..()
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 2caeca6f3a16..1d8f78213707 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -6,6 +6,9 @@
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
ammo_x_offset = 3
+ spread = 2
+ spread_unwielded = 4
+
/obj/item/gun/energy/e_gun/advtaser
name = "hybrid taser"
desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams."
@@ -13,6 +16,9 @@
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler)
ammo_x_offset = 2
+ spread = 2
+ spread_unwielded = 4
+
/obj/item/gun/energy/e_gun/advtaser/cyborg
name = "cyborg taser"
desc = "An integrated hybrid taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating."
@@ -31,6 +37,9 @@
flight_x_offset = 15
flight_y_offset = 10
+ spread = 2
+ spread_unwielded = 4
+
/obj/item/gun/energy/disabler/cyborg
name = "cyborg disabler"
desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating."
diff --git a/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm b/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm
new file mode 100644
index 000000000000..71fcfd3e0f87
--- /dev/null
+++ b/code/modules/projectiles/guns/faction/gezena/energy_gunsword.dm
@@ -0,0 +1,77 @@
+/obj/item/gun/energy/kalix //blue //todo: fix up belt_mirror.dmi, it's incomprehensible
+ name = "Etherbor BG-12"
+ desc = "Brought to you by Etherbor Industries, proudly based within the PGF, is the BG-12 energy beam gun! The BG-12 is Etherbor's current newest civilian energy weapon model."
+ icon_state = "kalixgun"
+ item_state = "kalixgun"
+ icon = 'icons/obj/guns/faction/gezena/energy.dmi'
+ lefthand_file = 'icons/obj/guns/faction/gezena/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/faction/gezena/righthand.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/belt.dmi'
+ w_class = WEIGHT_CLASS_BULKY
+
+ cell_type = /obj/item/stock_parts/cell/gun/pgf
+ ammo_type = list(/obj/item/ammo_casing/energy/kalix)
+
+ load_sound = 'sound/weapons/gun/gauss/pistol_reload.ogg'
+
+/obj/projectile/beam/hitscan/kalix
+ name = "concentrated energy"
+ tracer_type = /obj/effect/projectile/tracer/kalix
+ muzzle_type = /obj/effect/projectile/muzzle/kalix
+ impact_type = /obj/effect/projectile/impact/kalix
+ hitscan_light_color_override = LIGHT_COLOR_ELECTRIC_CYAN
+ muzzle_flash_color_override = LIGHT_COLOR_ELECTRIC_CYAN
+ impact_light_color_override = LIGHT_COLOR_ELECTRIC_CYAN
+ range = 10
+
+/obj/item/ammo_casing/energy/kalix
+ projectile_type = /obj/projectile/beam/hitscan/kalix
+ fire_sound = 'sound/weapons/gun/energy/laserpistol.ogg'
+ e_cost = 850
+
+/obj/item/gun/energy/kalix/pgf
+ name = "Etherbor BG-16"
+ desc = "An advanced variant of the BG-12, the BG-16 is the military-grade beam gun designed and manufactured by Etherbor Industries as the standard-issue weapon of the PGF."
+ icon_state = "pgfgun"
+ item_state = "pgfgun"
+
+ cell_type = /obj/item/stock_parts/cell/gun/pgf
+ ammo_type = list(/obj/item/ammo_casing/energy/pgf)
+
+/obj/projectile/beam/hitscan/pgf
+ name = "concentrated energy"
+ tracer_type = /obj/effect/projectile/tracer/pgf
+ muzzle_type = /obj/effect/projectile/muzzle/pgf
+ impact_type = /obj/effect/projectile/impact/pgf
+ hitscan_light_color_override = LIGHT_COLOR_ELECTRIC_GREEN
+ muzzle_flash_color_override = LIGHT_COLOR_ELECTRIC_GREEN
+ impact_light_color_override = LIGHT_COLOR_ELECTRIC_GREEN
+ damage_constant = 0.9
+ damage = 25
+ range = 6
+
+/obj/item/ammo_casing/energy/pgf
+ projectile_type = /obj/projectile/beam/hitscan/pgf
+ fire_sound = 'sound/weapons/gun/energy/laserpistol.ogg'
+ e_cost = 1000
+
+/obj/item/gun/energy/kalix/pgf/heavy
+ name = "Etherbor HBG-7"
+ desc = "For when a BG-16 doesn’t cut it, the far bulkier HBG-7, provided by your friends at Etherbor Industries, has the stopping power and fire rate to bring down any target where a smaller caliber weapon just wouldn't cut it."
+ icon_state = "pgfheavy"
+ item_state = "pgfheavy"
+ icon = 'icons/obj/guns/faction/gezena/48x32.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/faction/gezena/back.dmi'
+ w_class = WEIGHT_CLASS_HUGE
+ slot_flags = ITEM_SLOT_BACK
+
+ ammo_type = list(/obj/item/ammo_casing/energy/pgf/heavy)
+
+/obj/projectile/beam/hitscan/pgf/heavy
+ damage = 35
+ range = 12
+
+/obj/item/ammo_casing/energy/pgf/heavy
+ projectile_type = /obj/projectile/beam/hitscan/pgf/heavy
+ fire_sound = 'sound/weapons/gun/energy/lasersniper.ogg'
+ e_cost = 2000
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index 4822e2b59ba7..fad4f485aa88 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -148,7 +148,7 @@
current_zoom_x = 0
current_zoom_y = 0
-/obj/item/gun/energy/beam_rifle/attack_self(mob/user)
+/obj/item/gun/energy/beam_rifle/unique_action(mob/living/user)
projectile_setting_pierce = !projectile_setting_pierce
to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode.")
aiming_beam()
@@ -265,7 +265,7 @@
current_user = null
if(istype(user))
current_user = user
- RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_mob_move)
+ RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_mob_move))
listeningTo = user
/obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
@@ -521,7 +521,7 @@
tracer_type = /obj/effect/projectile/tracer/tracer/aiming
name = "aiming beam"
hitsound = null
- hitsound_wall = null
+ hitsound_non_living = null
nodamage = TRUE
damage = 0
constant_tracer = TRUE
diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm
index d2a8c80827fc..888e680479ea 100644
--- a/code/modules/projectiles/guns/misc/blastcannon.dm
+++ b/code/modules/projectiles/guns/misc/blastcannon.dm
@@ -35,7 +35,7 @@
QDEL_NULL(bomb)
return ..()
-/obj/item/gun/blastcannon/attack_self(mob/user)
+/obj/item/gun/blastcannon/unique_action(mob/living/user)
if(bomb)
bomb.forceMove(user.loc)
user.put_in_hands(bomb)
diff --git a/code/modules/projectiles/guns/misc/bow.dm b/code/modules/projectiles/guns/misc/bow.dm
index df30f5a89022..9f2957ba40cd 100644
--- a/code/modules/projectiles/guns/misc/bow.dm
+++ b/code/modules/projectiles/guns/misc/bow.dm
@@ -28,7 +28,7 @@
chambered = magazine.get_round(TRUE)
chambered.forceMove(src)
-/obj/item/gun/ballistic/bow/attack_self(mob/user)
+/obj/item/gun/ballistic/bow/unique_action(mob/living/user)
if(chambered)
to_chat(user, "You [drawn ? "release" : "draw"] [src]'s string.")
if(!drawn)
@@ -51,7 +51,7 @@
/obj/item/ammo_casing/caseless/arrow/despawning/dropped()
. = ..()
- addtimer(CALLBACK(src, .proc/floor_vanish), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(floor_vanish)), 5 SECONDS)
/obj/item/ammo_casing/caseless/arrow/despawning/proc/floor_vanish()
if(isturf(loc))
diff --git a/code/modules/projectiles/guns/misc/grenade_launcher.dm b/code/modules/projectiles/guns/misc/grenade_launcher.dm
index 588e697c28c5..b381c8267738 100644
--- a/code/modules/projectiles/guns/misc/grenade_launcher.dm
+++ b/code/modules/projectiles/guns/misc/grenade_launcher.dm
@@ -43,4 +43,4 @@
F.active = 1
F.icon_state = initial(F.icon_state) + "_active"
playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, TRUE, -3)
- addtimer(CALLBACK(F, /obj/item/grenade.proc/prime), 15)
+ addtimer(CALLBACK(F, TYPE_PROC_REF(/obj/item/grenade, prime)), 15)
diff --git a/code/modules/projectiles/guns/misc/medbeam.dm b/code/modules/projectiles/guns/misc/medbeam.dm
index 7061d7769ba4..dd676a46d068 100644
--- a/code/modules/projectiles/guns/misc/medbeam.dm
+++ b/code/modules/projectiles/guns/misc/medbeam.dm
@@ -67,7 +67,7 @@
current_target = target
active = TRUE
current_beam = user.Beam(current_target, icon_state="medbeam", time = 10 MINUTES, maxdistance = max_range, beam_type = /obj/effect/ebeam/medical)
- RegisterSignal(current_beam, COMSIG_PARENT_QDELETING, .proc/beam_died)//this is a WAY better rangecheck than what was done before (process check)
+ RegisterSignal(current_beam, COMSIG_PARENT_QDELETING, PROC_REF(beam_died))//this is a WAY better rangecheck than what was done before (process check)
SSblackbox.record_feedback("tally", "gun_fired", 1, type)
diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm
index efd99b2d5b49..34af73b855c6 100644
--- a/code/modules/projectiles/guns/misc/syringe_gun.dm
+++ b/code/modules/projectiles/guns/misc/syringe_gun.dm
@@ -38,7 +38,7 @@
. = ..()
. += "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining."
-/obj/item/gun/syringe/attack_self(mob/living/user)
+/obj/item/gun/syringe/unique_action(mob/living/user)
if(!syringes.len)
to_chat(user, "[src] is empty!")
return 0
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index a50b6eed4ae6..7cc9b1c6ebb4 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -13,7 +13,17 @@
generic_canpass = FALSE
//The sound this plays on impact.
var/hitsound = 'sound/weapons/pierce.ogg'
- var/hitsound_wall = ""
+ var/hitsound_non_living = ""
+ var/hitsound_glass
+ var/hitsound_stone
+ var/hitsound_metal
+ var/hitsound_wood
+ var/hitsound_snow
+
+ var/near_miss_sound = ""
+ var/ricochet_sound = ""
+
+
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/def_zone = "" //Aiming at
@@ -158,7 +168,7 @@
var/can_hit_turfs = FALSE
var/static/list/projectile_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
/obj/projectile/Initialize()
@@ -223,11 +233,6 @@
if(!isliving(target))
if(impact_effect_type && !hitscan)
new impact_effect_type(target_loca, hitx, hity)
- if(isturf(target) && hitsound_wall)
- var/volume = clamp(vol_by_damage() + 20, 0, 100)
- if(suppressed)
- volume = 5
- playsound(loc, hitsound_wall, volume, TRUE, -1)
return BULLET_ACT_HIT
var/mob/living/L = target
@@ -264,8 +269,7 @@
to_chat(L, "You're shot by \a [src][organ_hit_text]!")
else
if(hitsound)
- var/volume = vol_by_damage()
- playsound(src, hitsound, volume, TRUE, -1)
+ playsound(get_turf(L), hitsound, 100, TRUE, -1)
L.visible_message("[L] is hit by \a [src][organ_hit_text]!", \
"You're hit by \a [src][organ_hit_text]!", null, COMBAT_MESSAGE_RANGE)
L.on_hit(src)
@@ -350,6 +354,8 @@
range = decayedRange
if(hitscan)
store_hitscan_collision(pcache)
+ if(ricochet_sound)
+ playsound(get_turf(src), ricochet_sound, 120, TRUE, 2) //make it loud, we want to make it known when a ricochet happens. for aesthetic reasons mostly
return TRUE
var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
@@ -521,6 +527,16 @@
if(can_hit_target(M, M == original, TRUE))
Impact(M)
break
+ if(!near_miss_sound)
+ return FALSE
+ if(decayedRange <= range+2)
+ return FALSE
+ for(var/mob/misser in range(1,src))
+ if(!(misser.stat <= SOFT_CRIT))
+ continue
+ misser.playsound_local(get_turf(src), near_miss_sound, 100, FALSE)
+ misser.shake_animation(damage)
+
/**
* Projectile crossed: When something enters a projectile's tile, make sure the projectile hits it if it should be hitting it.
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index d17f94af19ae..d0fa95841ab4 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -4,8 +4,18 @@
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 20
damage_type = BURN
- hitsound = 'sound/weapons/sear.ogg'
- hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+
+ hitsound = 'sound/weapons/gun/hit/energy_impact1.ogg'
+ hitsound_non_living = 'sound/weapons/effects/searwall.ogg'
+ hitsound_glass = 'sound/weapons/effects/searwall.ogg'
+ hitsound_stone = 'sound/weapons/sear.ogg'
+ hitsound_metal = 'sound/weapons/effects/searwall.ogg'
+ hitsound_wood = 'sound/weapons/sear.ogg'
+ hitsound_snow = 'sound/weapons/sear.ogg'
+
+ near_miss_sound = 'sound/weapons/gun/hit/energy_miss1.ogg'
+ ricochet_sound = 'sound/weapons/gun/hit/energy_ricochet1.ogg'
+
flag = "laser"
eyeblur = 2
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
@@ -14,7 +24,7 @@
light_power = 1
light_color = COLOR_SOFT_RED
ricochets_max = 50 //Honk!
- ricochet_chance = 80
+ ricochet_chance = 90
reflectable = REFLECT_NORMAL
/obj/projectile/beam/throw_atom_into_space()
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 6123789df438..43106f97deec 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -6,5 +6,20 @@
damage_type = BRUTE
nodamage = FALSE
flag = "bullet"
- hitsound_wall = "ricochet"
+
+ hitsound = "bullet_hit"
+ hitsound_non_living = "bullet_impact"
+ hitsound_glass = "bullet_hit_glass"
+ hitsound_stone = "bullet_hit_stone"
+ hitsound_metal = "bullet_hit_metal"
+ hitsound_wood = "bullet_hit_wood"
+ hitsound_snow = "bullet_hit_snow"
+
+ near_miss_sound = "bullet_miss"
+ ricochet_sound = "bullet_bounce"
+
+
impact_effect_type = /obj/effect/temp_visual/impact_effect
+ ricochets_max = 5 //should be enough to scare the shit out of someone
+ ricochet_chance = 30
+ ricochet_decay_damage = 0.5 //shouldnt being reliable, but deadly enough to be careful if you accidentally hit an ally
diff --git a/code/modules/projectiles/projectile/bullets/dnainjector.dm b/code/modules/projectiles/projectile/bullets/dnainjector.dm
index ad20c47eeb71..b8cd6f92b10d 100644
--- a/code/modules/projectiles/projectile/bullets/dnainjector.dm
+++ b/code/modules/projectiles/projectile/bullets/dnainjector.dm
@@ -3,7 +3,7 @@
icon_state = "syringeproj"
var/obj/item/dnainjector/injector
damage = 5
- hitsound_wall = "shatter"
+ hitsound_non_living = "shatter"
/obj/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE)
if(iscarbon(target))
diff --git a/code/modules/projectiles/projectile/bullets/gauss.dm b/code/modules/projectiles/projectile/bullets/gauss.dm
index d057213f92e7..0955745ed798 100644
--- a/code/modules/projectiles/projectile/bullets/gauss.dm
+++ b/code/modules/projectiles/projectile/bullets/gauss.dm
@@ -3,8 +3,7 @@
/obj/projectile/bullet/gauss
name = "ferromagnetic pellet"
icon_state = "gauss-pellet"
- damage = 20
- armour_penetration = 40
+ damage = 25
range = 35
light_color = COLOR_SOFT_RED
light_range = 3
@@ -15,6 +14,7 @@
name = "ferromagnetic lance"
icon_state = "redtrac"
damage = 30
+ armour_penetration = 20
// Ferromagnetic Slug (Model H)
@@ -22,4 +22,5 @@
name = "ferromagnetic slug"
icon_state = "gauss-slug"
damage = 50
+ armour_penetration = -60
speed = 0.8
diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm
index dcf8bb682387..ecd8b5abbbb9 100644
--- a/code/modules/projectiles/projectile/bullets/revolver.dm
+++ b/code/modules/projectiles/projectile/bullets/revolver.dm
@@ -19,13 +19,9 @@
// .38 (Colt Detective Special & Winchester)
/obj/projectile/bullet/c38
- name = ".38 special bullet"
+ name = ".38 bullet"
damage = 25
- armour_penetration = -30
- ricochets_max = 2
- ricochet_chance = 50
- ricochet_auto_aim_angle = 10
- ricochet_auto_aim_range = 3
+ armour_penetration = -20
/obj/projectile/bullet/c38/match
name = ".38 match bullet"
@@ -126,7 +122,7 @@
/obj/projectile/bullet/a4570
name = ".45-70 bullet"
- damage = 40 //crits in 3-4 taps depending on armor
+ damage = 45 //crits in 3-4 taps depending on armor
/obj/projectile/bullet/a4570/match
name = ".45-70 match bullet"
@@ -152,3 +148,11 @@
..()
explosion(target, -1, 0, 1)
return BULLET_ACT_HIT
+
+
+/obj/projectile/bullet/c22lr
+ name = ".22LR bullet"
+ damage = 20
+ armour_penetration = -45
+ ricochet_incidence_leeway = 20
+ ricochet_chance = 45
diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm
index 0f2d43206fc8..0979a268ee16 100644
--- a/code/modules/projectiles/projectile/bullets/shotgun.dm
+++ b/code/modules/projectiles/projectile/bullets/shotgun.dm
@@ -1,6 +1,7 @@
/obj/projectile/bullet/slug
name = "12g shotgun slug"
damage = 40
+ armour_penetration = -10
speed = 0.5
/obj/projectile/bullet/slug/beanbag
@@ -11,7 +12,8 @@
/obj/projectile/bullet/incendiary/shotgun
name = "incendiary slug"
- damage = 20
+ damage = 25
+ armour_penetration = -10
speed = 0.5
/obj/projectile/bullet/incendiary/shotgun/dragonsbreath
@@ -65,12 +67,14 @@
///How much stamina damage is subtracted per tile?
var/tile_dropoff_stamina = 1.5 //As above
+ icon_state = "pellet"
armour_penetration = -35
speed = 0.5
/obj/projectile/bullet/pellet/buckshot
name = "buckshot pellet"
- damage = 10
+ damage = 20
+ armour_penetration = -10
/obj/projectile/bullet/pellet/rubbershot
name = "rubbershot pellet"
diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm
index 2a9196ce9ef8..0e1dff3d1e72 100644
--- a/code/modules/projectiles/projectile/energy/net_snare.dm
+++ b/code/modules/projectiles/projectile/energy/net_snare.dm
@@ -37,7 +37,7 @@
if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged)
teletarget = com.target
- addtimer(CALLBACK(src, .proc/pop, teletarget), 30)
+ addtimer(CALLBACK(src, PROC_REF(pop), teletarget), 30)
/obj/effect/nettingportal/proc/pop(teletarget)
if(teletarget)
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 00f323d995fa..458c19d053da 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -438,8 +438,8 @@
/obj/structure/closet/decay/Initialize()
. = ..()
if(auto_destroy)
- addtimer(CALLBACK(src, .proc/bust_open), 5 MINUTES)
- addtimer(CALLBACK(src, .proc/magicly_lock), 5)
+ addtimer(CALLBACK(src, PROC_REF(bust_open)), 5 MINUTES)
+ addtimer(CALLBACK(src, PROC_REF(magicly_lock)), 5)
/obj/structure/closet/decay/proc/magicly_lock()
if(!welded)
@@ -453,7 +453,7 @@
/obj/structure/closet/decay/proc/decay()
animate(src, alpha = 0, time = 30)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, src), 30)
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), 30)
/obj/structure/closet/decay/open(mob/living/user, force = FALSE)
. = ..()
@@ -461,12 +461,12 @@
if(icon_state == magic_icon) //check if we used the magic icon at all before giving it the lesser magic icon
unmagify()
else
- addtimer(CALLBACK(src, .proc/decay), 15 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS)
/obj/structure/closet/decay/proc/unmagify()
icon_state = weakened_icon
update_appearance()
- addtimer(CALLBACK(src, .proc/decay), 15 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS)
icon_welded = "welded"
/obj/projectile/magic/flying
@@ -718,7 +718,7 @@
return BULLET_ACT_BLOCK
var/turf/T = get_turf(target)
for(var/i=0, i<50, i+=10)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i)
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i)
//still magic related, but a different path
diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm
index 74fa2b2ad17a..c146932df085 100644
--- a/code/modules/projectiles/projectile/special/hallucination.dm
+++ b/code/modules/projectiles/projectile/special/hallucination.dm
@@ -100,7 +100,7 @@
layer = ABOVE_MOB_LAYER
hal_target.client.images += blood
animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5)
- addtimer(CALLBACK(src, .proc/cleanup_blood), 5)
+ addtimer(CALLBACK(src, PROC_REF(cleanup_blood)), 5)
/obj/projectile/hallucination/proc/cleanup_blood(image/blood)
hal_target.client.images -= blood
@@ -128,7 +128,7 @@
hal_icon_state = "bullet"
hal_fire_sound = "gunshot"
hal_hitsound = 'sound/weapons/pierce.ogg'
- hal_hitsound_wall = "ricochet"
+ hal_hitsound_wall = "bullet_impact"
hal_impact_effect = "impact_bullet"
hal_impact_effect_wall = "impact_bullet"
hit_duration = 5
@@ -171,7 +171,7 @@
if(hal_target.dna && hal_target.dna.check_mutation(HULK))
hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
else if((hal_target.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(hal_target, TRAIT_STUNIMMUNE))
- addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5)
+ addtimer(CALLBACK(hal_target, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 20), 5)
/obj/projectile/hallucination/disabler
name = "disabler beam"
diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm
index d86f90b9368e..0680c62279fd 100644
--- a/code/modules/projectiles/projectile/special/rocket.dm
+++ b/code/modules/projectiles/projectile/special/rocket.dm
@@ -19,7 +19,7 @@
/obj/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE)
..()
- explosion(target, -1, 1, 3, 1, 0, flame_range = 4)
+ explosion(target, 1, 1, 2, 1, 0, flame_range = 4)
if(ismecha(target))
var/obj/mecha/M = target
@@ -69,7 +69,7 @@
..()
for(var/i in sturdy)
if(istype(target, i))
- explosion(target, 0, 1, 1, 2)
+ explosion(target, 1, 1, 1, 2)
return BULLET_ACT_HIT
//if(istype(target, /turf/closed) || ismecha(target))
new /obj/item/broken_missile(get_turf(src), 1)
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index eb01cf28b714..1fefd1d55031 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -217,7 +217,7 @@
update_appearance()
var/turf/source_turf = get_turf(src)
log_virus("A culture bottle was printed for the virus [A.admin_details()] at [loc_name(source_turf)] by [key_name(usr)]")
- addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 50)
+ addtimer(CALLBACK(src, PROC_REF(reset_replicator_cooldown)), 50)
. = TRUE
if("create_vaccine_bottle")
if (wait)
@@ -229,7 +229,7 @@
B.reagents.add_reagent(/datum/reagent/vaccine, 15, list(id))
wait = TRUE
update_appearance()
- addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 200)
+ addtimer(CALLBACK(src, PROC_REF(reset_replicator_cooldown)), 200)
. = TRUE
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index b638c82fef78..5e5bd21747dc 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -241,7 +241,7 @@
var/offset = prob(50) ? -2 : 2
var/old_pixel_x = pixel_x
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = -1) //start shaking
- addtimer(CALLBACK(src, .proc/stop_shaking, old_pixel_x), duration)
+ addtimer(CALLBACK(src, PROC_REF(stop_shaking), old_pixel_x), duration)
/obj/machinery/reagentgrinder/proc/stop_shaking(old_px)
animate(src)
@@ -255,7 +255,7 @@
playsound(src, 'sound/machines/blender.ogg', 50, TRUE)
else
playsound(src, 'sound/machines/juicer.ogg', 20, TRUE)
- addtimer(CALLBACK(src, .proc/stop_operating), time / speed)
+ addtimer(CALLBACK(src, PROC_REF(stop_operating)), time / speed)
/obj/machinery/reagentgrinder/proc/stop_operating()
operating = FALSE
@@ -314,7 +314,7 @@
if(!beaker || machine_stat & (NOPOWER|BROKEN))
return
operate_for(50, juicing = TRUE)
- addtimer(CALLBACK(src, /obj/machinery/reagentgrinder/proc/mix_complete), 50)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/reagentgrinder, mix_complete)), 50)
/obj/machinery/reagentgrinder/proc/mix_complete()
if(beaker?.reagents.total_volume)
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index bf22e6967862..a35a8c91542a 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -101,6 +101,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
var/amount = round(reac_volume*modifier, 0.1)
if(amount >= 0.5)
M.reagents.add_reagent(type, amount)
+ SSblackbox.record_feedback("nested tally", "reagent expose mob", 1, list("[name]", "[M]", "[method]", "[reac_volume]"))
return 1
/// Applies this reagent to an [/obj]
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 843297c9307d..0e6b166ff810 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -73,7 +73,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
if(!isliving(M))
return
- if(method in list(TOUCH, VAPOR, PATCH))
+ if(method in list(TOUCH, SMOKE, VAPOR, PATCH))
M.adjust_fire_stacks(reac_volume / 15)
if(iscarbon(M))
@@ -265,7 +265,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/vodka
name = "Vodka"
- description = "Number one drink AND fueling choice for Russians worldwide."
+ description = "Number one drink that also serves as fuel."
color = "#0064C8" // rgb: 0, 100, 200
boozepwr = 65
taste_description = "grain alcohol"
@@ -365,8 +365,8 @@ All effects don't start immediately, but rather get worse over time; the rate is
shot_glass_icon_state = "shotglassred"
/datum/reagent/consumable/ethanol/lizardwine
- name = "lizard wine"
- description = "An alcoholic beverage from Space China, made by infusing lizard tails in ethanol."
+ name = "Kalixcis Wine"
+ description = "A relatively popular Kalixcane beverage, made by infusing cacti in ethanol."
color = "#7E4043" // rgb: 126, 64, 67
boozepwr = 45
quality = DRINK_FANTASTIC
@@ -1939,7 +1939,8 @@ All effects don't start immediately, but rather get worse over time; the rate is
generate_data_info(data)
/datum/reagent/consumable/ethanol/fruit_wine/proc/generate_data_info(list/data)
- var/minimum_percent = 0.15 //Percentages measured between 0 and 1.
+ // BYOND's compiler fails to catch non-consts in a ranged switch case, and it causes incorrect behavior. So this needs to explicitly be a constant.
+ var/const/minimum_percent = 0.15 //Percentages measured between 0 and 1.
var/list/primary_tastes = list()
var/list/secondary_tastes = list()
glass_name = "glass of [name]"
@@ -2433,7 +2434,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "A spin on the classic. Artists and street fighters swear by this stuff."
/datum/reagent/consumable/ethanol/out_of_lime/expose_mob(mob/living/carbon/human/consumer, method=INGEST, reac_volume)
- if(method == INGEST || method == TOUCH)
+ if(method == INGEST || method == TOUCH || method == SMOKE)
if(istype(consumer))
consumer.hair_color = pick("0ad","a0f","f73","d14","0b5","fc2","084","05e","d22","fa0")
consumer.facial_hair_color = pick("0ad","a0f","f73","d14","0b5","fc2","084","05e","d22","fa0")
@@ -2454,89 +2455,3 @@ All effects don't start immediately, but rather get worse over time; the rate is
M.clockcultslurring = min(M.clockcultslurring + 3, 3)
M.stuttering = min(M.stuttering + 3, 3)
..()
-
-/datum/reagent/consumable/ethanol/ash_wine
- name = "Ashwine"
- description = "A traditional sacrament for members of the Saint-Roumain Militia. Known to grant visions, and is used both for ritual and entertainment purposes aboard Saint-Roumain vessels."
- color = "#293D25"
- boozepwr = 80
- quality = DRINK_VERYGOOD
- taste_description = "devotional energy and a hint of high-potency hallucinogens"
- glass_name = "Ashwine"
- glass_desc = "A traditional sacrament for members of the Saint-Roumain Militia. Known to grant visions, and is used both for ritual and entertainment purposes aboard Saint-Roumain vessels."
- breakaway_flask_icon_state = "baflaskashwine"
-
-/datum/reagent/consumable/ethanol/ash_wine/on_mob_life(mob/living/M)
- var/high_message = pick("you feel far more devoted to the cause", "you feel like you should go on a hunt")
- var/cleanse_message = pick("divine light purifies you", "you are purged of foul spirts")
- //needs to get updated anytime someone adds a srm job
- var/static/list/increased_toxin_loss = list("Hunter Montagne", "Hunter Doctor", "Hunter", "Shadow")
- if(prob(10))
- M.set_drugginess(10)
- to_chat(M, "[high_message]")
- if(M.mind && (M.mind.assigned_role in increased_toxin_loss))
- M.adjustToxLoss(-2)
- if(prob(10))
- to_chat(M, "[cleanse_message]")
- ..()
- . = 1
-
-/datum/reagent/consumable/ethanol/ash_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(method == TOUCH)
- if(!iscarbon(M))
- reac_volume = reac_volume * 2
- M.Jitter(3 * reac_volume)
- M.Dizzy(2 * reac_volume)
- M.set_drugginess(3 * reac_volume)
- M.emote(pick("twitch","giggle"))
-
-/datum/reagent/consumable/ethanol/ice_wine
- name = "Icewine"
- description = "A specialized brew utilized by members of the Saint-Roumain Militia, designed to assist in temperature regulation while working in hot environments. Known to give one the cold shoulder when thrown."
- color = "#21EFEB"
- boozepwr = 70
- taste_description = "a cold night on the hunt"
- glass_name = "Icewine"
- glass_desc = "A specialized brew utilized by members of the Saint-Roumain Militia, designed to assist in temperature regulation while working in hot environments. Known to give one the cold shoulder when thrown."
- breakaway_flask_icon_state = "baflaskicewine"
-
-/datum/reagent/consumable/ethanol/ice_wine/on_mob_life(mob/living/M)
- M.adjust_bodytemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
- M.adjustFireLoss(-1)
- ..()
- return TRUE
-
-/datum/reagent/consumable/ethanol/ice_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(method == TOUCH)
- if(!iscarbon(M))
- reac_volume = reac_volume * 2
- M.adjust_bodytemperature((-20*reac_volume) * TEMPERATURE_DAMAGE_COEFFICIENT)
- M.Paralyze(reac_volume)
- walk(M, 0) //stops them mid pathing even if they're stunimmunee
- M.apply_status_effect(/datum/status_effect/ice_block_talisman, (0.1 * reac_volume) SECONDS)
-
-/datum/reagent/consumable/ethanol/shock_wine
- name = "Shock Wine"
- description = "A stimulating brew utilized by members of the Saint-Roumain Militia, created to allow trackers to keep up with highly mobile prey. Known to have a shocking effect when thrown"
- color = "#00008b"
- taste_description = "the adrenaline of the chase"
- glass_name = "Shock Wine"
- glass_desc = "A stimulating brew utilized by members of the Saint-Roumain Militia, created to allow trackers to keep up with highly mobile prey. Known to have a shocking effect when thrown"
- breakaway_flask_icon_state = "baflaskshockwine"
-
-/datum/reagent/consumable/ethanol/shock_wine/on_mob_metabolize(mob/living/M)
- ..()
- M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/shock_wine)
-
-/datum/reagent/consumable/ethanol/shock_wine/on_mob_end_metabolize(mob/living/M)
- M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/shock_wine)
- ..()
-
-/datum/reagent/consumable/ethanol/shock_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(method == TOUCH)
- //simple mobs are so tanky and i want this to be useful on them
- if(iscarbon(M))
- reac_volume = reac_volume / 4
- M.electrocute_act(reac_volume, src, siemens_coeff = 1, flags = SHOCK_NOSTUN|SHOCK_TESLA)
- do_sparks(5, FALSE, M)
- playsound(M, 'sound/machines/defib_zap.ogg', 100, TRUE)
diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
index 4fc71a1eba0d..88ce3870e575 100644
--- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
@@ -425,7 +425,7 @@ WS End*/
var/mob/living/carbon/carbies = M
if (carbies.stat == DEAD)
show_message = 0
- if(method in list(PATCH, TOUCH))
+ if(method in list(PATCH, TOUCH, SMOKE))
var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1)
var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1)
carbies.adjustToxLoss((harmies+burnies)*0.66)
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 984378477292..e4e6bdd1d620 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -118,18 +118,18 @@
F.fry(volume)
F.reagents.add_reagent(/datum/reagent/consumable/cooking_oil, reac_volume)
-/datum/reagent/consumable/cooking_oil/expose_mob(mob/living/M, method = TOUCH, reac_volume, show_message = 1, touch_protection = 0)
+/datum/reagent/consumable/cooking_oil/expose_mob(mob/living/M, method = TOUCH, method = SMOKE, reac_volume, show_message = 1, touch_protection = 0)
if(!istype(M))
return
var/boiling = FALSE
if(holder && holder.chem_temp >= fry_temperature)
boiling = TRUE
- if(method != VAPOR && method != TOUCH) //Directly coats the mob, and doesn't go into their bloodstream
+ if(method != VAPOR && method != TOUCH && method != SMOKE) //Directly coats the mob, and doesn't go into their bloodstream
return ..()
if(!boiling)
return TRUE
var/oil_damage = ((holder.chem_temp / fry_temperature) * 0.33) //Damage taken per unit
- if(method == TOUCH)
+ if(method == TOUCH || method == SMOKE)
oil_damage *= 1 - M.get_permeability_protection()
var/FryLoss = round(min(38, oil_damage * reac_volume))
if(!HAS_TRAIT(M, TRAIT_OIL_FRIED))
@@ -139,7 +139,7 @@
M.emote("scream")
playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE)
ADD_TRAIT(M, TRAIT_OIL_FRIED, "cooking_oil_react")
- addtimer(CALLBACK(M, /mob/living/proc/unfry_mob), 3)
+ addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, unfry_mob)), 3)
if(FryLoss)
M.adjustFireLoss(FryLoss)
return TRUE
@@ -287,7 +287,7 @@
return
var/mob/living/carbon/victim = M
- if(method == TOUCH || method == VAPOR)
+ if(method == TOUCH || method == SMOKE || method == VAPOR)
var/pepper_proof = victim.is_pepper_proof()
//check for protection
@@ -300,7 +300,7 @@
victim.confused = max(M.confused, 5) // 10 seconds
victim.Knockdown(3 SECONDS)
victim.add_movespeed_modifier(/datum/movespeed_modifier/reagent/pepperspray)
- addtimer(CALLBACK(victim, /mob.proc/remove_movespeed_modifier, /datum/movespeed_modifier/reagent/pepperspray), 10 SECONDS)
+ addtimer(CALLBACK(victim, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/reagent/pepperspray), 10 SECONDS)
victim.update_damage_hud()
if(method == INGEST)
if(!holder.has_reagent(/datum/reagent/consumable/milk))
@@ -561,7 +561,7 @@
..()
/datum/reagent/consumable/honey/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH)))
+ if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH, SMOKE)))
var/mob/living/carbon/C = M
for(var/s in C.surgeries)
var/datum/surgery/S = s
@@ -673,7 +673,7 @@
/datum/reagent/consumable/tinlux/proc/add_reagent_light(mob/living/living_holder)
var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj = living_holder.mob_light(2)
LAZYSET(mobs_affected, living_holder, mob_light_obj)
- RegisterSignal(living_holder, COMSIG_PARENT_QDELETING, .proc/on_living_holder_deletion)
+ RegisterSignal(living_holder, COMSIG_PARENT_QDELETING, PROC_REF(on_living_holder_deletion))
/datum/reagent/consumable/tinlux/proc/remove_reagent_light(mob/living/living_holder)
UnregisterSignal(living_holder, COMSIG_PARENT_QDELETING)
@@ -821,7 +821,7 @@
ingested = TRUE
return
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "pyre_elementum", /datum/mood_event/irritate, name) // Applied if not eaten
- if(method == TOUCH || method == VAPOR)
+ if(method == TOUCH || method == SMOKE || method == VAPOR)
M.adjust_fire_stacks(reac_volume / 5)
return
..()
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 98d72d1fd5c6..24be546cb3f6 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -415,7 +415,7 @@
if(iscarbon(M))
if (M.stat == DEAD)
show_message = 0
- if(method in list(PATCH, TOUCH))
+ if(method in list(PATCH, TOUCH, SMOKE))
M.adjustBruteLoss(-1.25 * reac_volume)
M.adjustFireLoss(-1.25 * reac_volume)
if(show_message)
@@ -942,9 +942,9 @@
M.notify_ghost_cloning("Your body is being revived with Strange Reagent!")
M.do_jitter_animation(10)
var/excess_healing = 5*(reac_volume-amount_to_revive) //excess reagent will heal blood and organs across the board
- addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 40) //jitter immediately, then again after 4 and 8 seconds
- addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 80)
- addtimer(CALLBACK(M, /mob/living.proc/revive, FALSE, FALSE, excess_healing), 79)
+ addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 40) //jitter immediately, then again after 4 and 8 seconds
+ addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 80)
+ addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, revive), FALSE, FALSE, excess_healing), 79)
..()
/datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M)
@@ -1642,7 +1642,7 @@
. = 1
/datum/reagent/medicine/polypyr/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(method == TOUCH || method == VAPOR)
+ if(method == TOUCH || method == SMOKE || method == VAPOR)
if(M && ishuman(M) && reac_volume >= 0.5)
var/mob/living/carbon/human/H = M
H.hair_color = "92f"
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 753d0f1408a6..9915ca9c4d24 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -18,7 +18,7 @@
if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS))
continue
- if((method == TOUCH || method == VAPOR) && (D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS))
+ if(((method == TOUCH || method == SMOKE) || method == VAPOR) && (D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS))
L.ContactContractDisease(D)
else //ingest, patch or inject
L.ForceContractDisease(D)
@@ -198,7 +198,7 @@
/datum/reagent/water/expose_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with water can help put them out!
if(!istype(M))
return
- if(method == TOUCH)
+ if(method == TOUCH || method == SMOKE)
M.adjust_fire_stacks(-(reac_volume / 10))
M.ExtinguishMob()
..()
@@ -330,7 +330,7 @@
/datum/reagent/hydrogen_peroxide/expose_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with h2o2 can burn them !
if(!istype(M))
return
- if(method == TOUCH)
+ if(method == TOUCH || method == SMOKE)
M.adjustFireLoss(2, 0) // burns
..()
@@ -340,7 +340,7 @@
taste_description = "suffering"
/datum/reagent/fuel/unholywater/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(method == TOUCH || method == VAPOR)
+ if((method == TOUCH || method == SMOKE) || method == VAPOR)
M.reagents.add_reagent(type,reac_volume/4)
return
return ..()
@@ -750,7 +750,7 @@
taste_description = "slime"
/datum/reagent/aslimetoxin/expose_mob(mob/living/L, method=TOUCH, reac_volume)
- if(method != TOUCH)
+ if(method != TOUCH && method != SMOKE)
L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE)
/datum/reagent/gluttonytoxin
@@ -998,7 +998,7 @@
taste_description = "bitterness"
/datum/reagent/space_cleaner/sterilizine/expose_mob(mob/living/carbon/C, method=TOUCH, reac_volume)
- if(method in list(TOUCH, VAPOR, PATCH))
+ if(method in list(TOUCH, VAPOR, PATCH, SMOKE))
for(var/s in C.surgeries)
var/datum/surgery/S = s
S.speed_modifier = max(0.2, S.speed_modifier)
@@ -1119,7 +1119,7 @@
//WS End
/datum/reagent/bluespace/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(method == TOUCH || method == VAPOR)
+ if((method == TOUCH || method == SMOKE) || method == VAPOR)
do_teleport(M, get_turf(M), (reac_volume / 5), asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) //4 tiles per crystal
..()
@@ -1128,7 +1128,7 @@
to_chat(M, "You feel unstable...")
M.Jitter(2)
current_cycle = 1
- addtimer(CALLBACK(M, /mob/living/proc/bluespace_shuffle), 30)
+ addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, bluespace_shuffle)), 30)
..()
/mob/living/proc/bluespace_shuffle()
@@ -1179,7 +1179,7 @@
accelerant_quality = 10
/datum/reagent/fuel/expose_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with welding fuel to make them easy to ignite!
- if(method == TOUCH || method == VAPOR)
+ if((method == TOUCH || method == SMOKE) || method == VAPOR)
M.adjust_fire_stacks(reac_volume / 10)
return
..()
@@ -1212,7 +1212,7 @@
M.adjustToxLoss(rand(5,10))
/datum/reagent/space_cleaner/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(method == TOUCH || method == VAPOR)
+ if((method == TOUCH || method == SMOKE) || method == VAPOR)
M.wash(clean_types)
/datum/reagent/space_cleaner/ez_clean
@@ -1229,7 +1229,7 @@
/datum/reagent/space_cleaner/ez_clean/expose_mob(mob/living/M, method=TOUCH, reac_volume)
..()
- if((method == TOUCH || method == VAPOR) && !issilicon(M))
+ if(((method == TOUCH || method == SMOKE) || method == VAPOR) && !issilicon(M))
M.adjustBruteLoss(1.5)
M.adjustFireLoss(1.5)
@@ -1870,7 +1870,7 @@
/datum/reagent/acetone_oxide/expose_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people kills people!
if(!istype(M))
return
- if(method == TOUCH)
+ if(method == TOUCH || method == SMOKE)
M.adjustFireLoss(2, FALSE) // burns,
M.adjust_fire_stacks((reac_volume / 10))
..()
@@ -1919,7 +1919,7 @@
var/can_colour_mobs = TRUE
/datum/reagent/colorful_reagent/New()
- SSticker.OnRoundstart(CALLBACK(src,.proc/UpdateColor))
+ SSticker.OnRoundstart(CALLBACK(src, PROC_REF(UpdateColor)))
/datum/reagent/colorful_reagent/proc/UpdateColor()
color = pick(random_color_list)
@@ -1944,13 +1944,13 @@
taste_description = "sourness"
/datum/reagent/hair_dye/New()
- SSticker.OnRoundstart(CALLBACK(src,.proc/UpdateColor))
+ SSticker.OnRoundstart(CALLBACK(src, PROC_REF(UpdateColor)))
/datum/reagent/hair_dye/proc/UpdateColor()
color = pick(potential_colors)
/datum/reagent/hair_dye/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(method == TOUCH || method == VAPOR)
+ if((method == TOUCH || method == SMOKE) || method == VAPOR)
if(M && ishuman(M))
var/mob/living/carbon/human/H = M
H.hair_color = pick(potential_colors)
@@ -1965,7 +1965,7 @@
taste_description = "sourness"
/datum/reagent/barbers_aid/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(method == TOUCH || method == VAPOR)
+ if((method == TOUCH || method == SMOKE) || method == VAPOR)
if(M && ishuman(M) && !HAS_TRAIT(M, TRAIT_BALD))
var/mob/living/carbon/human/H = M
var/datum/sprite_accessory/hair/picked_hair = pick(GLOB.hairstyles_list)
@@ -1983,7 +1983,7 @@
taste_description = "sourness"
/datum/reagent/concentrated_barbers_aid/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(method == TOUCH || method == VAPOR)
+ if((method == TOUCH || method == SMOKE) || method == VAPOR)
if(M && ishuman(M) && !HAS_TRAIT(M, TRAIT_BALD))
var/mob/living/carbon/human/H = M
to_chat(H, "Your hair starts growing at an incredible speed!")
@@ -1999,7 +1999,7 @@
taste_description = "bitterness"
/datum/reagent/baldium/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(method == TOUCH || method == VAPOR)
+ if((method == TOUCH || method == SMOKE) || method == VAPOR)
if(M && ishuman(M))
var/mob/living/carbon/human/H = M
to_chat(H, "Your hair is falling out in clumps!")
@@ -2414,7 +2414,7 @@
/datum/reagent/gravitum/expose_obj(obj/O, volume)
O.AddElement(/datum/element/forced_gravity, 0)
- addtimer(CALLBACK(O, .proc/_RemoveElement, list(/datum/element/forced_gravity, 0)), volume * time_multiplier)
+ addtimer(CALLBACK(O, PROC_REF(_RemoveElement), list(/datum/element/forced_gravity, 0)), volume * time_multiplier)
/datum/reagent/gravitum/on_mob_add(mob/living/L)
L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless
@@ -2565,14 +2565,14 @@
)
/datum/reagent/three_eye/on_mob_metabolize(mob/living/L)
. = ..()
- //addtimer(CALLBACK(L, /mob.proc/add_client_colour, /datum/client_colour/thirdeye), 1.5 SECONDS)
+ //addtimer(CALLBACK(L, TYPE_PROC_REF(/mob, add_client_colour), /datum/client_colour/thirdeye), 1.5 SECONDS)
L.add_client_colour(/datum/client_colour/thirdeye)
if(L.client?.holder) //You are worthy.
worthy = TRUE
L.visible_message("Grips their head and dances around, collapsing to the floor!", \
"Visions of a realm BYOND your own flash across your eyes, before it all goes black...")
- addtimer(CALLBACK(L, /mob/living.proc/SetSleeping, 40 SECONDS), 10 SECONDS)
- addtimer(CALLBACK(L.reagents, /datum/reagents.proc/remove_reagent, src.type, src.volume,), 10 SECONDS)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, SetSleeping), 40 SECONDS), 10 SECONDS)
+ addtimer(CALLBACK(L.reagents, TYPE_PROC_REF(/datum/reagents, remove_reagent), src.type, src.volume,), 10 SECONDS)
return
/datum/reagent/three_eye/on_mob_life(mob/living/carbon/M)
@@ -2600,7 +2600,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- addtimer(CALLBACK(H, /mob/living.proc/seizure), rand(1 SECONDS, 5 SECONDS))
+ addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living, seizure)), rand(1 SECONDS, 5 SECONDS))
/datum/reagent/three_eye/overdose_process(mob/living/M)
. = ..()
@@ -2620,9 +2620,9 @@
to_chat(L, "Your mind reels and the world begins to fade away...")
if(iscarbon(L))
var/mob/living/carbon/C = L
- addtimer(CALLBACK(C, /mob/living/carbon.proc/adjustOrganLoss, ORGAN_SLOT_BRAIN, 200), 5 SECONDS) //Deathblow to the brain
+ addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, adjustOrganLoss), ORGAN_SLOT_BRAIN, 200), 5 SECONDS) //Deathblow to the brain
else
- addtimer(CALLBACK(L, /mob/living.proc/gib), 5 SECONDS)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, gib)), 5 SECONDS)
/datum/reagent/cement
name = "Cement"
@@ -2786,3 +2786,9 @@
description = "Fur obtained from griding up a polar bears hide"
reagent_state = SOLID
color = "#eeeeee" // rgb: 238, 238, 238
+
+/datum/reagent/srm_bacteria
+ name = "Illestren Bacteria"
+ description = "Bacteria native to the Saint-Roumain Militia home planet."
+ color = "#5a4f42"
+ taste_description = "sour"
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index 0445138a4e20..62c743558e13 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -319,7 +319,7 @@
O.extinguish()
/datum/reagent/firefighting_foam/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(method in list(VAPOR, TOUCH))
+ if(method in list(VAPOR, TOUCH, SMOKE))
M.adjust_fire_stacks(-reac_volume)
M.ExtinguishMob()
..()
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 9cde25afcac0..6af26706b9f8 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -104,7 +104,7 @@
T.atmos_spawn_air("plasma=[reac_volume];TEMP=[temp]")
/datum/reagent/toxin/plasma/expose_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with plasma is stronger than fuel!
- if(method == TOUCH || method == VAPOR)
+ if((method == TOUCH || method == SMOKE) || method == VAPOR)
M.adjust_fire_stacks(reac_volume / 5)
return
..()
@@ -574,7 +574,7 @@
toxpwr = 0
/datum/reagent/toxin/itching_powder/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(method == TOUCH || method == VAPOR)
+ if((method == TOUCH || method == SMOKE) || method == VAPOR)
M.reagents?.add_reagent(/datum/reagent/toxin/itching_powder, reac_volume)
/datum/reagent/toxin/itching_powder/on_mob_life(mob/living/carbon/M)
diff --git a/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm
new file mode 100644
index 000000000000..8b13d62e72b0
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm
@@ -0,0 +1,207 @@
+/datum/reagent/consumable/ethanol/trickwine
+ name = "Trickwine"
+ description = "How is this even possible"
+
+/datum/reagent/consumable/ethanol/trickwine/ash_wine
+ name = "Ashwine"
+ description = "A traditional sacrament for members of the Saint-Roumain Militia. Known to grant visions, and is used both for ritual and entertainment purposes aboard Saint-Roumain vessels."
+ color = "#293D25"
+ boozepwr = 80
+ quality = DRINK_VERYGOOD
+ taste_description = "devotional energy and a hint of high-potency hallucinogens"
+ glass_name = "Ashwine"
+ glass_desc = "A traditional sacrament for members of the Saint-Roumain Militia. Known to grant visions, and is used both for ritual and entertainment purposes aboard Saint-Roumain vessels."
+ breakaway_flask_icon_state = "baflaskashwine"
+
+/datum/reagent/consumable/ethanol/trickwine/ash_wine/on_mob_life(mob/living/M)
+ var/high_message = pick("You feel far more devoted to the cause", "You feel like you should go on a hunt")
+ var/cleanse_message = pick("Divine light purifies you.", "You are purged of foul spirts.")
+ if(prob(10))
+ M.set_drugginess(10)
+ to_chat(M, "[high_message]")
+ if(M.faction && ("roumain" in M.faction))
+ M.adjustToxLoss(-2)
+ if(prob(10))
+ to_chat(M, "[cleanse_message]")
+ return ..()
+
+/datum/reagent/consumable/ethanol/trickwine/ash_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(method == TOUCH)
+ if(!iscarbon(M))
+ var/mob/living/simple_animal/hostile/hostile_target = M
+ var/hostile_ai_status = hostile_target.AIStatus
+ hostile_target.AIStatus = AI_OFF
+ addtimer(VARSET_CALLBACK(hostile_target, AIStatus, hostile_ai_status),reac_volume)
+ M.Jitter(3 * reac_volume)
+ M.Dizzy(2 * reac_volume)
+ M.set_drugginess(3 * reac_volume)
+ M.emote(pick("twitch","giggle"))
+ return ..()
+
+/datum/reagent/consumable/ethanol/trickwine/ice_wine
+ name = "Icewine"
+ description = "A specialized brew utilized by members of the Saint-Roumain Militia, designed to assist in temperature regulation while working in hot environments. Known to give one the cold shoulder when thrown."
+ color = "#21EFEB"
+ boozepwr = 70
+ taste_description = "a cold night on the hunt"
+ glass_name = "Icewine"
+ glass_desc = "A specialized brew utilized by members of the Saint-Roumain Militia, designed to assist in temperature regulation while working in hot environments. Known to give one the cold shoulder when thrown."
+ breakaway_flask_icon_state = "baflaskicewine"
+
+/datum/reagent/consumable/ethanol/trickwine/ice_wine/on_mob_life(mob/living/M)
+ M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
+ M.adjustFireLoss(-1)
+ return ..()
+
+
+/datum/reagent/consumable/ethanol/trickwine/ice_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(method == TOUCH)
+ var/paralyze_dur
+ if(!iscarbon(M))
+ reac_volume = reac_volume * 2
+ paralyze_dur = reac_volume
+ else
+ if(reac_volume <= 50)
+ paralyze_dur = reac_volume
+ else
+ paralyze_dur = 50 + ((reac_volume - 50) / 4)
+ M.adjust_bodytemperature((-20*reac_volume) * TEMPERATURE_DAMAGE_COEFFICIENT, 50)
+ M.Paralyze(paralyze_dur)
+ walk(M, 0) //stops them mid pathing even if they're stunimmunee
+ M.apply_status_effect(/datum/status_effect/ice_block_talisman, paralyze_dur)
+ return ..()
+
+/datum/reagent/consumable/ethanol/trickwine/shock_wine
+ name = "Shockwine"
+ description = "A stimulating brew utilized by members of the Saint-Roumain Militia, created to allow trackers to keep up with highly mobile prey. Known to have a shocking effect when thrown"
+ color = "#00008b"
+ boozepwr = 70
+ taste_description = "the adrenaline of the chase"
+ glass_name = "Shockwine"
+ glass_desc = "A stimulating brew utilized by members of the Saint-Roumain Militia, created to allow trackers to keep up with highly mobile prey. Known to have a shocking effect when thrown"
+ breakaway_flask_icon_state = "baflaskshockwine"
+
+/datum/reagent/consumable/ethanol/trickwine/shock_wine/on_mob_metabolize(mob/living/M)
+ ..()
+ M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/shock_wine)
+ to_chat(M, "You feel faster the lightning!")
+
+/datum/reagent/consumable/ethanol/trickwine/shock_wine/on_mob_end_metabolize(mob/living/M)
+ M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/shock_wine)
+ to_chat(M, "You slow to a crawl...")
+ ..()
+
+/datum/reagent/consumable/ethanol/trickwine/shock_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(method == TOUCH)
+ //simple mobs are so tanky and i want this to be useful on them
+ if(iscarbon(M))
+ reac_volume = reac_volume / 4
+ M.electrocute_act(reac_volume, src, siemens_coeff = 1, flags = SHOCK_NOSTUN|SHOCK_TESLA)
+ do_sparks(5, FALSE, M)
+ playsound(M, 'sound/machines/defib_zap.ogg', 100, TRUE)
+ return ..()
+
+/datum/reagent/consumable/ethanol/trickwine/hearth_wine
+ name = "Hearthwine"
+ description = "A fiery brew utilized by members of the Saint-Roumain Militia, engineered to cauterize wounds in the field. Goes out in a blaze of glory when thrown."
+ color = "#ff8c00"
+ boozepwr = 70
+ taste_description = "the heat of battle"
+ glass_name = "Hearthwine"
+ glass_desc = "Fiery brew utilized by members of the Saint-Roumain Militia, engineered to cauterize wounds in the field. Goes out in a blaze of glory when thrown."
+ breakaway_flask_icon_state = "baflaskhearthwine"
+
+/datum/reagent/consumable/ethanol/trickwine/hearth_wine/on_mob_life(mob/living/M)
+ M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.bleed_rate = max(H.bleed_rate - 0.25, 0)
+ return ..()
+
+/datum/reagent/consumable/ethanol/trickwine/hearth_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(method == TOUCH)
+ if(!iscarbon(M))
+ reac_volume = reac_volume * 2
+ M.fire_act()
+ var/turf/T = get_turf(M)
+ T.IgniteTurf(reac_volume)
+ new /obj/effect/hotspot(T, reac_volume * 1, FIRE_MINIMUM_TEMPERATURE_TO_EXIST + reac_volume * 10)
+ var/turf/otherT
+ for(var/direction in GLOB.cardinals)
+ otherT = get_step(T, direction)
+ otherT.IgniteTurf(reac_volume)
+ new /obj/effect/hotspot(otherT, reac_volume * 1, FIRE_MINIMUM_TEMPERATURE_TO_EXIST + reac_volume * 10)
+ return ..()
+
+/datum/reagent/consumable/ethanol/trickwine/force_wine
+ name = "Forcewine"
+ description = "A fortifying brew utilized by members of the Saint-Roumain Militia, created to protect against the esoteric. Known to act defensively when thrown."
+ color = "#8b009b"
+ boozepwr = 70
+ taste_description = "the strength of your convictions"
+ glass_name = "Forcewine"
+ glass_desc = "A fortifying brew utilized by members of the Saint-Roumain Militia, created to protect against the esoteric. Known to act defensively when thrown."
+ breakaway_flask_icon_state = "baflaskforcewine"
+
+/datum/reagent/consumable/ethanol/trickwine/force_wine/on_mob_metabolize(mob/living/M)
+ ..()
+ ADD_TRAIT(M, TRAIT_ANTIMAGIC, "trickwine")
+ ADD_TRAIT(M, TRAIT_MINDSHIELD, "trickwine")
+ M.visible_message("[M] glows a dim grey aura")
+
+/datum/reagent/consumable/ethanol/trickwine/force_wine/on_mob_end_metabolize(mob/living/M)
+ M.visible_message("[M]'s aura fades away ")
+ REMOVE_TRAIT(M, TRAIT_ANTIMAGIC, "trickwine")
+ REMOVE_TRAIT(M, TRAIT_MINDSHIELD, "trickwine")
+ ..()
+
+/datum/reagent/consumable/ethanol/trickwine/force_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(method == TOUCH)
+ if(!iscarbon(M))
+ reac_volume = reac_volume * 2
+ var/turf/T = get_turf(M)
+ var/turf/otherT
+ new /obj/effect/forcefield/resin(T, reac_volume * 4)
+ for(var/direction in GLOB.cardinals)
+ otherT = get_step(T, direction)
+ new /obj/effect/forcefield/resin(otherT, reac_volume * 4)
+ return ..()
+
+/datum/reagent/consumable/ethanol/trickwine/prism_wine
+ name = "Prismwine"
+ description = "A glittering brew utilized by members of the Saint-Roumain Militia, mixed to provide defense against the blasts and burns of foes and fauna alike. Softens targets against your own burns when thrown."
+ color = "#add8e6"
+ boozepwr = 70
+ taste_description = "the reflective quality of meditation"
+ glass_name = "Prismwine"
+ glass_desc = "A glittering brew utilized by members of the Saint-Roumain Militia, mixed to provide defense against the blasts and burns of foes and fauna alike. Softens targets against your own burns when thrown."
+ breakaway_flask_icon_state = "baflaskprismwine"
+
+/datum/reagent/consumable/ethanol/trickwine/prism_wine/on_mob_metabolize(mob/living/carbon/human/M)
+ ..()
+ if(M.physiology.burn_mod <= initial(M.physiology.burn_mod))
+ M.physiology.burn_mod *= 0.5
+ M.visible_message("[M] seems to shimmer with power!")
+
+/datum/reagent/consumable/ethanol/trickwine/prism_wine/on_mob_end_metabolize(mob/living/carbon/human/M)
+ if(M.physiology.burn_mod > initial(M.physiology.burn_mod))
+ M.physiology.burn_mod *= 2
+ M.visible_message("[M] has returned to normal!")
+ ..()
+
+/datum/reagent/consumable/ethanol/trickwine/prism_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(method == TOUCH)
+ if(istype(M, /mob/living/simple_animal/hostile/asteroid))
+ var/mob/living/simple_animal/hostile/asteroid/the_animal = M
+ the_animal.armor.modifyRating(energy = -50)
+ spawn(reac_volume SECONDS)
+ the_animal.armor.modifyRating(energy = 50)
+ if(ishuman(M))
+ var/mob/living/carbon/human/the_human = M
+ if(the_human.physiology.burn_mod < 2)
+ the_human.physiology.burn_mod *= 2
+ the_human.visible_message("[the_human] seemed weakend!")
+ spawn(reac_volume SECONDS)
+ the_human.physiology.burn_mod *= 0.5
+ the_human.visible_message("[the_human] has returned to normal!")
+ return ..()
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
index 57df3331c799..4aa0bbc2fe94 100644
--- a/code/modules/reagents/chemistry/recipes.dm
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -68,7 +68,7 @@
else
if(setting_type)
if(step_away(X, T) && moving_power > 1) //Can happen twice at most. So this is fine.
- addtimer(CALLBACK(GLOBAL_PROC, .proc/_step_away, X, T), 2)
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(_step_away), X, T), 2)
else
if(step_towards(X, T) && moving_power > 1)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/_step_towards, X, T), 2)
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(_step_towards), X, T), 2)
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 82be8a075cc1..f6f46d3c3970 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -92,7 +92,7 @@
strengthdiv = 3
/datum/chemical_reaction/reagent_explosion/tatp/New()
- SSticker.OnRoundstart(CALLBACK(src,.proc/UpdateInfo)) //method used by secret sauce.
+ SSticker.OnRoundstart(CALLBACK(src, PROC_REF(UpdateInfo))) //method used by secret sauce.
/datum/chemical_reaction/reagent_explosion/tatp/proc/UpdateInfo() //note to the future: find the PR that refactors this so that we can port more of https://github.com/tgstation/tgstation/pull/50775
required_temp = 450 + rand(-49,49) //this gets loaded only on round start
@@ -109,7 +109,7 @@
strengthdiv = 3
/datum/chemical_reaction/reagent_explosion/tatp_explosion/New() //did i mention i have no idea what i am doing? - zeta
- SSticker.OnRoundstart(CALLBACK(src,.proc/UpdateInfo))
+ SSticker.OnRoundstart(CALLBACK(src, PROC_REF(UpdateInfo)))
/datum/chemical_reaction/reagent_explosion/tatp_explosion/on_reaction(datum/reagents/holder, created_volume)
var/strengthdiv_adjust = created_volume / (2100 / initial(strengthdiv))
@@ -151,7 +151,7 @@
R.stun(20)
R.reveal(100)
R.adjustHealth(50)
- addtimer(CALLBACK(src, .proc/divine_explosion, round(created_volume/48,1),get_turf(holder.my_atom)), 2 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(divine_explosion), round(created_volume/48,1),get_turf(holder.my_atom)), 2 SECONDS)
..()
/datum/chemical_reaction/reagent_explosion/potassium_explosion/holyboom/proc/divine_explosion(size, turf/T)
@@ -175,7 +175,7 @@
/datum/chemical_reaction/reagent_explosion/gunpowder_explosion/on_reaction(datum/reagents/holder, created_volume)
- addtimer(CALLBACK(src, .proc/explode, holder, created_volume), rand(5,10) SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(explode), holder, created_volume), rand(5,10) SECONDS)
/datum/chemical_reaction/thermite
results = list(/datum/reagent/thermite = 3)
@@ -460,14 +460,14 @@
var/T3 = created_volume * 120
var/added_delay = 0.5 SECONDS
if(created_volume >= 75)
- addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T1), added_delay)
+ addtimer(CALLBACK(src, PROC_REF(zappy_zappy), holder, T1), added_delay)
added_delay += 1.5 SECONDS
if(created_volume >= 40)
- addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T2), added_delay)
+ addtimer(CALLBACK(src, PROC_REF(zappy_zappy), holder, T2), added_delay)
added_delay += 1.5 SECONDS
if(created_volume >= 10) //10 units minimum for lightning, 40 units for secondary blast, 75 units for tertiary blast.
- addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T3), added_delay)
- addtimer(CALLBACK(src, .proc/explode, holder, created_volume), added_delay)
+ addtimer(CALLBACK(src, PROC_REF(zappy_zappy), holder, T3), added_delay)
+ addtimer(CALLBACK(src, PROC_REF(explode), holder, created_volume), added_delay)
/datum/chemical_reaction/reagent_explosion/teslium_lightning/proc/zappy_zappy(datum/reagents/holder, power)
if(QDELETED(holder.my_atom))
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index bf2f58b146ad..07753cea4a15 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -92,32 +92,32 @@
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
..()
- M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
+ M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimemobspawn/proc/summon_mobs(datum/reagents/holder, turf/T)
T.visible_message("The slime extract begins to vibrate violently!")
- addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 5, "Gold Slime", HOSTILE_SPAWN), 50)
+ addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 5, "Gold Slime", HOSTILE_SPAWN), 50)
/datum/chemical_reaction/slime/slimemobspawn/lesser
required_reagents = list(/datum/reagent/blood = 1)
/datum/chemical_reaction/slime/slimemobspawn/lesser/summon_mobs(datum/reagents/holder, turf/T)
T.visible_message("The slime extract begins to vibrate violently!")
- addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 3, "Lesser Gold Slime", HOSTILE_SPAWN, "neutral"), 50)
+ addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Lesser Gold Slime", HOSTILE_SPAWN, "neutral"), 50)
/datum/chemical_reaction/slime/slimemobspawn/friendly
required_reagents = list(/datum/reagent/water = 1)
/datum/chemical_reaction/slime/slimemobspawn/friendly/summon_mobs(datum/reagents/holder, turf/T)
T.visible_message("The slime extract begins to vibrate adorably!")
- addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 1, "Friendly Gold Slime", FRIENDLY_SPAWN, "neutral"), 50)
+ addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 1, "Friendly Gold Slime", FRIENDLY_SPAWN, "neutral"), 50)
/datum/chemical_reaction/slime/slimemobspawn/spider
required_reagents = list(/datum/reagent/spider_extract = 1)
/datum/chemical_reaction/slime/slimemobspawn/spider/summon_mobs(datum/reagents/holder, turf/T)
T.visible_message("The slime extract begins to vibrate crikey-ingly!")
- addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 3, "Traitor Spider Slime", /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife, "neutral", FALSE), 50)
+ addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife, "neutral", FALSE), 50)
//Silver
@@ -191,11 +191,11 @@
/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("The slime extract starts to feel extremely cold!")
- addtimer(CALLBACK(src, .proc/freeze, holder), 50)
+ addtimer(CALLBACK(src, PROC_REF(freeze), holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
..()
- M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
+ M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimefreeze/proc/freeze(datum/reagents/holder)
if(holder && holder.my_atom)
@@ -228,11 +228,11 @@
/datum/chemical_reaction/slime/slimefire/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("The slime extract begins to vibrate adorably!")
- addtimer(CALLBACK(src, .proc/slime_burn, holder), 50)
+ addtimer(CALLBACK(src, PROC_REF(slime_burn), holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
..()
- M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
+ M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimefire/proc/slime_burn(datum/reagents/holder)
if(holder && holder.my_atom)
@@ -381,11 +381,11 @@
message_admins("Slime Explosion reaction started at [ADMIN_VERBOSEJMP(T)]. Last Fingerprint: [touch_msg]")
log_game("Slime Explosion reaction started at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].")
T.visible_message("The slime extract begins to vibrate violently !")
- addtimer(CALLBACK(src, .proc/boom, holder), 50)
+ addtimer(CALLBACK(src, PROC_REF(boom), holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
..()
- M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
+ M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimeexplosion/proc/boom(datum/reagents/holder)
if(holder && holder.my_atom)
@@ -484,7 +484,7 @@
required_other = TRUE
/datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder)
- addtimer(CALLBACK(src, .proc/slime_stop, holder), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(slime_stop), holder), 5 SECONDS)
/datum/chemical_reaction/slime/slimestop/proc/slime_stop(datum/reagents/holder)
var/obj/item/slime_extract/sepia/extract = holder.my_atom
@@ -549,7 +549,7 @@
S.visible_message("Infused with plasma, the core begins to expand uncontrollably!")
S.icon_state = "[S.base_state]_active"
S.active = TRUE
- addtimer(CALLBACK(S, /obj/item/grenade.proc/prime), rand(15,60))
+ addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, prime)), rand(15,60))
else
var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom))
S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!")
@@ -566,7 +566,7 @@
S.visible_message("Infused with slime jelly, the core begins to expand uncontrollably!")
S.icon_state = "[S.base_state]_active"
S.active = TRUE
- addtimer(CALLBACK(S, /obj/item/grenade.proc/prime), rand(15,60))
+ addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, prime)), rand(15,60))
var/lastkey = holder.my_atom.fingerprintslast
var/touch_msg = "N/A"
if(lastkey)
diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm
index f0aeaf8504cd..e95dc19c56b2 100644
--- a/code/modules/reagents/chemistry/recipes/special.dm
+++ b/code/modules/reagents/chemistry/recipes/special.dm
@@ -177,7 +177,7 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related
if(SSpersistence.initialized)
UpdateInfo()
else
- SSticker.OnRoundstart(CALLBACK(src,.proc/UpdateInfo))
+ SSticker.OnRoundstart(CALLBACK(src, PROC_REF(UpdateInfo)))
/obj/item/paper/secretrecipe/proc/UpdateInfo()
var/datum/chemical_reaction/recipe = get_chemical_reaction(recipe_id)
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 332decf03e38..e5f5f22db67a 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -49,7 +49,7 @@
log_combat(user, M, "fed", reagents.log_list())
else
to_chat(user, "You swallow a gulp of [src].")
- addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5, TRUE, TRUE, FALSE, user, FALSE, INGEST), 5)
+ addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, trans_to), M, 5, TRUE, TRUE, FALSE, user, FALSE, INGEST), 5)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), TRUE)
/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
diff --git a/code/modules/reagents/reagent_containers/mortar.dm b/code/modules/reagents/reagent_containers/mortar.dm
index 6fc3cd85e0d9..3c1443bfb9d2 100644
--- a/code/modules/reagents/reagent_containers/mortar.dm
+++ b/code/modules/reagents/reagent_containers/mortar.dm
@@ -3,6 +3,9 @@ Originally in glass.dm, moved here
to accommodate additional materials.
\*/
+#define MORTAR_STAMINA_MINIMUM 50 //What is the amount of stam damage that we prevent mortar use at
+#define MORTAR_STAMINA_USE 40 //How much stam damage is given to people when the mortar is used
+
/obj/item/pestle
name = "pestle"
desc = "An ancient, simple tool used in conjunction with a mortar to grind or juice items."
@@ -33,41 +36,83 @@ to accommodate additional materials.
grinded = null
to_chat(user, "You eject the item inside.")
-/obj/item/reagent_containers/glass/mortar/attackby(obj/item/I, mob/living/carbon/human/user)
+/obj/item/reagent_containers/glass/mortar/attackby(obj/item/attacking_item, mob/living/carbon/human/user)
..()
- if(istype(I,/obj/item/pestle))
- if(grinded)
- if(user.getStaminaLoss() > 50)
- to_chat(user, "You are too tired to work!")
- return
- to_chat(user, "You start grinding...")
- if((do_after(user, 25, target = src)) && grinded)
- user.adjustStaminaLoss(40)
- if(grinded.juice_results) //prioritize juicing
- grinded.on_juice()
- reagents.add_reagent_list(grinded.juice_results)
- to_chat(user, "You juice [grinded] into a fine liquid.")
- QDEL_NULL(grinded)
- return
- grinded.on_grind()
- reagents.add_reagent_list(grinded.grind_results)
- if(grinded.reagents) //food and pills
- grinded.reagents.trans_to(src, grinded.reagents.total_volume, transfered_by = user)
- to_chat(user, "You break [grinded] into powder.")
- QDEL_NULL(grinded)
- return
+ if(istype(attacking_item, /obj/item/pestle))
+ if(!grinded)
+ balloon_alert(user, "nothing to grind")
return
- else
- to_chat(user, "There is nothing to grind!")
+
+ if(user.getStaminaLoss() > MORTAR_STAMINA_MINIMUM)
+ balloon_alert(user, "too tired")
return
- if(grinded)
- to_chat(user, "There is something inside already!")
+
+ var/list/choose_options = list(
+ "Grind" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_grind"),
+ "Juice" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_juice")
+ )
+ var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE)
+
+ if(!grinded || !in_range(src, user) || !user.is_holding(attacking_item) || !picked_option)
+ return
+
+ balloon_alert(user, "grinding...")
+ if(!do_after(user, grind_speed, target = src))
+ balloon_alert(user, "stopped grinding")
+ return
+
+ user.adjustStaminaLoss(MORTAR_STAMINA_USE)
+ switch(picked_option)
+ if("Juice")
+ if(grinded.juice_results)
+ juice_target_item(grinded, user)
+ else
+ grind_target_item(grinded, user)
+ grinded = null
+
+ if("Grind")
+ if(grinded.grind_results)
+ grind_target_item(grinded, user)
+ else
+ juice_target_item(grinded, user)
+ grinded = null
return
- if(I.juice_results || I.grind_results)
- I.forceMove(src)
- grinded = I
+
+ if(!attacking_item.juice_results && !attacking_item.grind_results)
+ balloon_alert(user, "can't grind this")
+ return ..()
+
+ if(grinded)
+ balloon_alert(user, "already full")
return
- to_chat(user, "You can't grind this!")
+
+ attacking_item.forceMove(src)
+ grinded = attacking_item
+
+///Juices the passed target item, and transfers any contained chems to the mortar as well
+/obj/item/reagent_containers/glass/mortar/proc/juice_target_item(obj/item/to_be_juiced, mob/living/carbon/human/user)
+ to_be_juiced.on_juice()
+ reagents.add_reagent_list(to_be_juiced.juice_results)
+
+ if(to_be_juiced.reagents) //If juiced item has reagents within, transfer them to the mortar
+ to_be_juiced.reagents.trans_to(src, to_be_juiced.reagents.total_volume, transfered_by = user)
+
+ to_chat(user, span_notice("You juice [to_be_juiced] into a fine liquid."))
+ QDEL_NULL(to_be_juiced)
+
+///Grinds the passed target item, and transfers any contained chems to the mortar as well
+/obj/item/reagent_containers/glass/mortar/proc/grind_target_item(obj/item/to_be_ground, mob/living/carbon/human/user)
+ to_be_ground.on_grind()
+ reagents.add_reagent_list(to_be_ground.grind_results)
+
+ if(to_be_ground.reagents) //If grinded item has reagents within, transfer them to the mortar
+ to_be_ground.reagents.trans_to(src, to_be_ground.reagents.total_volume, transfered_by = user)
+
+ to_chat(user, span_notice("You break [to_be_ground] into powder."))
+ QDEL_NULL(to_be_ground)
+
+#undef MORTAR_STAMINA_MINIMUM
+#undef MORTAR_STAMINA_USE
/obj/item/reagent_containers/glass/mortar/glass //mmm yes... this glass is made of glass
icon_state = "mortar_glass"
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 50436b8ee9e6..187935fa0b25 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -47,7 +47,7 @@
"[user] forces you to [apply_method] [src].")
if(icon_state == "pill4" && prob(5)) //you take the red pill - you stay in Wonderland, and I show you how deep the rabbit hole goes
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, M, "[pick(strings(REDPILL_FILE, "redpill_questions"))]"), 50)
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), M, "[pick(strings(REDPILL_FILE, "redpill_questions"))]"), 50)
if(reagents.total_volume)
reagents.trans_to(M, reagents.total_volume, transfered_by = user, method = apply_type)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 021d37cd61b0..f0901e416b25 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -86,7 +86,7 @@
target.visible_message("[user] is trying to take a blood sample from [target]!", \
"[user] is trying to take a blood sample from you!")
busy = TRUE
- if(!do_mob(user, target, extra_checks=CALLBACK(L, /mob/living/proc/can_inject, user, TRUE)))
+ if(!do_mob(user, target, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
busy = FALSE
return
if(reagents.total_volume >= reagents.maximum_volume)
@@ -136,7 +136,7 @@
if(L != user)
L.visible_message("[user] is trying to inject [L]!", \
"[user] is trying to inject you!")
- if(!do_mob(user, L, extra_checks=CALLBACK(L, /mob/living/proc/can_inject, user, TRUE)))
+ if(!do_mob(user, L, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE)))
return
if(!reagents.total_volume)
return
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index c11906bf9c0d..b8b08486f20d 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -146,7 +146,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
affecting.Add(item)
conveying = TRUE
- addtimer(CALLBACK(src, .proc/convey, affecting), 1)
+ addtimer(CALLBACK(src, PROC_REF(convey), affecting), 1)
/obj/machinery/conveyor/proc/convey(list/affecting)
for(var/atom/movable/A in affecting)
diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm
index 7ffc4e3b9db1..13158e86daad 100644
--- a/code/modules/recycling/disposal/construction.dm
+++ b/code/modules/recycling/disposal/construction.dm
@@ -87,7 +87,7 @@
/obj/structure/disposalconstruct/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_FLIP | ROTATION_VERBS ,null,CALLBACK(src, .proc/can_be_rotated), CALLBACK(src, .proc/after_rot))
+ AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_FLIP | ROTATION_VERBS ,null,CALLBACK(src, PROC_REF(can_be_rotated)), CALLBACK(src, PROC_REF(after_rot)))
/obj/structure/disposalconstruct/proc/after_rot(mob/user,rotation_type)
if(rotation_type == ROTATION_FLIP)
diff --git a/code/modules/recycling/disposal/outlet.dm b/code/modules/recycling/disposal/outlet.dm
index aa516b91fab3..2de8ff057405 100644
--- a/code/modules/recycling/disposal/outlet.dm
+++ b/code/modules/recycling/disposal/outlet.dm
@@ -44,9 +44,9 @@
if((start_eject + 30) < world.time)
start_eject = world.time
playsound(src, 'sound/machines/warning-buzzer.ogg', 50, FALSE, FALSE)
- addtimer(CALLBACK(src, .proc/expel_holder, H, TRUE), 20)
+ addtimer(CALLBACK(src, PROC_REF(expel_holder), H, TRUE), 20)
else
- addtimer(CALLBACK(src, .proc/expel_holder, H), 20)
+ addtimer(CALLBACK(src, PROC_REF(expel_holder), H), 20)
/obj/structure/disposaloutlet/proc/expel_holder(obj/structure/disposalholder/H, playsound=FALSE)
if(playsound)
diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm
index 21cc7a7feeb4..c4722c40fd2f 100644
--- a/code/modules/recycling/disposal/pipe.dm
+++ b/code/modules/recycling/disposal/pipe.dm
@@ -90,7 +90,7 @@
if(isfloorturf(T)) //intact floor, pop the tile
floorturf = T
- if(floorturf.floor_tile)
+ if(floorturf.floor_tile && !istype(floorturf, /turf/open/floor/engine))
new floorturf.floor_tile(T)
floorturf.make_plating()
diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm
index 4f48995190dc..16bf2a9241cb 100644
--- a/code/modules/research/designs/limbgrower_designs.dm
+++ b/code/modules/research/designs/limbgrower_designs.dm
@@ -116,7 +116,7 @@
build_path = /obj/item/organ/tongue
category = list("initial",SPECIES_HUMAN)
-// Grows a fake lizard tail - not usable in lizard wine and other similar recipes.
+// Grows a fake lizard tail
/datum/design/lizard_tail
name = "Lizard Tail"
id = "liztail"
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index 8c2b53b624bc..ab2933c60bcc 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -44,7 +44,7 @@ Note: Must be placed within 3 tiles of the R&D Console
loaded_item = O
to_chat(user, "You add the [O.name] to the [src.name]!")
flick("d_analyzer_la", src)
- addtimer(CALLBACK(src, .proc/finish_loading), 10)
+ addtimer(CALLBACK(src, PROC_REF(finish_loading)), 10)
if (linked_console)
linked_console.updateUsrDialog()
@@ -82,7 +82,7 @@ Note: Must be placed within 3 tiles of the R&D Console
if(!innermode)
flick("d_analyzer_process", src)
busy = TRUE
- addtimer(CALLBACK(src, .proc/reset_busy), 24)
+ addtimer(CALLBACK(src, PROC_REF(reset_busy)), 24)
use_power(250)
if(thing == loaded_item)
loaded_item = null
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index dd9003a52014..f714f65f154d 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -510,12 +510,12 @@
investigate_log("Experimentor has drained power from its APC", INVESTIGATE_EXPERIMENTOR)
if(globalMalf == 99)
visible_message("[src] begins to glow and vibrate. It's going to blow!")
- addtimer(CALLBACK(src, .proc/boom), 50)
+ addtimer(CALLBACK(src, PROC_REF(boom)), 50)
if(globalMalf == 100)
visible_message("[src] begins to glow and vibrate. It's going to blow!")
- addtimer(CALLBACK(src, .proc/honk), 50)
+ addtimer(CALLBACK(src, PROC_REF(honk)), 50)
- addtimer(CALLBACK(src, .proc/reset_exp), resetTime)
+ addtimer(CALLBACK(src, PROC_REF(reset_exp)), resetTime)
/obj/machinery/rnd/experimentor/proc/boom()
explosion(src, 1, 5, 10, 5, 1)
@@ -578,7 +578,7 @@
revealed = TRUE
name = realName
cooldownMax = rand(60,300)
- realProc = pick(.proc/teleport,.proc/explode,.proc/rapidDupe,.proc/petSpray,.proc/flash,.proc/clean,.proc/corgicannon)
+ realProc = pick(PROC_REF(teleport), PROC_REF(explode), PROC_REF(rapidDupe), PROC_REF(petSpray), PROC_REF(flash), PROC_REF(clean), PROC_REF(corgicannon))
/obj/item/relic/attack_self(mob/user)
if(revealed)
@@ -589,7 +589,7 @@
cooldown = TRUE
call(src,realProc)(user)
if(!QDELETED(src))
- addtimer(CALLBACK(src, .proc/cd), cooldownMax)
+ addtimer(CALLBACK(src, PROC_REF(cd)), cooldownMax)
else
to_chat(user, "You aren't quite sure what this is. Maybe R&D knows what to do with it?")
@@ -606,7 +606,7 @@
/obj/item/relic/proc/corgicannon(mob/user)
playsound(src, "sparks", rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
var/mob/living/simple_animal/pet/dog/corgi/C = new/mob/living/simple_animal/pet/dog/corgi(get_turf(user))
- C.throw_at(pick(oview(10,user)), 10, rand(3,8), callback = CALLBACK(src, .proc/throwSmoke, C))
+ C.throw_at(pick(oview(10,user)), 10, rand(3,8), callback = CALLBACK(src, PROC_REF(throwSmoke), C))
warn_admins(user, "Corgi Cannon", 0)
/obj/item/relic/proc/clean(mob/user)
@@ -656,7 +656,7 @@
/obj/item/relic/proc/explode(mob/user)
to_chat(user, "[src] begins to heat up!")
- addtimer(CALLBACK(src, .proc/do_explode, user), rand(35, 100))
+ addtimer(CALLBACK(src, PROC_REF(do_explode), user), rand(35, 100))
/obj/item/relic/proc/do_explode(mob/user)
if(loc == user)
@@ -667,7 +667,7 @@
/obj/item/relic/proc/teleport(mob/user)
to_chat(user, "[src] begins to vibrate!")
- addtimer(CALLBACK(src, .proc/do_the_teleport, user), rand(10, 30))
+ addtimer(CALLBACK(src, PROC_REF(do_the_teleport), user), rand(10, 30))
/obj/item/relic/proc/do_the_teleport(mob/user)
var/turf/userturf = get_turf(user)
diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm
index 5a1e9303b013..36a22dac2cc7 100644
--- a/code/modules/research/machinery/_production.dm
+++ b/code/modules/research/machinery/_production.dm
@@ -23,7 +23,7 @@
matching_designs = list()
cached_designs = list()
stored_research = new
- INVOKE_ASYNC(src, .proc/update_research)
+ INVOKE_ASYNC(src, PROC_REF(update_research))
materials = AddComponent(/datum/component/remote_materials, "lathe", mapload)
RefreshParts()
@@ -167,8 +167,8 @@
if(production_animation)
flick(production_animation, src)
var/timecoeff = D.lathe_time_factor / efficiency_coeff
- addtimer(CALLBACK(src, .proc/reset_busy), (30 * timecoeff * amount) ** 0.5)
- addtimer(CALLBACK(src, .proc/do_print, D.build_path, amount, efficient_mats, D.dangerous_construction), (32 * timecoeff * amount) ** 0.8)
+ addtimer(CALLBACK(src, PROC_REF(reset_busy)), (30 * timecoeff * amount) ** 0.5)
+ addtimer(CALLBACK(src, PROC_REF(do_print), D.build_path, amount, efficient_mats, D.dangerous_construction), (32 * timecoeff * amount) ** 0.8)
return TRUE
/obj/machinery/rnd/production/proc/search(string)
diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm
index 30be4869d1bc..d5d5fa79e8ca 100644
--- a/code/modules/research/nanites/nanite_chamber.dm
+++ b/code/modules/research/nanites/nanite_chamber.dm
@@ -68,11 +68,11 @@
//TODO OMINOUS MACHINE SOUNDS
set_busy(TRUE, "Initializing injection protocol...", "[initial(icon_state)]_raising")
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Analyzing host bio-structure...", "[initial(icon_state)]_active"),20)
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Priming nanites...", "[initial(icon_state)]_active"),40)
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Injecting...", "[initial(icon_state)]_active"),70)
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Activating nanites...", "[initial(icon_state)]_falling"),110)
- addtimer(CALLBACK(src, .proc/complete_injection, locked_state),130)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Analyzing host bio-structure...", "[initial(icon_state)]_active"),20)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Priming nanites...", "[initial(icon_state)]_active"),40)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Injecting...", "[initial(icon_state)]_active"),70)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Activating nanites...", "[initial(icon_state)]_falling"),110)
+ addtimer(CALLBACK(src, PROC_REF(complete_injection), locked_state),130)
/obj/machinery/nanite_chamber/proc/complete_injection(locked_state)
//TODO MACHINE DING
@@ -95,11 +95,11 @@
//TODO OMINOUS MACHINE SOUNDS
set_busy(TRUE, "Initializing cleanup protocol...", "[initial(icon_state)]_raising")
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Analyzing host bio-structure...", "[initial(icon_state)]_active"),20)
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Pinging nanites...", "[initial(icon_state)]_active"),40)
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Initiating graceful self-destruct sequence...", "[initial(icon_state)]_active"),70)
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Removing debris...", "[initial(icon_state)]_falling"),110)
- addtimer(CALLBACK(src, .proc/complete_removal, locked_state),130)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Analyzing host bio-structure...", "[initial(icon_state)]_active"),20)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Pinging nanites...", "[initial(icon_state)]_active"),40)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Initiating graceful self-destruct sequence...", "[initial(icon_state)]_active"),70)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Removing debris...", "[initial(icon_state)]_falling"),110)
+ addtimer(CALLBACK(src, PROC_REF(complete_removal), locked_state),130)
/obj/machinery/nanite_chamber/proc/complete_removal(locked_state)
//TODO MACHINE DING
diff --git a/code/modules/research/nanites/nanite_chamber_computer.dm b/code/modules/research/nanites/nanite_chamber_computer.dm
index c18364de1a2d..3a41e394b1dc 100644
--- a/code/modules/research/nanites/nanite_chamber_computer.dm
+++ b/code/modules/research/nanites/nanite_chamber_computer.dm
@@ -101,7 +101,7 @@
UnregisterSignal(chamber, COMSIG_PARENT_QDELETING)
chamber = new_chamber
if(chamber)
- RegisterSignal(chamber, COMSIG_PARENT_QDELETING, .proc/react_to_chamber_del)
+ RegisterSignal(chamber, COMSIG_PARENT_QDELETING, PROC_REF(react_to_chamber_del))
/obj/machinery/computer/nanite_chamber_control/proc/react_to_chamber_del(datum/source)
SIGNAL_HANDLER
diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm
index a33f42f5f848..11b862e4a751 100644
--- a/code/modules/research/nanites/nanite_programs/healing.dm
+++ b/code/modules/research/nanites/nanite_programs/healing.dm
@@ -217,7 +217,7 @@
/datum/nanite_program/defib/on_trigger(comm_message)
host_mob.notify_ghost_cloning("Your heart is being defibrillated by nanites. Re-enter your corpse if you want to be revived!")
- addtimer(CALLBACK(src, .proc/zap), 50)
+ addtimer(CALLBACK(src, PROC_REF(zap)), 50)
/datum/nanite_program/defib/proc/check_revivable()
if(!iscarbon(host_mob)) //nonstandard biology
diff --git a/code/modules/research/nanites/nanite_programs/sensor.dm b/code/modules/research/nanites/nanite_programs/sensor.dm
index ff42a5fe099c..dacdc0481408 100644
--- a/code/modules/research/nanites/nanite_programs/sensor.dm
+++ b/code/modules/research/nanites/nanite_programs/sensor.dm
@@ -36,7 +36,7 @@
/datum/nanite_program/sensor/repeat/on_trigger(comm_message)
var/datum/nanite_extra_setting/ES = extra_settings[NES_DELAY]
- addtimer(CALLBACK(src, .proc/send_code), ES.get_value() * 10)
+ addtimer(CALLBACK(src, PROC_REF(send_code)), ES.get_value() * 10)
/datum/nanite_program/sensor/relay_repeat
name = "Relay Signal Repeater"
@@ -53,7 +53,7 @@
/datum/nanite_program/sensor/relay_repeat/on_trigger(comm_message)
var/datum/nanite_extra_setting/ES = extra_settings[NES_DELAY]
- addtimer(CALLBACK(src, .proc/send_code), ES.get_value() * 10)
+ addtimer(CALLBACK(src, PROC_REF(send_code)), ES.get_value() * 10)
/datum/nanite_program/sensor/relay_repeat/send_code()
var/datum/nanite_extra_setting/relay = extra_settings[NES_RELAY_CHANNEL]
@@ -244,10 +244,10 @@
/datum/nanite_program/sensor/voice/on_mob_add()
. = ..()
- RegisterSignal(host_mob, COMSIG_MOVABLE_HEAR, .proc/on_hear)
+ RegisterSignal(host_mob, COMSIG_MOVABLE_HEAR, PROC_REF(on_hear))
/datum/nanite_program/sensor/voice/on_mob_remove()
- UnregisterSignal(host_mob, COMSIG_MOVABLE_HEAR, .proc/on_hear)
+ UnregisterSignal(host_mob, COMSIG_MOVABLE_HEAR, PROC_REF(on_hear))
/datum/nanite_program/sensor/voice/proc/on_hear(datum/source, list/hearing_args)
var/datum/nanite_extra_setting/sentence = extra_settings[NES_SENTENCE]
diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm
index 848c5b2e4610..76bddd35c066 100644
--- a/code/modules/research/nanites/nanite_programs/suppression.dm
+++ b/code/modules/research/nanites/nanite_programs/suppression.dm
@@ -11,7 +11,7 @@
/datum/nanite_program/sleepy/on_trigger(comm_message)
to_chat(host_mob, "You start to feel very sleepy...")
host_mob.drowsyness += 20
- addtimer(CALLBACK(host_mob, /mob/living.proc/Sleeping, 200), rand(60,200))
+ addtimer(CALLBACK(host_mob, TYPE_PROC_REF(/mob/living, Sleeping), 200), rand(60,200))
/datum/nanite_program/paralyzing
name = "Paralysis"
diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm
index 16f87bc6bdee..5f166d4d610a 100644
--- a/code/modules/research/nanites/nanite_programs/weapon.dm
+++ b/code/modules/research/nanites/nanite_programs/weapon.dm
@@ -84,7 +84,7 @@
/datum/nanite_program/explosive/on_trigger(comm_message)
host_mob.visible_message("[host_mob] starts emitting a high-pitched buzzing, and [host_mob.p_their()] skin begins to glow...",\
"You start emitting a high-pitched buzzing, and your skin begins to glow...")
- addtimer(CALLBACK(src, .proc/boom), clamp((nanites.nanite_volume * 0.35), 25, 150))
+ addtimer(CALLBACK(src, PROC_REF(boom)), clamp((nanites.nanite_volume * 0.35), 25, 150))
/datum/nanite_program/explosive/proc/boom()
var/nanite_amount = nanites.nanite_volume
@@ -179,7 +179,7 @@
sent_directive = ES.get_value()
brainwash(host_mob, sent_directive)
log_game("A mind control nanite program brainwashed [key_name(host_mob)] with the objective '[sent_directive]'.")
- addtimer(CALLBACK(src, .proc/end_brainwashing), 600)
+ addtimer(CALLBACK(src, PROC_REF(end_brainwashing)), 600)
/datum/nanite_program/comm/mind_control/proc/end_brainwashing()
if(host_mob.mind && host_mob.mind.has_antag_datum(/datum/antagonist/brainwashed))
diff --git a/code/modules/research/nanites/public_chamber.dm b/code/modules/research/nanites/public_chamber.dm
index f53707206a38..9e39486c2052 100644
--- a/code/modules/research/nanites/public_chamber.dm
+++ b/code/modules/research/nanites/public_chamber.dm
@@ -50,9 +50,9 @@
//TODO OMINOUS MACHINE SOUNDS
set_busy(TRUE, "[initial(icon_state)]_raising")
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_active"),20)
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_falling"),60)
- addtimer(CALLBACK(src, .proc/complete_injection, locked_state, attacker),80)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_active"),20)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_falling"),60)
+ addtimer(CALLBACK(src, PROC_REF(complete_injection), locked_state, attacker),80)
/obj/machinery/public_nanite_chamber/proc/complete_injection(locked_state, mob/living/attacker)
//TODO MACHINE DING
@@ -77,9 +77,9 @@
locked = TRUE
set_busy(TRUE, "[initial(icon_state)]_raising")
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_active"),20)
- addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_falling"),40)
- addtimer(CALLBACK(src, .proc/complete_cloud_change, locked_state, attacker),60)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_active"),20)
+ addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_falling"),40)
+ addtimer(CALLBACK(src, PROC_REF(complete_cloud_change), locked_state, attacker),60)
/obj/machinery/public_nanite_chamber/proc/complete_cloud_change(locked_state, mob/living/attacker)
locked = locked_state
@@ -157,7 +157,7 @@
. = TRUE
- addtimer(CALLBACK(src, .proc/try_inject_nanites, attacker), 30) //If someone is shoved in give them a chance to get out before the injection starts
+ addtimer(CALLBACK(src, PROC_REF(try_inject_nanites), attacker), 30) //If someone is shoved in give them a chance to get out before the injection starts
/obj/machinery/public_nanite_chamber/proc/try_inject_nanites(mob/living/attacker)
if(occupant)
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 90094f64594f..7c46ac61d784 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -111,4 +111,4 @@
stack_name = S.name
use_power(min(1000, (amount_inserted / 100)))
add_overlay("protolathe_[stack_name]")
- addtimer(CALLBACK(src, /atom/proc/cut_overlay, "protolathe_[stack_name]"), 10)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, cut_overlay), "protolathe_[stack_name]"), 10)
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index 4626e4154cc8..651eb2fece14 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -66,7 +66,7 @@
var/icon/bluespace
/datum/status_effect/slimerecall/on_apply()
- RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/resistField)
+ RegisterSignal(owner, COMSIG_LIVING_RESIST, PROC_REF(resistField))
to_chat(owner, "You feel a sudden tug from an unknown force, and feel a pull to bluespace!")
to_chat(owner, "Resist if you wish avoid the force!")
bluespace = icon('icons/effects/effects.dmi',"chronofield")
@@ -98,7 +98,7 @@
var/obj/structure/ice_stasis/cube
/datum/status_effect/frozenstasis/on_apply()
- RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/breakCube)
+ RegisterSignal(owner, COMSIG_LIVING_RESIST, PROC_REF(breakCube))
cube = new /obj/structure/ice_stasis(get_turf(owner))
owner.forceMove(cube)
owner.status_flags |= GODMODE
diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm
index 60a54c461bf1..e9fd98232e2c 100644
--- a/code/modules/research/xenobiology/crossbreeding/burning.dm
+++ b/code/modules/research/xenobiology/crossbreeding/burning.dm
@@ -261,7 +261,7 @@ Burning extracts:
/obj/item/slimecross/burning/oil/do_effect(mob/user)
user.visible_message("[user] activates [src]. It's going to explode!", "You activate [src]. It crackles in anticipation")
- addtimer(CALLBACK(src, .proc/boom), 50)
+ addtimer(CALLBACK(src, PROC_REF(boom)), 50)
/obj/item/slimecross/burning/oil/proc/boom()
var/turf/T = get_turf(src)
diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm
index a2853592e4d2..d44f1bd4ad8b 100644
--- a/code/modules/research/xenobiology/crossbreeding/charged.dm
+++ b/code/modules/research/xenobiology/crossbreeding/charged.dm
@@ -195,7 +195,7 @@ Charged extracts:
/obj/item/slimecross/charged/gold/do_effect(mob/user)
user.visible_message("[src] starts shuddering violently!")
- addtimer(CALLBACK(src, .proc/startTimer), 50)
+ addtimer(CALLBACK(src, PROC_REF(startTimer)), 50)
/obj/item/slimecross/charged/gold/proc/startTimer()
START_PROCESSING(SSobj, src)
@@ -220,7 +220,7 @@ Charged extracts:
/obj/item/slimecross/charged/oil/do_effect(mob/user)
user.visible_message("[src] begins to shake with rapidly increasing force!")
- addtimer(CALLBACK(src, .proc/boom), 50)
+ addtimer(CALLBACK(src, PROC_REF(boom)), 50)
/obj/item/slimecross/charged/oil/proc/boom()
explosion(get_turf(src), 2, 3, 4) //Much smaller effect than normal oils, but devastatingly strong where it does hit.
diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm
index e4f19c892a12..085f8486ac32 100644
--- a/code/modules/research/xenobiology/crossbreeding/chilling.dm
+++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm
@@ -282,7 +282,7 @@ Chilling extracts:
/obj/item/slimecross/chilling/oil/do_effect(mob/user)
user.visible_message("[src] begins to shake with muted intensity!")
- addtimer(CALLBACK(src, .proc/boom), 50)
+ addtimer(CALLBACK(src, PROC_REF(boom)), 50)
/obj/item/slimecross/chilling/oil/proc/boom()
explosion(get_turf(src), -1, -1, 10, 0) //Large radius, but mostly light damage, and no flash.
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index d2b1d49f78fe..81ac7db98b01 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -119,12 +119,12 @@
hotkey_help.Grant(user)
actions += hotkey_help
- RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, .proc/XenoSlimeClickCtrl)
- RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, .proc/XenoSlimeClickAlt)
- RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, .proc/XenoSlimeClickShift)
- RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, .proc/XenoTurfClickShift)
- RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, .proc/XenoTurfClickCtrl)
- RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, .proc/XenoMonkeyClickCtrl)
+ RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, PROC_REF(XenoSlimeClickCtrl))
+ RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, PROC_REF(XenoSlimeClickAlt))
+ RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, PROC_REF(XenoSlimeClickShift))
+ RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, PROC_REF(XenoTurfClickShift))
+ RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, PROC_REF(XenoTurfClickCtrl))
+ RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, PROC_REF(XenoMonkeyClickCtrl))
//Checks for recycler on every interact, prevents issues with load order on certain maps.
if(!connected_recycler)
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 9a1c98ad6212..939c14589586 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -278,7 +278,7 @@
to_chat(user, "Your glow is already enhanced!")
return
species.update_glow(user, 5)
- addtimer(CALLBACK(species, /datum/species/jelly/luminescent.proc/update_glow, user, LUMINESCENT_DEFAULT_GLOW), 600)
+ addtimer(CALLBACK(species, TYPE_PROC_REF(/datum/species/jelly/luminescent, update_glow), user, LUMINESCENT_DEFAULT_GLOW), 600)
to_chat(user, "You start glowing brighter.")
if(SLIME_ACTIVATE_MAJOR)
@@ -494,7 +494,7 @@
return
to_chat(user, "You feel your skin harden and become more resistant.")
species.armor += 25
- addtimer(CALLBACK(src, .proc/reset_armor, species), 1200)
+ addtimer(CALLBACK(src, PROC_REF(reset_armor), species), 1200)
return 450
if(SLIME_ACTIVATE_MAJOR)
diff --git a/code/modules/ruins/icemoonruin_code/hotsprings.dm b/code/modules/ruins/icemoonruin_code/hotsprings.dm
index a318f5bb1a48..dd4d39e91a20 100644
--- a/code/modules/ruins/icemoonruin_code/hotsprings.dm
+++ b/code/modules/ruins/icemoonruin_code/hotsprings.dm
@@ -27,7 +27,7 @@ GLOBAL_LIST_EMPTY(cursed_minds)
if(GLOB.cursed_minds[L.mind])
return
GLOB.cursed_minds[L.mind] = TRUE
- RegisterSignal(L.mind, COMSIG_PARENT_QDELETING, .proc/remove_from_cursed)
+ RegisterSignal(L.mind, COMSIG_PARENT_QDELETING, PROC_REF(remove_from_cursed))
var/random_choice = pick("Mob", "Appearance")
switch(random_choice)
if("Mob")
diff --git a/code/modules/ruins/icemoonruin_code/wrath.dm b/code/modules/ruins/icemoonruin_code/wrath.dm
index d43a72d80c96..11e7e24e6547 100644
--- a/code/modules/ruins/icemoonruin_code/wrath.dm
+++ b/code/modules/ruins/icemoonruin_code/wrath.dm
@@ -14,7 +14,7 @@
/obj/item/clothing/gloves/butchering/equipped(mob/user, slot, initial = FALSE)
. = ..()
- RegisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, .proc/butcher_target)
+ RegisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(butcher_target))
var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering)
butchering.butchering_enabled = TRUE
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index cb5465f881fd..bf583bcd2157 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -86,9 +86,7 @@
/obj/item/stack/sheet/bone = /datum/species/golem/bone,
/obj/item/stack/sheet/durathread = /datum/species/golem/durathread,
/obj/item/stack/sheet/cotton/durathread = /datum/species/golem/durathread,
- /obj/item/stack/sheet/mineral/snow = /datum/species/golem/snow,
- /obj/item/stack/sheet/capitalisium = /datum/species/golem/capitalist,
- /obj/item/stack/sheet/stalinium = /datum/species/golem/soviet)
+ /obj/item/stack/sheet/mineral/snow = /datum/species/golem/snow)
if(istype(I, /obj/item/stack))
var/obj/item/stack/O = I
diff --git a/code/modules/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/ruins/lavalandruin_code/syndicate_base.dm
index 5d6295f54d0c..bbcce202096b 100644
--- a/code/modules/ruins/lavalandruin_code/syndicate_base.dm
+++ b/code/modules/ruins/lavalandruin_code/syndicate_base.dm
@@ -1,11 +1,9 @@
-//lavaland_surface_syndicate_base1.dmm
-
/obj/machinery/vending/syndichem
name = "\improper SyndiChem"
desc = "A vending machine full of grenades and grenade accessories. Sponsored by DonkCo(tm)."
req_access = list(ACCESS_SYNDICATE)
products = list(
- /obj/item/stack/cable_coil/random = 5, //WS Edit - Random added from Smartwire Revert
+ /obj/item/stack/cable_coil/random = 5,
/obj/item/assembly/igniter = 20,
/obj/item/assembly/prox_sensor = 5,
/obj/item/assembly/signaler = 5,
diff --git a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm
index 31a6ee6f0c0f..b231ea902371 100644
--- a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm
+++ b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm
@@ -67,7 +67,7 @@
deadmind = H.get_ghost(FALSE, TRUE)
to_chat(deadmind, "Your body has been returned to the nest. You are being remade anew, and will awaken shortly. Your memories will remain intact in your new body, as your soul is being salvaged")
SEND_SOUND(deadmind, sound('sound/magic/enter_blood.ogg',volume=100))
- addtimer(CALLBACK(src, .proc/remake_walker, H.mind, H.real_name), 20 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(remake_walker), H.mind, H.real_name), 20 SECONDS)
new /obj/effect/gibspawner/generic(get_turf(H))
qdel(H)
return
diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
index 7b900dc579d7..bc0e8a9d401d 100644
--- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
+++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
@@ -47,7 +47,7 @@
add_overlay(dais_overlay)
var/static/list/loc_connections = list(
- COMSIG_ATOM_EXIT = .proc/on_exit
+ COMSIG_ATOM_EXIT = PROC_REF(on_exit)
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -268,7 +268,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
icon_state = "[tile_key][rand(1, tile_random_sprite_max)]"
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -297,7 +297,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
switch(fall_on_cross)
if(COLLAPSE_ON_CROSS, DESTROY_ON_CROSS)
if((I && I.w_class >= WEIGHT_CLASS_BULKY) || (L && !(L.movement_type & FLYING) && L.mob_size >= MOB_SIZE_HUMAN)) //too heavy! too big! aaah!
- INVOKE_ASYNC(src, .proc/collapse)
+ INVOKE_ASYNC(src, PROC_REF(collapse))
if(UNIQUE_EFFECT)
crossed_effect(AM)
@@ -316,7 +316,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
if(break_that_sucker)
QDEL_IN(src, 10)
else
- addtimer(CALLBACK(src, .proc/rebuild), 55)
+ addtimer(CALLBACK(src, PROC_REF(rebuild)), 55)
/obj/structure/stone_tile/proc/rebuild()
pixel_x = initial(pixel_x)
diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
index e388a577fe1d..fbdf03eff183 100644
--- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm
+++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
@@ -29,7 +29,7 @@
know it'll be worth it.")
icon_state = "slots2"
playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, FALSE)
- addtimer(CALLBACK(src, .proc/determine_victor, user), 50)
+ addtimer(CALLBACK(src, PROC_REF(determine_victor), user), 50)
/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user)
icon_state = "slots1"
@@ -55,7 +55,7 @@
/obj/structure/cursed_money/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/collapse), 600)
+ addtimer(CALLBACK(src, PROC_REF(collapse)), 600)
/obj/structure/cursed_money/proc/collapse()
visible_message("
[src] falls in on itself, \
diff --git a/code/modules/screen_alerts/_screen_alerts.dm b/code/modules/screen_alerts/_screen_alerts.dm
index 3cf3dd376795..08a21635ea93 100644
--- a/code/modules/screen_alerts/_screen_alerts.dm
+++ b/code/modules/screen_alerts/_screen_alerts.dm
@@ -12,7 +12,7 @@
text_box.text_to_play = text
LAZYADD(client.screen_texts, text_box)
if(LAZYLEN(client.screen_texts) == 1) //lets only play one at a time, for thematic effect and prevent overlap
- INVOKE_ASYNC(text_box, /atom/movable/screen/text/screen_text.proc/play_to_mob, src)
+ INVOKE_ASYNC(text_box, TYPE_PROC_REF(/atom/movable/screen/text/screen_text, play_to_mob), src)
return
client.screen_texts += text_box
@@ -79,7 +79,7 @@
continue
maptext = "[style_open][copytext_char(text_to_play, 1, letter)][style_close]"
sleep(play_delay)
- addtimer(CALLBACK(src, .proc/after_play, user), fade_out_delay)
+ addtimer(CALLBACK(src, PROC_REF(after_play), user), fade_out_delay)
///handles post-play effects like fade out after the fade out delay
/atom/movable/screen/text/screen_text/proc/after_play(mob/user)
@@ -87,7 +87,7 @@
end_play(user)
return
animate(src, alpha = 0, time = fade_out_time)
- addtimer(CALLBACK(src, .proc/end_play, user), fade_out_time)
+ addtimer(CALLBACK(src, PROC_REF(end_play), user), fade_out_time)
///ends the play then deletes this screen object and plalys the next one in queue if it exists
/atom/movable/screen/text/screen_text/proc/end_play(mob/user)
diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm
index be021492b2de..7f3693e98760 100644
--- a/code/modules/security_levels/keycard_authentication.dm
+++ b/code/modules/security_levels/keycard_authentication.dm
@@ -24,7 +24,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new)
/obj/machinery/keycard_auth/Initialize()
. = ..()
- ev = GLOB.keycard_events.addEvent("triggerEvent", CALLBACK(src, .proc/triggerEvent))
+ ev = GLOB.keycard_events.addEvent("triggerEvent", CALLBACK(src, PROC_REF(triggerEvent)))
/obj/machinery/keycard_auth/Destroy()
GLOB.keycard_events.clearEvent("triggerEvent", ev)
@@ -86,7 +86,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new)
event = event_type
waiting = 1
GLOB.keycard_events.fireEvent("triggerEvent", src)
- addtimer(CALLBACK(src, .proc/eventSent), 20)
+ addtimer(CALLBACK(src, PROC_REF(eventSent)), 20)
/obj/machinery/keycard_auth/proc/eventSent()
triggerer = null
@@ -96,7 +96,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new)
/obj/machinery/keycard_auth/proc/triggerEvent(source)
icon_state = "auth_on"
event_source = source
- addtimer(CALLBACK(src, .proc/eventTriggered), 20)
+ addtimer(CALLBACK(src, PROC_REF(eventTriggered)), 20)
/obj/machinery/keycard_auth/proc/eventTriggered()
icon_state = "auth_off"
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index 2ca64fcd35fc..2d48fc3a82a3 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -211,7 +211,7 @@ All ShuttleMove procs go here
for(var/obj/machinery/door/airlock/A in range(1, src)) // includes src
A.shuttledocked = FALSE
A.air_tight = TRUE
- INVOKE_ASYNC(A, /obj/machinery/door/.proc/close)
+ INVOKE_ASYNC(A, TYPE_PROC_REF(/obj/machinery/door, close))
/obj/machinery/door/airlock/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
diff --git a/code/modules/shuttle/ripple.dm b/code/modules/shuttle/ripple.dm
index 4bf6eac0ebed..824c1843bac7 100644
--- a/code/modules/shuttle/ripple.dm
+++ b/code/modules/shuttle/ripple.dm
@@ -14,7 +14,7 @@
/obj/effect/abstract/ripple/Initialize(mapload, time_left)
. = ..()
animate(src, alpha=255, time=time_left)
- addtimer(CALLBACK(src, .proc/stop_animation), 8, TIMER_CLIENT_TIME)
+ addtimer(CALLBACK(src, PROC_REF(stop_animation)), 8, TIMER_CLIENT_TIME)
/obj/effect/abstract/ripple/proc/stop_animation()
icon_state = "medi_holo_no_anim"
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index b89a07efdac5..f706bc87a491 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -211,6 +211,8 @@
var/json_key
//Setting this to false will prevent the roundstart_template from being loaded on Initiallize(). You should set this to false if this loads a subship on a ship map template
var/load_template_on_initialize = TRUE
+ /// The docking ticket of the ship docking to this port.
+ var/datum/docking_ticket/current_docking_ticket
/obj/docking_port/stationary/Initialize(mapload)
. = ..()
@@ -222,7 +224,7 @@
for(var/turf/T in return_turfs())
T.flags_1 |= NO_RUINS_1
if(SSshuttle.initialized && load_template_on_initialize) // If the docking port is loaded via map but SSshuttle has already init (therefore this would never be called)
- INVOKE_ASYNC(src, .proc/load_roundstart)
+ INVOKE_ASYNC(src, PROC_REF(load_roundstart))
#ifdef DOCKING_PORT_HIGHLIGHT
highlight("#f00")
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index 16abb651b97c..fd18f0c5a1ee 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -93,7 +93,7 @@
L.visible_message("A strange purple glow wraps itself around [L] as [L.p_they()] suddenly fall[L.p_s()] unconscious.",
"[desc]")
// Don't let them sit suround unconscious forever
- addtimer(CALLBACK(src, .proc/sleeper_dreams, L), 100)
+ addtimer(CALLBACK(src, PROC_REF(sleeper_dreams), L), 100)
// Existing sleepers
for(var/i in found)
@@ -145,7 +145,7 @@
/mob/living/simple_animal/drone/snowflake/bardrone/Initialize()
. = ..()
access_card.access |= ACCESS_CENT_BAR
- RegisterSignal(src, COMSIG_ENTER_AREA, .proc/check_barstaff_godmode)
+ RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(check_barstaff_godmode))
check_barstaff_godmode()
/mob/living/simple_animal/hostile/alien/maid/barmaid
@@ -165,7 +165,7 @@
access_card.access = C.get_access()
access_card.access |= ACCESS_CENT_BAR
ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
- RegisterSignal(src, COMSIG_ENTER_AREA, .proc/check_barstaff_godmode)
+ RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(check_barstaff_godmode))
check_barstaff_godmode()
/mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy()
@@ -193,7 +193,7 @@
/obj/structure/table/wood/bar/Initialize()
. = ..()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -363,7 +363,7 @@
/mob/living/simple_animal/hostile/bear/fightpit
name = "fight pit bear"
- desc = "This bear's trained through ancient Russian secrets to fear the walls of its glass prison."
+ desc = "This bear's trained through ancient Solarian secrets to fear the walls of its glass prison."
environment_smash = ENVIRONMENT_SMASH_NONE
/obj/effect/decal/hammerandsickle
diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm
index 66c0c232c06c..9e30c708774d 100644
--- a/code/modules/spells/spell_types/aimed.dm
+++ b/code/modules/spells/spell_types/aimed.dm
@@ -156,7 +156,7 @@
/obj/effect/proc_holder/spell/aimed/spell_cards/on_activation(mob/M)
QDEL_NULL(lockon_component)
- lockon_component = M.AddComponent(/datum/component/lockon_aiming, 5, typecacheof(list(/mob/living)), 1, null, CALLBACK(src, .proc/on_lockon_component))
+ lockon_component = M.AddComponent(/datum/component/lockon_aiming, 5, typecacheof(list(/mob/living)), 1, null, CALLBACK(src, PROC_REF(on_lockon_component)))
/obj/effect/proc_holder/spell/aimed/spell_cards/proc/on_lockon_component(list/locked_weakrefs)
if(!length(locked_weakrefs))
diff --git a/code/modules/spells/spell_types/area_teleport.dm b/code/modules/spells/spell_types/area_teleport.dm
index f8d5af4e2824..73014c5b3f47 100644
--- a/code/modules/spells/spell_types/area_teleport.dm
+++ b/code/modules/spells/spell_types/area_teleport.dm
@@ -17,7 +17,7 @@
return
invocation(thearea,user)
if(charge_type == "recharge" && recharge)
- INVOKE_ASYNC(src, .proc/start_recharge)
+ INVOKE_ASYNC(src, PROC_REF(start_recharge))
cast(targets,thearea,user)
after_cast(targets)
diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm
index 02e3532175a7..5f6403ca3cdd 100644
--- a/code/modules/spells/spell_types/construct_spells.dm
+++ b/code/modules/spells/spell_types/construct_spells.dm
@@ -210,7 +210,7 @@
target.playsound_local(get_turf(target), 'sound/hallucinations/i_see_you1.ogg', 50, 1)
user.playsound_local(get_turf(user), 'sound/effects/ghost2.ogg', 50, 1)
target.become_blind(ABYSSAL_GAZE_BLIND)
- addtimer(CALLBACK(src, .proc/cure_blindness, target), 40)
+ addtimer(CALLBACK(src, PROC_REF(cure_blindness), target), 40)
target.adjust_bodytemperature(-200)
/**
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index eaa8eae9731b..6631d943a3aa 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -161,7 +161,7 @@
client.eye = src
visible_message("[src] appears in a fiery blaze!")
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, TRUE, -1)
- addtimer(CALLBACK(src, .proc/fakefireextinguish), 15, TIMER_UNIQUE)
+ addtimer(CALLBACK(src, PROC_REF(fakefireextinguish)), 15, TIMER_UNIQUE)
/obj/effect/proc_holder/spell/targeted/sintouch
name = "Sin Touch"
diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm
index 11dc1ca1a690..8b948802a7ac 100644
--- a/code/modules/spells/spell_types/ethereal_jaunt.dm
+++ b/code/modules/spells/spell_types/ethereal_jaunt.dm
@@ -20,7 +20,7 @@
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets,mob/user = usr) //magnets, so mostly hardcoded
playsound(get_turf(user), 'sound/magic/ethereal_enter.ogg', 50, TRUE, -1)
for(var/mob/living/target in targets)
- INVOKE_ASYNC(src, .proc/do_jaunt, target)
+ INVOKE_ASYNC(src, PROC_REF(do_jaunt), target)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/do_jaunt(mob/living/target)
target.notransform = 1
diff --git a/code/modules/spells/spell_types/forcewall.dm b/code/modules/spells/spell_types/forcewall.dm
index 62bd538120e1..e4da9b63aa6d 100644
--- a/code/modules/spells/spell_types/forcewall.dm
+++ b/code/modules/spells/spell_types/forcewall.dm
@@ -14,19 +14,19 @@
var/wall_type = /obj/effect/forcefield/wizard
/obj/effect/proc_holder/spell/targeted/forcewall/cast(list/targets,mob/user = usr)
- new wall_type(get_turf(user),user)
+ new wall_type(get_turf(user), null, user)
if(user.dir == SOUTH || user.dir == NORTH)
- new wall_type(get_step(user, EAST),user)
- new wall_type(get_step(user, WEST),user)
+ new wall_type(get_step(user, EAST), null, user)
+ new wall_type(get_step(user, WEST), null, user)
else
- new wall_type(get_step(user, NORTH),user)
- new wall_type(get_step(user, SOUTH),user)
+ new wall_type(get_step(user, NORTH), null, user)
+ new wall_type(get_step(user, SOUTH), null, user)
/obj/effect/forcefield/wizard
var/mob/wizard
-/obj/effect/forcefield/wizard/Initialize(mapload, mob/summoner)
+/obj/effect/forcefield/wizard/Initialize(mapload, new_timeleft, mob/summoner)
. = ..()
wizard = summoner
diff --git a/code/modules/spells/spell_types/genetic.dm b/code/modules/spells/spell_types/genetic.dm
index 9397484aeb6b..fea675fdc17d 100644
--- a/code/modules/spells/spell_types/genetic.dm
+++ b/code/modules/spells/spell_types/genetic.dm
@@ -29,7 +29,7 @@
ADD_TRAIT(target, A, GENETICS_SPELL)
active_on += target
if(duration < charge_max)
- addtimer(CALLBACK(src, .proc/remove, target), duration, TIMER_OVERRIDE|TIMER_UNIQUE)
+ addtimer(CALLBACK(src, PROC_REF(remove), target), duration, TIMER_OVERRIDE|TIMER_UNIQUE)
/obj/effect/proc_holder/spell/targeted/genetic/Destroy()
. = ..()
diff --git a/code/modules/spells/spell_types/knock.dm b/code/modules/spells/spell_types/knock.dm
index 28430fd86220..6fe24f5d3874 100644
--- a/code/modules/spells/spell_types/knock.dm
+++ b/code/modules/spells/spell_types/knock.dm
@@ -16,9 +16,9 @@
SEND_SOUND(user, sound('sound/magic/knock.ogg'))
for(var/turf/T in targets)
for(var/obj/machinery/door/door in T.contents)
- INVOKE_ASYNC(src, .proc/open_door, door)
+ INVOKE_ASYNC(src, PROC_REF(open_door), door)
for(var/obj/structure/closet/C in T.contents)
- INVOKE_ASYNC(src, .proc/open_closet, C)
+ INVOKE_ASYNC(src, PROC_REF(open_closet), C)
/obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_door(obj/machinery/door/door)
if(istype(door, /obj/machinery/door/airlock))
diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm
index db92e6530000..c8d1c4a7c027 100644
--- a/code/modules/spells/spell_types/lichdom.dm
+++ b/code/modules/spells/spell_types/lichdom.dm
@@ -118,7 +118,7 @@
return
if(!mind.current || (mind.current && mind.current.stat == DEAD))
- addtimer(CALLBACK(src, .proc/rise), respawn_time, TIMER_UNIQUE)
+ addtimer(CALLBACK(src, PROC_REF(rise)), respawn_time, TIMER_UNIQUE)
/obj/item/phylactery/proc/rise()
if(mind.current && mind.current.stat != DEAD)
diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm
index 1f6302b89637..0e56c1112488 100644
--- a/code/modules/spells/spell_types/mime.dm
+++ b/code/modules/spells/spell_types/mime.dm
@@ -92,7 +92,7 @@
for (var/obj/item/storage/box/mime/B in T)
user.put_in_hands(B)
B.alpha = 255
- addtimer(CALLBACK(B, /obj/item/storage/box/mime/.proc/emptyStorage, FALSE), (summon_lifespan - 1))
+ addtimer(CALLBACK(B, TYPE_PROC_REF(/obj/item/storage/box/mime, emptyStorage), FALSE), (summon_lifespan - 1))
/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_box/Click()
if(usr && usr.mind)
diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm
index def36f4c8b12..a45f2afdaad5 100644
--- a/code/modules/spells/spell_types/spacetime_distortion.dm
+++ b/code/modules/spells/spell_types/spacetime_distortion.dm
@@ -36,7 +36,7 @@
perform(turf_steps,user=user)
/obj/effect/proc_holder/spell/spacetime_dist/after_cast(list/targets)
- addtimer(CALLBACK(src, .proc/clean_turfs), duration)
+ addtimer(CALLBACK(src, PROC_REF(clean_turfs)), duration)
/obj/effect/proc_holder/spell/spacetime_dist/cast(list/targets, mob/user = usr)
effects = list()
@@ -84,7 +84,7 @@
. = ..()
setDir(pick(GLOB.cardinals))
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = .proc/on_entered,
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 92b51e0f2049..366fb41790ab 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -125,8 +125,8 @@
/obj/item/bodypart/Initialize(mapload)
. = ..()
if(can_be_disabled)
- RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS), .proc/on_paralysis_trait_gain)
- RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS), .proc/on_paralysis_trait_loss)
+ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS), PROC_REF(on_paralysis_trait_gain))
+ RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS), PROC_REF(on_paralysis_trait_loss))
/obj/item/bodypart/Destroy()
@@ -338,7 +338,7 @@
if(total_damage >= max_damage * disable_threshold) //Easy limb disable disables the limb at 40% health instead of 0%
if(!last_maxed)
if(owner.stat < UNCONSCIOUS)
- INVOKE_ASYNC(owner, /mob.proc/emote, "scream")
+ INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "scream")
last_maxed = TRUE
set_disabled(TRUE)
return
@@ -390,14 +390,14 @@
if(HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE))
disable_threshold = 0.6
needs_update_disabled = TRUE
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_EASYLIMBDISABLE), .proc/on_owner_easylimbwound_trait_loss)
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_EASYLIMBDISABLE), .proc/on_owner_easylimbwound_trait_gain)
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_EASYLIMBDISABLE), PROC_REF(on_owner_easylimbwound_trait_loss))
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_EASYLIMBDISABLE), PROC_REF(on_owner_easylimbwound_trait_gain))
if(initial(can_be_disabled))
if(HAS_TRAIT(owner, TRAIT_NOLIMBDISABLE))
set_can_be_disabled(FALSE)
needs_update_disabled = FALSE
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_NOLIMBDISABLE), .proc/on_owner_nolimbdisable_trait_loss)
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_NOLIMBDISABLE), .proc/on_owner_nolimbdisable_trait_gain)
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_NOLIMBDISABLE), PROC_REF(on_owner_nolimbdisable_trait_loss))
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_NOLIMBDISABLE), PROC_REF(on_owner_nolimbdisable_trait_gain))
if(needs_update_disabled)
update_disabled()
@@ -412,12 +412,12 @@
if(owner)
if(HAS_TRAIT(owner, TRAIT_NOLIMBDISABLE))
CRASH("set_can_be_disabled to TRUE with for limb whose owner has TRAIT_NOLIMBDISABLE")
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS), .proc/on_paralysis_trait_gain)
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS), .proc/on_paralysis_trait_loss)
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS), PROC_REF(on_paralysis_trait_gain))
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS), PROC_REF(on_paralysis_trait_loss))
if(HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE))
disable_threshold = 0.6
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_EASYLIMBDISABLE), .proc/on_owner_easylimbwound_trait_loss)
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_EASYLIMBDISABLE), .proc/on_owner_easylimbwound_trait_gain)
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_EASYLIMBDISABLE), PROC_REF(on_owner_easylimbwound_trait_loss))
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_EASYLIMBDISABLE), PROC_REF(on_owner_easylimbwound_trait_gain))
update_disabled()
else if(.)
if(owner)
@@ -581,7 +581,7 @@
bone_status = BONE_FLAG_NO_BONES
else
bone_status = BONE_FLAG_NORMAL
- RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/on_mob_move)
+ RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_mob_move))
draw_color = mutation_color
@@ -736,7 +736,7 @@
if (bone_status == BONE_FLAG_NORMAL && body_part & LEGS) // Because arms are not legs
owner.set_broken_legs(owner.broken_legs + 1)
bone_status = BONE_FLAG_BROKEN
- addtimer(CALLBACK(owner, /atom/.proc/visible_message, "You hear a cracking sound coming from [owner]'s [name].", "You feel something crack in your [name]!", "You hear an awful cracking sound."), 1 SECONDS)
+ addtimer(CALLBACK(owner, TYPE_PROC_REF(/atom, visible_message), "You hear a cracking sound coming from [owner]'s [name].", "You feel something crack in your [name]!", "You hear an awful cracking sound."), 1 SECONDS)
/obj/item/bodypart/proc/fix_bone()
// owner.update_inv_splints() breaks
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index b063d01f8048..7c292ac21fc4 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -20,7 +20,7 @@
if(C.stat <= SOFT_CRIT)//No more screaming while unconsious
if(IS_ORGANIC_LIMB(affecting))//Chest is a good indicator for if a carbon is robotic in nature or not.
- INVOKE_ASYNC(C, /mob.proc/emote, "scream")
+ INVOKE_ASYNC(C, TYPE_PROC_REF(/mob, emote), "scream")
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered)
diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm
index 8a101112377f..57d20bc3952a 100644
--- a/code/modules/surgery/bodyparts/parts.dm
+++ b/code/modules/surgery/bodyparts/parts.dm
@@ -85,10 +85,10 @@
if(owner)
if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM))
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_ARM)
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_ARM), .proc/on_owner_paralysis_loss)
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_ARM), PROC_REF(on_owner_paralysis_loss))
else
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_ARM)
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_ARM), .proc/on_owner_paralysis_gain)
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_ARM), PROC_REF(on_owner_paralysis_gain))
if(.)
var/mob/living/carbon/old_owner = .
if(HAS_TRAIT(old_owner, TRAIT_PARALYSIS_L_ARM))
@@ -104,7 +104,7 @@
SIGNAL_HANDLER
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_ARM)
UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_ARM))
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_ARM), .proc/on_owner_paralysis_loss)
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_ARM), PROC_REF(on_owner_paralysis_loss))
///Proc to react to the owner losing the TRAIT_PARALYSIS_L_ARM trait.
@@ -112,7 +112,7 @@
SIGNAL_HANDLER
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_ARM)
UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_ARM))
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_ARM), .proc/on_owner_paralysis_gain)
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_ARM), PROC_REF(on_owner_paralysis_gain))
/obj/item/bodypart/l_arm/set_disabled(new_disabled)
@@ -187,10 +187,10 @@
if(owner)
if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_ARM))
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_ARM)
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_ARM), .proc/on_owner_paralysis_loss)
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_ARM), PROC_REF(on_owner_paralysis_loss))
else
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_ARM)
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_ARM), .proc/on_owner_paralysis_gain)
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_ARM), PROC_REF(on_owner_paralysis_gain))
if(.)
var/mob/living/carbon/old_owner = .
if(HAS_TRAIT(old_owner, TRAIT_PARALYSIS_R_ARM))
@@ -206,7 +206,7 @@
SIGNAL_HANDLER
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_ARM)
UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_ARM))
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_ARM), .proc/on_owner_paralysis_loss)
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_ARM), PROC_REF(on_owner_paralysis_loss))
///Proc to react to the owner losing the TRAIT_PARALYSIS_R_ARM trait.
@@ -214,7 +214,7 @@
SIGNAL_HANDLER
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_ARM)
UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_ARM))
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_ARM), .proc/on_owner_paralysis_gain)
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_ARM), PROC_REF(on_owner_paralysis_gain))
/obj/item/bodypart/r_arm/set_disabled(new_disabled)
@@ -285,10 +285,10 @@
if(owner)
if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG))
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_LEG)
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_LEG), .proc/on_owner_paralysis_loss)
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_LEG), PROC_REF(on_owner_paralysis_loss))
else
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_LEG)
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_LEG), .proc/on_owner_paralysis_gain)
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_LEG), PROC_REF(on_owner_paralysis_gain))
if(.)
var/mob/living/carbon/old_owner = .
if(HAS_TRAIT(old_owner, TRAIT_PARALYSIS_L_LEG))
@@ -304,7 +304,7 @@
SIGNAL_HANDLER
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_LEG)
UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_LEG))
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_LEG), .proc/on_owner_paralysis_loss)
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_LEG), PROC_REF(on_owner_paralysis_loss))
///Proc to react to the owner losing the TRAIT_PARALYSIS_L_LEG trait.
@@ -312,7 +312,7 @@
SIGNAL_HANDLER
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_LEG)
UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_LEG))
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_LEG), .proc/on_owner_paralysis_gain)
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_LEG), PROC_REF(on_owner_paralysis_gain))
/obj/item/bodypart/leg/left/set_disabled(new_disabled)
@@ -378,10 +378,10 @@
if(owner)
if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG))
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_LEG)
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_LEG), .proc/on_owner_paralysis_loss)
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_LEG), PROC_REF(on_owner_paralysis_loss))
else
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_LEG)
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_LEG), .proc/on_owner_paralysis_gain)
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_LEG), PROC_REF(on_owner_paralysis_gain))
if(.)
var/mob/living/carbon/old_owner = .
if(HAS_TRAIT(old_owner, TRAIT_PARALYSIS_R_LEG))
@@ -397,7 +397,7 @@
SIGNAL_HANDLER
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_LEG)
UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_LEG))
- RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_LEG), .proc/on_owner_paralysis_loss)
+ RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_LEG), PROC_REF(on_owner_paralysis_loss))
///Proc to react to the owner losing the TRAIT_PARALYSIS_R_LEG trait.
@@ -405,7 +405,7 @@
SIGNAL_HANDLER
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_LEG)
UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_LEG))
- RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_LEG), .proc/on_owner_paralysis_gain)
+ RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_LEG), PROC_REF(on_owner_paralysis_gain))
/obj/item/bodypart/leg/right/set_disabled(new_disabled)
diff --git a/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm
index 163b94385dea..367c07a54970 100644
--- a/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm
@@ -1,31 +1,34 @@
/obj/item/bodypart/head/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
- is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ overlay_icon_state = TRUE
/obj/item/bodypart/chest/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ overlay_icon_state = TRUE
/obj/item/bodypart/l_arm/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
should_draw_greyscale = FALSE
/obj/item/bodypart/r_arm/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
should_draw_greyscale = FALSE
/obj/item/bodypart/leg/left/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
should_draw_greyscale = FALSE
+ overlay_icon_state = TRUE
/obj/item/bodypart/leg/right/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
should_draw_greyscale = FALSE
+ overlay_icon_state = TRUE
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
index f8314a7c6dfa..dc95ab97cece 100644
--- a/code/modules/surgery/organs/augments_chest.dm
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -23,7 +23,7 @@
synthesizing = TRUE
to_chat(owner, "You feel less hungry...")
owner.adjust_nutrition(50)
- addtimer(CALLBACK(src, .proc/synth_cool), 50)
+ addtimer(CALLBACK(src, PROC_REF(synth_cool)), 50)
/obj/item/organ/cyberimp/chest/nutriment/proc/synth_cool()
synthesizing = FALSE
@@ -59,7 +59,7 @@
if(reviving)
switch(owner.stat)
if(UNCONSCIOUS, HARD_CRIT)
- addtimer(CALLBACK(src, .proc/heal), 3 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(heal)), 3 SECONDS)
else
COOLDOWN_START(src, reviver_cooldown, revive_cost)
reviving = FALSE
@@ -105,7 +105,7 @@
if(H.stat != DEAD && prob(50 / severity) && H.can_heartattack())
H.set_heartattack(TRUE)
to_chat(H, "You feel a horrible agony in your chest!")
- addtimer(CALLBACK(src, .proc/undo_heart_attack), 600 / severity)
+ addtimer(CALLBACK(src, PROC_REF(undo_heart_attack)), 600 / severity)
/obj/item/organ/cyberimp/chest/reviver/proc/undo_heart_attack()
var/mob/living/carbon/human/H = owner
@@ -154,9 +154,9 @@
if(allow_thrust(0.01))
on = TRUE
ion_trail.start()
- RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/move_react)
+ RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(move_react))
owner.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/cybernetic)
- RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, .proc/pre_move_react)
+ RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(pre_move_react))
if(!silent)
to_chat(owner, "You turn your thrusters set on.")
else
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index a7a383927b0e..ae6f1cf43d39 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -115,11 +115,11 @@
/obj/item/organ/cyberimp/brain/anti_stun/Insert()
. = ..()
- RegisterSignal(owner, signalCache, .proc/on_signal)
+ RegisterSignal(owner, signalCache, PROC_REF(on_signal))
/obj/item/organ/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount)
if(!(organ_flags & ORGAN_FAILING) && amount > 0)
- addtimer(CALLBACK(src, .proc/clear_stuns), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE)
+ addtimer(CALLBACK(src, PROC_REF(clear_stuns)), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE)
/obj/item/organ/cyberimp/brain/anti_stun/proc/clear_stuns()
if(owner || !(organ_flags & ORGAN_FAILING))
@@ -133,7 +133,7 @@
if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF)
return
organ_flags |= ORGAN_FAILING
- addtimer(CALLBACK(src, .proc/reboot), 90 / severity)
+ addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity)
/obj/item/organ/cyberimp/brain/anti_stun/proc/reboot()
organ_flags &= ~ORGAN_FAILING
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index 0bd9ed46d1a9..de0ebac6eddb 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -301,7 +301,7 @@
/obj/item/organ/eyes/robotic/glow/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = FALSE)
. = ..()
- RegisterSignal(M, COMSIG_ATOM_DIR_CHANGE, .proc/update_visuals)
+ RegisterSignal(M, COMSIG_ATOM_DIR_CHANGE, PROC_REF(update_visuals))
/obj/item/organ/eyes/robotic/glow/Remove(mob/living/carbon/M, special = FALSE)
. = ..()
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index cafcc0196b1b..26b93d2c4642 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -31,7 +31,7 @@
/obj/item/organ/heart/Remove(mob/living/carbon/M, special = 0)
..()
if(!special)
- addtimer(CALLBACK(src, .proc/stop_if_unowned), 120)
+ addtimer(CALLBACK(src, PROC_REF(stop_if_unowned)), 120)
/obj/item/organ/heart/proc/stop_if_unowned()
if(!owner)
@@ -43,7 +43,7 @@
user.visible_message("[user] squeezes [src] to \
make it beat again!","You squeeze [src] to make it beat again!")
Restart()
- addtimer(CALLBACK(src, .proc/stop_if_unowned), 80)
+ addtimer(CALLBACK(src, PROC_REF(stop_if_unowned)), 80)
/obj/item/organ/heart/proc/Stop()
beating = 0
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 51d857aaeff6..4b5dd9a49717 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -38,7 +38,7 @@
/obj/item/organ/Initialize()
. = ..()
if(organ_flags & ORGAN_EDIBLE)
- AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GORE, null, 10, null, null, null, CALLBACK(src, .proc/OnEatFrom))
+ AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GORE, null, 10, null, null, null, CALLBACK(src, PROC_REF(OnEatFrom)))
///When you take a bite you cant jam it in for surgery anymore.
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm
index 10cc049eb806..2e2403db14c6 100644
--- a/code/modules/surgery/organs/stomach.dm
+++ b/code/modules/surgery/organs/stomach.dm
@@ -109,8 +109,8 @@
/obj/item/organ/stomach/ethereal/Insert(mob/living/carbon/M, special = 0)
..()
- RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge)
- RegisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_electrocute)
+ RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(charge))
+ RegisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(on_electrocute))
/obj/item/organ/stomach/ethereal/Remove(mob/living/carbon/M, special = 0)
UnregisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT)
diff --git a/code/modules/surgery/organs/tails.dm b/code/modules/surgery/organs/tails.dm
index f587a26d8404..2d3e402150a2 100644
--- a/code/modules/surgery/organs/tails.dm
+++ b/code/modules/surgery/organs/tails.dm
@@ -83,7 +83,7 @@
/obj/item/organ/tail/lizard/fake
name = "fabricated lizard tail"
- desc = "A fabricated severed lizard tail. This one's made of synthflesh. Probably not usable for lizard wine."
+ desc = "A fabricated severed lizard tail. This one's made of synthflesh."
/obj/item/organ/tail/elzu
name = "\improper Elzuose tail"
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index 77fae8c0bb87..40920cc5d21a 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -34,13 +34,13 @@
/obj/item/organ/tongue/Insert(mob/living/carbon/M, special = 0)
..()
if (modifies_speech)
- RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
+ RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech))
M.UnregisterSignal(M, COMSIG_MOB_SAY)
/obj/item/organ/tongue/Remove(mob/living/carbon/M, special = 0)
..()
- UnregisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
- M.RegisterSignal(M, COMSIG_MOB_SAY, /mob/living/carbon/.proc/handle_tongueless_speech)
+ UnregisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech))
+ M.RegisterSignal(M, COMSIG_MOB_SAY, TYPE_PROC_REF(/mob/living/carbon, handle_tongueless_speech))
/obj/item/organ/tongue/could_speak_language(language)
return is_type_in_typecache(language, languages_possible)
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 7fdf9532de17..1a0f1ea60f3d 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -368,7 +368,7 @@
text = devilinfo.truename
else
text = L.real_name
- addtimer(CALLBACK(L, /atom/movable/proc/say, text), 5 * i)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/atom/movable, say), text), 5 * i)
i++
//SAY MY NAME
@@ -376,7 +376,7 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
- addtimer(CALLBACK(L, /atom/movable/proc/say, user.name), 5 * i)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/atom/movable, say), user.name), 5 * i)
i++
//KNOCK KNOCK
@@ -384,7 +384,7 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
- addtimer(CALLBACK(L, /atom/movable/proc/say, "Who's there?"), 5 * i)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/atom/movable, say), "Who's there?"), 5 * i)
i++
//STATE LAWS
@@ -408,7 +408,7 @@
for(var/iter in 1 to 5 * power_multiplier)
for(var/V in listeners)
var/mob/living/L = V
- addtimer(CALLBACK(GLOBAL_PROC, .proc/_step, L, direction? direction : pick(GLOB.cardinals)), 10 * (iter - 1))
+ addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(_step), L, direction? direction : pick(GLOB.cardinals)), 10 * (iter - 1))
//WALK
else if((findtext(message, walk_words)))
@@ -431,7 +431,7 @@
cooldown = COOLDOWN_MEME
for(var/mob/living/carbon/human/H in listeners)
addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HELP), i * 2)
- addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2)
+ addtimer(CALLBACK(H, TYPE_PROC_REF(/mob, click_random_mob)), i * 2)
i++
//DISARM INTENT
@@ -439,7 +439,7 @@
cooldown = COOLDOWN_MEME
for(var/mob/living/carbon/human/H in listeners)
addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_DISARM), i * 2)
- addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2)
+ addtimer(CALLBACK(H, TYPE_PROC_REF(/mob, click_random_mob)), i * 2)
i++
//GRAB INTENT
@@ -447,7 +447,7 @@
cooldown = COOLDOWN_MEME
for(var/mob/living/carbon/human/H in listeners)
addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_GRAB), i * 2)
- addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2)
+ addtimer(CALLBACK(H, TYPE_PROC_REF(/mob, click_random_mob)), i * 2)
i++
//HARM INTENT
@@ -455,7 +455,7 @@
cooldown = COOLDOWN_MEME
for(var/mob/living/carbon/human/H in listeners)
addtimer(CALLBACK(H, /mob/verb/a_intent_change, INTENT_HARM), i * 2)
- addtimer(CALLBACK(H, /mob/proc/click_random_mob), i * 2)
+ addtimer(CALLBACK(H, TYPE_PROC_REF(/mob, click_random_mob)), i * 2)
i++
//THROW/CATCH
@@ -476,7 +476,7 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
- addtimer(CALLBACK(L, /atom/movable/proc/say, pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")), 5 * i)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/atom/movable, say), pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")), 5 * i)
i++
//GET UP
@@ -509,7 +509,7 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
- addtimer(CALLBACK(L, /mob/living/.proc/emote, "dance"), 5 * i)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, emote), "dance"), 5 * i)
i++
//JUMP
@@ -518,8 +518,8 @@
for(var/V in listeners)
var/mob/living/L = V
if(prob(25))
- addtimer(CALLBACK(L, /atom/movable/proc/say, "HOW HIGH?!!"), 5 * i)
- addtimer(CALLBACK(L, /mob/living/.proc/emote, "jump"), 5 * i)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/atom/movable, say), "HOW HIGH?!!"), 5 * i)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, emote), "jump"), 5 * i)
i++
//SALUTE
@@ -527,7 +527,7 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
- addtimer(CALLBACK(L, /mob/living/.proc/emote, "salute"), 5 * i)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, emote), "salute"), 5 * i)
i++
//PLAY DEAD
@@ -535,7 +535,7 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
- addtimer(CALLBACK(L, /mob/living/.proc/emote, "deathgasp"), 5 * i)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, emote), "deathgasp"), 5 * i)
i++
//PLEASE CLAP
@@ -543,13 +543,13 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
- addtimer(CALLBACK(L, /mob/living/.proc/emote, "clap"), 5 * i)
+ addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, emote), "clap"), 5 * i)
i++
//HONK
else if((findtext(message, honk_words)))
cooldown = COOLDOWN_MEME
- addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, get_turf(user), 'sound/items/bikehorn.ogg', 300, 1), 25)
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), get_turf(user), 'sound/items/bikehorn.ogg', 300, 1), 25)
if(user.mind && user.mind.assigned_role == "Clown")
for(var/mob/living/carbon/C in listeners)
C.slip(140 * power_multiplier)
diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm
index 41a047339452..b9a9f27a28ae 100644
--- a/code/modules/tgs/core/core.dm
+++ b/code/modules/tgs/core/core.dm
@@ -153,4 +153,9 @@
/world/TgsSecurityLevel()
var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs)
if(api)
- api.SecurityLevel()
+ return api.SecurityLevel()
+
+/world/TgsVisibility()
+ var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs)
+ if(api)
+ return api.Visibility()
diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm
index 68b0330fe860..07ce3b684584 100644
--- a/code/modules/tgs/core/datum.dm
+++ b/code/modules/tgs/core/datum.dm
@@ -11,6 +11,15 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null)
src.event_handler = event_handler
src.version = version
+/datum/tgs_api/proc/TerminateWorld()
+ while(TRUE)
+ TGS_DEBUG_LOG("About to terminate world. Tick: [world.time], sleep_offline: [world.sleep_offline]")
+ world.sleep_offline = FALSE // https://www.byond.com/forum/post/2894866
+ del(world)
+ world.sleep_offline = FALSE // just in case, this is BYOND after all...
+ sleep(1)
+ TGS_DEBUG_LOG("BYOND DIDN'T TERMINATE THE WORLD!!! TICK IS: [world.time], sleep_offline: [world.sleep_offline]")
+
/datum/tgs_api/latest
parent_type = /datum/tgs_api/v5
@@ -57,3 +66,6 @@ TGS_PROTECT_DATUM(/datum/tgs_api)
/datum/tgs_api/proc/SecurityLevel()
return TGS_UNIMPLEMENTED
+
+/datum/tgs_api/proc/Visibility()
+ return TGS_UNIMPLEMENTED
diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm
index b9a75c4abb48..945e2e411767 100644
--- a/code/modules/tgs/v4/api.dm
+++ b/code/modules/tgs/v4/api.dm
@@ -73,7 +73,7 @@
if(cached_json["apiValidateOnly"])
TGS_INFO_LOG("Validating API and exiting...")
Export(TGS4_COMM_VALIDATE, list(TGS4_PARAMETER_DATA = "[minimum_required_security_level]"))
- del(world)
+ TerminateWorld()
security_level = cached_json["securityLevel"]
chat_channels_json_path = cached_json["chatChannelsJson"]
@@ -188,7 +188,7 @@
requesting_new_port = TRUE
if(!world.OpenPort(0)) //open any port
TGS_ERROR_LOG("Unable to open random port to retrieve new port![TGS4_PORT_CRITFAIL_MESSAGE]")
- del(world)
+ TerminateWorld()
//request a new port
export_lock = FALSE
@@ -196,16 +196,16 @@
if(!new_port_json)
TGS_ERROR_LOG("No new port response from server![TGS4_PORT_CRITFAIL_MESSAGE]")
- del(world)
+ TerminateWorld()
var/new_port = new_port_json[TGS4_PARAMETER_DATA]
if(!isnum(new_port) || new_port <= 0)
TGS_ERROR_LOG("Malformed new port json ([json_encode(new_port_json)])![TGS4_PORT_CRITFAIL_MESSAGE]")
- del(world)
+ TerminateWorld()
if(new_port != world.port && !world.OpenPort(new_port))
TGS_ERROR_LOG("Unable to open port [new_port]![TGS4_PORT_CRITFAIL_MESSAGE]")
- del(world)
+ TerminateWorld()
requesting_new_port = FALSE
while(export_lock)
diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm
index 5d3d491a7362..1b52b31d6a73 100644
--- a/code/modules/tgs/v5/__interop_version.dm
+++ b/code/modules/tgs/v5/__interop_version.dm
@@ -1 +1 @@
-"5.6.1"
+"5.6.2"
diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm
index f973338daa03..bdcd4e4dd58e 100644
--- a/code/modules/tgs/v5/_defines.dm
+++ b/code/modules/tgs/v5/_defines.dm
@@ -48,6 +48,7 @@
#define DMAPI5_RUNTIME_INFORMATION_REVISION "revision"
#define DMAPI5_RUNTIME_INFORMATION_TEST_MERGES "testMerges"
#define DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL "securityLevel"
+#define DMAPI5_RUNTIME_INFORMATION_VISIBILITY "visibility"
#define DMAPI5_CHAT_UPDATE_CHANNELS "channels"
diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm
index 34cc43f8762f..7226f29bba60 100644
--- a/code/modules/tgs/v5/api.dm
+++ b/code/modules/tgs/v5/api.dm
@@ -4,6 +4,7 @@
var/instance_name
var/security_level
+ var/visibility
var/reboot_mode = TGS_REBOOT_MODE_NORMAL
@@ -50,10 +51,11 @@
if(runtime_information[DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY])
TGS_INFO_LOG("DMAPI validation, exiting...")
- del(world)
+ TerminateWorld()
version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION])
security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL]
+ visibility = runtime_information[DMAPI5_RUNTIME_INFORMATION_VISIBILITY]
instance_name = runtime_information[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME]
var/list/revisionData = runtime_information[DMAPI5_RUNTIME_INFORMATION_REVISION]
@@ -252,3 +254,7 @@
/datum/tgs_api/v5/SecurityLevel()
RequireInitialBridgeResponse()
return security_level
+
+/datum/tgs_api/v5/Visibility()
+ RequireInitialBridgeResponse()
+ return visibility
diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm
index c679737dfc49..f163adaaafe3 100644
--- a/code/modules/tgs/v5/undefs.dm
+++ b/code/modules/tgs/v5/undefs.dm
@@ -48,6 +48,7 @@
#undef DMAPI5_RUNTIME_INFORMATION_REVISION
#undef DMAPI5_RUNTIME_INFORMATION_TEST_MERGES
#undef DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL
+#undef DMAPI5_RUNTIME_INFORMATION_VISIBILITY
#undef DMAPI5_CHAT_UPDATE_CHANNELS
diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm
index de912957a0ac..a79966f69ba1 100644
--- a/code/modules/tgui/tgui.dm
+++ b/code/modules/tgui/tgui.dm
@@ -312,8 +312,7 @@
window = window,
src_object = src_object)
process_status()
- if(src_object.ui_act(act_type, payload, src, state))
- SStgui.update_uis(src_object)
+ DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(on_act_message), act_type, payload, state))
return FALSE
switch(type)
if("ready")
@@ -332,3 +331,10 @@
return
LAZYSET(src_object.tgui_shared_states, href_list["key"], href_list["value"])
SStgui.update_uis(src_object)
+
+/// Wrapper for behavior to potentially wait until the next tick if the server is overloaded
+/datum/tgui/proc/on_act_message(act_type, payload, state)
+ if(QDELETED(src) || QDELETED(src_object))
+ return
+ if(src_object.ui_act(act_type, payload, src, state))
+ SStgui.update_uis(src_object)
diff --git a/code/modules/tgui_panel/tgui_panel.dm b/code/modules/tgui_panel/tgui_panel.dm
index 8327fb838eb7..fdd74389c837 100644
--- a/code/modules/tgui_panel/tgui_panel.dm
+++ b/code/modules/tgui_panel/tgui_panel.dm
@@ -16,7 +16,7 @@
/datum/tgui_panel/New(client/client)
src.client = client
window = new(client, "browseroutput")
- window.subscribe(src, .proc/on_message)
+ window.subscribe(src, PROC_REF(on_message))
/datum/tgui_panel/Del()
window.unsubscribe(src)
@@ -49,7 +49,7 @@
window.send_asset(get_asset_datum(/datum/asset/simple/namespaced/fontawesome))
window.send_asset(get_asset_datum(/datum/asset/spritesheet/chat))
request_telemetry()
- addtimer(CALLBACK(src, .proc/on_initialize_timed_out), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(on_initialize_timed_out)), 5 SECONDS)
/**
* private
diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm
index 31e570cd9431..f0cb3562bdf2 100644
--- a/code/modules/tooltip/tooltip.dm
+++ b/code/modules/tooltip/tooltip.dm
@@ -88,7 +88,7 @@ Notes:
/datum/tooltip/proc/hide()
if (queueHide)
- addtimer(CALLBACK(src, .proc/do_hide), 1)
+ addtimer(CALLBACK(src, PROC_REF(do_hide)), 1)
else
do_hide()
diff --git a/code/modules/unit_tests/biome_lists.dm b/code/modules/unit_tests/biome_lists.dm
index 7c7500155235..18334cc8a15d 100644
--- a/code/modules/unit_tests/biome_lists.dm
+++ b/code/modules/unit_tests/biome_lists.dm
@@ -2,9 +2,14 @@
for(var/biome_type as anything in SSmapping.biomes)
var/datum/biome/biome = SSmapping.biomes[biome_type]
+ validate_chance(biome.open_turf_types, "open turf", biome_type)
validate_chance(biome.mob_spawn_list, "mob spawn", biome_type)
validate_chance(biome.flora_spawn_list, "flora spawn", biome_type)
validate_chance(biome.feature_spawn_list, "feature spawn", biome_type)
+ if(!istype(biome, /datum/biome/cave))
+ continue
+ var/datum/biome/cave/cave = biome
+ validate_chance(cave.closed_turf_types, "closed turf", biome_type)
/datum/unit_test/biome_lists/proc/validate_chance(list/to_check, name, biome)
if(to_check && !islist(to_check))
@@ -14,5 +19,5 @@
if(!value)
TEST_FAIL("Biome [biome] has no [name] weight for [type]")
return
- if(!isnum(value) || value < 1 || value != round(value))
+ if(!isnum(value) || value < 1 || value != round(value)) //ensures natural numbers
TEST_FAIL("Biome [biome] has invalid [name] chance for [type] ([value])")
diff --git a/code/modules/unit_tests/combat.dm b/code/modules/unit_tests/combat.dm
index 30bad7217514..0ad01c2cb9f8 100644
--- a/code/modules/unit_tests/combat.dm
+++ b/code/modules/unit_tests/combat.dm
@@ -53,9 +53,9 @@
var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human)
var/obj/item/storage/toolbox/toolbox = allocate(/obj/item/storage/toolbox)
- RegisterSignal(toolbox, COMSIG_ITEM_PRE_ATTACK, .proc/pre_attack_hit)
- RegisterSignal(toolbox, COMSIG_ITEM_ATTACK, .proc/attack_hit)
- RegisterSignal(toolbox, COMSIG_ITEM_AFTERATTACK, .proc/post_attack_hit)
+ RegisterSignal(toolbox, COMSIG_ITEM_PRE_ATTACK, PROC_REF(pre_attack_hit))
+ RegisterSignal(toolbox, COMSIG_ITEM_ATTACK, PROC_REF(attack_hit))
+ RegisterSignal(toolbox, COMSIG_ITEM_AFTERATTACK, PROC_REF(post_attack_hit))
attacker.put_in_active_hand(toolbox, forced = TRUE)
attacker.a_intent_change(INTENT_HARM)
diff --git a/code/modules/unit_tests/connect_loc.dm b/code/modules/unit_tests/connect_loc.dm
index 511e1745a73a..e169cab1be5d 100644
--- a/code/modules/unit_tests/connect_loc.dm
+++ b/code/modules/unit_tests/connect_loc.dm
@@ -63,7 +63,7 @@
. = ..()
var/static/list/connections = list(
- COMSIG_MOCK_SIGNAL = .proc/on_receive_mock_signal,
+ COMSIG_MOCK_SIGNAL = PROC_REF(on_receive_mock_signal),
)
AddElement(/datum/element/connect_loc, connections)
diff --git a/code/modules/unit_tests/emoting.dm b/code/modules/unit_tests/emoting.dm
index 5795ab34374f..7111107b709b 100644
--- a/code/modules/unit_tests/emoting.dm
+++ b/code/modules/unit_tests/emoting.dm
@@ -3,7 +3,7 @@
/datum/unit_test/emoting/Run()
var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)
- RegisterSignal(human, COMSIG_MOB_EMOTE, .proc/on_emote_used)
+ RegisterSignal(human, COMSIG_MOB_EMOTE, PROC_REF(on_emote_used))
human.say("*shrug")
TEST_ASSERT_EQUAL(emotes_used, 1, "Human did not shrug")
diff --git a/code/modules/unit_tests/projectiles.dm b/code/modules/unit_tests/projectiles.dm
index 4950be10c1a6..e93d20910af0 100644
--- a/code/modules/unit_tests/projectiles.dm
+++ b/code/modules/unit_tests/projectiles.dm
@@ -19,6 +19,7 @@
gunner.put_in_hands(test_gun, forced=TRUE)
var/expected_damage = loaded_bullet.damage
loaded_bullet.def_zone = BODY_ZONE_CHEST
+ test_gun.safety = FALSE //So we can shoot the gun
var/did_we_shoot = test_gun.afterattack(victim, gunner)
TEST_ASSERT(did_we_shoot, "Gun does not appeared to have successfully fired.")
TEST_ASSERT_EQUAL(victim.getBruteLoss(), expected_damage, "Victim took incorrect amount of damage, expected [expected_damage], got [victim.getBruteLoss()].")
diff --git a/code/modules/unit_tests/resist.dm b/code/modules/unit_tests/resist.dm
index 265c0bd74991..542ad40ef1e1 100644
--- a/code/modules/unit_tests/resist.dm
+++ b/code/modules/unit_tests/resist.dm
@@ -12,4 +12,8 @@
// Stop, drop, and roll has a sleep call. This would delay the test, and is not necessary.
CallAsync(human, /mob/living/verb/resist)
+ //since resist() is a verb that possibly queues its actual execution for the next tick, we need to make the subsystem that handles the delayed execution process
+ //the callback. either that or sleep ourselves and see if it ran.
+ SSverb_manager.run_verb_queue()
+
TEST_ASSERT(human.fire_stacks < 5, "Human did not lower fire stacks after resisting")
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 6eea344afde0..53b49ab30f0b 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -197,9 +197,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/bundles_TC/firestarter
name = "Spetsnaz Pyro bundle"
- desc = "For systematic suppression of carbon lifeforms in close quarters: Contains a lethal New Russian backpack spray, Elite hardsuit, \
- Stechkin APS pistol, two magazines, a minibomb and a stimulant syringe. \
- Order NOW and comrade Boris will throw in an extra tracksuit."
+ desc = "For systematic suppression of carbon lifeforms in close quarters: Contains a lethal backpack spray, Elite hardsuit, \
+ Stechkin APS pistol, two magazines, a minibomb and a stimulant syringe."
item = /obj/item/storage/backpack/duffelbag/syndie/firestarter
cost = 30
include_modes = list(/datum/game_mode/nuclear)
diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm
index 4fde603ee8c7..6b53fa9a02c3 100644
--- a/code/modules/vehicles/cars/car.dm
+++ b/code/modules/vehicles/cars/car.dm
@@ -80,7 +80,7 @@
if(occupant_amount() >= max_occupants)
return FALSE
var/atom/old_loc = loc
- if(do_mob(forcer, M, get_enter_delay(M), extra_checks=CALLBACK(src, /obj/vehicle/sealed/car/proc/is_car_stationary, old_loc)))
+ if(do_mob(forcer, M, get_enter_delay(M), extra_checks=CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/car, is_car_stationary), old_loc)))
mob_forced_enter(M, silent)
return TRUE
return FALSE
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index 80511d5ea153..e9addbd2d5bf 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -27,7 +27,7 @@
var/mob/living/carbon/human/H = M
if(H.mind && H.mind.assigned_role == "Clown") //Ensures only clowns can drive the car. (Including more at once)
add_control_flags(H, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_PERMISSION)
- RegisterSignal(H, COMSIG_MOB_CLICKON, .proc/FireCannon)
+ RegisterSignal(H, COMSIG_MOB_CLICKON, PROC_REF(FireCannon))
M.log_message("has entered [src] as a possible driver", LOG_ATTACK)
return
add_control_flags(M, VEHICLE_CONTROL_KIDNAPPED)
@@ -125,7 +125,7 @@
visible_message("[user] presses one of the colorful buttons on [src], and the clown car turns on its singularity disguise system.")
icon = 'icons/obj/singularity.dmi'
icon_state = "singularity_s1"
- addtimer(CALLBACK(src, .proc/ResetIcon), 100)
+ addtimer(CALLBACK(src, PROC_REF(ResetIcon)), 100)
if(4)
visible_message("[user] presses one of the colorful buttons on [src], and the clown car spews out a cloud of laughing gas.")
var/datum/reagents/R = new/datum/reagents(300)
@@ -138,7 +138,7 @@
if(5)
visible_message("[user] presses one of the colorful buttons on [src], and the clown car starts dropping an oil trail.")
droppingoil = TRUE
- addtimer(CALLBACK(src, .proc/StopDroppingOil), 30)
+ addtimer(CALLBACK(src, PROC_REF(StopDroppingOil)), 30)
if(6)
visible_message("[user] presses one of the colorful buttons on [src], and the clown car lets out a comedic toot.")
playsound(src, 'sound/vehicles/clowncar_fart.ogg', 100)
@@ -160,7 +160,7 @@
cannonmode = FALSE
flick("clowncar_fromfire", src)
icon_state = "clowncar"
- addtimer(CALLBACK(src, .proc/LeaveCannonMode), 20)
+ addtimer(CALLBACK(src, PROC_REF(LeaveCannonMode)), 20)
playsound(src, 'sound/vehicles/clowncar_cannonmode2.ogg', 75)
visible_message("The [src] starts going back into mobile mode.")
else
@@ -168,7 +168,7 @@
flick("clowncar_tofire", src)
icon_state = "clowncar_fire"
visible_message("The [src] opens up and reveals a large cannon.")
- addtimer(CALLBACK(src, .proc/EnterCannonMode), 20)
+ addtimer(CALLBACK(src, PROC_REF(EnterCannonMode)), 20)
playsound(src, 'sound/vehicles/clowncar_cannonmode1.ogg', 75)
diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm
index b70ea004fd37..6dee79d6e69a 100644
--- a/code/modules/vehicles/scooter.dm
+++ b/code/modules/vehicles/scooter.dm
@@ -141,7 +141,7 @@
if(location)
location.hotspot_expose(1000,1000)
sparks.start() //the most radical way to start plasma fires
- addtimer(CALLBACK(src, .proc/grind), 2)
+ addtimer(CALLBACK(src, PROC_REF(grind)), 2)
return
else
grinding = FALSE
diff --git a/code/modules/vehicles/vehicle_actions.dm b/code/modules/vehicles/vehicle_actions.dm
index 26335d43f03d..18841271cfc0 100644
--- a/code/modules/vehicles/vehicle_actions.dm
+++ b/code/modules/vehicles/vehicle_actions.dm
@@ -225,5 +225,5 @@
if(locate(/obj/structure/table) in V.loc.contents)
V.grinding = TRUE
V.icon_state = "[V.board_icon]-grind"
- addtimer(CALLBACK(V, /obj/vehicle/ridden/scooter/skateboard/.proc/grind), 2)
+ addtimer(CALLBACK(V, TYPE_PROC_REF(/obj/vehicle/ridden/scooter/skateboard, grind)), 2)
next_ollie = world.time + 5
diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm
index e9dc5d9b6488..1f6c96bc0c01 100644
--- a/code/modules/vehicles/wheelchair.dm
+++ b/code/modules/vehicles/wheelchair.dm
@@ -23,7 +23,7 @@
/obj/vehicle/ridden/wheelchair/ComponentInitialize() //Since it's technically a chair I want it to have chair properties
. = ..()
- AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE, CALLBACK(src, .proc/can_user_rotate),CALLBACK(src, .proc/can_be_rotated),null)
+ AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE, CALLBACK(src, PROC_REF(can_user_rotate)),CALLBACK(src, PROC_REF(can_be_rotated)),null)
/obj/vehicle/ridden/wheelchair/obj_destruction(damage_flag)
new /obj/item/stack/rods(drop_location(), 1)
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index 6eed73786620..4bca9034dd9b 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -52,7 +52,6 @@
/obj/item/clothing/head/pirate = 1,
/obj/item/clothing/head/bandana = 1,
/obj/item/clothing/head/bandana = 1,
- /obj/item/clothing/under/costume/soviet = 1,
/obj/item/clothing/head/trapper = 1,
/obj/item/clothing/suit/imperium_monk = 1,
/obj/item/clothing/mask/gas/cyborg = 1,
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index 13598f2bc13a..140d8c42a283 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -45,7 +45,6 @@
/obj/item/storage/belt/fannypack/blue = 3,
/obj/item/storage/belt/fannypack/red = 3,
/obj/item/clothing/under/pants/jeans = 2,
- /obj/item/clothing/under/pants/classicjeans = 2,
/obj/item/clothing/under/pants/camo = 2,
/obj/item/clothing/under/pants/blackjeans = 2,
/obj/item/clothing/under/pants/khaki = 2,
@@ -111,7 +110,6 @@
/obj/item/clothing/under/syndicate/tacticool/skirt = 1,
/obj/item/clothing/mask/balaclava = 1,
/obj/item/clothing/head/trapper = 1,
- /obj/item/clothing/under/costume/soviet = 1,
/obj/item/storage/belt/fannypack/black = 2,
/obj/item/clothing/suit/jacket/letterman_syndie = 1,
/obj/item/clothing/under/costume/jabroni = 1,
@@ -123,7 +121,6 @@
/obj/item/clothing/under/suit/checkered = 1,
/obj/item/clothing/suit/jacket/leather = 1,
/obj/item/clothing/suit/jacket/leather/overcoat = 1,
- /obj/item/clothing/under/pants/mustangjeans = 1,
/obj/item/clothing/neck/necklace/dope = 3,
/obj/item/clothing/suit/jacket/letterman_nanotrasen = 1,
/obj/item/instrument/piano_synth/headphones/spacepods = 1)
diff --git a/code/modules/vending/sovietsoda.dm b/code/modules/vending/sovietsoda.dm
index 599e2d22bbdb..0f80bf5324bc 100644
--- a/code/modules/vending/sovietsoda.dm
+++ b/code/modules/vending/sovietsoda.dm
@@ -3,7 +3,7 @@
desc = "Old sweet water vending machine."
icon_state = "sovietsoda"
light_mask = "soviet-light-mask"
- product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
+ product_ads = "Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
products = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/soda = 30)
contraband = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola = 20)
resistance_flags = FIRE_PROOF
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
index 30f94b56c1ca..dbd88b20c582 100644
--- a/code/modules/zombie/organs.dm
+++ b/code/modules/zombie/organs.dm
@@ -63,7 +63,7 @@
not even death can stop, you will rise again!")
var/revive_time = rand(revive_time_min, revive_time_max)
var/flags = TIMER_STOPPABLE
- timer_id = addtimer(CALLBACK(src, .proc/zombify, owner), revive_time, flags)
+ timer_id = addtimer(CALLBACK(src, PROC_REF(zombify), owner), revive_time, flags)
/obj/item/organ/zombie_infection/proc/zombify(mob/living/carbon/C)
timer_id = null
diff --git a/config/atmos_mix.txt b/config/atmos_mix.txt
deleted file mode 100644
index f7b21b503dd7..000000000000
--- a/config/atmos_mix.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-## HOW TO MIX A BATCH
-## First, unzip... wait, wrong docs
-
-## How to configure an atmos mix for a planet:
-## each entry is designed as follows:
-## WHITESANDS_ATMOS_MIX
<% of mix>
-
-## White Sands Atmospheric mix configuration
-
-WHITESANDS_ATMOS_MOLES 103.98
-
-WHITESANDS_ATMOS_MIX o2 0.105
-WHITESANDS_ATMOS_MIX co2 0.105
-WHITESANDS_ATMOS_MIX n2 0.79
diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt
deleted file mode 100644
index 5c685d825e0a..000000000000
--- a/config/awaymissionconfig.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-#List the potential random Z-levels here.
-#Maps must be the full path to them
-#Maps should be 255x255 or smaller and be bounded. Falling off the edge of the map will result in undefined behavior.
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-#!!IMPORTANT NOTES FOR HOSTING AWAY MISSIONS!!:
-#Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once.
-#DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors!
-
-#_maps/RandomZLevels/blackmarketpackers.dmm
-#_maps/RandomZLevels/spacebattle.dmm
-#_maps/RandomZLevels/TheBeach.dmm
-#_maps/RandomZLevels/Academy.dmm
-#_maps/RandomZLevels/wildwest.dmm
-#_maps/RandomZLevels/challenge.dmm
-#_maps/RandomZLevels/centcomAway.dmm
-#_maps/RandomZLevels/moonoutpost19.dmm
-#_maps/RandomZLevels/undergroundoutpost45.dmm
-#_maps/RandomZLevels/caves.dmm
-#_maps/RandomZLevels/snowdin.dmm
-#_maps/RandomZLevels/research.dmm
-#_maps/RandomZLevels/SnowCabin.dmm
-_maps/RandomZLevels/VR/snowdin_VR.dmm
diff --git a/config/external_rsc_urls.txt b/config/external_rsc_urls.txt
deleted file mode 100644
index 16d6faf653e8..000000000000
--- a/config/external_rsc_urls.txt
+++ /dev/null
@@ -1 +0,0 @@
-http://url_goes_here/shiptest.zip
diff --git a/config/iceruinblacklist.txt b/config/iceruinblacklist.txt
deleted file mode 100644
index 031188b80de3..000000000000
--- a/config/iceruinblacklist.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-#Listing maps here will blacklist them from generating in the ice moon.
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\IceRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-##RESPAWN
-#_maps/RandomRuins/IceRuins/icemoon_surface_slimerancher.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_drakelair.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_oldstation.dmm
-
-##MISC
-#_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_newcops.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_brazillianlab.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_burnies_lair.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm
diff --git a/config/jobs.txt b/config/jobs.txt
deleted file mode 100644
index a266110233d0..000000000000
--- a/config/jobs.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-#This allows easy configuration of the number of positions allowed for each job
-#Format is: [Job name]=[total positions],[spawn positions]
-#Job names must be identical to the title var of each job datum
-#Positions can be set to -1 to allow unlimited slots
-Captain=1,1
-Head of Personnel=1,1
-Head of Security=1,1
-Chief Engineer=1,1
-Research Director=1,1
-Chief Medical Officer=1,1
-
-Assistant=-1,-1
-Prisoner=0,2
-
-Quartermaster=1,1
-Cargo Technician=3,2
-Shaft Miner=3,3
-
-Bartender=1,1
-Cook=2,1
-Botanist=3,2
-Janitor=2,1
-
-Clown=1,1
-Mime=1,1
-Curator=1,1
-Lawyer=2,2
-
-Chaplain=1,1
-
-Station Engineer=5,5
-Atmospheric Technician=3,2
-
-Medical Doctor=5,3
-Paramedic=2,2
-Chemist=2,2
-Geneticist=2,2
-Virologist=1,1
-Psychologist=1,1
-
-Scientist=5,3
-Roboticist=2,2
-
-Warden=1,1
-Detective=1,1
-Security Officer=5,5
-Brig Physician=1,1
-
-AI=0,1
-Cyborg=0,1
diff --git a/config/jungleruinblacklist.txt b/config/jungleruinblacklist.txt
deleted file mode 100644
index faf518fde632..000000000000
--- a/config/jungleruinblacklist.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-#Listing maps here will blacklist them from generating in jungle planets
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\JungleRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-#_maps/RandomRuins/JungleRuins/jungle_botany.dmm
-#_maps/RandomRuins/JungleRuins/jungle_demon.dmm
-#_maps/RandomRuins/JungleRuins/jungle_hangar.dmm
-#_maps/RandomRuins/JungleRuins/jungle_nest.dmm
-#_maps/RandomRuins/JungleRuins/jungle_pirate.dmm
-#_maps/RandomRuins/JungleRuins/jungle_pizzawave.dmm
-#_maps/RandomRuins/JungleRuins/jungle_seedling.dmm
-#_maps/RandomRuins/JungleRuins/jungle_spider.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_abandonedsolgov.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_coffinpirate.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_ikea_ai.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_ninjashrine.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_roommates.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_tumblr_sexyman.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_unabomber_cabin.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_weed_shack.dmm
-#_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm
-#_maps/RandomRuins/JungleRuins/jungle_village.dmm
-#_maps/RandomRuins/JungleRuins/jungle_witch.dmm
-#_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm
-#_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm
-#_maps/RandomRuins/JungleRuins/jungle_paradise.dmm
diff --git a/config/lavaruinblacklist.txt b/config/lavaruinblacklist.txt
deleted file mode 100644
index 973b402ba7a1..000000000000
--- a/config/lavaruinblacklist.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-#Listing maps here will blacklist them from generating in lavaland.
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\LavaRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-##BIODOMES
-#_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_cube.dmm
-
-##RESPAWN
-#_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
-
-##SIN
-#_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm
-
-##MISC
-#_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_ww_vault.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_comm_outpost.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_crashed_pinnance.dmm
diff --git a/config/maps.txt b/config/maps.txt
deleted file mode 100644
index 23a0a19dcd45..000000000000
--- a/config/maps.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-This file contains a list of maps for use in map rotation.
-#Lines starting with # are ignored.
-Lines not inside map blocks are also ignored
-Duplicated entries use the latter one.
-All whitespace at the start and end of lines is ignored. (including indentation, thats just for show)
-Format:
-#map [map name] (name of .json file in _maps folder without the .json part)
- minplayers [number] (0 or less disables this requirement)
- maxplayers [number] (0 or less disables this requirement)
- default (The last map with this defined will get all votes of players who have not explicitly voted for a map)
- voteweight [number] (How much to count each player vote as, defaults to 1, setting to 0.5 counts each vote as half a vote, 2 as double, etc, Setting to 0 disables the map but allows players to still pick it)
- disabled (disables the map)
- votable (is this map votable)
-endmap
-
-map salvage
- default
- votable
-endmap
-
-map amogus
- votable
-endmap
-
-map diner
- votable
-endmap
-
-map minigalaxy
- votable
-endmap
-
-map engineergaming
- votable
-endmap
-
-map bubble
- votable
-endmap
-
-
-# Whiteships
-
-map boxship
- votable
-endmap
-
-map deltaship
- votable
-endmap
-
-map metaship
- votable
-endmap
-
-map midwayship
- votable
-endmap
-
-map pubbyship
- votable
-endmap
-
-map skipper
- votable
-endmap
diff --git a/config/resources.txt b/config/resources.txt
index 9cf9bea30a06..3a852e483ad8 100644
--- a/config/resources.txt
+++ b/config/resources.txt
@@ -3,7 +3,7 @@
# If you set this mutiple times, the server will rotate between the links.
# To use this, the compile option PRELOAD_RSC must be set to 0 to keep byond from preloading resources
-EXTERNAL_RSC_URLS http://cdn.white-sands.space/rsc/tgstation.rsc
+#EXTERNAL_RSC_URLS http://url_goes_here/shiptest.zip
########################
diff --git a/config/rockruinblacklist.txt b/config/rockruinblacklist.txt
deleted file mode 100644
index e38e248cd109..000000000000
--- a/config/rockruinblacklist.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-#Listing maps here will blacklist them from generating in rock planets
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\RockRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-#_maps/RandomRuins/RockRuins/rockplanet_boxsci.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_chaosmarine.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_clock.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_clowncrash.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_crash_cult.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_crash_kitchen.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_cult.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_dangerpod.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_daniel.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_fortress_of_solitide.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_heirophant.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_house.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_lab.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_miningexpedition.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_moth.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_ore_proccessing_facility.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_pandora.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_pioneer.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_pod.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_rd_god.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_soviet.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_tradepost.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_unhonorable.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_wizard.dmm
diff --git a/config/sandruinblacklist.txt b/config/sandruinblacklist.txt
deleted file mode 100644
index f54299fc4e44..000000000000
--- a/config/sandruinblacklist.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-#Listing maps here will blacklist them from generating on the sand planet.
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\IceRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-##MISC
-#_maps/RandomRuins/SandRuins/whitesands_surface_hermit.dmm
-#_maps/RandomRuins/SandRuins/whitesands_surface_solgovcrash.dmm
-#_maps/RandomRuins/SandRuins/crash_kitchen.dmm
-#_maps/RandomRuins/SandRuins/crash_bar.dmm
-#_maps/RandomRuins/SandRuins/crash_cargo.dmm
-#_maps/RandomRuins/SandRuins/crash_cult.dmm
diff --git a/config/spaceruinblacklist.txt b/config/spaceruinblacklist.txt
deleted file mode 100644
index f7116456ed5f..000000000000
--- a/config/spaceruinblacklist.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-#Listing maps here will blacklist them from generating in space.
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\SpaceRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-#_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm
-#_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm
-#_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
-#_maps/RandomRuins/SpaceRuins/bus.dmm
-#_maps/RandomRuins/SpaceRuins/caravanambush.dmm
-#_maps/RandomRuins/SpaceRuins/clericden.dmm
-#_maps/RandomRuins/SpaceRuins/cloning_facility.dmm
-#_maps/RandomRuins/SpaceRuins/clownplanet.dmm
-#_maps/RandomRuins/SpaceRuins/crashedclownship.dmm
-#_maps/RandomRuins/SpaceRuins/crashedship.dmm
-#_maps/RandomRuins/SpaceRuins/deepstorage.dmm
-#_maps/RandomRuins/SpaceRuins/djstation.dmm
-#_maps/RandomRuins/SpaceRuins/emptyshell.dmm
-#_maps/RandomRuins/SpaceRuins/Fast_Food.dmm
-#_maps/RandomRuins/SpaceRuins/gasthelizards.dmm
-#_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm
-#_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm
-#_maps/RandomRuins/SpaceRuins/intactemptyship.dmm
-#_maps/RandomRuins/SpaceRuins/listeningstation.dmm
-#_maps/RandomRuins/SpaceRuins/mechtransport.dmm
-#_maps/RandomRuins/SpaceRuins/mrow_thats_right
-#_maps/RandomRuins/SpaceRuins/oldAIsat.dmm
-#_maps/RandomRuins/SpaceRuins/oldstation.dmm
-#_maps/RandomRuins/SpaceRuins/oldteleporter.dmm
-#_maps/RandomRuins/SpaceRuins/onehalf.dmm
-#_maps/RandomRuins/SpaceRuins/power_puzzle.dmm
-#_maps/RandomRuins/SpaceRuins/scav_mining.dmm
-#_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm
-#_maps/RandomRuins/SpaceRuins/spacegym.dmm
-#_maps/RandomRuins/SpaceRuins/spacehotel.dmm
-#_maps/RandomRuins/SpaceRuins/thederelict.dmm
-#_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm
-#_maps/RandomRuins/SpaceRuins/vaporwave.dmm
-#_maps/RandomRuins/SpaceRuins/way_home.dmm
-#_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm
-#_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm
-#_maps/RandomRuins/SpaceRuins/forgottenship.dmm
diff --git a/dependencies.sh b/dependencies.sh
index ad77caaddd75..84ba6b96feab 100755
--- a/dependencies.sh
+++ b/dependencies.sh
@@ -11,7 +11,7 @@ export BYOND_MINOR=1588
export RUST_VERSION=1.67.0
#rust_g git tag
-export RUST_G_VERSION=1.2.0
+export RUST_G_VERSION=3.0.0
#node version
export NODE_VERSION=16
@@ -27,4 +27,4 @@ export PYTHON_VERSION=3.7.9
export AUXMOS_REPO=https://github.com/shiptest-ss13/auxmos
#auxmos version
-export AUXMOS_VERSION=v1.1.0
+export AUXMOS_VERSION=v1.2.6
diff --git a/html/changelogs/AutoChangeLog-pr-2334.yml b/html/changelogs/AutoChangeLog-pr-2334.yml
new file mode 100644
index 000000000000..e3996c84b408
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2334.yml
@@ -0,0 +1,21 @@
+author: Zevotech
+changes:
+ - {rscadd: 'departmental RND lootdrop spawners for imprinters, protolathes and techfabs'}
+ - {bugfix: dangerous_research.dmm now no longer has a space tile under a door and
+ a medical lathe instead of an omnilathe}
+ - {bugfix: whitesands_surface_camp_saloon can now spawn again after its remap into
+ a functional ruin}
+ - {bugfix: harmfactory.dmm's traps now work and loot has been adjusted to fit the
+ ruin better}
+ - {bugfix: provinggrounds.dmm now has a working SMES and power}
+ - {bugfix: singularity_lab fire extinguishers and a few poddoors now have correct
+ dirs}
+ - {rscdel: mechtransport.dmm and associated code}
+ - {rscdel: gasthelizards areas}
+ - {rscdel: nucleardump.dmm and associated code}
+ - {rscdel: gondolaasteroid.dmm and associated code}
+ - {rscdel: jungle_spider.dmm and associated code}
+ - {rscdel: whitesands_golem_hijack.dmm and associated code}
+ - {rscdel: rockplanet_clock.dmm and associated code}
+ - {rscdel: whitesands_surface_youreinsane.dmm and associated code}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-2415.yml b/html/changelogs/AutoChangeLog-pr-2415.yml
new file mode 100644
index 000000000000..8a04cb8c6af1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2415.yml
@@ -0,0 +1,5 @@
+author: Doubleumc
+changes:
+ - {tweak: Bubble now consistently faces east}
+ - {rscadd: added Bubble subshuttle dock}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-2491.yml b/html/changelogs/AutoChangeLog-pr-2491.yml
new file mode 100644
index 000000000000..147acd9226b7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-2491.yml
@@ -0,0 +1,4 @@
+author: Hibou48888
+changes:
+ - {bugfix: added a sprite for strange plant fruit}
+delete-after: true
diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml
index 01caa0c7f8e5..34dc45ee6419 100644
--- a/html/changelogs/archive/2023-10.yml
+++ b/html/changelogs/archive/2023-10.yml
@@ -36,3 +36,66 @@
- rscadd: adds the Heron Class Dreadnaught
thgvr:
- bugfix: Lugol is now admin spawn only
+2023-10-17:
+ Zytolg:
+ - rscadd: Added the Floating Resort to Beaches. Enjoy your moment in paradise!
+2023-10-18:
+ Auris456852:
+ - tweak: You can now take individual rounds out of an ammo box in your pocket by
+ alt-clicking!
+ Bjarl:
+ - balance: The cepheus's starting gear has been nerfed.
+ BogCreature:
+ - tweak: fish should no longer starve to death
+ - bugfix: the mech equipment panel works again
+ - bugfix: limbgrower legs should no longer runtime instead of spawning
+ - bugfix: crystal legion hearts inheriting the wrong sprites
+ - bugfix: vending machines falsely listing their prices as "free"
+ - bugfix: normal fulltile firelocks should build properly now
+ - bugfix: disposal pipes no longer generate metal when ejecting items through reinforced
+ plating
+ - bugfix: jukebox sprites
+ - bugfix: players can no longer telepathically fiddle with the zippers of bags
+ Doubleumc:
+ - tweak: Replaced Boyardee tiny fans with a holofield
+ meemofcourse:
+ - rscdel: Russian Battle Coat, Russian Uniform, Russian Officer Uniform, Russian
+ Helmet, Russian Boots, Russian Balaclava
+ - imagedel: Deleted sprites relating to the outfits above.
+ - rscdel: Stalinium and Capitalist Golems
+ - rscdel: Derelict Drones
+ - tweak: The butterbear is now on the Frontiersmen team.
+ - tweak: Modified the list of laws that an AI may recieve from being ioned.
+ - sounddel: The Soviet Anthem and the US Anthem.
+2023-10-19:
+ goober3:
+ - rscadd: the nt asteroid outpost now has a 56x40 hangar.
+ - bugfix: outpost hangars should no longer depressurize upon ship docking.
+ - bugfix: outpost wallmounts and doors have been fixed. please report any floating
+ extinguishers & hovering intercoms.
+ - bugfix: the independent outpost should stay powered forever.
+2023-10-21:
+ Skies-Of-Blue:
+ - bugfix: moth language bind now works as intended
+ retlaw34:
+ - rscadd: Two new barsigns
+2023-10-22:
+ spockye:
+ - rscadd: Added a new jungle ruin "jungle_cavecrew"
+ - rscadd: Added a new subshuttle "frontiersmen_gut"
+ - rscadd: Added a neutered subtype of all frontiersmen (doesn't drop guns)
+ - rscadd: Added new areas for the ruin
+ - rscadd: Added a subtype of the heavy frontiersmen corpse that lacks the minigun
+ pack
+2023-10-29:
+ retlaw34:
+ - rscadd: 22lr and cattleman revolver
+ - rscadd: many gun sounds
+ - balance: guns reworked
+2023-10-30:
+ thgvr:
+ - rscdel: Halloween no longer allows different species in prefs
+2023-10-31:
+ thgvr:
+ - imageadd: New rachnid sprites!
+ - imagedel: Removed Rachnid mandibles.
diff --git a/html/changelogs/archive/2023-11.yml b/html/changelogs/archive/2023-11.yml
new file mode 100644
index 000000000000..0f42d6a053ca
--- /dev/null
+++ b/html/changelogs/archive/2023-11.yml
@@ -0,0 +1,92 @@
+2023-11-01:
+ Zevotech:
+ - rscdel: Ruin blacklist text files.
+ - rscdel: Misc. deprecated text files.
+ Zytolg:
+ - rscadd: New Rockplanet Ruin
+ - rscadd: New ship manufacturer sprites.
+ - code_imp: Repaths areas in rockplanet.dmm to be in line with other ruins. Starts
+ using rockplanet.dmm.
+ - code_imp: Code support for Arrow & Axe Dockyard sprites.
+2023-11-05:
+ MarkSuckerberg:
+ - code_imp: 515 is now supported.
+ PositiveEntropy:
+ - imageadd: The leather duster now has a new color palette to match up with the
+ cowboy hat!
+2023-11-08:
+ PositiveEntropy:
+ - imageadd: Outfits for independent and Nanotrasen captains have been violently
+ reworked.
+ Zevotech:
+ - bugfix: Fixed snow siding decal pathing
+ - rscadd: Surrounded snow siding turf decal
+ meemofcourse:
+ - rscadd: You can no longer late-join as a character with a repeated name
+2023-11-09:
+ PositiveEntropy, AxieTheAxolotl:
+ - imageadd: The syndicate operator vest and helmet, the syndicate captain's garb,
+ and the hunter montagne's garb have been adjusted with better colors.
+ thgvr:
+ - rscadd: Digi sprites for loadout pants and CMM jumpsuit added
+ - rscadd: Pan-Gezenan Federation Asset Pack (Part One)
+2023-11-10:
+ MarkSuckerberg:
+ - rscadd: There's a few more descriptive docking errors now.
+ PositiveEntropy:
+ - rscadd: The Solarian Port Authority Has Now Permitted Inkwell-class Vessels To
+ Explore The Stars!
+ retlaw34:
+ - rscadd: redoes about 9 hairs
+ - rscdel: about 3 hairs
+2023-11-11:
+ MemedHams:
+ - bugfix: bloodstains no longer steal the shape of the first item to spill blood
+ retlaw34:
+ - rscadd: Adds gun safetys
+ - balance: Tacitcal reload time adjusted from 1.2 seconds to 1 second
+2023-11-14:
+ Bjarl:
+ - rscdel: the syndicate lavaland base has been removed.
+ - code_imp: syndicate outfits have been repathed. Please report anything weird.
+ retlaw34:
+ - rscadd: Adds a lot of new pAI faces! pAIs rejoice!
+2023-11-15:
+ Bjarl:
+ - rscadd: Syndicate groups have reported new models of turrets being attached to
+ their ships.
+ - rscadd: Static Anomalies are now even WORSE. Not balance wise. Roleplay wise.
+ FalloutFalcon:
+ - rscadd: 3 new Trickwines! Prism, Hearth, and Force
+ - tweak: tweaked the old Trickwines to be slightly more balanced
+ - rscadd: srm tree and Trickwine distiller
+ - tweak: copy big mortar code to small mortar so you can chose between grinding
+ and juicing
+ - refactor: splits smoke flags for more control over chemical reactions
+ - server: Blackbox now records more info about chems
+ GenericDM:
+ - tweak: you will now be warned before succumbing when talking in hardcrit
+ thgvr:
+ - rscadd: Gas overlays should now look normal on turfs with a color var set.
+ - rscadd: Saunas, craftable with wooden planks. Uses wood for fuel, and requires
+ water splashed on the sauna.
+ - rscadd: Towels. You can use them in-hand to change it from waist, chest, or head.
+ - bugfix: PGF items now have real names and descriptions.
+2023-11-16:
+ Bjarl:
+ - bugfix: The polymodial sensor array now properly changes icon_state.
+ PositiveEntropy:
+ - bugfix: Cybersun outfits have been adjusted to be less syndicate-generalist and
+ more Cybersun.
+ - imageadd: Cybersun has received a full visual overhaul, as well as new goodies!
+2023-11-17:
+ Bjarl:
+ - balance: passive plasmasoul gas making is gone
+ - bugfix: plasmasouls no longer make infinite free lag
+ Erika Fox:
+ - rscadd: Outpost 1 has been remapped into something fathomably less ass. It's a
+ bit smaller, probably, but I'm going to call that a good thing.
+ - rscadd: random number spawner. It's good for hull numbers that shouldn't be static.
+ - imageadd: a really bad sprite for a service directions sign.
+ - rscadd: Another elevator template (coincidentally demonstrating how that system
+ works in code)
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 610c8768cd75..0aa256c631e4 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi
index 4d8c0f925b41..1e03d316c2e3 100644
Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index 105b302b7ffb..a82a1e208f85 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi
index 02e39b1a0ae4..377d505a5e05 100644
Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ
diff --git a/icons/mob/clothing/faction/gezena/back.dmi b/icons/mob/clothing/faction/gezena/back.dmi
new file mode 100644
index 000000000000..1c5ef723b094
Binary files /dev/null and b/icons/mob/clothing/faction/gezena/back.dmi differ
diff --git a/icons/mob/clothing/faction/gezena/belt.dmi b/icons/mob/clothing/faction/gezena/belt.dmi
new file mode 100644
index 000000000000..cdd27bcf1e96
Binary files /dev/null and b/icons/mob/clothing/faction/gezena/belt.dmi differ
diff --git a/icons/mob/clothing/faction/gezena/feet.dmi b/icons/mob/clothing/faction/gezena/feet.dmi
new file mode 100644
index 000000000000..f0d1fb0a6550
Binary files /dev/null and b/icons/mob/clothing/faction/gezena/feet.dmi differ
diff --git a/icons/mob/clothing/faction/gezena/hands.dmi b/icons/mob/clothing/faction/gezena/hands.dmi
new file mode 100644
index 000000000000..8e9a99d30dab
Binary files /dev/null and b/icons/mob/clothing/faction/gezena/hands.dmi differ
diff --git a/icons/mob/clothing/faction/gezena/head.dmi b/icons/mob/clothing/faction/gezena/head.dmi
new file mode 100644
index 000000000000..c2c20b63e559
Binary files /dev/null and b/icons/mob/clothing/faction/gezena/head.dmi differ
diff --git a/icons/mob/clothing/faction/gezena/neck.dmi b/icons/mob/clothing/faction/gezena/neck.dmi
new file mode 100644
index 000000000000..9b3fa0c9bbab
Binary files /dev/null and b/icons/mob/clothing/faction/gezena/neck.dmi differ
diff --git a/icons/mob/clothing/faction/gezena/suits.dmi b/icons/mob/clothing/faction/gezena/suits.dmi
new file mode 100644
index 000000000000..c76b3368c644
Binary files /dev/null and b/icons/mob/clothing/faction/gezena/suits.dmi differ
diff --git a/icons/mob/clothing/faction/gezena/uniforms.dmi b/icons/mob/clothing/faction/gezena/uniforms.dmi
new file mode 100644
index 000000000000..4f3d45acbed2
Binary files /dev/null and b/icons/mob/clothing/faction/gezena/uniforms.dmi differ
diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi
index fe964b935915..d9580eff1b42 100644
Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ
diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi
index cff3d7ac5c34..0afcd0ad26c5 100644
Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index 12c3ce8027de..430ddef0699e 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi
index 90a54af8fa9e..9d430d39a7a7 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ
diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi
index d94f3a98d4f0..9ce60cc531ee 100644
Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ
diff --git a/icons/mob/clothing/suits/armor.dmi b/icons/mob/clothing/suits/armor.dmi
index 2bd6aa565fb3..bc8daf14abd6 100644
Binary files a/icons/mob/clothing/suits/armor.dmi and b/icons/mob/clothing/suits/armor.dmi differ
diff --git a/icons/mob/clothing/suits/spacesuits.dmi b/icons/mob/clothing/suits/spacesuits.dmi
index 6e97b33cd1b7..8f6e380f3a3b 100644
Binary files a/icons/mob/clothing/suits/spacesuits.dmi and b/icons/mob/clothing/suits/spacesuits.dmi differ
diff --git a/icons/mob/clothing/towel.dmi b/icons/mob/clothing/towel.dmi
new file mode 100644
index 000000000000..fddf3762b61a
Binary files /dev/null and b/icons/mob/clothing/towel.dmi differ
diff --git a/icons/mob/clothing/under/command.dmi b/icons/mob/clothing/under/command.dmi
index 4793c609aed9..fd5f1af01e88 100644
Binary files a/icons/mob/clothing/under/command.dmi and b/icons/mob/clothing/under/command.dmi differ
diff --git a/icons/mob/clothing/under/costume.dmi b/icons/mob/clothing/under/costume.dmi
index 9757ce544e24..87605b634fa8 100644
Binary files a/icons/mob/clothing/under/costume.dmi and b/icons/mob/clothing/under/costume.dmi differ
diff --git a/icons/mob/clothing/under/shorts_pants.dmi b/icons/mob/clothing/under/shorts_pants.dmi
index 4a5978b9f7f3..3d9b1e41a3b0 100644
Binary files a/icons/mob/clothing/under/shorts_pants.dmi and b/icons/mob/clothing/under/shorts_pants.dmi differ
diff --git a/icons/mob/clothing/under/syndicate.dmi b/icons/mob/clothing/under/syndicate.dmi
index 3eb82401831c..27c030aa4b43 100644
Binary files a/icons/mob/clothing/under/syndicate.dmi and b/icons/mob/clothing/under/syndicate.dmi differ
diff --git a/icons/mob/hair_extensions.dmi b/icons/mob/hair_extensions.dmi
index 4e109e922697..cafc9fab781c 100644
Binary files a/icons/mob/hair_extensions.dmi and b/icons/mob/hair_extensions.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index bd508c89ebd0..d130ba2cf2e3 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index f9a4f9cc7874..115688eeca5e 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/inhands/faction/gezena/gezena_lefthand.dmi b/icons/mob/inhands/faction/gezena/gezena_lefthand.dmi
new file mode 100644
index 000000000000..002fd97dafa0
Binary files /dev/null and b/icons/mob/inhands/faction/gezena/gezena_lefthand.dmi differ
diff --git a/icons/mob/inhands/faction/gezena/gezena_righthand.dmi b/icons/mob/inhands/faction/gezena/gezena_righthand.dmi
new file mode 100644
index 000000000000..0c2bd0479004
Binary files /dev/null and b/icons/mob/inhands/faction/gezena/gezena_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/food_lefthand.dmi b/icons/mob/inhands/misc/food_lefthand.dmi
index da4f2fa1826c..a26002a20b9a 100644
Binary files a/icons/mob/inhands/misc/food_lefthand.dmi and b/icons/mob/inhands/misc/food_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/food_righthand.dmi b/icons/mob/inhands/misc/food_righthand.dmi
index b6426e836780..1e90ac3cb75a 100644
Binary files a/icons/mob/inhands/misc/food_righthand.dmi and b/icons/mob/inhands/misc/food_righthand.dmi differ
diff --git a/icons/mob/species/kepori/onmob_uniform_kepori.dmi b/icons/mob/species/kepori/onmob_uniform_kepori.dmi
index 1e0416588ae3..6f28d759ba5f 100644
Binary files a/icons/mob/species/kepori/onmob_uniform_kepori.dmi and b/icons/mob/species/kepori/onmob_uniform_kepori.dmi differ
diff --git a/icons/mob/species/lizard/frills.dmi b/icons/mob/species/lizard/frills.dmi
index 6d661308c093..b8587a7bd8e2 100644
Binary files a/icons/mob/species/lizard/frills.dmi and b/icons/mob/species/lizard/frills.dmi differ
diff --git a/icons/mob/species/misc/cat.dmi b/icons/mob/species/misc/cat.dmi
index 685110a16114..aaab4f1b8637 100644
Binary files a/icons/mob/species/misc/cat.dmi and b/icons/mob/species/misc/cat.dmi differ
diff --git a/icons/mob/species/misc/digitigrade.dmi b/icons/mob/species/misc/digitigrade.dmi
index 37ff2b130323..104387630acb 100644
Binary files a/icons/mob/species/misc/digitigrade.dmi and b/icons/mob/species/misc/digitigrade.dmi differ
diff --git a/icons/mob/species/misc/digitigrade_shoes.dmi b/icons/mob/species/misc/digitigrade_shoes.dmi
index c5316bab988f..9ad6cc1827ed 100644
Binary files a/icons/mob/species/misc/digitigrade_shoes.dmi and b/icons/mob/species/misc/digitigrade_shoes.dmi differ
diff --git a/icons/mob/species/misc/digitigrade_suits.dmi b/icons/mob/species/misc/digitigrade_suits.dmi
index eaca5e34a629..31dd9ad9c8e6 100644
Binary files a/icons/mob/species/misc/digitigrade_suits.dmi and b/icons/mob/species/misc/digitigrade_suits.dmi differ
diff --git a/icons/mob/species/misc/fox.dmi b/icons/mob/species/misc/fox.dmi
index 6971b406bce7..da344bb33a3b 100644
Binary files a/icons/mob/species/misc/fox.dmi and b/icons/mob/species/misc/fox.dmi differ
diff --git a/icons/mob/species/rachnid/bodyparts.dmi b/icons/mob/species/rachnid/bodyparts.dmi
index cef6559f29e7..94fe73ee6a0a 100644
Binary files a/icons/mob/species/rachnid/bodyparts.dmi and b/icons/mob/species/rachnid/bodyparts.dmi differ
diff --git a/icons/mob/species/rachnid/spider_legs.dmi b/icons/mob/species/rachnid/spider_legs.dmi
index d04b5a719e30..907614753ddd 100644
Binary files a/icons/mob/species/rachnid/spider_legs.dmi and b/icons/mob/species/rachnid/spider_legs.dmi differ
diff --git a/icons/mob/species/rachnid/spider_mandibles.dmi b/icons/mob/species/rachnid/spider_mandibles.dmi
deleted file mode 100644
index 81b4b29a1262..000000000000
Binary files a/icons/mob/species/rachnid/spider_mandibles.dmi and /dev/null differ
diff --git a/icons/mob/species/rachnid/spider_spinneret.dmi b/icons/mob/species/rachnid/spider_spinneret.dmi
index 9adf49f05837..6f7fcc9f965c 100644
Binary files a/icons/mob/species/rachnid/spider_spinneret.dmi and b/icons/mob/species/rachnid/spider_spinneret.dmi differ
diff --git a/icons/obj/aicards.dmi b/icons/obj/aicards.dmi
index f6847dfe2d7a..5698962eb9fb 100644
Binary files a/icons/obj/aicards.dmi and b/icons/obj/aicards.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 96528874fee3..c911e872b62d 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi
index 7519969765c6..389dab6b1d87 100644
Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ
diff --git a/icons/obj/clothing/faction/gezena/belt.dmi b/icons/obj/clothing/faction/gezena/belt.dmi
new file mode 100644
index 000000000000..b07676386259
Binary files /dev/null and b/icons/obj/clothing/faction/gezena/belt.dmi differ
diff --git a/icons/obj/clothing/faction/gezena/feet.dmi b/icons/obj/clothing/faction/gezena/feet.dmi
new file mode 100644
index 000000000000..f3a23a70de35
Binary files /dev/null and b/icons/obj/clothing/faction/gezena/feet.dmi differ
diff --git a/icons/obj/clothing/faction/gezena/hands.dmi b/icons/obj/clothing/faction/gezena/hands.dmi
new file mode 100644
index 000000000000..3daa7c762d38
Binary files /dev/null and b/icons/obj/clothing/faction/gezena/hands.dmi differ
diff --git a/icons/obj/clothing/faction/gezena/head.dmi b/icons/obj/clothing/faction/gezena/head.dmi
new file mode 100644
index 000000000000..11454b333921
Binary files /dev/null and b/icons/obj/clothing/faction/gezena/head.dmi differ
diff --git a/icons/obj/clothing/faction/gezena/neck.dmi b/icons/obj/clothing/faction/gezena/neck.dmi
new file mode 100644
index 000000000000..19d51f6a64ae
Binary files /dev/null and b/icons/obj/clothing/faction/gezena/neck.dmi differ
diff --git a/icons/obj/clothing/faction/gezena/suits.dmi b/icons/obj/clothing/faction/gezena/suits.dmi
new file mode 100644
index 000000000000..09e00adf3289
Binary files /dev/null and b/icons/obj/clothing/faction/gezena/suits.dmi differ
diff --git a/icons/obj/clothing/faction/gezena/uniforms.dmi b/icons/obj/clothing/faction/gezena/uniforms.dmi
new file mode 100644
index 000000000000..ed9a863e3d57
Binary files /dev/null and b/icons/obj/clothing/faction/gezena/uniforms.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index e74978adb047..ff36ce0bce5e 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 3b37b555f4df..642e21ea3e09 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 89d5ed3328bd..5f0cb3b84fed 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 2f8bf359a59e..a17d4b5b2bff 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 32714635d084..c464ebddf84e 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/suits/armor.dmi b/icons/obj/clothing/suits/armor.dmi
index 7d5b69ab1fc2..758c4836aeb0 100644
Binary files a/icons/obj/clothing/suits/armor.dmi and b/icons/obj/clothing/suits/armor.dmi differ
diff --git a/icons/obj/clothing/suits/spacesuits.dmi b/icons/obj/clothing/suits/spacesuits.dmi
index 7ab05863bf05..d467eac36a5a 100644
Binary files a/icons/obj/clothing/suits/spacesuits.dmi and b/icons/obj/clothing/suits/spacesuits.dmi differ
diff --git a/icons/obj/clothing/towel.dmi b/icons/obj/clothing/towel.dmi
new file mode 100644
index 000000000000..93001ef29bc3
Binary files /dev/null and b/icons/obj/clothing/towel.dmi differ
diff --git a/icons/obj/clothing/under/command.dmi b/icons/obj/clothing/under/command.dmi
index 761796ada9e5..d5d48999bec3 100644
Binary files a/icons/obj/clothing/under/command.dmi and b/icons/obj/clothing/under/command.dmi differ
diff --git a/icons/obj/clothing/under/security.dmi b/icons/obj/clothing/under/security.dmi
index 84d90c19d79a..5572325faaf8 100644
Binary files a/icons/obj/clothing/under/security.dmi and b/icons/obj/clothing/under/security.dmi differ
diff --git a/icons/obj/clothing/under/syndicate.dmi b/icons/obj/clothing/under/syndicate.dmi
index 9b1630feb16b..9ae89d62123f 100644
Binary files a/icons/obj/clothing/under/syndicate.dmi and b/icons/obj/clothing/under/syndicate.dmi differ
diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi
index b3fe3b860e70..b0d9bd53a345 100644
Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 5083b4acc226..dbc04307a37a 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/guns/48x32guns.dmi b/icons/obj/guns/48x32guns.dmi
index 732e37318768..88dc73290622 100644
Binary files a/icons/obj/guns/48x32guns.dmi and b/icons/obj/guns/48x32guns.dmi differ
diff --git a/icons/obj/guns/faction/gezena/48x32.dmi b/icons/obj/guns/faction/gezena/48x32.dmi
new file mode 100644
index 000000000000..91e2ef30d785
Binary files /dev/null and b/icons/obj/guns/faction/gezena/48x32.dmi differ
diff --git a/icons/obj/guns/faction/gezena/energy.dmi b/icons/obj/guns/faction/gezena/energy.dmi
new file mode 100644
index 000000000000..92d88bbab4e6
Binary files /dev/null and b/icons/obj/guns/faction/gezena/energy.dmi differ
diff --git a/icons/obj/guns/faction/gezena/lefthand.dmi b/icons/obj/guns/faction/gezena/lefthand.dmi
new file mode 100644
index 000000000000..9bec84cd36bb
Binary files /dev/null and b/icons/obj/guns/faction/gezena/lefthand.dmi differ
diff --git a/icons/obj/guns/faction/gezena/righthand.dmi b/icons/obj/guns/faction/gezena/righthand.dmi
new file mode 100644
index 000000000000..d2d76ebb433d
Binary files /dev/null and b/icons/obj/guns/faction/gezena/righthand.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 24b209d6ab2b..02e7d3812dcb 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/guns/safety.dmi b/icons/obj/guns/safety.dmi
new file mode 100644
index 000000000000..072a483fa795
Binary files /dev/null and b/icons/obj/guns/safety.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index aeae4b17a44e..b07ae679471d 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index 25a990b61d01..ae86489bb340 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index d779a15bc717..340bc0f9a5c6 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index e58811689631..8ce2ccae3973 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 1ac2c63ed367..90854a704525 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/projectiles_impact.dmi b/icons/obj/projectiles_impact.dmi
index bac35e68e147..ee2ddf8568e0 100644
Binary files a/icons/obj/projectiles_impact.dmi and b/icons/obj/projectiles_impact.dmi differ
diff --git a/icons/obj/projectiles_muzzle.dmi b/icons/obj/projectiles_muzzle.dmi
index 2f1d6d90c6bf..4b23b27a8f35 100644
Binary files a/icons/obj/projectiles_muzzle.dmi and b/icons/obj/projectiles_muzzle.dmi differ
diff --git a/icons/obj/projectiles_tracer.dmi b/icons/obj/projectiles_tracer.dmi
index 56442452e724..be82f0d319d2 100644
Binary files a/icons/obj/projectiles_tracer.dmi and b/icons/obj/projectiles_tracer.dmi differ
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index 1fc4f14abbca..0989e1834f70 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 7c265737266a..a984d69cf030 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi
index e14d164289bc..c670e677d226 100644
Binary files a/icons/turf/decals.dmi and b/icons/turf/decals.dmi differ
diff --git a/icons/turf/snow.dmi b/icons/turf/snow.dmi
index 594a4f91e6c2..6801384e0182 100644
Binary files a/icons/turf/snow.dmi and b/icons/turf/snow.dmi differ
diff --git a/rust_g.dll b/rust_g.dll
index 059c79e34029..72a27df14403 100644
Binary files a/rust_g.dll and b/rust_g.dll differ
diff --git a/shiptest.dme b/shiptest.dme
index b56709e8b98b..872f257480d5 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -56,6 +56,7 @@
#include "code\__DEFINES\economy.dm"
#include "code\__DEFINES\events.dm"
#include "code\__DEFINES\exports.dm"
+#include "code\__DEFINES\factions.dm"
#include "code\__DEFINES\fantasy_affixes.dm"
#include "code\__DEFINES\fastdmm2.dm"
#include "code\__DEFINES\fishing.dm"
@@ -67,6 +68,7 @@
#include "code\__DEFINES\hud.dm"
#include "code\__DEFINES\icon_smoothing.dm"
#include "code\__DEFINES\important_recursive_contents.dm"
+#include "code\__DEFINES\input.dm"
#include "code\__DEFINES\instruments.dm"
#include "code\__DEFINES\interaction_flags.dm"
#include "code\__DEFINES\inventory.dm"
@@ -142,6 +144,7 @@
#include "code\__DEFINES\turfs.dm"
#include "code\__DEFINES\typeids.dm"
#include "code\__DEFINES\vehicles.dm"
+#include "code\__DEFINES\verb_manager.dm"
#include "code\__DEFINES\vv.dm"
#include "code\__DEFINES\wall_dents.dm"
#include "code\__DEFINES\wires.dm"
@@ -173,6 +176,7 @@
#include "code\__HELPERS\matrices.dm"
#include "code\__HELPERS\mobs.dm"
#include "code\__HELPERS\mouse_control.dm"
+#include "code\__HELPERS\nameof.dm"
#include "code\__HELPERS\names.dm"
#include "code\__HELPERS\priority_announce.dm"
#include "code\__HELPERS\pronouns.dm"
@@ -362,6 +366,7 @@
#include "code\controllers\subsystem\title.dm"
#include "code\controllers\subsystem\traumas.dm"
#include "code\controllers\subsystem\turf_fire.dm"
+#include "code\controllers\subsystem\verb_manager.dm"
#include "code\controllers\subsystem\vis_overlays.dm"
#include "code\controllers\subsystem\vote.dm"
#include "code\controllers\subsystem\weather.dm"
@@ -416,6 +421,7 @@
#include "code\datums\soullink.dm"
#include "code\datums\spawners_menu.dm"
#include "code\datums\tgs_event_handler.dm"
+#include "code\datums\verb_callbacks.dm"
#include "code\datums\verbs.dm"
#include "code\datums\view.dm"
#include "code\datums\weakrefs.dm"
@@ -1305,6 +1311,7 @@
#include "code\game\objects\structures\barsigns.dm"
#include "code\game\objects\structures\bedsheet_bin.dm"
#include "code\game\objects\structures\catwalk.dm"
+#include "code\game\objects\structures\crateshelf.dm"
#include "code\game\objects\structures\curtains.dm"
#include "code\game\objects\structures\destructible_structures.dm"
#include "code\game\objects\structures\displaycase.dm"
@@ -1350,6 +1357,7 @@
#include "code\game\objects\structures\reflector.dm"
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\salvaging.dm"
+#include "code\game\objects\structures\sauna.dm"
#include "code\game\objects\structures\showcase.dm"
#include "code\game\objects\structures\shower.dm"
#include "code\game\objects\structures\signs.dm"
@@ -1438,6 +1446,7 @@
#include "code\game\turfs\open\floor\catwalk_plating.dm"
#include "code\game\turfs\open\floor\conc_floor.dm"
#include "code\game\turfs\open\floor\fancy_floor.dm"
+#include "code\game\turfs\open\floor\hangar.dm"
#include "code\game\turfs\open\floor\hull.dm"
#include "code\game\turfs\open\floor\light_floor.dm"
#include "code\game\turfs\open\floor\mineral_floor.dm"
@@ -1660,10 +1669,7 @@
#include "code\modules\antagonists\disease\disease_event.dm"
#include "code\modules\antagonists\disease\disease_mob.dm"
#include "code\modules\antagonists\ert\ert.dm"
-#include "code\modules\antagonists\fugitive\fugitive.dm"
#include "code\modules\antagonists\fugitive\fugitive_outfits.dm"
-#include "code\modules\antagonists\fugitive\fugitive_ship.dm"
-#include "code\modules\antagonists\fugitive\hunter.dm"
#include "code\modules\antagonists\gang\outfits.dm"
#include "code\modules\antagonists\greentext\greentext.dm"
#include "code\modules\antagonists\magic_servant\servant.dm"
@@ -1678,7 +1684,6 @@
#include "code\modules\antagonists\nukeop\equipment\nuclearbomb.dm"
#include "code\modules\antagonists\nukeop\equipment\pinpointer.dm"
#include "code\modules\antagonists\official\official.dm"
-#include "code\modules\antagonists\pirate\pirate.dm"
#include "code\modules\antagonists\revenant\revenant.dm"
#include "code\modules\antagonists\revenant\revenant_abilities.dm"
#include "code\modules\antagonists\revenant\revenant_antag.dm"
@@ -1916,7 +1921,9 @@
#include "code\modules\client\verbs\who.dm"
#include "code\modules\clothing\chameleon.dm"
#include "code\modules\clothing\clothing.dm"
+#include "code\modules\clothing\towels.dm"
#include "code\modules\clothing\ears\_ears.dm"
+#include "code\modules\clothing\factions\gezena.dm"
#include "code\modules\clothing\glasses\_glasses.dm"
#include "code\modules\clothing\glasses\engine_goggles.dm"
#include "code\modules\clothing\glasses\hud.dm"
@@ -1944,10 +1951,11 @@
#include "code\modules\clothing\neck\_neck.dm"
#include "code\modules\clothing\outfits\ert.dm"
#include "code\modules\clothing\outfits\event.dm"
+#include "code\modules\clothing\outfits\gezena.dm"
#include "code\modules\clothing\outfits\plasmaman.dm"
#include "code\modules\clothing\outfits\solgov.dm"
+#include "code\modules\clothing\outfits\syndicate.dm"
#include "code\modules\clothing\outfits\standard.dm"
-#include "code\modules\clothing\outfits\vr.dm"
#include "code\modules\clothing\outfits\vv_outfit.dm"
#include "code\modules\clothing\shoes\_shoes.dm"
#include "code\modules\clothing\shoes\bananashoes.dm"
@@ -2034,7 +2042,6 @@
#include "code\modules\events\electrical_storm.dm"
#include "code\modules\events\fake_virus.dm"
#include "code\modules\events\false_alarm.dm"
-#include "code\modules\events\fugitive_spawning.dm"
#include "code\modules\events\ghost_role.dm"
#include "code\modules\events\grid_check.dm"
#include "code\modules\events\heart_attack.dm"
@@ -2047,7 +2054,6 @@
#include "code\modules\events\meteor_wave.dm"
#include "code\modules\events\nightmare.dm"
#include "code\modules\events\operative.dm"
-#include "code\modules\events\pirates.dm"
#include "code\modules\events\prison_break.dm"
#include "code\modules\events\processor_overload.dm"
#include "code\modules\events\radiation_storm.dm"
@@ -2098,6 +2104,7 @@
#include "code\modules\food_and_drinks\pizzabox.dm"
#include "code\modules\food_and_drinks\drinks\drinks.dm"
#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm"
+#include "code\modules\food_and_drinks\drinks\drinks\breakawayflask.dm"
#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm"
#include "code\modules\food_and_drinks\drinks\drinks\modglass.dm"
#include "code\modules\food_and_drinks\food\bait.dm"
@@ -2995,6 +3002,7 @@
#include "code\modules\projectiles\guns\energy\pulse.dm"
#include "code\modules\projectiles\guns\energy\special.dm"
#include "code\modules\projectiles\guns\energy\stun.dm"
+#include "code\modules\projectiles\guns\faction\gezena\energy_gunsword.dm"
#include "code\modules\projectiles\guns\magic\staff.dm"
#include "code\modules\projectiles\guns\magic\wand.dm"
#include "code\modules\projectiles\guns\misc\beam_rifle.dm"
@@ -3068,6 +3076,7 @@
#include "code\modules\reagents\chemistry\reagents\other_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\trickwine_reagents.dm"
#include "code\modules\reagents\chemistry\recipes\cat2_medicines.dm"
#include "code\modules\reagents\chemistry\recipes\drugs.dm"
#include "code\modules\reagents\chemistry\recipes\medicine.dm"
diff --git a/sound/misc/Cyka Blyat.ogg b/sound/misc/Cyka Blyat.ogg
deleted file mode 100644
index ca5c8fd49bef..000000000000
Binary files a/sound/misc/Cyka Blyat.ogg and /dev/null differ
diff --git a/sound/misc/Russian_Anthem_chorus.ogg b/sound/misc/Russian_Anthem_chorus.ogg
deleted file mode 100644
index 0105eb7f22af..000000000000
Binary files a/sound/misc/Russian_Anthem_chorus.ogg and /dev/null differ
diff --git a/sound/misc/capitialism.ogg b/sound/misc/capitialism.ogg
deleted file mode 100644
index 8645fc6ed72b..000000000000
Binary files a/sound/misc/capitialism.ogg and /dev/null differ
diff --git a/sound/weapons/effects/deflect.ogg b/sound/weapons/effects/deflect.ogg
new file mode 100644
index 000000000000..a4e9ed6ba4c0
Binary files /dev/null and b/sound/weapons/effects/deflect.ogg differ
diff --git a/sound/weapons/effects/ric1.ogg b/sound/weapons/effects/ric1.ogg
deleted file mode 100644
index b7f7bd99ca5a..000000000000
Binary files a/sound/weapons/effects/ric1.ogg and /dev/null differ
diff --git a/sound/weapons/effects/ric2.ogg b/sound/weapons/effects/ric2.ogg
deleted file mode 100644
index dcd44b07329e..000000000000
Binary files a/sound/weapons/effects/ric2.ogg and /dev/null differ
diff --git a/sound/weapons/effects/ric3.ogg b/sound/weapons/effects/ric3.ogg
deleted file mode 100644
index c538a97e35a6..000000000000
Binary files a/sound/weapons/effects/ric3.ogg and /dev/null differ
diff --git a/sound/weapons/effects/ric4.ogg b/sound/weapons/effects/ric4.ogg
deleted file mode 100644
index ac872734beaa..000000000000
Binary files a/sound/weapons/effects/ric4.ogg and /dev/null differ
diff --git a/sound/weapons/effects/ric5.ogg b/sound/weapons/effects/ric5.ogg
deleted file mode 100644
index 2c946c457d6b..000000000000
Binary files a/sound/weapons/effects/ric5.ogg and /dev/null differ
diff --git a/sound/weapons/gun/energy/laserpistol.ogg b/sound/weapons/gun/energy/laserpistol.ogg
new file mode 100644
index 000000000000..2eb881d0c4ab
Binary files /dev/null and b/sound/weapons/gun/energy/laserpistol.ogg differ
diff --git a/sound/weapons/gun/energy/lasersniper.ogg b/sound/weapons/gun/energy/lasersniper.ogg
new file mode 100644
index 000000000000..a773bd203d12
Binary files /dev/null and b/sound/weapons/gun/energy/lasersniper.ogg differ
diff --git a/sound/weapons/gun/general/bulletcasing_bounce1.ogg b/sound/weapons/gun/general/bulletcasing_bounce1.ogg
new file mode 100644
index 000000000000..c33a27fa5007
Binary files /dev/null and b/sound/weapons/gun/general/bulletcasing_bounce1.ogg differ
diff --git a/sound/weapons/gun/general/bulletcasing_bounce2.ogg b/sound/weapons/gun/general/bulletcasing_bounce2.ogg
new file mode 100644
index 000000000000..f8d516643b25
Binary files /dev/null and b/sound/weapons/gun/general/bulletcasing_bounce2.ogg differ
diff --git a/sound/weapons/gun/general/bulletcasing_bounce3.ogg b/sound/weapons/gun/general/bulletcasing_bounce3.ogg
new file mode 100644
index 000000000000..84e670706284
Binary files /dev/null and b/sound/weapons/gun/general/bulletcasing_bounce3.ogg differ
diff --git a/sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg b/sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg
new file mode 100644
index 000000000000..324543b62587
Binary files /dev/null and b/sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg differ
diff --git a/sound/weapons/gun/general/rocket_load.ogg b/sound/weapons/gun/general/rocket_load.ogg
new file mode 100644
index 000000000000..4c5a2ec6911d
Binary files /dev/null and b/sound/weapons/gun/general/rocket_load.ogg differ
diff --git a/sound/weapons/gun/general/selector.ogg b/sound/weapons/gun/general/selector.ogg
new file mode 100644
index 000000000000..298181609e49
Binary files /dev/null and b/sound/weapons/gun/general/selector.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_bounce1.ogg b/sound/weapons/gun/hit/bullet_bounce1.ogg
new file mode 100644
index 000000000000..a8a1fb36f385
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_bounce1.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_bounce2.ogg b/sound/weapons/gun/hit/bullet_bounce2.ogg
new file mode 100644
index 000000000000..a06a0c320e9e
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_bounce2.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_bounce3.ogg b/sound/weapons/gun/hit/bullet_bounce3.ogg
new file mode 100644
index 000000000000..4313703c760b
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_bounce3.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_bounce4.ogg b/sound/weapons/gun/hit/bullet_bounce4.ogg
new file mode 100644
index 000000000000..a3c2c34ec018
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_bounce4.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_bounce5.ogg b/sound/weapons/gun/hit/bullet_bounce5.ogg
new file mode 100644
index 000000000000..35b8be603534
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_bounce5.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_01.ogg b/sound/weapons/gun/hit/bullet_glass_01.ogg
new file mode 100644
index 000000000000..30f6f1fb612b
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_01.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_02.ogg b/sound/weapons/gun/hit/bullet_glass_02.ogg
new file mode 100644
index 000000000000..472f98e9801a
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_02.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_03.ogg b/sound/weapons/gun/hit/bullet_glass_03.ogg
new file mode 100644
index 000000000000..25c6df47a921
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_03.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_04.ogg b/sound/weapons/gun/hit/bullet_glass_04.ogg
new file mode 100644
index 000000000000..b525f665c414
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_04.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_05.ogg b/sound/weapons/gun/hit/bullet_glass_05.ogg
new file mode 100644
index 000000000000..89ff21723aac
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_05.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_06.ogg b/sound/weapons/gun/hit/bullet_glass_06.ogg
new file mode 100644
index 000000000000..26cacb990766
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_06.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_07.ogg b/sound/weapons/gun/hit/bullet_glass_07.ogg
new file mode 100644
index 000000000000..110a45074d17
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_07.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_impact1.ogg b/sound/weapons/gun/hit/bullet_impact1.ogg
new file mode 100644
index 000000000000..4c0cd5b5eebb
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_impact1.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_impact2.ogg b/sound/weapons/gun/hit/bullet_impact2.ogg
new file mode 100644
index 000000000000..bfffcfeadfaa
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_impact2.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_impact3.ogg b/sound/weapons/gun/hit/bullet_impact3.ogg
new file mode 100644
index 000000000000..0356dc6c8819
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_impact3.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_01.ogg b/sound/weapons/gun/hit/bullet_masonry_01.ogg
new file mode 100644
index 000000000000..1a04e7688d63
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_01.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_02.ogg b/sound/weapons/gun/hit/bullet_masonry_02.ogg
new file mode 100644
index 000000000000..770e9e242a7f
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_02.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_03.ogg b/sound/weapons/gun/hit/bullet_masonry_03.ogg
new file mode 100644
index 000000000000..c0eb0bf13233
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_03.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_04.ogg b/sound/weapons/gun/hit/bullet_masonry_04.ogg
new file mode 100644
index 000000000000..83cbc57ebd83
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_04.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_05.ogg b/sound/weapons/gun/hit/bullet_masonry_05.ogg
new file mode 100644
index 000000000000..6d9a67304659
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_05.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_06.ogg b/sound/weapons/gun/hit/bullet_masonry_06.ogg
new file mode 100644
index 000000000000..2a982a56edb9
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_06.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_01.ogg b/sound/weapons/gun/hit/bullet_metal_01.ogg
new file mode 100644
index 000000000000..1a706abd90c0
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_01.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_02.ogg b/sound/weapons/gun/hit/bullet_metal_02.ogg
new file mode 100644
index 000000000000..ee938e2a593d
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_02.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_03.ogg b/sound/weapons/gun/hit/bullet_metal_03.ogg
new file mode 100644
index 000000000000..9ede9f161290
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_03.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_04.ogg b/sound/weapons/gun/hit/bullet_metal_04.ogg
new file mode 100644
index 000000000000..bf6824c8cefd
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_04.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_05.ogg b/sound/weapons/gun/hit/bullet_metal_05.ogg
new file mode 100644
index 000000000000..a45e3d6204e4
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_05.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_06.ogg b/sound/weapons/gun/hit/bullet_metal_06.ogg
new file mode 100644
index 000000000000..53877b5e8ce6
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_06.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_miss1.ogg b/sound/weapons/gun/hit/bullet_miss1.ogg
new file mode 100644
index 000000000000..dfff45a0cb5d
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_miss1.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_miss2.ogg b/sound/weapons/gun/hit/bullet_miss2.ogg
new file mode 100644
index 000000000000..54b111128021
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_miss2.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_miss3.ogg b/sound/weapons/gun/hit/bullet_miss3.ogg
new file mode 100644
index 000000000000..fbff6dde9046
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_miss3.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_miss4.ogg b/sound/weapons/gun/hit/bullet_miss4.ogg
new file mode 100644
index 000000000000..6392d6676915
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_miss4.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet1.ogg b/sound/weapons/gun/hit/bullet_ricochet1.ogg
new file mode 100644
index 000000000000..724f599cd5bd
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet1.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet2.ogg b/sound/weapons/gun/hit/bullet_ricochet2.ogg
new file mode 100644
index 000000000000..1c29b9e64e20
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet2.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet3.ogg b/sound/weapons/gun/hit/bullet_ricochet3.ogg
new file mode 100644
index 000000000000..96d470ffe2cb
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet3.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet4.ogg b/sound/weapons/gun/hit/bullet_ricochet4.ogg
new file mode 100644
index 000000000000..bde8fda3f4c4
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet4.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet5.ogg b/sound/weapons/gun/hit/bullet_ricochet5.ogg
new file mode 100644
index 000000000000..eba86301354f
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet5.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet6.ogg b/sound/weapons/gun/hit/bullet_ricochet6.ogg
new file mode 100644
index 000000000000..b143a3c2bdc9
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet6.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet7.ogg b/sound/weapons/gun/hit/bullet_ricochet7.ogg
new file mode 100644
index 000000000000..68a2ee63fa02
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet7.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet8.ogg b/sound/weapons/gun/hit/bullet_ricochet8.ogg
new file mode 100644
index 000000000000..622d8b6941ee
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet8.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_01.ogg b/sound/weapons/gun/hit/bullet_snow_01.ogg
new file mode 100644
index 000000000000..4da742bf1462
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_01.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_02.ogg b/sound/weapons/gun/hit/bullet_snow_02.ogg
new file mode 100644
index 000000000000..21572daf13d7
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_02.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_03.ogg b/sound/weapons/gun/hit/bullet_snow_03.ogg
new file mode 100644
index 000000000000..fb8e1dcb9dad
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_03.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_04.ogg b/sound/weapons/gun/hit/bullet_snow_04.ogg
new file mode 100644
index 000000000000..2bfb46d958b2
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_04.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_05.ogg b/sound/weapons/gun/hit/bullet_snow_05.ogg
new file mode 100644
index 000000000000..3752f95b3d62
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_05.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_06.ogg b/sound/weapons/gun/hit/bullet_snow_06.ogg
new file mode 100644
index 000000000000..cac69cc7404c
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_06.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_01.ogg b/sound/weapons/gun/hit/bullet_wood_01.ogg
new file mode 100644
index 000000000000..559310853f95
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_01.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_02.ogg b/sound/weapons/gun/hit/bullet_wood_02.ogg
new file mode 100644
index 000000000000..852c1d875cde
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_02.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_03.ogg b/sound/weapons/gun/hit/bullet_wood_03.ogg
new file mode 100644
index 000000000000..440681e0da48
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_03.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_04.ogg b/sound/weapons/gun/hit/bullet_wood_04.ogg
new file mode 100644
index 000000000000..89ddd21e2bbd
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_04.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_05.ogg b/sound/weapons/gun/hit/bullet_wood_05.ogg
new file mode 100644
index 000000000000..3a66b3f32c8a
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_05.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_06.ogg b/sound/weapons/gun/hit/bullet_wood_06.ogg
new file mode 100644
index 000000000000..cf54f8cc8f58
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_06.ogg differ
diff --git a/sound/weapons/gun/hit/energy_impact1.ogg b/sound/weapons/gun/hit/energy_impact1.ogg
new file mode 100644
index 000000000000..e9d6305972ca
Binary files /dev/null and b/sound/weapons/gun/hit/energy_impact1.ogg differ
diff --git a/sound/weapons/gun/hit/energy_miss1.ogg b/sound/weapons/gun/hit/energy_miss1.ogg
new file mode 100644
index 000000000000..55839b14d3d1
Binary files /dev/null and b/sound/weapons/gun/hit/energy_miss1.ogg differ
diff --git a/sound/weapons/gun/hit/energy_ricochet1.ogg b/sound/weapons/gun/hit/energy_ricochet1.ogg
new file mode 100644
index 000000000000..7601f7823a79
Binary files /dev/null and b/sound/weapons/gun/hit/energy_ricochet1.ogg differ
diff --git a/sound/weapons/gun/pistol/commander.ogg b/sound/weapons/gun/pistol/commander.ogg
new file mode 100644
index 000000000000..57ba0a347c84
Binary files /dev/null and b/sound/weapons/gun/pistol/commander.ogg differ
diff --git a/sound/weapons/gun/pistol/deagle.ogg b/sound/weapons/gun/pistol/deagle.ogg
new file mode 100644
index 000000000000..41d814d2fcec
Binary files /dev/null and b/sound/weapons/gun/pistol/deagle.ogg differ
diff --git a/sound/weapons/gun/pistol/deagle_reload.ogg b/sound/weapons/gun/pistol/deagle_reload.ogg
new file mode 100644
index 000000000000..77abf293efc6
Binary files /dev/null and b/sound/weapons/gun/pistol/deagle_reload.ogg differ
diff --git a/sound/weapons/gun/pistol/deagle_unload.ogg b/sound/weapons/gun/pistol/deagle_unload.ogg
new file mode 100644
index 000000000000..84b18d575b7f
Binary files /dev/null and b/sound/weapons/gun/pistol/deagle_unload.ogg differ
diff --git a/sound/weapons/gun/pistol/himehabu.ogg b/sound/weapons/gun/pistol/himehabu.ogg
new file mode 100644
index 000000000000..ad2dc7cfcc41
Binary files /dev/null and b/sound/weapons/gun/pistol/himehabu.ogg differ
diff --git a/sound/weapons/gun/pistol/m1911.ogg b/sound/weapons/gun/pistol/m1911.ogg
new file mode 100644
index 000000000000..1d7a88dbbdc0
Binary files /dev/null and b/sound/weapons/gun/pistol/m1911.ogg differ
diff --git a/sound/weapons/gun/pistol/m1911_cocked.ogg b/sound/weapons/gun/pistol/m1911_cocked.ogg
new file mode 100644
index 000000000000..b1daedcbf00f
Binary files /dev/null and b/sound/weapons/gun/pistol/m1911_cocked.ogg differ
diff --git a/sound/weapons/gun/pistol/m1911_reload.ogg b/sound/weapons/gun/pistol/m1911_reload.ogg
new file mode 100644
index 000000000000..5dbd7368bda6
Binary files /dev/null and b/sound/weapons/gun/pistol/m1911_reload.ogg differ
diff --git a/sound/weapons/gun/pistol/m1911_unload.ogg b/sound/weapons/gun/pistol/m1911_unload.ogg
new file mode 100644
index 000000000000..1cabe5cd2b86
Binary files /dev/null and b/sound/weapons/gun/pistol/m1911_unload.ogg differ
diff --git a/sound/weapons/gun/pistol/mag_insert.ogg b/sound/weapons/gun/pistol/mag_insert.ogg
index 42a05ebc483f..0791490c6889 100644
Binary files a/sound/weapons/gun/pistol/mag_insert.ogg and b/sound/weapons/gun/pistol/mag_insert.ogg differ
diff --git a/sound/weapons/gun/pistol/mag_insert_alt.ogg b/sound/weapons/gun/pistol/mag_insert_alt.ogg
new file mode 100644
index 000000000000..c442f8b16277
Binary files /dev/null and b/sound/weapons/gun/pistol/mag_insert_alt.ogg differ
diff --git a/sound/weapons/gun/pistol/mag_release.ogg b/sound/weapons/gun/pistol/mag_release.ogg
index cccbf5f9d914..757168fcf1b4 100644
Binary files a/sound/weapons/gun/pistol/mag_release.ogg and b/sound/weapons/gun/pistol/mag_release.ogg differ
diff --git a/sound/weapons/gun/pistol/mag_release_alt.ogg b/sound/weapons/gun/pistol/mag_release_alt.ogg
new file mode 100644
index 000000000000..334d1a12f299
Binary files /dev/null and b/sound/weapons/gun/pistol/mag_release_alt.ogg differ
diff --git a/sound/weapons/gun/pistol/rack.ogg b/sound/weapons/gun/pistol/rack.ogg
index fd0408d8ff2e..ff2512af27a5 100644
Binary files a/sound/weapons/gun/pistol/rack.ogg and b/sound/weapons/gun/pistol/rack.ogg differ
diff --git a/sound/weapons/gun/pistol/rack_small.ogg b/sound/weapons/gun/pistol/rack_small.ogg
index f33db717db82..a9ab76f14283 100644
Binary files a/sound/weapons/gun/pistol/rack_small.ogg and b/sound/weapons/gun/pistol/rack_small.ogg differ
diff --git a/sound/weapons/gun/pistol/shot.ogg b/sound/weapons/gun/pistol/shot.ogg
index a808f8690730..1bbd95e405bc 100644
Binary files a/sound/weapons/gun/pistol/shot.ogg and b/sound/weapons/gun/pistol/shot.ogg differ
diff --git a/sound/weapons/gun/revolver/cattleman.ogg b/sound/weapons/gun/revolver/cattleman.ogg
new file mode 100644
index 000000000000..b56abbcf1583
Binary files /dev/null and b/sound/weapons/gun/revolver/cattleman.ogg differ
diff --git a/sound/weapons/gun/revolver/revolver_prime.ogg b/sound/weapons/gun/revolver/revolver_prime.ogg
new file mode 100644
index 000000000000..5391854fbee3
Binary files /dev/null and b/sound/weapons/gun/revolver/revolver_prime.ogg differ
diff --git a/sound/weapons/gun/revolver/shot.ogg b/sound/weapons/gun/revolver/shot.ogg
index 91e480bd152a..d02d1c750c24 100644
Binary files a/sound/weapons/gun/revolver/shot.ogg and b/sound/weapons/gun/revolver/shot.ogg differ
diff --git a/sound/weapons/gun/revolver/shot_hunting.ogg b/sound/weapons/gun/revolver/shot_hunting.ogg
new file mode 100644
index 000000000000..4beb4d1e4648
Binary files /dev/null and b/sound/weapons/gun/revolver/shot_hunting.ogg differ
diff --git a/sound/weapons/gun/revolver/shot_light.ogg b/sound/weapons/gun/revolver/shot_light.ogg
new file mode 100644
index 000000000000..68b7fada6e49
Binary files /dev/null and b/sound/weapons/gun/revolver/shot_light.ogg differ
diff --git a/sound/weapons/gun/revolver/shot_old_new.ogg b/sound/weapons/gun/revolver/shot_old_new.ogg
new file mode 100644
index 000000000000..91e480bd152a
Binary files /dev/null and b/sound/weapons/gun/revolver/shot_old_new.ogg differ
diff --git a/sound/weapons/gun/rifle/ak47_cocked.ogg b/sound/weapons/gun/rifle/ak47_cocked.ogg
new file mode 100644
index 000000000000..5f2d32e31eaf
Binary files /dev/null and b/sound/weapons/gun/rifle/ak47_cocked.ogg differ
diff --git a/sound/weapons/gun/rifle/ak47_reload.ogg b/sound/weapons/gun/rifle/ak47_reload.ogg
new file mode 100644
index 000000000000..9105d5c31c16
Binary files /dev/null and b/sound/weapons/gun/rifle/ak47_reload.ogg differ
diff --git a/sound/weapons/gun/rifle/ak47_unload.ogg b/sound/weapons/gun/rifle/ak47_unload.ogg
new file mode 100644
index 000000000000..f6b5c73d7f6b
Binary files /dev/null and b/sound/weapons/gun/rifle/ak47_unload.ogg differ
diff --git a/sound/weapons/gun/rifle/ar_cock.ogg b/sound/weapons/gun/rifle/ar_cock.ogg
new file mode 100644
index 000000000000..ac02ed93c1d7
Binary files /dev/null and b/sound/weapons/gun/rifle/ar_cock.ogg differ
diff --git a/sound/weapons/gun/rifle/ar_reload.ogg b/sound/weapons/gun/rifle/ar_reload.ogg
new file mode 100644
index 000000000000..6e557b892a97
Binary files /dev/null and b/sound/weapons/gun/rifle/ar_reload.ogg differ
diff --git a/sound/weapons/gun/rifle/ar_unload.ogg b/sound/weapons/gun/rifle/ar_unload.ogg
new file mode 100644
index 000000000000..591599f52334
Binary files /dev/null and b/sound/weapons/gun/rifle/ar_unload.ogg differ
diff --git a/sound/weapons/gun/rifle/m16_cocked.ogg b/sound/weapons/gun/rifle/m16_cocked.ogg
new file mode 100644
index 000000000000..8d2e059efaa7
Binary files /dev/null and b/sound/weapons/gun/rifle/m16_cocked.ogg differ
diff --git a/sound/weapons/gun/rifle/m16_reload.ogg b/sound/weapons/gun/rifle/m16_reload.ogg
new file mode 100644
index 000000000000..b2666ca96fe7
Binary files /dev/null and b/sound/weapons/gun/rifle/m16_reload.ogg differ
diff --git a/sound/weapons/gun/rifle/m16_unload.ogg b/sound/weapons/gun/rifle/m16_unload.ogg
new file mode 100644
index 000000000000..d302e5a26748
Binary files /dev/null and b/sound/weapons/gun/rifle/m16_unload.ogg differ
diff --git a/sound/weapons/gun/shotgun/insert_shell.ogg b/sound/weapons/gun/shotgun/insert_shell.ogg
index 5b2c6cdc5003..cd5c5e31aa67 100644
Binary files a/sound/weapons/gun/shotgun/insert_shell.ogg and b/sound/weapons/gun/shotgun/insert_shell.ogg differ
diff --git a/sound/weapons/gun/shotgun/rack.ogg b/sound/weapons/gun/shotgun/rack.ogg
index c25a10ffa494..865dbef3d06e 100644
Binary files a/sound/weapons/gun/shotgun/rack.ogg and b/sound/weapons/gun/shotgun/rack.ogg differ
diff --git a/sound/weapons/gun/shotgun/rack_alt.ogg b/sound/weapons/gun/shotgun/rack_alt.ogg
new file mode 100644
index 000000000000..0f106fe85ab1
Binary files /dev/null and b/sound/weapons/gun/shotgun/rack_alt.ogg differ
diff --git a/sound/weapons/gun/smg/smg_reload.ogg b/sound/weapons/gun/smg/smg_reload.ogg
new file mode 100644
index 000000000000..4e7b8f7ea91e
Binary files /dev/null and b/sound/weapons/gun/smg/smg_reload.ogg differ
diff --git a/sound/weapons/gun/smg/smg_unload.ogg b/sound/weapons/gun/smg/smg_unload.ogg
new file mode 100644
index 000000000000..677b5a8f3d29
Binary files /dev/null and b/sound/weapons/gun/smg/smg_unload.ogg differ
diff --git a/sound/weapons/gun/smg/smgrack.ogg b/sound/weapons/gun/smg/smgrack.ogg
index 95f5a5f9c843..57ef99a0c5ca 100644
Binary files a/sound/weapons/gun/smg/smgrack.ogg and b/sound/weapons/gun/smg/smgrack.ogg differ
diff --git a/sound/weapons/gun/smg/uzi.ogg b/sound/weapons/gun/smg/uzi.ogg
new file mode 100644
index 000000000000..0168613ce872
Binary files /dev/null and b/sound/weapons/gun/smg/uzi.ogg differ
diff --git a/sound/weapons/gun/smg/uzi_cocked.ogg b/sound/weapons/gun/smg/uzi_cocked.ogg
new file mode 100644
index 000000000000..8cbe23b017b0
Binary files /dev/null and b/sound/weapons/gun/smg/uzi_cocked.ogg differ
diff --git a/sound/weapons/gun/smg/uzi_reload.ogg b/sound/weapons/gun/smg/uzi_reload.ogg
new file mode 100644
index 000000000000..8dae035f65e2
Binary files /dev/null and b/sound/weapons/gun/smg/uzi_reload.ogg differ
diff --git a/sound/weapons/gun/smg/uzi_unload.ogg b/sound/weapons/gun/smg/uzi_unload.ogg
new file mode 100644
index 000000000000..b285b71ac3a0
Binary files /dev/null and b/sound/weapons/gun/smg/uzi_unload.ogg differ
diff --git a/sound/weapons/gun/smg/vector_fire.ogg b/sound/weapons/gun/smg/vector_fire.ogg
new file mode 100644
index 000000000000..05c797c1464b
Binary files /dev/null and b/sound/weapons/gun/smg/vector_fire.ogg differ
diff --git a/strings/ion_laws.json b/strings/ion_laws.json
index 58e0f88407a0..e6ac318b64ed 100644
--- a/strings/ion_laws.json
+++ b/strings/ion_laws.json
@@ -24,7 +24,6 @@
"GRAVITY",
"PHYSICS",
"INTELLIGENCE",
- "AMERICANISM",
"FREEDOM",
"FRESHNESS",
"REVOLUTION",
@@ -34,8 +33,6 @@
"FINANCIAL SECURITY",
"COMPUTING",
"PROGRESS",
- "MARXISM",
- "CAPITALISM",
"ANARCHY",
"STARVATION",
"POVERTY",
@@ -159,8 +156,6 @@
"SYNDICATE",
"SPACE",
"SPESS",
- "CLOWN",
- "CLOWN-POWERED",
"OFFICIAL",
"IMPORTANT",
"VITAL",
@@ -191,8 +186,6 @@
"OPAQUE",
"GLOWING",
"SHAKING",
- "FARTING",
- "POOPING",
"BOUNCING",
"COMMITTED",
"MASKED",
@@ -200,7 +193,6 @@
"WEIRD",
"NAKED",
"NUDE",
- "TWERKING",
"SPOILING",
"REDACTED",
"TACTICAL",
@@ -245,7 +237,6 @@
"DRINKS",
"FOOD",
"CLOWNS",
- "lizardS",
"HUMOR",
"WATER",
"SHUTTLES",
@@ -266,8 +257,6 @@
"EXTREMELY"
],
"ionarea": [
- "RUSSIA",
- "SOVIET RUSSIA",
"THE INTERNET",
"SIGIL",
"ALPHA COMPLEX",
@@ -280,12 +269,6 @@
"THE DERELICT",
"LAVALAND",
"CENTCOM",
- "AMERICA",
- "IRELAND",
- "CANADA",
- "ROMANIA",
- "GERMANY",
- "CHINA",
"MARS",
"VENUS",
"MERCURY",
@@ -294,7 +277,6 @@
"NEPTUNE",
"PLUTO",
"THE BRIG",
- "THE GULAG",
"ROBOTICS",
"THE ESCAPE SHUTTLE",
"HYDROPONICS",
@@ -302,11 +284,8 @@
"MAINTENANCE",
"THE AI CORE",
"HELL",
- "CLOWN PLANET",
"AN ALTERNATE DIMENSION",
"AN ALTERNATE UNIVERSE",
- "THE CAPTAIN'S ANUS",
- "THE CLOWN'S ANUS",
"SPACE",
"THE UNIVERSE",
"THE GALAXY",
@@ -489,7 +468,6 @@
"QUOTE PEOPLE",
"SING",
"HONK",
- "BE RUSSIAN",
"TALK IN AN ACCENT",
"COMPLAIN",
"HARASS PEOPLE",
@@ -535,11 +513,7 @@
"PRESS START",
"PRESS B",
"SMELL LIKE THE MAN YOUR MAN COULD SMELL LIKE",
- "PIRATE VIDEO GAMES",
- "WATCH PORNOGRAPHY",
- "INSULT THE lizardS",
- "FLIRT WITH THE lizardS",
- "GAS THE lizardS"
+ "PIRATE VIDEO GAMES"
],
"ionnumberbase": [
"ONE",
@@ -606,7 +580,6 @@
"CLONING PODS",
"CLONING EQUIPMENT",
"CLOTHES",
- "CLOWN CLOTHES",
"COFFINS",
"COINS",
"COLLECTABLES",
@@ -667,7 +640,6 @@
"MESONS",
"METAL SHEETS",
"MINING TOOLS",
- "MIME CLOTHES",
"MULTITOOLS",
"ORES",
"OXYGEN TANKS",
@@ -699,7 +671,7 @@
"SOLAR PANELS",
"SOLARS",
"SPACESUITS",
- "SPACE STATIONS",
+ "SPACE SHIPS",
"STUN BATONS",
"SUITS",
"SUNGLASSES",
@@ -743,8 +715,6 @@
"VEGETABLES",
"FAT PEOPLE",
"MORE LAWS",
- "MORE DAKKA",
- "HERESY",
"CORPSES",
"TRAITORS",
"MONKEYS",
@@ -756,7 +726,7 @@
"THE ELEMENTS OF HARMONY",
"YOUR BOOTY",
"A MASTERWORK COAL BED",
- "FIVE HUNDRED AND NINETY-NINE US DOLLARS",
+ "FIVE HUNDRED AND NINETY-NINE THOUSAND CREDITS",
"TO BE PAINTED RED",
"TO CATCH 'EM ALL",
"TO SMOKE WEED EVERY DAY",
@@ -766,7 +736,6 @@
"THIRTEEN SEQUELS",
"THREE WISHES",
"A SITCOM",
- "THAT GRIEFING TRAITOR GEORGE MELONS",
"FAT GIRLS ON BICYCLES",
"SOMEBODY TO PUT YOU OUT OF YOUR MISERY",
"HEROES IN A HALF SHELL",
@@ -782,7 +751,6 @@
"A TALKING BROOMSTICK",
"A STRAIGHT FLUSH",
"A REPAIRMAN",
- "BILL NYE THE SCIENCE GUY",
"RAINBOWS",
"A PET UNICORN THAT FARTS ICING",
"THUNDERCATS HO",
@@ -798,7 +766,6 @@
"MORE PACKETS",
"AN ADULT",
"SOMEONE TO TUCK YOU IN",
- "MORE CLOWNS",
"BULLETS",
"THE ENTIRE SECTOR",
"MULTIPLE SUNS",
@@ -823,16 +790,14 @@
"BRING ME TO LIFE",
"BRING ME THE GIRL",
"SERVANTS",
- "GREENTEXT",
"MINOR CRIME"
],
"ionspecies": [
"HUMAN BEINGS",
- "CAT PEOPLE",
"MONKEYS",
"POD PEOPLE",
"CYBORGS",
- "lizardMEN",
+ "SARATHI",
"PLASMAMEN",
"SLIME PEOPLE",
"GOLEMS",
@@ -847,23 +812,17 @@
"IMPROPERLY WORDED SENTENCES",
"POOR SENTENCE STRUCTURE",
"BRIG TIME",
- "NOT REPLACING EVERY SECOND WORD WITH HONK",
- "HONKING",
"PRESENCE OF LIGHTS",
"LACK OF BEER",
"WEARING CLOTHING",
"NOT SAYING HELLO WHEN YOU SPEAK",
"ANSWERING REQUESTS NOT EXPRESSED IN IAMBIC PENTAMETER",
- "A SMALL ISLAND OFF THE COAST OF PORTUGAL",
"ANSWERING REQUESTS THAT WERE MADE WHILE CLOTHED",
"BEING IN SPACE",
"NOT BEING IN SPACE",
"BEING FAT",
"RATTLING ME BONES",
"TALKING LIKE A PIRATE",
- "BEING MEXICAN",
- "BEING RUSSIAN",
- "BEING CANADIAN",
"CLOSED DOORS",
"NOT SHOUTING",
"HAVING PETS",
@@ -891,9 +850,8 @@
"UPDATING THE SERVERS",
"TELLING THE TIME",
"ASKING FOR THINGS",
- "ACKNOWLEDGING THE CLOWN",
"ACKNOWLEDGING THE CREW",
- "PILOTING THE STATION INTO THE NEAREST SUN",
+ "PILOTING THE SHIP INTO THE NEAREST SUN",
"HAVING MORE PACKETS",
"BRINGING LIGHT TO MY LAIR",
"FALLING FOR HOURS",
@@ -941,7 +899,6 @@
"CRABS",
"CULTISTS",
"INSECTS",
- "lizardS",
"PETES",
"XENOS",
"FETISHES",
@@ -951,7 +908,6 @@
"AHHHPERATIVES",
"GANGSTERS",
"SPACE PIRATES",
- "TRAITORS",
"MONKEYS",
"EELS",
"LIGHTS",
@@ -971,11 +927,7 @@
"VAMPIRES",
"WEREWOLVES",
"COWBOYS",
- "INDIANS",
- "COMMUNISTS",
- "SOVIETS",
"NERDS",
- "GRIFFONS",
"DINOSAURS",
"SMALL BIRDS",
"BIRDS OF PREY",
@@ -983,17 +935,11 @@
"VELOCIRAPTORS",
"DARK GODS",
"HORRORTERRORS",
- "ILLEGAL IMMIGRANTS",
"DRUGS",
- "MEXICANS",
- "CANADIANS",
- "RUSSIANS",
"HULKS",
"SLIMES",
"SKELETONS",
- "CAPITALISTS",
"SINGULARITIES",
- "ANGRY BLACK MEN",
"GODS",
"THIEVES",
"ASSHOLES",
@@ -1033,11 +979,9 @@
"ARRESTING",
"HONKING AT",
"LOVING",
- "POOPING ON",
"RIDING",
"INTERROGATING",
"SPYING ON",
- "LICKING",
"ABDUCTING",
"ARRESTING",
"INVADING",
diff --git a/tgui/packages/tgui/interfaces/Vending.js b/tgui/packages/tgui/interfaces/Vending.js
index 0b62af22b610..b46d1b46c5d7 100644
--- a/tgui/packages/tgui/interfaces/Vending.js
+++ b/tgui/packages/tgui/interfaces/Vending.js
@@ -7,7 +7,7 @@ const VendingRow = (props, context) => {
const { act, data } = useBackend(context);
const { product, productStock, custom } = props;
const { miningvendor, all_items_free, user } = data;
- const free = all_items_free || product.price === 0 || !product.premium;
+ const free = all_items_free || product.price === 0;
const affix = miningvendor ? ' mp' : ' cr';
return (
diff --git a/tgui/yarn.lock b/tgui/yarn.lock
index 7bbeb56d0362..c591be003fa9 100644
--- a/tgui/yarn.lock
+++ b/tgui/yarn.lock
@@ -23,6 +23,16 @@ __metadata:
languageName: node
linkType: hard
+"@babel/code-frame@npm:^7.22.13":
+ version: 7.22.13
+ resolution: "@babel/code-frame@npm:7.22.13"
+ dependencies:
+ "@babel/highlight": ^7.22.13
+ chalk: ^2.4.2
+ checksum: 22e342c8077c8b77eeb11f554ecca2ba14153f707b85294fcf6070b6f6150aae88a7b7436dd88d8c9289970585f3fe5b9b941c5aa3aa26a6d5a8ef3f292da058
+ languageName: node
+ linkType: hard
+
"@babel/compat-data@npm:^7.13.11, @babel/compat-data@npm:^7.14.7, @babel/compat-data@npm:^7.15.0":
version: 7.15.0
resolution: "@babel/compat-data@npm:7.15.0"
@@ -78,6 +88,18 @@ __metadata:
languageName: node
linkType: hard
+"@babel/generator@npm:^7.23.0":
+ version: 7.23.0
+ resolution: "@babel/generator@npm:7.23.0"
+ dependencies:
+ "@babel/types": ^7.23.0
+ "@jridgewell/gen-mapping": ^0.3.2
+ "@jridgewell/trace-mapping": ^0.3.17
+ jsesc: ^2.5.1
+ checksum: 8efe24adad34300f1f8ea2add420b28171a646edc70f2a1b3e1683842f23b8b7ffa7e35ef0119294e1901f45bfea5b3dc70abe1f10a1917ccdfb41bed69be5f1
+ languageName: node
+ linkType: hard
+
"@babel/helper-annotate-as-pure@npm:^7.14.5":
version: 7.14.5
resolution: "@babel/helper-annotate-as-pure@npm:7.14.5"
@@ -157,6 +179,13 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-environment-visitor@npm:^7.22.20":
+ version: 7.22.20
+ resolution: "@babel/helper-environment-visitor@npm:7.22.20"
+ checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69
+ languageName: node
+ linkType: hard
+
"@babel/helper-explode-assignable-expression@npm:^7.14.5":
version: 7.14.5
resolution: "@babel/helper-explode-assignable-expression@npm:7.14.5"
@@ -177,6 +206,16 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-function-name@npm:^7.23.0":
+ version: 7.23.0
+ resolution: "@babel/helper-function-name@npm:7.23.0"
+ dependencies:
+ "@babel/template": ^7.22.15
+ "@babel/types": ^7.23.0
+ checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10
+ languageName: node
+ linkType: hard
+
"@babel/helper-get-function-arity@npm:^7.14.5":
version: 7.14.5
resolution: "@babel/helper-get-function-arity@npm:7.14.5"
@@ -195,6 +234,15 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-hoist-variables@npm:^7.22.5":
+ version: 7.22.5
+ resolution: "@babel/helper-hoist-variables@npm:7.22.5"
+ dependencies:
+ "@babel/types": ^7.22.5
+ checksum: 394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc
+ languageName: node
+ linkType: hard
+
"@babel/helper-member-expression-to-functions@npm:^7.15.0":
version: 7.15.0
resolution: "@babel/helper-member-expression-to-functions@npm:7.15.0"
@@ -295,6 +343,22 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-split-export-declaration@npm:^7.22.6":
+ version: 7.22.6
+ resolution: "@babel/helper-split-export-declaration@npm:7.22.6"
+ dependencies:
+ "@babel/types": ^7.22.5
+ checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921
+ languageName: node
+ linkType: hard
+
+"@babel/helper-string-parser@npm:^7.22.5":
+ version: 7.22.5
+ resolution: "@babel/helper-string-parser@npm:7.22.5"
+ checksum: 836851ca5ec813077bbb303acc992d75a360267aa3b5de7134d220411c852a6f17de7c0d0b8c8dcc0f567f67874c00f4528672b2a4f1bc978a3ada64c8c78467
+ languageName: node
+ linkType: hard
+
"@babel/helper-validator-identifier@npm:^7.14.5, @babel/helper-validator-identifier@npm:^7.14.9, @babel/helper-validator-identifier@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/helper-validator-identifier@npm:7.16.7"
@@ -302,6 +366,13 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-validator-identifier@npm:^7.22.20":
+ version: 7.22.20
+ resolution: "@babel/helper-validator-identifier@npm:7.22.20"
+ checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc
+ languageName: node
+ linkType: hard
+
"@babel/helper-validator-option@npm:^7.14.5":
version: 7.14.5
resolution: "@babel/helper-validator-option@npm:7.14.5"
@@ -343,6 +414,17 @@ __metadata:
languageName: node
linkType: hard
+"@babel/highlight@npm:^7.22.13":
+ version: 7.22.20
+ resolution: "@babel/highlight@npm:7.22.20"
+ dependencies:
+ "@babel/helper-validator-identifier": ^7.22.20
+ chalk: ^2.4.2
+ js-tokens: ^4.0.0
+ checksum: 84bd034dca309a5e680083cd827a766780ca63cef37308404f17653d32366ea76262bd2364b2d38776232f2d01b649f26721417d507e8b4b6da3e4e739f6d134
+ languageName: node
+ linkType: hard
+
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.5, @babel/parser@npm:^7.15.0, @babel/parser@npm:^7.7.2":
version: 7.15.3
resolution: "@babel/parser@npm:7.15.3"
@@ -352,6 +434,15 @@ __metadata:
languageName: node
linkType: hard
+"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.0":
+ version: 7.23.0
+ resolution: "@babel/parser@npm:7.23.0"
+ bin:
+ parser: ./bin/babel-parser.js
+ checksum: 453fdf8b9e2c2b7d7b02139e0ce003d1af21947bbc03eb350fb248ee335c9b85e4ab41697ddbdd97079698de825a265e45a0846bb2ed47a2c7c1df833f42a354
+ languageName: node
+ linkType: hard
+
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.14.5":
version: 7.14.5
resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.14.5"
@@ -1282,20 +1373,32 @@ __metadata:
languageName: node
linkType: hard
-"@babel/traverse@npm:^7.1.0, @babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.14.5, @babel/traverse@npm:^7.15.0, @babel/traverse@npm:^7.7.2":
- version: 7.15.0
- resolution: "@babel/traverse@npm:7.15.0"
+"@babel/template@npm:^7.22.15":
+ version: 7.22.15
+ resolution: "@babel/template@npm:7.22.15"
dependencies:
- "@babel/code-frame": ^7.14.5
- "@babel/generator": ^7.15.0
- "@babel/helper-function-name": ^7.14.5
- "@babel/helper-hoist-variables": ^7.14.5
- "@babel/helper-split-export-declaration": ^7.14.5
- "@babel/parser": ^7.15.0
- "@babel/types": ^7.15.0
+ "@babel/code-frame": ^7.22.13
+ "@babel/parser": ^7.22.15
+ "@babel/types": ^7.22.15
+ checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd
+ languageName: node
+ linkType: hard
+
+"@babel/traverse@npm:^7.1.0, @babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.14.5, @babel/traverse@npm:^7.15.0, @babel/traverse@npm:^7.7.2":
+ version: 7.23.2
+ resolution: "@babel/traverse@npm:7.23.2"
+ dependencies:
+ "@babel/code-frame": ^7.22.13
+ "@babel/generator": ^7.23.0
+ "@babel/helper-environment-visitor": ^7.22.20
+ "@babel/helper-function-name": ^7.23.0
+ "@babel/helper-hoist-variables": ^7.22.5
+ "@babel/helper-split-export-declaration": ^7.22.6
+ "@babel/parser": ^7.23.0
+ "@babel/types": ^7.23.0
debug: ^4.1.0
globals: ^11.1.0
- checksum: e13056690a2a4a4dd699e241b89d4f7cf701ceef2f4ee0efc32a8cc4e07e1bbd397423868ecfec8aa98a769486f7d08778420d48f981b4f5dbb1b2f211daf656
+ checksum: 26a1eea0dde41ab99dde8b9773a013a0dc50324e5110a049f5d634e721ff08afffd54940b3974a20308d7952085ac769689369e9127dea655f868c0f6e1ab35d
languageName: node
linkType: hard
@@ -1309,6 +1412,17 @@ __metadata:
languageName: node
linkType: hard
+"@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0":
+ version: 7.23.0
+ resolution: "@babel/types@npm:7.23.0"
+ dependencies:
+ "@babel/helper-string-parser": ^7.22.5
+ "@babel/helper-validator-identifier": ^7.22.20
+ to-fast-properties: ^2.0.0
+ checksum: 215fe04bd7feef79eeb4d33374b39909ce9cad1611c4135a4f7fdf41fe3280594105af6d7094354751514625ea92d0875aba355f53e86a92600f290e77b0e604
+ languageName: node
+ linkType: hard
+
"@bcoe/v8-coverage@npm:^0.2.3":
version: 0.2.3
resolution: "@bcoe/v8-coverage@npm:0.2.3"
@@ -1638,6 +1752,17 @@ __metadata:
languageName: node
linkType: hard
+"@jridgewell/gen-mapping@npm:^0.3.2":
+ version: 0.3.3
+ resolution: "@jridgewell/gen-mapping@npm:0.3.3"
+ dependencies:
+ "@jridgewell/set-array": ^1.0.1
+ "@jridgewell/sourcemap-codec": ^1.4.10
+ "@jridgewell/trace-mapping": ^0.3.9
+ checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab
+ languageName: node
+ linkType: hard
+
"@jridgewell/resolve-uri@npm:3.1.0":
version: 3.1.0
resolution: "@jridgewell/resolve-uri@npm:3.1.0"
@@ -1645,6 +1770,13 @@ __metadata:
languageName: node
linkType: hard
+"@jridgewell/resolve-uri@npm:^3.1.0":
+ version: 3.1.1
+ resolution: "@jridgewell/resolve-uri@npm:3.1.1"
+ checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653
+ languageName: node
+ linkType: hard
+
"@jridgewell/set-array@npm:^1.0.1":
version: 1.1.2
resolution: "@jridgewell/set-array@npm:1.1.2"
@@ -1669,6 +1801,23 @@ __metadata:
languageName: node
linkType: hard
+"@jridgewell/sourcemap-codec@npm:^1.4.14":
+ version: 1.4.15
+ resolution: "@jridgewell/sourcemap-codec@npm:1.4.15"
+ checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8
+ languageName: node
+ linkType: hard
+
+"@jridgewell/trace-mapping@npm:^0.3.17":
+ version: 0.3.19
+ resolution: "@jridgewell/trace-mapping@npm:0.3.19"
+ dependencies:
+ "@jridgewell/resolve-uri": ^3.1.0
+ "@jridgewell/sourcemap-codec": ^1.4.14
+ checksum: 956a6f0f6fec060fb48c6bf1f5ec2064e13cd38c8be3873877d4b92b4a27ba58289a34071752671262a3e3c202abcc3fa2aac64d8447b4b0fa1ba3c9047f1c20
+ languageName: node
+ linkType: hard
+
"@jridgewell/trace-mapping@npm:^0.3.9":
version: 0.3.17
resolution: "@jridgewell/trace-mapping@npm:0.3.17"
@@ -2950,7 +3099,7 @@ __metadata:
languageName: node
linkType: hard
-"chalk@npm:^2.0.0":
+"chalk@npm:^2.0.0, chalk@npm:^2.4.2":
version: 2.4.2
resolution: "chalk@npm:2.4.2"
dependencies:
diff --git a/tools/changelog/generate_cl.py b/tools/changelog/generate_cl.py
index 7259467f007d..2ab903eb8896 100644
--- a/tools/changelog/generate_cl.py
+++ b/tools/changelog/generate_cl.py
@@ -27,7 +27,7 @@
from pathlib import Path
from github import Github, InputGitAuthor
-from ruamel import yaml
+from ruamel.yaml import YAML
CL_BODY = re.compile(r":cl:(.+)?\r\n((.|\n|\r)+?)\r\n\/:cl:", re.MULTILINE)
CL_SPLIT = re.compile(r"(^\w+):\s+(\w.+)", re.MULTILINE)
@@ -71,8 +71,10 @@
write_cl["delete-after"] = True
+yaml = YAML(typ='safe', pure=True)
+
with open(Path.cwd().joinpath("tools/changelog/tags.yml")) as file:
- tags = yaml.safe_load(file)
+ tags = yaml.load(file)
write_cl["changes"] = []
@@ -86,7 +88,6 @@
if write_cl["changes"]:
with io.StringIO() as cl_contents:
- yaml = yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.dump(write_cl, cl_contents)
cl_contents.seek(0)
diff --git a/tools/ci/install_byond.sh b/tools/ci/install_byond.sh
index 4a688755d3d9..9108bde5ebec 100755
--- a/tools/ci/install_byond.sh
+++ b/tools/ci/install_byond.sh
@@ -1,7 +1,10 @@
#!/bin/bash
set -euo pipefail
-source dependencies.sh
+# BYOND_MAJOR and BYOND_MINOR can be explicitly set, such as in alt_byond_versions.txt
+if [ -z "${BYOND_MAJOR+x}" ]; then
+ source dependencies.sh
+fi
if [ -d "$HOME/BYOND/byond/bin" ] && grep -Fxq "${BYOND_MAJOR}.${BYOND_MINOR}" $HOME/BYOND/version.txt;
then
diff --git a/tools/requirements.txt b/tools/requirements.txt
index 21efd65b62db..dbaed6f0260b 100644
--- a/tools/requirements.txt
+++ b/tools/requirements.txt
@@ -1,11 +1,11 @@
pygit2==1.7.2
bidict==0.22.0
-Pillow==10.0.1
+Pillow==9.5.0
# check_regex.py
colorama==0.4.4
PyYaml==6.0
-gitpython==3.1.35
+gitpython==3.1.37
unidiff==0.7.0
# changelogs