diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index bfdcf82024..4a24416e3c 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1262,22 +1262,3 @@
*/
/atom/proc/setClosed()
return
-
-///Passes Stat Browser Panel clicks to the game and calls client click on an atom
-/atom/Topic(href, list/href_list)
- . = ..()
- if(!usr?.client)
- return
- var/client/usr_client = usr.client
- var/list/paramslist = list()
- if(href_list["statpanel_item_shiftclick"])
- paramslist["shift"] = "1"
- if(href_list["statpanel_item_ctrlclick"])
- paramslist["ctrl"] = "1"
- if(href_list["statpanel_item_altclick"])
- paramslist["alt"] = "1"
- if(href_list["statpanel_item_click"])
- // first of all make sure we valid
- var/mouseparams = list2params(paramslist)
- usr_client.Click(src, loc, null, mouseparams)
- return TRUE
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index c8eb96005c..92b222aed7 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -23,14 +23,15 @@
resistance_flags = FIRE_PROOF
var/self_fueling = FALSE //Do we refill ourselves or not
- var/nextrefueltick = 0 // How long it takes before we get a new fuel unit
+ var/nextrefueltick = 0 //When is the next tick we refuel?
+ var/refueling_interval = 10 //Every how many processing ticks does this refuel? (1 = every processing tick)
custom_materials = list(/datum/material/iron=70, /datum/material/glass=30)
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
var/max_fuel = 20 //The max amount of fuel the welder can hold
var/change_icons = 1
- var/can_off_process = 0
+ var/can_off_process = FALSE
var/light_intensity = 2 //how powerful the emitted light is when used.
var/progress_flash_divisor = 10
var/burned_fuel_for = 0 //when fuel was last removed
@@ -66,6 +67,14 @@
. += "[initial(icon_state)]-on"
/obj/item/weldingtool/process()
+ //This handles refueling. Its looking at how much fuel the tool has and comparing that to how much it holds
+ //This then looks if the refuel tick has come based on world time.
+ //Then looks if we refuel ourselves or not.
+
+ if(self_fueling && get_fuel() < max_fuel && nextrefueltick <= world.time)
+ nextrefueltick = world.time + refueling_interval
+ reagents.add_reagent(/datum/reagent/fuel, 1)
+
switch(welding)
if(0)
force = 3
@@ -86,14 +95,6 @@
//This is to start fires. process() is only called if the welder is on.
open_flame()
- //This handles refueling. Its looking at how much fuel the tool has and comparing that to how much it holds
- //This then looks if the refuel tick has come based on world time.
- //Then looks if we refuel ourselves or not.
-
- if(get_fuel() < max_fuel && nextrefueltick < world.time && self_fueling)
- nextrefueltick = world.time + 10
- reagents.add_reagent(/datum/reagent/fuel, 1)
-
/obj/item/weldingtool/suicide_act(mob/user)
user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!")
return (FIRELOSS)
@@ -367,7 +368,7 @@
custom_materials = list(/datum/material/iron=70, /datum/material/glass=120)
change_icons = 0
self_fueling = TRUE
- can_off_process = 1
+ can_off_process = TRUE
light_intensity = 1
toolspeed = 0.5
@@ -375,6 +376,7 @@
name = "brass welding tool"
desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
resistance_flags = FIRE_PROOF | ACID_PROOF
+ refueling_interval = 5
icon_state = "clockwelder"
item_state = "brasswelder"
@@ -384,16 +386,20 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "welder"
self_fueling = TRUE
+ can_off_process = TRUE
+ refueling_interval = 1
toolspeed = 0.1
light_intensity = 0
change_icons = 0
/obj/item/weldingtool/advanced
name = "advanced welding tool"
- desc = "A modern welding tool combined with an alien welding tool, it never runs out of fuel and works almost as fast."
+ desc = "A modern welding tool combined with an alien welding tool, it almost never runs out of fuel and works nearly as fast."
icon = 'icons/obj/advancedtools.dmi'
icon_state = "welder"
self_fueling = TRUE
+ can_off_process = TRUE
+ refueling_interval = 2
toolspeed = 0.2
light_intensity = 0
change_icons = 0
diff --git a/code/game/say.dm b/code/game/say.dm
index 61dd9c0879..3bc14ed245 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -98,11 +98,11 @@ GLOBAL_LIST_INIT(freqtospan, list(
/// Converts specific characters, like +, |, and _ to formatted output.
/atom/movable/proc/say_emphasis(input)
- var/static/regex/italics = regex(@"\|(\S[\w\W]*?\S)\|", "g")
+ var/static/regex/italics = regex(@"\|((?=\S)[\w\W]*?(?<=\S))\|", "g")
input = italics.Replace_char(input, "$1")
- var/static/regex/bold = regex(@"\+(\S[\w\W]*?\S)\+", "g")
+ var/static/regex/bold = regex(@"\+((?=\S)[\w\W]*?(?<=\S))\+", "g")
input = bold.Replace_char(input, "$1")
- var/static/regex/underline = regex(@"_(\S[\w\W]*?\S)_", "g")
+ var/static/regex/underline = regex(@"_((?=\S)[\w\W]*?(?<=\S))_", "g")
input = underline.Replace_char(input, "$1")
return input
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index fd2ad6d3e0..f51ab7d3e3 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -101,6 +101,10 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
keyUp(keycode)
return
+ if(href_list["statpanel_item_target"])
+ handle_statpanel_click(href_list)
+ return
+
// Tgui Topic middleware
if(tgui_Topic(href_list))
return
@@ -141,6 +145,10 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
..() //redirect to hsrc.Topic()
+/client/proc/handle_statpanel_click(list/href_list)
+ var/atom/target = locate(href_list["statpanel_item_target"])
+ Click(target, target.loc, null, "[href_list["statpanel_item_shiftclick"]?"shift=1;":null][href_list["statpanel_item_ctrlclick"]?"ctrl=1;":null]&alt=[href_list["statpanel_item_altclick"]?"alt=1;":null]", FALSE, "statpanel")
+
/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.")
@@ -798,7 +806,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
message_admins("Proxy Detection: [key_name_admin(src)] IP intel rated [res.intel*100]% likely to be a Proxy/VPN.")
ip_intel = res.intel
-/client/Click(atom/object, atom/location, control, params, ignore_spam = FALSE)
+/client/Click(atom/object, atom/location, control, params, ignore_spam = FALSE, extra_info)
if(last_click > world.time - world.tick_lag)
return
last_click = world.time
@@ -851,7 +859,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
return
if(prefs.log_clicks)
- log_click(object, location, control, params, src)
+ log_click(object, location, control, params, src, extra_info? "clicked ([extra_info])" : null)
if (prefs.hotkeys)
// If hotkey mode is enabled, then clicking the map will automatically
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index f9f587ae5b..af55c6b9d7 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -20,6 +20,7 @@
body_parts_covered = ARMS
cold_protection = ARMS
strip_delay = 300 //you can't just yank them off
+ obj_flags = UNIQUE_RENAME
/// did you ever get around to wearing these or no
var/wornonce = FALSE
///Extra damage through the punch.
diff --git a/code/modules/mob/living/carbon/human/species_types/arachnid.dm b/code/modules/mob/living/carbon/human/species_types/arachnid.dm
index 4a8c872400..a44177ced1 100644
--- a/code/modules/mob/living/carbon/human/species_types/arachnid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/arachnid.dm
@@ -139,6 +139,18 @@
if(E.web_ready == FALSE)
to_chat(H, "You need to wait awhile to regenerate web fluid.")
return
+ if(!H.Adjacent(A)) //No.
+ return
+ if(!isliving(A) && A.anchored)
+ to_chat(H, "[A] is bolted to the floor!")
+ return
+ if(istype(A, /obj/structure/arachnid))
+ to_chat(H, "No double wrapping.")
+ return
+ if(istype(A, /obj/effect))
+ to_chat(H, "You cannot wrap this.")
+ return
+ H.visible_message("[H] starts to wrap [A] into a cocoon!","You start to wrap [A] into a cocoon.")
if(!do_after(H, 10 SECONDS, 1, A))
to_chat(H, "Your web spinning was interrupted!")
return
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 7faa08b52c..0418292fea 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -27,7 +27,7 @@
/datum/species/dullahan/check_roundstart_eligible()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
return TRUE
- return FALSE
+ return ..()
/datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
. = ..()
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index ca2c259bb5..762e9fe39c 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -1082,11 +1082,12 @@
if("lockdown")
var/celluse = rand(20,35)
celluse = celluse /100
+ if(!cell.use(cell.maxcharge*celluse))
+ return
for (var/obj/machinery/door/D in GLOB.airlocks)
if (get_area(D) == area)
INVOKE_ASYNC(D,/obj/machinery/door.proc/hostile_lockdown,usr, FALSE)
addtimer(CALLBACK(D,/obj/machinery/door.proc/disable_lockdown, FALSE), 30 SECONDS)
- cell.charge -= cell.maxcharge*celluse
var/obj/item/implant/hijack/H = usr.getImplant(/obj/item/implant/hijack)
H.stealthcooldown = world.time + 3 MINUTES
if("occupy")
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index a4daeb6a33..a0509fbd41 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -86,6 +86,8 @@
// recharge the cell
/obj/item/stock_parts/cell/proc/give(amount)
+ if(amount < 0)
+ return
if(rigged && amount > 0)
explode()
return 0
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index fd442bb7a6..fb9e6ff6c6 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -100,6 +100,10 @@
var/impact_light_intensity = 3
var/impact_light_range = 2
var/impact_light_color_override
+ // Normal lighting effects
+ var/fired_light_intensity = 1
+ var/fired_light_range = 0
+ var/fired_light_color = rgb(255, 255, 255)
//Homing
var/homing = FALSE
@@ -506,6 +510,7 @@
transform = M
trajectory_ignore_forcemove = TRUE
forceMove(starting)
+ set_light(fired_light_range, fired_light_intensity, fired_light_color)
trajectory_ignore_forcemove = FALSE
if(isnull(pixel_increment_amount))
pixel_increment_amount = SSprojectiles.global_pixel_increment_amount
diff --git a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm
index 78deff601f..03482e2a9d 100644
--- a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm
+++ b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm
@@ -2,22 +2,22 @@
icon_state = "magjectile"
damage = 20
armour_penetration = 20
- light_range = 3
+ fired_light_range = 3
pixels_per_second = TILES_TO_PIXELS(16.667)
range = 35
- light_color = LIGHT_COLOR_RED
+ fired_light_color = LIGHT_COLOR_RED
/obj/item/projectile/bullet/magnetic/disabler
icon_state = "magjectile-nl" //nl stands for non-lethal
damage = 2
armour_penetration = 10
stamina = 20
- light_color = LIGHT_COLOR_BLUE
+ fired_light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/bullet/magnetic/weak
damage = 15
armour_penetration = 10
- light_range = 2
+ fired_light_range = 2
range = 25
/obj/item/projectile/bullet/magnetic/weak/disabler
@@ -30,8 +30,8 @@
stamina = 10
movement_type = FLYING | UNSTOPPABLE
range = 6
- light_range = 1
- light_color = LIGHT_COLOR_RED
+ fired_light_range = 1
+ fired_light_color = LIGHT_COLOR_RED
/obj/item/projectile/bullet/incendiary/mag_inferno
icon_state = "magjectile-large"
@@ -40,8 +40,8 @@
movement_type = FLYING | UNSTOPPABLE
range = 20
pixels_per_second = TILES_TO_PIXELS(12.5)
- light_range = 4
- light_color = LIGHT_COLOR_RED
+ fired_light_range = 4
+ fired_light_color = LIGHT_COLOR_RED
/obj/item/projectile/bullet/incendiary/mag_inferno/on_hit(atom/target, blocked = FALSE)
..()
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index f706dd10d9..cd0ac28daf 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -699,6 +699,8 @@
else
if(species_id in GLOB.greyscale_limb_types) //should they have greyscales?
base_bp_icon = DEFAULT_BODYPART_ICON_ORGANIC
+ else
+ base_bp_icon = DEFAULT_BODYPART_ICON
if(base_bp_icon != DEFAULT_BODYPART_ICON)
color_src = mut_colors ? MUTCOLORS : ((H.dna.skin_tone_override && S.use_skintones == USE_SKINTONES_GRAYSCALE_CUSTOM) ? CUSTOM_SKINTONE : SKINTONE)
diff --git a/html/changelogs/AutoChangeLog-pr-13830.yml b/html/changelogs/AutoChangeLog-pr-13830.yml
new file mode 100644
index 0000000000..c126670246
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13830.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - bugfix: "apids render now"
diff --git a/html/changelogs/AutoChangeLog-pr-13845.yml b/html/changelogs/AutoChangeLog-pr-13845.yml
new file mode 100644
index 0000000000..d10485ae9f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13845.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - bugfix: "dullahans enabled"
diff --git a/html/changelogs/AutoChangeLog-pr-13850.yml b/html/changelogs/AutoChangeLog-pr-13850.yml
new file mode 100644
index 0000000000..64c47ade40
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13850.yml
@@ -0,0 +1,5 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - bugfix: "Self-fueling weldingtools recharge fuel properly again."
+ - bugfix: "Brass welders now actually recharge faster than experimental ones."
diff --git a/html/changelogs/AutoChangeLog-pr-13870.yml b/html/changelogs/AutoChangeLog-pr-13870.yml
new file mode 100644
index 0000000000..820c524224
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13870.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - bugfix: "Magrifle ammo no longer glows."
diff --git a/html/statbrowser.html b/html/statbrowser.html
index 346a198746..e7d49ceebc 100644
--- a/html/statbrowser.html
+++ b/html/statbrowser.html
@@ -875,7 +875,7 @@ function draw_listedturf() {
// rather than every onmousedown getting the "part" of the last entry.
return function(e) {
e.preventDefault();
- clickcatcher = "?src=" + part[1] + ";statpanel_item_click=1";
+ clickcatcher = "?src=_statpanel_;statpanel_item_target=" + part[1] + ";statpanel_item_click=1";
if(e.shiftKey){
clickcatcher += ";statpanel_item_shiftclick=1";
}