diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index bca65dd853..b68d798113 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -563,4 +563,4 @@
singular_name = "catwalk floor tile"
desc = "Flooring that shows its contents underneath. Engineers love it!"
icon_state = "catwalk_tile"
- turf_type = /turf/open/floor/plating/catwalk_floor
+ turf_type = /turf/open/floor/catwalk_floor
diff --git a/code/game/turfs/open/floor/catwalk_plating.dm b/code/game/turfs/open/floor/catwalk_plating.dm
index 76d22847c9..ac0f3b63de 100644
--- a/code/game/turfs/open/floor/catwalk_plating.dm
+++ b/code/game/turfs/open/floor/catwalk_plating.dm
@@ -5,7 +5,7 @@
* you can crowbar it to interact with the underneath stuff without destroying the tile...
* unless you want to!
*/
-/turf/open/floor/plating/catwalk_floor
+/turf/open/floor/catwalk_floor
icon = 'icons/turf/floors/catwalk_plating.dmi'
icon_state = "catwalk_below"
floor_tile = /obj/item/stack/tile/catwalk
@@ -16,29 +16,35 @@
barefootstep = FOOTSTEP_CATWALK
clawfootstep = FOOTSTEP_CATWALK
heavyfootstep = FOOTSTEP_CATWALK
+ intact = FALSE
var/covered = TRUE
-/turf/open/floor/plating/catwalk_floor/Initialize(mapload)
+/turf/open/floor/catwalk_floor/Initialize(mapload)
. = ..()
layer = CATWALK_LAYER
update_icon(UPDATE_OVERLAYS)
-/turf/open/floor/plating/catwalk_floor/update_overlays()
+/turf/open/floor/catwalk_floor/update_overlays()
. = ..()
- var/static/catwalk_overlay
+ var/static/image/catwalk_overlay
if(isnull(catwalk_overlay))
- catwalk_overlay = iconstate2appearance(icon, "catwalk_above")
+ catwalk_overlay = new()
+ catwalk_overlay.icon = icon
+ catwalk_overlay.icon_state = "catwalk_above"
+ catwalk_overlay.plane = GAME_PLANE
+ catwalk_overlay.layer = CATWALK_LAYER
+ catwalk_overlay = catwalk_overlay.appearance
if(covered)
. += catwalk_overlay
-/turf/open/floor/plating/catwalk_floor/screwdriver_act(mob/living/user, obj/item/tool)
+/turf/open/floor/catwalk_floor/screwdriver_act(mob/living/user, obj/item/tool)
. = ..()
covered = !covered
user.balloon_alert(user, "[!covered ? "cover removed" : "cover added"]")
update_icon(UPDATE_OVERLAYS)
-/turf/open/floor/plating/catwalk_floor/pry_tile(obj/item/crowbar, mob/user, silent)
+/turf/open/floor/catwalk_floor/crowbar_act(mob/user, obj/item/I)
if(covered)
user.balloon_alert(user, "remove cover first!")
return FALSE
- . = ..()
+ return pry_tile(I, user)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 2430ae1b22..e9818476c6 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -247,6 +247,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/screenshake = 100
var/damagescreenshake = 2
+ var/recoil_screenshake = 100
var/arousable = TRUE
var/autostand = TRUE
var/auto_ooc = FALSE
@@ -972,6 +973,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]
"
if (user && user.client && !user.client.prefs.screenshake==0)
dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
"
+ dat += "Recoil Screen Push: [(recoil_screenshake==100) ? "Full" : ((recoil_screenshake==0) ? "None" : "[screenshake]")]
"
var/p_chaos
if (!preferred_chaos)
p_chaos = "No preference"
@@ -2890,7 +2892,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("no_tetris_storage")
no_tetris_storage = !no_tetris_storage
if ("screenshake")
- var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, 200 = maximum.)", "Character Preference", screenshake) as null|num
+ var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, no maximum (at your own risk).)", "Character Preference", screenshake) as null|num
if (!isnull(desiredshake))
screenshake = desiredshake
if("damagescreenshake")
@@ -2903,6 +2905,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
damagescreenshake = 0
else
damagescreenshake = 1
+ if ("recoil_screenshake")
+ var/desiredshake = input(user, "Set the amount of recoil screenshake/push you want. \n(0 = disabled, 100 = full, no maximum (at your own risk).)", "Character Preference", screenshake) as null|num
+ if (!isnull(desiredshake))
+ recoil_screenshake = desiredshake
if("nameless")
nameless = !nameless
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index 8ede497c83..561dc9c096 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -19,6 +19,7 @@
attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
sharpness = SHARP_EDGED
actions_types = list(/datum/action/item_action/toggle_light)
+ obj_flags = UNIQUE_RENAME
var/list/trophies = list()
var/charged = TRUE
var/charge_time = 15
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 0f2b808de3..e89f39f464 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -836,13 +836,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/left_state = DEFAULT_LEFT_EYE_STATE
var/right_state = DEFAULT_RIGHT_EYE_STATE
if(eye_type in GLOB.eye_types)
- left_state = eye_type + "_left_eye"
- right_state = eye_type + "_right_eye"
+ left_state = "[eye_type]_left_eye"
+ right_state = "[eye_type]_right_eye"
var/mutable_appearance/left_eye = mutable_appearance('icons/mob/eyes.dmi', left_state, -BODY_LAYER)
var/mutable_appearance/right_eye = mutable_appearance('icons/mob/eyes.dmi', right_state, -BODY_LAYER)
if((EYECOLOR in species_traits) && has_eyes)
- left_eye.color = "#" + H.left_eye_color
- right_eye.color = "#" + H.right_eye_color
+ left_eye.color = "#[H.left_eye_color]"
+ right_eye.color = "#[H.right_eye_color]"
if(OFFSET_EYES in offset_features)
left_eye.pixel_x += offset_features[OFFSET_EYES][1]
left_eye.pixel_y += offset_features[OFFSET_EYES][2]
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 8595839831..90a7aae95e 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -250,7 +250,17 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
animate(pixel_x=oldx, pixel_y=oldy, time=1)
-
+/proc/directional_recoil(mob/M, strength=1, angle = 0)
+ if(!M || !M.client)
+ return
+ var/client/C = M.client
+ var/client_screenshake = (C.prefs.recoil_screenshake * 0.01)
+ strength *= client_screenshake
+ var/recoil_x = -sin(angle)*4*strength + rand(-strength, strength)
+ var/recoil_y = -cos(angle)*4*strength + rand(-strength, strength)
+ animate(C, pixel_x=recoil_x, pixel_y=recoil_y, time=1, easing=SINE_EASING|EASE_OUT, flags=ANIMATION_PARALLEL|ANIMATION_RELATIVE)
+ animate(pixel_x=0, pixel_y=0, time=3, easing=SINE_EASING|EASE_IN) // according to bhjin this works on more recent byond versions
+ // if you havent updated uuh sucks to be you then
/proc/findname(msg)
if(!istext(msg))
diff --git a/code/modules/modular_computers/file_system/programs/signaler.dm b/code/modules/modular_computers/file_system/programs/signaler.dm
index b7bbcacaa0..ded70f7f37 100644
--- a/code/modules/modular_computers/file_system/programs/signaler.dm
+++ b/code/modules/modular_computers/file_system/programs/signaler.dm
@@ -15,40 +15,29 @@
/// Radio connection datum used by signalers.
var/datum/radio_frequency/radio_connection
-/datum/computer_file/program/signaler/run_program(mob/living/user)
- . = ..()
- if (!.)
- return
- if(!computer?.get_modular_computer_part(MC_SIGNALER)) //Giving a clue to users why the program is spitting out zeros.
- to_chat(user, span_warning("\The [computer] flashes an error: \"hardware\\signal_hardware\\startup.bin -- file not found\"."))
-
+/datum/computer_file/program/signaler/New()
+ set_frequency(signal_frequency)
+ return ..()
/datum/computer_file/program/signaler/ui_data(mob/user)
var/list/data = get_header_data()
- var/obj/item/computer_hardware/radio_card/sensor = computer?.get_modular_computer_part(MC_SIGNALER)
- if(sensor?.check_functionality())
- data["frequency"] = signal_frequency
- data["code"] = signal_code
- data["minFrequency"] = MIN_FREE_FREQ
- data["maxFrequency"] = MAX_FREE_FREQ
+ data["frequency"] = signal_frequency
+ data["code"] = signal_code
+ data["minFrequency"] = MIN_FREE_FREQ
+ data["maxFrequency"] = MAX_FREE_FREQ
return data
/datum/computer_file/program/signaler/ui_act(action, list/params)
. = ..()
if(.)
return
- var/obj/item/computer_hardware/radio_card/sensor = computer?.get_modular_computer_part(MC_SIGNALER)
- if(!(sensor?.check_functionality()))
- playsound(src, 'sound/machines/scanbuzz.ogg', 100, FALSE)
- return
switch(action)
if("signal")
INVOKE_ASYNC(src, .proc/signal)
. = TRUE
if("freq")
- signal_frequency = unformat_frequency(params["freq"])
- signal_frequency = sanitize_frequency(signal_frequency, TRUE)
- set_frequency(signal_frequency)
+ var/new_signal_frequency = sanitize_frequency(unformat_frequency(params["freq"]), TRUE)
+ set_frequency(new_signal_frequency)
. = TRUE
if("code")
signal_code = text2num(params["code"])
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 0ad49e192d..cb9570e02f 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -173,7 +173,7 @@
O.renamedByPlayer = TRUE
if(penchoice == "Change description")
- var/input = stripped_input(user,"Describe [O] here:", ,"[O.desc]", 140)
+ var/input = stripped_input(user,"Describe [O] here:", ,"[O.desc]", 350)
var/olddesc = O.desc
if(QDELETED(O) || !user.canUseTopic(O, BE_CLOSE))
return
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 3210ad2d15..a4d3c3a63a 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -94,6 +94,9 @@
var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds
+ /// directional recoil multiplier
+ var/dir_recoil_amp = 10
+
/obj/item/gun/Initialize(mapload)
. = ..()
if(no_pin_required)
@@ -159,7 +162,7 @@
/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = FALSE, mob/pbtarget, message = 1, stam_cost = 0)
if(recoil)
- shake_camera(user, recoil + 1, recoil)
+ directional_recoil(user, recoil*dir_recoil_amp, Get_Angle(user, pbtarget))
if(stam_cost) //CIT CHANGE - makes gun recoil cause staminaloss
var/safe_cost = clamp(stam_cost, 0, user.stamina_buffer)*(firing && burst_size >= 2 ? 1/burst_size : 1)
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index fe42fc2d99..f3b07aa7a4 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -167,6 +167,7 @@
icon_state = "goldrevolver"
fire_sound = 'sound/weapons/resonator_blast.ogg'
recoil = 8
+ dir_recoil_amp = 5 // 40 directional recoil is already really funny
pin = /obj/item/firing_pin
/obj/item/gun/ballistic/revolver/nagant
diff --git a/html/changelogs/AutoChangeLog-pr-15747.yml b/html/changelogs/AutoChangeLog-pr-15747.yml
new file mode 100644
index 0000000000..5660fdb125
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15747.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "catwalk overlays behave properly, appearing on top of cables and such"
diff --git a/html/changelogs/AutoChangeLog-pr-15751.yml b/html/changelogs/AutoChangeLog-pr-15751.yml
new file mode 100644
index 0000000000..f37748f5d0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15751.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - tweak: "Recoil now pushes your screen in the opposite direction of where you're shooting. It makes sense in context, I swear. Adjust the setting for this in your client prefs, because it defaults to on."
diff --git a/html/changelogs/AutoChangeLog-pr-15753.yml b/html/changelogs/AutoChangeLog-pr-15753.yml
new file mode 100644
index 0000000000..b7201a1f87
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15753.yml
@@ -0,0 +1,5 @@
+author: "SandPoot"
+delete-after: True
+changes:
+ - bugfix: "Fixed the lack of eyes making ERROR appear on people."
+ - qol: "Set up for the dmi editor extension, very helpful as you can see the existant states and their names opposed to only images in a huge spritesheet."
diff --git a/html/changelogs/AutoChangeLog-pr-15757.yml b/html/changelogs/AutoChangeLog-pr-15757.yml
new file mode 100644
index 0000000000..170f1d733d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15757.yml
@@ -0,0 +1,5 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - tweak: "Proto-kinetic crushers and variants can now be renamed via pen."
+ - tweak: "Custom descriptions on items tagged with UNIQUE_RENAME can now go to 350 characters, up from 140."
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index 4b8dba160a..c4927ea06b 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/turf/floors/catwalk_plating.dmi b/icons/turf/floors/catwalk_plating.dmi
index 24954e4a17..c9ad36653b 100644
Binary files a/icons/turf/floors/catwalk_plating.dmi and b/icons/turf/floors/catwalk_plating.dmi differ