diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 45b7dc5a642..526be3bcaf0 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,7 +15,6 @@ add: Added new things del: Removed old things tweak: tweaked a few things -balance: rebalanced something fix: fixed a few things wip: added a few works in progress soundadd: added a new sound thingy diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 8de75d7aaf1..d046e4fb402 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -35447,7 +35447,6 @@ /area/library) "bmF" = ( /obj/structure/cult/archives, -/obj/item/videocam, /obj/machinery/light_switch{ pixel_y = -25 }, @@ -72015,7 +72014,7 @@ dir = 8; layer = 2.9 }, -/obj/item/circuitboard/rdconsole/public{ +/obj/item/circuitboard/rdconsole{ pixel_x = -4 }, /obj/item/circuitboard/rdserver{ diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index a0a0b6b8784..b86ad2299ff 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -486,7 +486,7 @@ turf/simulated/proc/consider_superconductivity(starting) turf/simulated/proc/radiate_to_spess() //Radiate excess tile heat to space if(temperature > T0C) //Considering 0 degC as te break even point for radiation in and out - var/delta_temperature = (temperature_archived - 2.7) //hardcoded space temperature + var/delta_temperature = (temperature_archived - TCMB) //hardcoded space temperature if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)) var/heat = thermal_conductivity*delta_temperature* \ diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index df957eaa11e..c94dff5ca6c 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -107,6 +107,7 @@ #define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) #define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable) #define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable) +#define COMSIG_CROSSED_MOVABLE "crossed_movable" //when we cross over something (calling Crossed() on that atom) #define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed" //from base of atom/movable/Uncrossed(): (/atom/movable) #define COMSIG_MOVABLE_UNCROSS "movable_uncross" //from base of atom/movable/Uncross(): (/atom/movable) #define COMPONENT_MOVABLE_BLOCK_UNCROSS 1 diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index c3c9b6f7e65..c0f5cfd5f3b 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -362,7 +362,7 @@ object_overlays += item_overlay add_overlay(object_overlays) -/obj/screen/inventory/Click() +/obj/screen/inventory/Click(location, control, params) // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click if(world.time <= usr.next_move) @@ -371,6 +371,12 @@ return 1 if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech return 1 + + if(hud?.mymob && slot_id) + var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id) + if(inv_item) + return inv_item.Click(location, control, params) + if(usr.attack_ui(slot_id)) usr.update_inv_l_hand(0) usr.update_inv_r_hand(0) diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm index a90e14d0ab4..d2f87c93e06 100644 --- a/code/controllers/subsystem/chat.dm +++ b/code/controllers/subsystem/chat.dm @@ -11,7 +11,8 @@ SUBSYSTEM_DEF(chat) /datum/controller/subsystem/chat/fire() for(var/i in payload) var/client/C = i - C << output(payload[C], "browseroutput:output") + if(C) + C << output(payload[C], "browseroutput:output") payload -= C if(MC_TICK_CHECK) diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 504a2d74a2c..d7e7a3cc33e 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -439,7 +439,7 @@ SUBSYSTEM_DEF(jobs) if(job.is_security) to_chat(H, "As a member of Security, you are to know Space Law, Legal Standard Operating Procedure, as well as your Department SOP") if(job.req_admin_notify) - to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp.") + to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please go to cryo and inform command. If you are unable to do so, please notify the admins via adminhelp.") return H /datum/controller/subsystem/jobs/proc/EquipRank(mob/living/carbon/human/H, rank, joined_late = 0) // Equip and put them in an area @@ -690,4 +690,4 @@ SUBSYSTEM_DEF(jobs) .++ new_id_change_records["[id_change_counter]"] = thisrecord id_change_counter++ - id_change_records = new_id_change_records \ No newline at end of file + id_change_records = new_id_change_records diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index cf7f931ff32..2fb8796dc10 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -220,6 +220,7 @@ // This is automatically called when something enters your square /atom/movable/Crossed(atom/movable/AM, oldloc) SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM) + SEND_SIGNAL(AM, COMSIG_CROSSED_MOVABLE, src) /atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump(). if(A && yes) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 3489a087ec0..de8846d292e 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -226,7 +226,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list( if(istype(T, /turf/simulated/floor)) T.ChangeTurf(/turf/simulated/floor/engine/cult) if(istype(T, /turf/simulated/wall)) - T.ChangeTurf(/turf/simulated/wall/cult) + T.ChangeTurf(/turf/simulated/wall/cult/artificer) else var/turf/simulated/floor/engine/cult/F = safepick(cultturfs) if(F) diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 9fce3cc6e24..bcbc86d991b 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -208,12 +208,14 @@ text += "
The abductors were:
" for(var/datum/mind/abductor_mind in abductors) text += printplayer(abductor_mind) + text += "
" text += printobjectives(abductor_mind) text += "
" if(abductees.len) text += "
The abductees were:
" for(var/datum/mind/abductee_mind in abductees) text += printplayer(abductee_mind) + text += "
" text += printobjectives(abductee_mind) text += "
" to_chat(world, text) diff --git a/code/game/jobs/job/central.dm b/code/game/jobs/job/central.dm index 1d6ae0162a2..a20476155d7 100644 --- a/code/game/jobs/job/central.dm +++ b/code/game/jobs/job/central.dm @@ -66,9 +66,9 @@ /datum/outfit/job/ntspecops name = "Special Operations Officer" jobtype = /datum/job/ntspecops - uniform = /obj/item/clothing/under/rank/centcom_commander + uniform = /obj/item/clothing/under/rank/centcom/captain suit = /obj/item/clothing/suit/space/deathsquad/officer - back = /obj/item/storage/backpack/security + back = /obj/item/storage/backpack/ert/security belt = /obj/item/storage/belt/military/assault gloves = /obj/item/clothing/gloves/combat shoes = /obj/item/clothing/shoes/combat diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index feaf1c7972d..6a22935f7be 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -182,9 +182,9 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) /obj/item/gun/energy/gun/blueshield = 1 ) implants = list(/obj/item/implant/mindshield) - backpack = /obj/item/storage/backpack/security - satchel = /obj/item/storage/backpack/satchel_sec - dufflebag = /obj/item/storage/backpack/duffel/security + backpack = /obj/item/storage/backpack/blueshield + satchel = /obj/item/storage/backpack/satchel_blueshield + dufflebag = /obj/item/storage/backpack/duffel/blueshield /datum/job/judge diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index e4bb22b28af..9a70beaae31 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -294,6 +294,7 @@ genemutcheck(H, COMICBLOCK, null, MUTCHK_FORCED) H.dna.default_blocks.Add(COMICBLOCK) H.check_mutations = TRUE + H.add_language("Clownish") //action given to antag clowns /datum/action/innate/toggle_clumsy @@ -420,6 +421,8 @@ r_pocket = /obj/item/barcodescanner l_hand = /obj/item/storage/bag/books pda = /obj/item/pda/librarian + backpack_contents = list( + /obj/item/videocam = 1) /datum/job/barber title = "Barber" diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index 8f2625b8854..b6c6121cfd6 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -8,6 +8,7 @@ use_power = IDLE_POWER_USE current_heat_capacity = 1000 layer = 3 + plane = GAME_PLANE max_integrity = 300 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 30) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 26f0e2a2400..444c319334b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1034,6 +1034,17 @@ About the new airlock wires panel: /obj/machinery/door/airlock/try_to_crowbar(mob/living/user, obj/item/I) //*scream if(operating) return + if(istype(I, /obj/item/twohanded/fireaxe)) //let's make this more specific //FUCK YOU + var/obj/item/twohanded/fireaxe/F = I + if(F.wielded) + spawn(0) + if(density) + open(1) + else + close(1) + else + to_chat(user, "You need to be wielding the fire axe to do that!") + return var/beingcrowbarred = FALSE if(I.tool_behaviour == TOOL_CROWBAR && I.tool_use_check(user, 0)) beingcrowbarred = TRUE @@ -1049,17 +1060,6 @@ About the new airlock wires panel: if(locked) to_chat(user, "The airlock's bolts prevent it from being forced!") return - if(istype(I, /obj/item/twohanded/fireaxe)) //let's make this more specific //FUCK YOU - var/obj/item/twohanded/fireaxe/F = I - if(F.wielded) - spawn(0) - if(density) - open(1) - else - close(1) - else - to_chat(user, "You need to be wielding the fire axe to do that!") - return else if(!arePowerSystemsOn()) spawn(0) if(density) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 83ce512ebd9..14d1de97327 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -185,12 +185,12 @@ /obj/machinery/door/proc/unrestricted_side(mob/M) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter) return get_dir(src, M) & unres_sides -/obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user) +/obj/machinery/door/proc/try_to_crowbar(mob/user, obj/item/I) return /obj/machinery/door/attackby(obj/item/I, mob/user, params) if(user.a_intent != INTENT_HARM && istype(I, /obj/item/twohanded/fireaxe)) - try_to_crowbar(I, user) + try_to_crowbar(user, I) return 1 else if(!(I.flags & NOBLUDGEON) && user.a_intent != INTENT_HARM) try_to_activate_door(user) @@ -206,7 +206,7 @@ return if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return - try_to_crowbar(I, user) + try_to_crowbar(user, I) /obj/machinery/door/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index a69535e9fc9..ae87480e929 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -302,9 +302,9 @@ qdel(src) else - try_to_crowbar(I, user) + try_to_crowbar(user, I) -/obj/machinery/door/window/try_to_crowbar(obj/item/I, mob/user) +/obj/machinery/door/window/try_to_crowbar(mob/user, obj/item/I) if(!hasPower()) if(density) open(2) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index aacd605b730..0bfbef39289 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -535,7 +535,7 @@ if(!istype(target, /obj/machinery/door))//early return if we're not trying to open a door return var/obj/machinery/door/D = target //the door we want to open - D.try_to_crowbar(src, chassis.occupant)//use the door's crowbar function + D.try_to_crowbar(chassis.occupant, src)//use the door's crowbar function if(isliving(target)) //interact with living beings var/mob/living/M = target if(chassis.occupant.a_intent == INTENT_HARM)//the patented, medical rescue claw is incapable of doing harm. Worry not. diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm index 1b2eae4db8d..aed33fc2819 100644 --- a/code/game/objects/items/flag.dm +++ b/code/game/objects/items/flag.dm @@ -197,7 +197,7 @@ name = "Chameleon flag" desc = "A poor recreation of the official NT flag. It seems to shimmer a little." icon_state = "ntflag" - origin_tech = "syndicate=4;magnets=4" + origin_tech = "syndicate=1;magnets=4" var/updated_icon_state = null var/used = FALSE var/obj/item/grenade/boobytrap = null diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index c27ad41b66e..a2b193fc608 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -227,7 +227,7 @@ LIGHTERS ARE IN LIGHTERS.DM list_reagents = list("nicotine" = 40, "omnizine" = 20) /obj/item/clothing/mask/cigarette/medical_marijuana - list_reagents = list("thc" = 40) + list_reagents = list("thc" = 40, "cbd" = 20) /obj/item/clothing/mask/cigarette/robustgold list_reagents = list("nicotine" = 40, "gold" = 1) diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm index 3340542ea15..f2d750aafa2 100644 --- a/code/game/objects/items/weapons/scissors.dm +++ b/code/game/objects/items/weapons/scissors.dm @@ -27,57 +27,11 @@ return if(ishuman(M)) var/mob/living/carbon/human/H = M - //see code/modules/mob/new_player/preferences.dm at approx line 545 for comments! - //this is largely copypasted from there. - //handle facial hair (if necessary) - var/list/species_facial_hair = list() var/obj/item/organ/external/head/C = H.get_organ("head") - var/datum/robolimb/robohead = all_robolimbs[C.model] - if(H.gender == MALE || isvulpkanin(H)) - if(C.dna.species) - for(var/i in GLOB.facial_hair_styles_list) - var/datum/sprite_accessory/facial_hair/tmp_facial = GLOB.facial_hair_styles_list[i] - if(C.dna.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles. - if(C.dna.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list. - if(robohead.is_monitor) - to_chat(user, "You are unable to find anything on [H]'s face worth cutting. How disappointing.") - return - continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles. - species_facial_hair += i - else - if(C.dna.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list. - if(!robohead.is_monitor) - if("Human" in tmp_facial.species_allowed) - species_facial_hair += i - else //Otherwise, they won't be getting any hairstyles. - to_chat(user, "You are unable to find anything on [H]'s face worth cutting. How disappointing.") - return - else - species_facial_hair = GLOB.facial_hair_styles_list - var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair + //facial hair + var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in H.generate_valid_facial_hairstyles() //handle normal hair - var/list/species_hair = list() - if(C.dna.species) - for(var/i in GLOB.hair_styles_public_list) - var/datum/sprite_accessory/hair/tmp_hair = GLOB.hair_styles_public_list[i] - if(C.dna.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles. - if(C.dna.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list. - if(robohead.is_monitor) - to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.") - return - continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles. - species_hair += i - else - if(C.dna.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list. - if(!robohead.is_monitor) - if("Human" in tmp_hair.species_allowed) - species_hair += i - else //Otherwise, they won't be getting any hairstyles. - to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.") - return - else - species_hair = GLOB.hair_styles_public_list - var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair + var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in H.generate_valid_hairstyles() user.visible_message("[user] starts cutting [M]'s hair!", "You start cutting [M]'s hair!") //arguments for this are: 1. what others see 2. what the user sees. --Fixed grammar, (TGameCo) playsound(loc, 'sound/goonstation/misc/scissor.ogg', 100, 1) if(do_after(user, 50 * toolspeed, target = H)) //this is the part that adds a delay. delay is in deciseconds. --Made it 5 seconds, because hair isn't cut in one second in real life, and I want at least a little bit longer time, (TGameCo) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 96806bb827a..af5e9540b02 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -193,6 +193,12 @@ icon_state = "viropack" item_state = "viropack" +/obj/item/storage/backpack/blueshield + name = "blueshield backpack" + desc = "A robust backpack issued to Nanotrasen's finest." + icon_state = "blueshieldpack" + item_state = "blueshieldpack" + /* * Satchel Types */ @@ -287,6 +293,11 @@ icon_state = "satchel-cap" resistance_flags = FIRE_PROOF +/obj/item/storage/backpack/satchel_blueshield + name = "blueshield satchel" + desc = "A robust satchel issued to Nanotrasen's finest." + icon_state = "satchel-blueshield" + /obj/item/storage/backpack/satchel_flat name = "smuggler's satchel" desc = "A very slim satchel that can easily fit into tight spaces." @@ -531,12 +542,19 @@ icon_state = "duffel-clown" item_state = "duffel-clown" +obj/item/storage/backpack/duffel/blueshield + name = "blueshield duffelbag" + desc = "A robust duffelbag issued to Nanotrasen's finest." + icon_state = "duffel-blueshield" + item_state = "duffel-blueshield" + //ERT backpacks. /obj/item/storage/backpack/ert name = "emergency response team backpack" desc = "A spacious backpack with lots of pockets, used by members of the Nanotrasen Emergency Response Team." icon_state = "ert_commander" item_state = "backpack" + max_combined_w_class = 30 resistance_flags = FIRE_PROOF //Commander diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 4d2b1bd9c44..a61d1ecda53 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -247,6 +247,7 @@ item_state = "cigpacket" cigarette_type = /obj/item/clothing/mask/cigarette/medical_marijuana + /obj/item/storage/fancy/cigarettes/cigpack_uplift name = "\improper Uplift Smooth packet" desc = "Your favorite brand, now menthol flavored." diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index aa6528ee118..5938a52c1d5 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -78,10 +78,5 @@ if(href_list["read"]) var/obj/item/paper/P = locate(href_list["read"]) if((P && P.loc == src)) - if(!( istype(usr, /mob/living/carbon/human) )) - usr << browse("[P.name][stars(P.info)]", "window=[P.name]") - onclose(usr, "[P.name]") - else - usr << browse("[P.name][P.info]", "window=[P.name]") - onclose(usr, "[P.name]") + P.show_content(usr) return diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index c4f0e93dbd6..118132765a1 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -8,7 +8,6 @@ smooth = SMOOTH_MORE | SMOOTH_BORDER canSmoothWith = null baseturf = /turf/simulated/floor/plating/asteroid/airless - temperature = 2.7 opacity = 1 density = TRUE blocks_air = TRUE diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 8672c65ea69..7dd41815a4c 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -250,7 +250,7 @@ var/turf/simulated/floor/F = src F.burn_tile() - F.icon_state = "wall_thermite" + F.icon_state = "plating" if(user) to_chat(user, "The thermite starts melting through the wall.") @@ -329,6 +329,9 @@ /turf/simulated/wall/welder_act(mob/user, obj/item/I) . = TRUE + if(thermite && I.use_tool(src, user, volume = I.tool_volume)) + thermitemelt(user) + return if(rotting) if(I.use_tool(src, user, volume = I.tool_volume)) for(var/obj/effect/overlay/wall_rot/WR in src) diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 7988f9cccf1..4c211291ae0 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -93,6 +93,9 @@ return ..() /turf/simulated/wall/r_wall/welder_act(mob/user, obj/item/I) + if(thermite && I.use_tool(src, user, volume = I.tool_volume)) + thermitemelt(user) + return TRUE if(!(d_state in list(RWALL_COVER, RWALL_SUPPORT_RODS, RWALL_CUT_COVER))) return ..() . = TRUE diff --git a/code/game/world.dm b/code/game/world.dm index 4488cb2d218..cccf5eb497a 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -4,6 +4,7 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG /world/New() SetupLogs() + enable_debugger() // Enable the extools debugger log_world("World loaded at [time_stamp()]") log_world("[GLOB.vars.len - GLOB.gvars_datum_in_built_vars.len] global variables") @@ -468,3 +469,10 @@ proc/establish_db_connection() return 1 #undef FAILED_DB_CONNECTION_CUTOFF + +// Proc to enable the extools debugger, which allows breakpoints, live var checking, and many other useful tools +// The DLL is injected into the env by visual studio code. If not running VSCode, the proc will not call the initialization +/world/proc/enable_debugger() + var/dll = world.GetConfig("env", "EXTOOLS_DLL") + if (dll) + call(dll, "debug_initialize")() \ No newline at end of file diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index f5735548077..2d98626a1c3 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2164,7 +2164,7 @@ var/obj/pageobj = B.contents[page] data += "Page [page] - [pageobj.name]
" - usr << browse(data, "window=[B.name]") + usr << browse(data, "window=PaperBundle[B.UID()]") else to_chat(usr, "The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 2384c24b6ff..a347f65590b 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -116,7 +116,7 @@ if(!msg) return - msg = pencode_to_html(msg) + msg = admin_pencode_to_html(msg) to_chat(world, "[msg]") log_admin("GlobalNarrate: [key_name(usr)] : [msg]") message_admins("GlobalNarrate: [key_name_admin(usr)]: [msg]
", 1) diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm index 41b3a80cbab..f80e82938ec 100644 --- a/code/modules/busy_space/organizations.dm +++ b/code/modules/busy_space/organizations.dm @@ -439,7 +439,7 @@ /datum/lore/organization/gov/synth name = "Synthetic Union" - short_name = "Synthtica" + short_name = "Synthetica" acronym = "SYN" desc = "A defensive coalition of synthetics based out of New Canaan,\ the Synthetic Union is an organization which aims to establish and consolidate synthetic rights across the galaxy.\ diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 56cb55b6b80..eb1587ff28c 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -1308,7 +1308,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts else //Not using the whitelist? Aliens for everyone! new_species += GLOB.whitelisted_species - species = input("Please select a species", "Character Generation", null) in new_species + species = input("Please select a species", "Character Generation", null) in sortTim(new_species, /proc/cmp_text_asc) var/datum/species/NS = GLOB.all_species[species] if(!istype(NS)) //The species was invalid. Notify the user and fail out. species = prev_species @@ -1406,7 +1406,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(!(lang.flags & RESTRICTED)) new_languages += lang.name - language = input("Please select a secondary language", "Character Generation", null) in new_languages + language = input("Please select a secondary language", "Character Generation", null) in sortTim(new_languages, /proc/cmp_text_asc) if("autohiss_mode") if(S.autohiss_basic_map) diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 9e009014deb..5203aafdcf6 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -96,38 +96,35 @@ item_color = "centcom" /obj/item/clothing/under/rank/centcom/officer - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant-Commander\" and bears \"N.C.V. Fearless CV-286\" on the left shoulder." - name = "\improper Nanotrasen Officers Uniform" - icon_state = "officer" - item_state = "g_suit" - item_color = "officer" + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant-Commander\" and bears \"N.A.S. Trurl \" on the left shoulder. Worn exclusively by officers of the Nanotrasen Navy. It's got exotic materials for protection." + name = "\improper Nanotrasen Naval Officer Uniform" + icon_state = "navy_gold" + item_state = "navy_gold" + item_color = "navy_gold" displays_id = 0 flags_size = ONESIZEFITSALL /obj/item/clothing/under/rank/centcom/captain - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain\" and bears \"N.C.V. Fearless CV-286\" on the left shoulder." - name = "\improper Nanotrasen Captains Uniform" - icon_state = "centcom" - item_state = "dg_suit" - item_color = "centcom" + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain\" and bears \"N.A.S. Trurl \" on the left shoulder. Worn exclusively by officers of the Nanotrasen Navy. It's got exotic materials for protection." + name = "\improper Nanotrasen Naval Captain Uniform" + icon_state = "navy_gold" + item_state = "navy_gold" + item_color = "navy_gold" displays_id = 0 + flags_size = ONESIZEFITSALL /obj/item/clothing/under/rank/centcom/blueshield - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant\" and bears \"N.S.S. Cyberiad\" on the left shoulder." - name = "\improper Nanotrasen Navy Uniform" + desc = "Gold trim on space-black cloth, this uniform bears \"Close Protection\" on the left shoulder." + name = "\improper Formal Nanotrasen Uniform" icon_state = "officer" item_state = "g_suit" item_color = "officer" displays_id = 0 flags_size = ONESIZEFITSALL -/obj/item/clothing/under/rank/centcom/blueshield/New() - ..() - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant\" and bears [station_name()] on the left shoulder." - /obj/item/clothing/under/rank/centcom/representative - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears \"N.S.S. Cyberiad\" on the left shoulder." - name = "\improper Nanotrasen Navy Uniform" + desc = "Gold trim on space-black cloth, this uniform bears \"N.S.S. Cyberiad\" on the left shoulder." + name = "\improper Formal Nanotrasen Uniform" icon_state = "officer" item_state = "g_suit" item_color = "officer" @@ -136,11 +133,11 @@ /obj/item/clothing/under/rank/centcom/representative/New() ..() - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears [station_name()] on the left shoulder." + desc = "Gold trim on space-black cloth, this uniform bears [station_name()] on the left shoulder." /obj/item/clothing/under/rank/centcom/magistrate desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Magistrate\" and bears \"N.S.S. Cyberiad\" on the left shoulder." - name = "\improper Nanotrasen Navy Uniform" + name = "\improper Formal Nanotrasen Uniform" icon_state = "officer" item_state = "g_suit" item_color = "officer" @@ -161,7 +158,7 @@ /obj/item/clothing/under/rank/blueshield name = "blueshield uniform" - desc = "A short-sleeved black uniform, paired with grey digital-camo cargo pants. Standard issue to Blueshield officers." + desc = "A short-sleeved black uniform, paired with grey digital-camo cargo pants. Standard issue to Blueshields." icon_state = "ert_uniform" item_state = "bl_suit" item_color = "ert_uniform" @@ -169,7 +166,7 @@ /obj/item/clothing/under/rank/blueshield/skirt name = "blueshield skirt" - desc = "A short, black and grey with blue markings skirted uniform. For the feminine Blueshield officers." + desc = "A short, black and grey with blue markings skirted uniform. For the feminine Blueshield." icon_state = "blueshieldf" item_state = "blueshieldf" item_color = "blueshieldf" diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 2e5c7d99082..36f0da802cc 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -89,7 +89,8 @@ /datum/personal_crafting/proc/get_surroundings(mob/user) . = list() - .["other"] = list() + .["other"] = list() //paths go in here + .["toolsother"] = list() // items go in here for(var/obj/item/I in get_environment(user)) if(I.flags_2 & HOLOGRAM_2) continue @@ -102,22 +103,24 @@ if(RC.is_drainable()) for(var/datum/reagent/A in RC.reagents.reagent_list) .["other"][A.type] += A.volume - .["other"][I.type] += 1 + .["other"][I.type] += 1 + .["toolsother"][I] += 1 /datum/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents) - if(!R.tools.len) + if(!R.tools.len) //does not run if no tools are needed return TRUE var/list/possible_tools = list() var/list/tools_used = list() - for(var/obj/item/I in user.contents) + for(var/obj/item/I in user.contents) //searchs the inventory of the mob if(istype(I, /obj/item/storage)) for(var/obj/item/SI in I.contents) - if(SI.tool_behaviour) //Only add things that we could actually use as a tool + if(SI.tool_behaviour) //filters for tool behaviours possible_tools += SI if(I.tool_behaviour) possible_tools += I - possible_tools |= contents["other"] - main_loop: + + possible_tools |= contents["toolsother"] // this add contents to possible_tools + main_loop: // checks if all tools found are usable with the recipe for(var/A in R.tools) for(var/obj/item/I in possible_tools) if(A == I.tool_behaviour) @@ -129,26 +132,49 @@ return FALSE return TRUE -/datum/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R) +/datum/personal_crafting/proc/check_pathtools(mob/user, datum/crafting_recipe/R, list/contents) + if(!R.pathtools.len) //does not run if no tools are needed + return TRUE + var/list/other_possible_tools = list() + for(var/obj/item/I in user.contents) // searchs the inventory of the mob + if(istype(I, /obj/item/storage)) + for(var/obj/item/SI in I.contents) + other_possible_tools += SI.type // filters type paths + other_possible_tools += I.type + + other_possible_tools |= contents["other"] // this adds contents to the other_possible_tools + main_loop: // checks if all tools found are usable with the recipe + for(var/A in R.pathtools) + for(var/I in other_possible_tools) + if(ispath(I,A)) + continue main_loop + return FALSE + return TRUE + +/datum/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R) var/list/contents = get_surroundings(user) var/send_feedback = 1 if(check_contents(R, contents)) if(check_tools(user, R, contents)) - if(do_after(user, R.time, target = user)) - contents = get_surroundings(user) - if(!check_contents(R, contents)) - return ", missing component." - if(!check_tools(user, R, contents)) - return ", missing tool." - var/list/parts = del_reqs(R, user) - var/atom/movable/I = new R.result (get_turf(user.loc)) - I.CheckParts(parts, R) - if(isitem(I)) - user.put_in_hands(I) - if(send_feedback) - feedback_add_details("object_crafted","[I.type]") - return 0 - return "." + if(check_pathtools(user, R, contents)) + if(do_after(user, R.time, target = user)) + contents = get_surroundings(user) + if(!check_contents(R, contents)) + return ", missing component." + if(!check_tools(user, R, contents)) + return ", missing tool." + if(!check_pathtools(user, R, contents)) + return ", missing tool." + var/list/parts = del_reqs(R, user) + var/atom/movable/I = new R.result (get_turf(user.loc)) + I.CheckParts(parts, R) + if(isitem(I)) + user.put_in_hands(I) + if(send_feedback) + feedback_add_details("object_crafted","[I.type]") + return 0 + return "." + return ", missing tool." return ", missing tool." return ", missing component." @@ -413,12 +439,15 @@ catalyst_text = replacetext(catalyst_text, ",", "", -1) data["catalyst_text"] = catalyst_text - for(var/a in R.tools) + for(var/a in R.pathtools) if(ispath(a, /obj/item)) var/obj/item/b = a tool_text += " [initial(b.name)]," else tool_text += " [a]," + for(var/a in R.tools) + var/b = a + tool_text += " [b]," tool_text = replacetext(tool_text, ",", "", -1) data["tool_text"] = tool_text diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 63a3b953864..ec334979cd2 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -3,7 +3,8 @@ var/reqs[] = list() //type paths of items consumed associated with how many are needed var/blacklist[] = list() //type paths of items explicitly not allowed as an ingredient var/result //type path of item resulting from this craft - var/tools[] = list() //type paths of items needed but not consumed + var/tools[] = list() //tool behaviours of items needed but not consumed + var/pathtools[] = list() //type paths of items needed but not consumed var/time = 30 //time in deciseconds var/parts[] = list() //type paths of items that will be placed in the result var/chem_catalysts[] = list() //like tools but for reagents @@ -307,7 +308,7 @@ time = 15 reqs = list(/obj/item/stack/sheet/wood = 1, /obj/item/stack/cable_coil = 5) - tools = list(/obj/item/kitchen/knife) // Gotta carve the wood into handles + pathtools = list(/obj/item/kitchen/knife) // Gotta carve the wood into handles category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -328,8 +329,7 @@ /obj/item/stack/cable_coil = 10, /obj/item/stack/sheet/plastic = 3, /obj/item/stack/sheet/wood = 5) - tools = list(TOOL_WELDER, - TOOL_SCREWDRIVER) + tools = list(TOOL_WELDER, TOOL_SCREWDRIVER) category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -354,7 +354,7 @@ result = /obj/item/stack/tile/carpet/black time = 20 reqs = list(/obj/item/stack/tile/carpet = 1) - tools = list(/obj/item/toy/crayon) + pathtools = list(/obj/item/toy/crayon) category = CAT_MISC /datum/crafting_recipe/showercurtain @@ -559,7 +559,7 @@ reqs = list(/datum/reagent/paint/red = 10, /datum/reagent/paint/black = 30, /obj/item/storage/toolbox = 1) //Paint in reagents so it doesnt take the container up, yet still take it from the beaker - tools = list(/obj/item/reagent_containers/glass/rag = 1) //need something to paint with it + pathtools = list(/obj/item/reagent_containers/glass/rag = 1) //need something to paint with it category = CAT_MISC /datum/crafting_recipe/snowman @@ -578,152 +578,153 @@ result = /obj/item/decorations/sticky_decorations/flammable/heart reqs = list(/obj/item/paper = 1, /obj/item/stack/tape_roll = 1) - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/red)//cutters act as makeshift scissors. I doubt the barber wants to have their scissors stolen when somone wants to decorate + tools = list(TOOL_WIRECUTTER) //cutters act as makeshift scissors. I doubt the barber wants to have their scissors stolen when somone wants to decorate + pathtools = list(/obj/item/toy/crayon/red) category = CAT_DECORATIONS subcategory = CAT_DECORATION /datum/crafting_recipe/paper_craft/single_eye name = "Paper Eye" result = /obj/item/decorations/sticky_decorations/flammable/singleeye - tools = list(/obj/item/wirecutters, - /obj/item/pen, - /obj/item/toy/crayon/blue) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen, /obj/item/toy/crayon/blue) category = CAT_DECORATIONS subcategory = CAT_DECORATION /datum/crafting_recipe/paper_craft/googlyeyes name = "Paper Googly Eye" result = /obj/item/decorations/sticky_decorations/flammable/googlyeyes - tools = list(/obj/item/wirecutters, - /obj/item/pen) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen) category = CAT_DECORATIONS subcategory = CAT_DECORATION /datum/crafting_recipe/paper_craft/clock name = "Paper Clock" result = /obj/item/decorations/sticky_decorations/flammable/paperclock - tools = list(/obj/item/wirecutters, - /obj/item/pen) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen) category = CAT_DECORATIONS subcategory = CAT_DECORATION /datum/crafting_recipe/paper_craft/jack_o_lantern name = "Paper Jack o'Lantern" result = /obj/item/decorations/sticky_decorations/flammable/jack_o_lantern - tools = list(/obj/item/wirecutters, - /obj/item/pen, - /obj/item/toy/crayon/orange, - /obj/item/toy/crayon/green)//pen ink is black + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen, + /obj/item/toy/crayon/orange, + /obj/item/toy/crayon/green)//pen ink is black category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/ghost name = "Paper Ghost" result = /obj/item/decorations/sticky_decorations/flammable/ghost - tools = list(/obj/item/wirecutters, - /obj/item/pen)//it's white paper why need a white crayon? + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen)//it's white paper why need a white crayon? category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/spider name = "Paper Spider" result = /obj/item/decorations/sticky_decorations/flammable/spider - tools = list(/obj/item/wirecutters, - /obj/item/pen, - /obj/item/toy/crayon/red) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen, + /obj/item/toy/crayon/red) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/spiderweb name = "Paper Spiderweb" result = /obj/item/decorations/sticky_decorations/flammable/spiderweb - tools = list(/obj/item/wirecutters) + tools = list(TOOL_WIRECUTTER) + pathtools = list() category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/skull name = "Paper Skull" result = /obj/item/decorations/sticky_decorations/flammable/skull - tools = list(/obj/item/wirecutters, - /obj/item/pen) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/skeleton name = "Paper Skeleton" result = /obj/item/decorations/sticky_decorations/flammable/skeleton - tools = list(/obj/item/wirecutters, - /obj/item/pen) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/cauldron name = "Paper Cauldron" result = /obj/item/decorations/sticky_decorations/flammable/cauldron - tools = list(/obj/item/wirecutters, - /obj/item/pen) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/snowman name = "Paper Snowman" result = /obj/item/decorations/sticky_decorations/flammable/snowman - tools = list(/obj/item/wirecutters, - /obj/item/pen, - /obj/item/toy/crayon/orange) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen, + /obj/item/toy/crayon/orange) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/christmas_stocking name = "Paper Christmas Stocking" result = /obj/item/decorations/sticky_decorations/flammable/christmas_stocking - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/red) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/red) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/christmas_tree name = "Paper Christmas Tree" result = /obj/item/decorations/sticky_decorations/flammable/christmas_tree - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/red, - /obj/item/toy/crayon/yellow, - /obj/item/toy/crayon/blue, - /obj/item/toy/crayon/green) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/red, + /obj/item/toy/crayon/yellow, + /obj/item/toy/crayon/blue, + /obj/item/toy/crayon/green) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/snowflake name = "Paper Snowflake" result = /obj/item/decorations/sticky_decorations/flammable/snowflake - tools = list(/obj/item/wirecutters) + tools = list(TOOL_WIRECUTTER) + pathtools = list() category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/candy_cane name = "Paper Candy Cane" result = /obj/item/decorations/sticky_decorations/flammable/candy_cane - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/red) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/red) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/mistletoe name = "Paper Mistletoe" result = /obj/item/decorations/sticky_decorations/flammable/mistletoe - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/red, - /obj/item/toy/crayon/green) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/red, + /obj/item/toy/crayon/green) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/holly name = "Paper Holly" result = /obj/item/decorations/sticky_decorations/flammable/holly - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/red, - /obj/item/toy/crayon/green) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/red, + /obj/item/toy/crayon/green) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY @@ -733,7 +734,8 @@ result = /obj/item/decorations/sticky_decorations/flammable/tinsel reqs = list(/obj/item/paper = 1, /obj/item/stack/tape_roll = 2) - tools = list(/obj/item/wirecutters) + tools = list(TOOL_WIRECUTTER) + pathtools = list() category = CAT_DECORATIONS subcategory = CAT_HOLIDAY @@ -743,8 +745,8 @@ result = /obj/item/decorations/sticky_decorations/flammable/tinsel/red reqs = list(/obj/item/paper = 1, /obj/item/stack/tape_roll = 2) - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/red) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/red) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY @@ -754,8 +756,8 @@ result = /obj/item/decorations/sticky_decorations/flammable/tinsel/blue reqs = list(/obj/item/paper = 1, /obj/item/stack/tape_roll = 2) - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/blue) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/blue) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY @@ -765,8 +767,8 @@ result = /obj/item/decorations/sticky_decorations/flammable/tinsel/yellow reqs = list(/obj/item/paper = 1, /obj/item/stack/tape_roll = 2) - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/yellow) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/yellow) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY @@ -776,8 +778,8 @@ result = /obj/item/decorations/sticky_decorations/flammable/tinsel/purple reqs = list(/obj/item/paper = 1, /obj/item/stack/tape_roll = 2) - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/purple) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/purple) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY @@ -787,8 +789,8 @@ result = /obj/item/decorations/sticky_decorations/flammable/tinsel/green reqs = list(/obj/item/paper = 1, /obj/item/stack/tape_roll = 2) - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/green) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/green) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY @@ -798,8 +800,8 @@ result = /obj/item/decorations/sticky_decorations/flammable/tinsel/orange reqs = list(/obj/item/paper = 1, /obj/item/stack/tape_roll = 2) - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/orange) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/orange) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY @@ -809,8 +811,8 @@ result = /obj/item/decorations/sticky_decorations/flammable/tinsel/black reqs = list(/obj/item/paper = 1, /obj/item/stack/tape_roll = 2) - tools = list(/obj/item/wirecutters, - /obj/item/pen) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY @@ -820,17 +822,17 @@ result = /obj/item/decorations/sticky_decorations/flammable/tinsel/halloween reqs = list(/obj/item/paper = 1, /obj/item/stack/tape_roll = 2) - tools = list(/obj/item/wirecutters, - /obj/item/pen, - /obj/item/toy/crayon/orange) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen, + /obj/item/toy/crayon/orange) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/arrowed_heart name = "Paper Arrowed Heart" result = /obj/item/decorations/sticky_decorations/flammable/arrowed_heart - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/red) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/red) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY @@ -840,24 +842,24 @@ reqs = list(/obj/item/paper = 1, /obj/item/stack/tape_roll = 2, /obj/item/stack/cable_coil = 2) - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/red) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/red) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/four_leaf_clover name = "Paper Four Leaf Clover" result = /obj/item/decorations/sticky_decorations/flammable/four_leaf_clover - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/green) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/green) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/pot_of_gold name = "Paper Pot of Gold" result = /obj/item/decorations/sticky_decorations/flammable/pot_of_gold - tools = list(/obj/item/wirecutters, - /obj/item/pen, + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen, /obj/item/toy/crayon/red, /obj/item/toy/crayon/yellow, /obj/item/toy/crayon/orange, @@ -871,8 +873,8 @@ name = "Paper Leprechaun Hat" time = 10 result = /obj/item/decorations/sticky_decorations/flammable/leprechaun_hat - tools = list(/obj/item/wirecutters, - /obj/item/pen, + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen, /obj/item/toy/crayon/yellow, /obj/item/toy/crayon/green) category = CAT_DECORATIONS @@ -881,8 +883,8 @@ /datum/crafting_recipe/paper_craft/easter_bunny name = "Paper Easter Bunny" result = /obj/item/decorations/sticky_decorations/flammable/easter_bunny - tools = list(/obj/item/wirecutters, - /obj/item/pen, + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/pen, /obj/item/toy/crayon/blue, /obj/item/toy/crayon/purple) category = CAT_DECORATIONS @@ -891,40 +893,40 @@ /datum/crafting_recipe/paper_craft/easter_egg_blue name = "Blue Paper Easter Egg" result = /obj/item/decorations/sticky_decorations/flammable/easter_egg - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/blue) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/blue) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/easter_egg_yellow name = "Yellow Paper Easter Egg" result = /obj/item/decorations/sticky_decorations/flammable/easter_egg/yellow - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/yellow) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/yellow) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/easter_egg_red name = "Red Paper Easter Egg" result = /obj/item/decorations/sticky_decorations/flammable/easter_egg/red - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/red) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/red) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/easter_egg_purple name = "Purple Paper Easter Egg" result = /obj/item/decorations/sticky_decorations/flammable/easter_egg/purple - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/purple) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/purple) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY /datum/crafting_recipe/paper_craft/easter_egg_orange name = "Orange Paper Easter Egg" result = /obj/item/decorations/sticky_decorations/flammable/easter_egg/orange - tools = list(/obj/item/wirecutters, - /obj/item/toy/crayon/orange) + tools = list(TOOL_WIRECUTTER) + pathtools = list(/obj/item/toy/crayon/orange) category = CAT_DECORATIONS subcategory = CAT_HOLIDAY @@ -934,7 +936,7 @@ result = /obj/structure/decorative_structures/metal/statue/metal_angel reqs = list(/obj/item/stack/sheet/metal = 10, /obj/item/stack/sheet/mineral/gold = 6) - tools = list(/obj/item/weldingtool) + tools = list(TOOL_WELDER) category = CAT_DECORATIONS subcategory = CAT_LARGE_DECORATIONS @@ -945,7 +947,7 @@ reqs = list(/obj/item/stack/sheet/metal = 10, /obj/item/stack/sheet/mineral/plasma = 3, /obj/item/stack/sheet/mineral/gold = 8) - tools = list(/obj/item/weldingtool) + tools = list(TOOL_WELDER) category = CAT_DECORATIONS subcategory = CAT_LARGE_DECORATIONS @@ -955,7 +957,7 @@ result = /obj/structure/decorative_structures/metal/statue/sun reqs = list(/obj/item/stack/sheet/metal = 6, /obj/item/stack/sheet/mineral/gold = 4) - tools = list(/obj/item/weldingtool) + tools = list(TOOL_WELDER) category = CAT_DECORATIONS subcategory = CAT_LARGE_DECORATIONS @@ -966,7 +968,7 @@ reqs = list(/obj/item/stack/sheet/metal = 6, /obj/item/stack/sheet/mineral/silver = 6, /obj/item/stack/sheet/mineral/gold = 4) - tools = list(/obj/item/weldingtool) + tools = list(TOOL_WELDER) category = CAT_DECORATIONS subcategory = CAT_LARGE_DECORATIONS @@ -976,7 +978,7 @@ result = /obj/structure/decorative_structures/metal/statue/tesla reqs = list(/obj/item/stack/sheet/metal = 4, /obj/item/stack/sheet/glass = 8) - tools = list(/obj/item/weldingtool) + tools = list(TOOL_WELDER) category = CAT_DECORATIONS subcategory = CAT_LARGE_DECORATIONS @@ -987,7 +989,7 @@ reqs = list(/obj/item/stack/sheet/metal = 8, /obj/item/stock_parts/cell = 3, /obj/item/stack/cable_coil = 4) - tools = list(/obj/item/weldingtool) + tools = list(TOOL_WELDER) category = CAT_DECORATIONS subcategory = CAT_LARGE_DECORATIONS @@ -1010,9 +1012,9 @@ /obj/item/stack/rods = 4, /obj/item/stock_parts/cell = 1, /obj/item/stack/cable_coil = 4)//thing is a wireframe construct with an electro magnetic hover field - tools = list(/obj/item/wirecutters, - /obj/item/pen, - /obj/item/weldingtool, + tools = list(TOOL_WIRECUTTER, + TOOL_WELDER) + pathtools = list(/obj/item/pen, /obj/item/toy/crayon/red) category = CAT_DECORATIONS subcategory = CAT_LARGE_DECORATIONS diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm index 1ecf5aa22ca..925051cff11 100644 --- a/code/modules/events/spider_terror.dm +++ b/code/modules/events/spider_terror.dm @@ -15,6 +15,10 @@ var/list/vents = list() for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in GLOB.all_vent_pumps) if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) + if(!temp_vent.parent) + // Issue happening more often with vents. Log and continue. Delete once solved + log_debug("spider_terror/start(), vent has no parent: [temp_vent], qdeled: [QDELETED(temp_vent)], loc: [temp_vent.loc]") + continue if(temp_vent.parent.other_atmosmch.len > 50) vents += temp_vent var/spider_type diff --git a/code/modules/events/traders.dm b/code/modules/events/traders.dm index 04663f93152..b481bca88eb 100644 --- a/code/modules/events/traders.dm +++ b/code/modules/events/traders.dm @@ -18,6 +18,9 @@ var/global/list/unused_trade_stations = list("sol") return if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) event_announcement.Announce("A trading shuttle from Jupiter Station has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused") + // if the docking request was refused, fire another major event in 60 seconds + var/list/datum/event_container/EC = SSevents.event_containers[EVENT_LEVEL_MAJOR] + EC.next_event_time = world.time + (60 * 10) return var/list/spawnlocs = list() diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm index a0988951855..2a2ee410522 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm @@ -95,7 +95,7 @@ /obj/item/reagent_containers/food/snacks/boiledrice = 1, /obj/item/reagent_containers/food/snacks/boiled_shrimp = 4, ) - tools = list(/obj/item/kitchen/sushimat) + pathtools = list(/obj/item/kitchen/sushimat) result = /obj/item/reagent_containers/food/snacks/sliceable/Ebi_maki category = CAT_FOOD subcategory = CAT_SUSHI @@ -116,7 +116,7 @@ /obj/item/reagent_containers/food/snacks/boiledrice = 1, /obj/item/fish_eggs/salmon = 4, ) - tools = list(/obj/item/kitchen/sushimat) + pathtools = list(/obj/item/kitchen/sushimat) result = /obj/item/reagent_containers/food/snacks/sliceable/Ikura_maki category = CAT_FOOD subcategory = CAT_SUSHI @@ -137,7 +137,7 @@ /obj/item/reagent_containers/food/snacks/boiledrice = 1, /obj/item/reagent_containers/food/snacks/fried_tofu = 4, ) - tools = list(/obj/item/kitchen/sushimat) + pathtools = list(/obj/item/kitchen/sushimat) result = /obj/item/reagent_containers/food/snacks/sliceable/Inari_maki category = CAT_FOOD subcategory = CAT_SUSHI @@ -158,7 +158,7 @@ /obj/item/reagent_containers/food/snacks/boiledrice = 1, /obj/item/reagent_containers/food/snacks/salmonmeat = 4, ) - tools = list(/obj/item/kitchen/sushimat) + pathtools = list(/obj/item/kitchen/sushimat) result = /obj/item/reagent_containers/food/snacks/sliceable/Sake_maki category = CAT_FOOD subcategory = CAT_SUSHI @@ -179,7 +179,7 @@ /obj/item/reagent_containers/food/snacks/boiledrice = 1, /obj/item/reagent_containers/food/snacks/salmonsteak = 4, ) - tools = list(/obj/item/kitchen/sushimat) + pathtools = list(/obj/item/kitchen/sushimat) result = /obj/item/reagent_containers/food/snacks/sliceable/SmokedSalmon_maki category = CAT_FOOD subcategory = CAT_SUSHI @@ -200,7 +200,7 @@ /obj/item/reagent_containers/food/snacks/boiledrice = 1, /obj/item/fish_eggs/goldfish = 4, ) - tools = list(/obj/item/kitchen/sushimat) + pathtools = list(/obj/item/kitchen/sushimat) result = /obj/item/reagent_containers/food/snacks/sliceable/Masago_maki category = CAT_FOOD subcategory = CAT_SUSHI @@ -221,7 +221,7 @@ /obj/item/reagent_containers/food/snacks/boiledrice = 1, /obj/item/fish_eggs/shark = 4, ) - tools = list(/obj/item/kitchen/sushimat) + pathtools = list(/obj/item/kitchen/sushimat) result = /obj/item/reagent_containers/food/snacks/sliceable/Tobiko_maki category = CAT_FOOD subcategory = CAT_SUSHI @@ -242,7 +242,7 @@ /obj/item/reagent_containers/food/snacks/sushi_Tobiko = 4, /obj/item/reagent_containers/food/snacks/egg = 4, ) - tools = list(/obj/item/kitchen/sushimat) + pathtools = list(/obj/item/kitchen/sushimat) result = /obj/item/reagent_containers/food/snacks/sliceable/TobikoEgg_maki category = CAT_FOOD subcategory = CAT_SUSHI @@ -253,7 +253,7 @@ /obj/item/reagent_containers/food/snacks/sushi_Tobiko = 4, /obj/item/reagent_containers/food/snacks/egg = 4, ) - tools = list(/obj/item/kitchen/sushimat) + pathtools = list(/obj/item/kitchen/sushimat) result = /obj/item/reagent_containers/food/snacks/sliceable/TobikoEgg_maki category = CAT_FOOD subcategory = CAT_SUSHI @@ -274,7 +274,7 @@ /obj/item/reagent_containers/food/snacks/boiledrice = 1, /obj/item/reagent_containers/food/snacks/catfishmeat = 4, ) - tools = list(/obj/item/kitchen/sushimat) + pathtools = list(/obj/item/kitchen/sushimat) result = /obj/item/reagent_containers/food/snacks/sliceable/Tai_maki category = CAT_FOOD subcategory = CAT_SUSHI diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index 274a1f1e084..06ba1fc7a66 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -17,7 +17,7 @@ /obj/item/seeds/cannabis/death, /obj/item/seeds/cannabis/white, /obj/item/seeds/cannabis/ultimate) - reagents_add = list("thc" = 0.15) + reagents_add = list("thc" = 0.15, "cbd" = 0.15) /obj/item/seeds/cannabis/rainbow @@ -28,7 +28,7 @@ plantname = "Rainbow Weed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow mutatelist = list() - reagents_add = list("lsd" = 0.15, "thc" = 0.15) + reagents_add = list("lsd" = 0.15, "thc" = 0.15, "cbd" = 0.15) rarity = 40 /obj/item/seeds/cannabis/death @@ -39,7 +39,7 @@ plantname = "Deathweed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/death mutatelist = list() - reagents_add = list("cyanide" = 0.35, "thc" = 0.15) + reagents_add = list("cyanide" = 0.35, "thc" = 0.15, "cbd" = 0.15) rarity = 40 /obj/item/seeds/cannabis/white @@ -50,7 +50,7 @@ plantname = "Lifeweed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/white mutatelist = list() - reagents_add = list("omnizine" = 0.35, "thc" = 0.15) + reagents_add = list("omnizine" = 0.35, "thc" = 0.15, "cbd" = 0.15) rarity = 40 @@ -72,6 +72,7 @@ "haloperidol" = 0.15, "methamphetamine" = 0.15, "thc" = 0.15, + "cbd" = 0.15, "psilocybin" = 0.15, "hairgrownium" = 0.15, "ectoplasm" = 0.15, diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 7d494803495..d13b7a11e5b 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -145,6 +145,9 @@ message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) (JMP)") log_game("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x],[user.y],[user.z]).") prime() + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.throw_mode_on() /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/deconstruct(disassembled = TRUE) if(!disassembled) diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 873b08f151e..6cf56d619d6 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -141,7 +141,8 @@ spawn(30) if(!QDELETED(src)) - var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(get_turf(loc)) + var/turf/T = get_turf(user) + var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(T) K.maxHealth += round(seed.endurance / 3) K.melee_damage_lower += round(seed.potency / 10) K.melee_damage_upper += round(seed.potency / 10) @@ -150,4 +151,6 @@ K.visible_message("The Killer Tomato growls as it suddenly awakens.") if(user) user.unEquip(src) + message_admins("[key_name_admin(user)] released a killer tomato at [ADMIN_COORDJMP(T)]") + log_game("[key_name(user)] released a killer tomato at [COORD(T)]") qdel(src) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 304bdc419a2..57232d74f44 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -30,12 +30,10 @@ // All mobs should have custom emote, really.. /mob/proc/custom_emote(var/m_type=EMOTE_VISUAL,var/message = null) - if(stat || !use_me && usr == src) if(usr) to_chat(usr, "You are unable to emote.") return - var/muzzled = is_muzzled() if(muzzled) var/obj/item/clothing/mask/muzzle/M = wear_mask @@ -57,7 +55,10 @@ if(message) log_emote(message, src) - + if(isliving(src)) //isliving because these are defined on the mob/living level not mob + var/mob/living/L = src + L.say_log += "EMOTE: [input]" //say log too so it is easier on admins instead of having to merge the two with timestamps etc + L.emote_log += input //emote only log if an admin wants to search just for emotes they don't have to sift through the say // Hearing gasp and such every five seconds is not good emotes were not global for a reason. // Maybe some people are okay with that. for(var/mob/M in GLOB.player_list) diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index f4832e20384..04924d4b310 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -79,5 +79,5 @@ In all, this is a lot like the monkey code. /N if(M.is_adult) damage = rand(10, 40) adjustBruteLoss(damage) - add_attack_logs(src, M, "Slime'd for [damage] damage") + add_attack_logs(M, src, "Slime'd for [damage] damage") updatehealth("slime attack") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 146d107daba..a0fd10e0610 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -323,7 +323,7 @@ valid_species += current_species_name - return valid_species + return sortTim(valid_species, /proc/cmp_text_asc) /mob/living/carbon/human/proc/generate_valid_hairstyles() var/list/valid_hairstyles = new() @@ -351,7 +351,7 @@ if(H.dna.species.name in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list. valid_hairstyles += hairstyle - return valid_hairstyles + return sortTim(valid_hairstyles, /proc/cmp_text_asc) /mob/living/carbon/human/proc/generate_valid_facial_hairstyles() var/list/valid_facial_hairstyles = new() @@ -380,7 +380,7 @@ if(H.dna.species.name in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list. valid_facial_hairstyles += facialhairstyle - return valid_facial_hairstyles + return sortTim(valid_facial_hairstyles, /proc/cmp_text_asc) /mob/living/carbon/human/proc/generate_valid_head_accessories() var/list/valid_head_accessories = new() @@ -395,7 +395,7 @@ continue valid_head_accessories += head_accessory - return valid_head_accessories + return sortTim(valid_head_accessories, /proc/cmp_text_asc) /mob/living/carbon/human/proc/generate_valid_markings(var/location = "body") var/list/valid_markings = new() @@ -433,7 +433,7 @@ continue valid_markings += marking - return valid_markings + return sortTim(valid_markings, /proc/cmp_text_asc) /mob/living/carbon/human/proc/generate_valid_body_accessories() var/list/valid_body_accessories = new() @@ -448,7 +448,7 @@ if(dna.species.name in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list. valid_body_accessories += B - return valid_body_accessories + return sortTim(valid_body_accessories, /proc/cmp_text_asc) /mob/living/carbon/human/proc/generate_valid_alt_heads() var/list/valid_alt_heads = list() @@ -463,7 +463,7 @@ valid_alt_heads += alternate_head - return valid_alt_heads + return sortTim(valid_alt_heads, /proc/cmp_text_asc) /mob/living/carbon/human/proc/scramble_appearance() scramble(1, src, 100) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 01c2d773d51..51088f66457 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -585,6 +585,14 @@ message = "[src] makes a weak noise" m_type = 2 + if("hsigh", "hsighs") + if(!muzzled) + message = "[src] sighs contentedly." + m_type = 2 + else + message = "[src] makes a [pick("chill", "relaxed")] noise" + m_type = 2 + if("laugh", "laughs") var/M = handle_emote_param(param) if(miming) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5da0296ccbf..2c00a4f91bd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -454,12 +454,6 @@ popup.set_content(dat) popup.open() - -/mob/living/carbon/human/Crossed(atom/movable/AM, oldloc) - var/mob/living/simple_animal/bot/mulebot/MB = AM - if(istype(MB)) - MB.RunOver(src) - // Get rank from ID, ID inside PDA, PDA, ID in wallet, etc. /mob/living/carbon/human/proc/get_authentification_rank(var/if_no_id = "No id", var/if_no_job = "No job") var/obj/item/pda/pda = wear_id diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 2643d1f3102..93e7ff54ec6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -542,7 +542,7 @@ if(COLDRES in mutations) return 1 //Fully protected from the cold. - temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. + temperature = max(temperature, TCMB) //There is an occasional bug where the temperature is miscalculated in areas with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. var/thermal_protection_flags = get_cold_protection_flags(temperature) var/thermal_protection = 0.0 diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index d925e2ef1d9..c30c8176fdc 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -165,7 +165,7 @@ ..() /datum/species/plasmaman/handle_reagents(mob/living/carbon/human/H, datum/reagent/R) - if(R.id == "plasma") + if(R.id == "plasma" || R.id == "plasma_dust") H.adjustBruteLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) H.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER) H.adjustPlasma(20) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 8ab2b44865f..b35556903f2 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -404,6 +404,7 @@ if(C.reagents) C.reagents.clear_reagents() QDEL_LIST(C.reagents.addiction_list) + C.reagents.addiction_threshold_accumulated.Cut() // rejuvenate: Called by `revive` to get the mob into a revivable state // the admin "rejuvenate" command calls `revive`, not this proc. diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 67ea6e7f887..2b148a6a0a2 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -296,7 +296,7 @@ return FALSE if(stat != DEAD) - add_attack_logs(src, M, "Slime'd") + add_attack_logs(M, src, "Slime'd") M.do_attack_animation(src) visible_message("\The [M.name] glomps [src]!", "\The [M.name] glomps you!") return TRUE diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 74a51a771ac..8f5ed797b6c 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -59,6 +59,7 @@ var/tesla_ignore = FALSE var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message" + var/list/emote_log = list() //like say_log but for emotes var/list/recent_tastes = list() var/blood_volume = 0 //how much blood the mob has diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 0750e4ea3ed..26b5683d1a3 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -10,15 +10,11 @@ var/max_damage = 30 var/component_disabled = 0 var/mob/living/silicon/robot/owner - -// The actual device object that has to be installed for this. -/datum/robot_component/var/external_type = null - -// The wrapped device(e.g. radio), only set if external_type isn't null -/datum/robot_component/var/obj/item/wrapped = null + var/external_type = null // The actual device object that has to be installed for this. + var/obj/item/wrapped = null // The wrapped device(e.g. radio), only set if external_type isn't null /datum/robot_component/New(mob/living/silicon/robot/R) - src.owner = R + owner = R /datum/robot_component/proc/install() go_online() @@ -109,6 +105,13 @@ name = "power cell" max_damage = 50 +/datum/robot_component/cell/New(mob/living/silicon/robot/R) + . = ..() + // sets `external_type` to the borg's currently installed cell type + if(owner.cell) + var/obj/item/stock_parts/cell/C = owner.cell + external_type = C.type + /datum/robot_component/cell/is_powered() return ..() && owner.cell diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e148a4fe75a..6c399a7161f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -142,6 +142,9 @@ var/list/robot_verbs_default = list( mmi = new /obj/item/mmi/robotic_brain(src) //Give the borg an MMI if he spawns without for some reason. (probably not the correct way to spawn a robotic brain, but it works) mmi.icon_state = "boris" + if(!cell) // Make sure a new cell gets created *before* executing initialize_components(). The cell component needs an existing cell for it to get set up properly + cell = new /obj/item/stock_parts/cell/high(src) + initialize_components() //if(!unfinished) // Create all the robot parts. @@ -150,9 +153,6 @@ var/list/robot_verbs_default = list( C.installed = 1 C.wrapped = new C.external_type - if(!cell) - cell = new /obj/item/stock_parts/cell/high(src) - ..() add_robot_verbs() @@ -602,7 +602,8 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/attackby(obj/item/W, mob/user, params) - if(opened) // Are they trying to insert something? + // Check if the user is trying to insert another component like a radio, actuator, armor etc. + if(istype(W, /obj/item/robot_parts/robot_component) && opened) for(var/V in components) var/datum/robot_component/C = components[V] if(!C.installed && istype(W, C.external_type)) @@ -637,7 +638,7 @@ var/list/robot_verbs_default = list( user.visible_message("\The [user] fixes some of the burnt wires on \the [src] with \the [coil].") else if(istype(W, /obj/item/stock_parts/cell) && opened) // trying to put a cell inside - var/datum/robot_component/C = components["power cell"] + var/datum/robot_component/cell/C = components["power cell"] if(wiresexposed) to_chat(user, "Close the panel first.") else if(cell) @@ -651,6 +652,7 @@ var/list/robot_verbs_default = list( C.installed = 1 C.wrapped = W C.install() + C.external_type = W.type // Update the cell component's `external_type` to the path of new cell //This will mean that removing and replacing a power cell will repair the mount, but I don't care at this point. ~Z C.brute_damage = 0 C.electronics_damage = 0 @@ -1419,6 +1421,8 @@ var/list/robot_verbs_default = list( burn = borked_part.electronics_damage borked_part.installed = 1 borked_part.wrapped = new borked_part.external_type + if(ispath(borked_part.external_type, /obj/item/stock_parts/cell)) // is the broken part a cell? + cell = new borked_part.external_type // borgs that have their cell destroyed have their `cell` var set to null. we need create a new cell for them based on their old cell type. borked_part.heal_damage(brute,burn) borked_part.install() diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 2c8e56f3fbe..83c038cc125 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -63,6 +63,7 @@ mulebot_count++ set_suffix(suffix ? suffix : "#[mulebot_count]") + RegisterSignal(src, COMSIG_CROSSED_MOVABLE, .proc/human_squish_check) /mob/living/simple_animal/bot/mulebot/Destroy() unload(0) @@ -866,6 +867,11 @@ else ..() +/mob/living/simple_animal/bot/mulebot/proc/human_squish_check(src, atom/movable/AM) + if(!ishuman(AM)) + return + RunOver(AM) + #undef SIGH #undef ANNOYED #undef DELIGHT diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 3f8924232e7..75d6d9084ca 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -80,7 +80,7 @@ else data = "
[infolinks ? info_links : info]
[stamps]" if(view) - var/datum/browser/popup = new(user, name, , paper_width, paper_height) + var/datum/browser/popup = new(user, "Paper[UID()]", , paper_width, paper_height) popup.stylesheets = list() popup.set_content(data) if(!stars) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index ecc26ba0cff..06bd0ec25c6 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -63,13 +63,13 @@ qdel(W) else if(istype(W, /obj/item/pen) || istype(W, /obj/item/toy/crayon)) - usr << browse("", "window=[name]") //Closes the dialog + usr << browse("", "window=PaperBundle[UID()]") //Closes the dialog P = src[page] P.attackby(W, user, params) update_icon() - if(winget(usr, "[name]", "is-visible") == "true") // NOT MY FAULT IT IS A BUILT IN PROC PLEASE DO NOT HIT ME + if(winget(usr, "PaperBundle[UID()]", "is-visible") == "true") // NOT MY FAULT IT IS A BUILT IN PROC PLEASE DO NOT HIT ME attack_self(usr) //Update the browsed page. add_fingerprint(usr) return @@ -125,7 +125,7 @@ if(istype(src[page], /obj/item/paper)) var/obj/item/paper/P = W dat += P.show_content(usr, view = 0) - usr << browse(dat, "window=[name]") + usr << browse(dat, "window=PaperBundle[UID()]") else if(istype(src[page], /obj/item/photo)) var/obj/item/photo/P = W usr << browse_rsc(P.img, "tmp_photo.png") @@ -133,7 +133,7 @@ + "" \ + "

Written on the back:
[P.scribble]" : ""]"\ - + "", "window=[name]") + + "", "window=PaperBundle[UID()]") /obj/item/paper_bundle/attack_self(mob/user as mob) src.show_content(user) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 11beb1a7cb6..4129ddf30ad 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -81,13 +81,22 @@ . += "It is too far away." /obj/item/photo/proc/show(mob/user as mob) - usr << browse_rsc(img, "tmp_photo.png") + var/icon/img_shown = new/icon(img) + var/colormatrix = user.get_screen_colour() + // Apply colorblindness effects, if any. + if(islist(colormatrix)) + img_shown.MapColors( + colormatrix[1], colormatrix[2], colormatrix[3], + colormatrix[4], colormatrix[5], colormatrix[6], + colormatrix[7], colormatrix[8], colormatrix[9], + ) + usr << browse_rsc(img_shown, "tmp_photo.png") usr << browse("[name]" \ + "" \ + "" \ + "[scribble ? "
Written on the back:
[scribble]" : ""]"\ - + "", "window=book;size=[64*photo_size]x[scribble ? 400 : 64*photo_size]") - onclose(usr, "[name]") + + "", "window=Photo[UID()];size=[64*photo_size]x[scribble ? 400 : 64*photo_size]") + onclose(usr, "Photo[UID()]") return /obj/item/photo/verb/rename() diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 327c29cebda..c7fcfcda5e7 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -22,30 +22,29 @@ energy = 50 -/obj/effect/accelerated_particle/New(loc) - ..() +/obj/effect/accelerated_particle/Initialize(loc) + . = ..() + addtimer(CALLBACK(src, .proc/propagate), 1) + RegisterSignal(src, COMSIG_CROSSED_MOVABLE, .proc/try_irradiate) + RegisterSignal(src, COMSIG_MOVABLE_CROSSED, .proc/try_irradiate) + QDEL_IN(src, movement_range) - addtimer(CALLBACK(src, .proc/move), 1) - - -/obj/effect/accelerated_particle/Bump(atom/A) - if(A) - if(isliving(A)) - toxmob(A) - else if(istype(A, /obj/machinery/the_singularitygen)) - var/obj/machinery/the_singularitygen/S = A - S.energy += energy - else if(istype(A, /obj/singularity)) - var/obj/singularity/S = A - S.energy += energy - else if(istype(A, /obj/structure/blob)) - var/obj/structure/blob/B = A - B.take_damage(energy * 0.6) - movement_range = 0 - -/obj/effect/accelerated_particle/Crossed(atom/A, oldloc) +/obj/effect/accelerated_particle/proc/try_irradiate(src, atom/A) if(isliving(A)) - toxmob(A) + var/mob/living/L = A + L.apply_effect((energy * 6), IRRADIATE, 0) + else if(istype(A, /obj/machinery/the_singularitygen)) + var/obj/machinery/the_singularitygen/S = A + S.energy += energy + else if(istype(A, /obj/structure/blob)) + var/obj/structure/blob/B = A + B.take_damage(energy * 0.6) + movement_range = 0 + +/obj/effect/accelerated_particle/Bump(obj/singularity/S) + if(!istype(S)) + return ..() + S.energy += energy /obj/effect/accelerated_particle/ex_act(severity) @@ -54,17 +53,7 @@ /obj/effect/accelerated_particle/singularity_pull() return - - -/obj/effect/accelerated_particle/proc/toxmob(mob/living/M) - M.apply_effect((energy * 6), IRRADIATE, 0) - -/obj/effect/accelerated_particle/proc/move() +/obj/effect/accelerated_particle/proc/propagate() + addtimer(CALLBACK(src, .proc/propagate), 1) if(!step(src,dir)) forceMove(get_step(src, dir)) - movement_range-- - if(movement_range == 0) - qdel(src) - else - sleep(speed) - move() \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index c745d6be846..a686eda11f0 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -98,7 +98,7 @@ return if(!chambered) var/obj/item/ammo_casing/energy/shot = ammo_type[select] - if(cell.charge >= shot.e_cost) //if there's enough power in the cell cell... + if(cell.charge >= shot.e_cost) //if there's enough power in the WEAPON'S cell... chambered = shot //...prepare a new shot based on the current ammo type selected if(!chambered.BB) chambered.newshot() @@ -111,6 +111,11 @@ chambered = null //either way, released the prepared shot newshot() +/obj/item/gun/energy/process_fire(atom/target, mob/living/user, message = 1, params, zone_override, bonus_spread = 0) + if(!chambered && can_shoot()) + process_chamber() + return ..() + /obj/item/gun/energy/proc/select_fire(mob/living/user) select++ if(select > ammo_type.len) @@ -193,6 +198,9 @@ . = ..() /obj/item/gun/energy/proc/robocharge() + if(cell.charge == cell.maxcharge) + // No point in recharging a weapon's cell that is already at 100%. That would just waste borg cell power for no reason. + return if(isrobot(loc)) var/mob/living/silicon/robot/R = loc if(R && R.cell) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 28c6c0eaf8a..ab9f633a43a 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -11,6 +11,7 @@ var/const/INGEST = 2 var/atom/my_atom = null var/chem_temp = T20C var/list/datum/reagent/addiction_list = new/list() + var/list/addiction_threshold_accumulated = new/list() var/flags var/list/reagents_generated_per_cycle = new/list() @@ -233,6 +234,15 @@ var/const/INGEST = 2 if(M) temperature_reagents(M.bodytemperature - 30) + + if(LAZYLEN(addiction_threshold_accumulated)) + for(var/thing in addiction_threshold_accumulated) + if(has_reagent(thing)) + continue // if we have the reagent in our system, then don't deplete the addiction threshold + addiction_threshold_accumulated[thing] -= 0.01 // Otherwise very slowly deplete the buildup + if(addiction_threshold_accumulated[thing] <= 0) + addiction_threshold_accumulated -= thing + // a bitfield filled in by each reagent's `on_mob_life` to find out which states to update var/update_flags = STATUS_UPDATE_NONE for(var/A in reagent_list) @@ -291,17 +301,21 @@ var/const/INGEST = 2 if(R.addiction_stage < 5) if(prob(5)) R.addiction_stage++ - switch(R.addiction_stage) - if(1) - update_flags |= R.addiction_act_stage1(M) - if(2) - update_flags |= R.addiction_act_stage2(M) - if(3) - update_flags |= R.addiction_act_stage3(M) - if(4) - update_flags |= R.addiction_act_stage4(M) - if(5) - update_flags |= R.addiction_act_stage5(M) + if(M.reagents.has_reagent(R.id)) + R.last_addiction_dose = world.timeofday + R.addiction_stage = 1 + else + switch(R.addiction_stage) + if(1) + update_flags |= R.addiction_act_stage1(M) + if(2) + update_flags |= R.addiction_act_stage2(M) + if(3) + update_flags |= R.addiction_act_stage3(M) + if(4) + update_flags |= R.addiction_act_stage4(M) + if(5) + update_flags |= R.addiction_act_stage5(M) if(prob(20) && (world.timeofday > (R.last_addiction_dose + ADDICTION_TIME))) //Each addiction lasts 8 minutes before it can end to_chat(M, "You no longer feel reliant on [R.name]!") addiction_list.Remove(R) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 05967be04ca..a9350961357 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -20,6 +20,9 @@ var/can_synth = TRUE //whether or not a mech syringe gun and synthesize this reagent var/overdose_threshold = 0 var/addiction_chance = 0 + var/addiction_chance_additional = 100 // If we want to lower the chance of addiction even more, set this + var/addiction_threshold = 0 // How much of a chem do we have to absorb before we can start rolling for its ill effects? + var/minor_addiction = FALSE var/addiction_stage = 1 var/last_addiction_dose = 0 var/overdosed = FALSE // You fucked up and this is now triggering it's overdose effects, purge that shit quick. @@ -53,12 +56,7 @@ var/can_become_addicted = M.reagents.reaction_check(M, src) if(can_become_addicted) - if(prob(addiction_chance) && !is_type_in_list(src, M.reagents.addiction_list)) - to_chat(M, "You suddenly feel invigorated and guilty...") - var/datum/reagent/new_reagent = new type() - new_reagent.last_addiction_dose = world.timeofday - M.reagents.addiction_list.Add(new_reagent) - else if(is_type_in_list(src, M.reagents.addiction_list)) + if(is_type_in_list(src, M.reagents.addiction_list)) to_chat(M, "You feel slightly better, but for how long?") for(var/A in M.reagents.addiction_list) var/datum/reagent/AD = A @@ -75,9 +73,24 @@ /datum/reagent/proc/on_mob_life(mob/living/M) current_cycle++ - holder.remove_reagent(id, metabolization_rate * M.metabolism_efficiency * M.digestion_ratio) //By default it slowly disappears. + var/total_depletion_rate = metabolization_rate * M.metabolism_efficiency * M.digestion_ratio // Cache it + + handle_addiction(M, total_depletion_rate) + + holder.remove_reagent(id, total_depletion_rate) //By default it slowly disappears. return STATUS_UPDATE_NONE +/datum/reagent/proc/handle_addiction(mob/living/M, consumption_rate) + if(addiction_chance && !is_type_in_list(src, M.reagents.addiction_list)) + M.reagents.addiction_threshold_accumulated[id] += consumption_rate + var/current_threshold_accumulated = M.reagents.addiction_threshold_accumulated[id] + + if(addiction_threshold < current_threshold_accumulated && prob(addiction_chance) && prob(addiction_chance_additional)) + to_chat(M, "You suddenly feel invigorated and guilty...") + var/datum/reagent/new_reagent = new type() + new_reagent.last_addiction_dose = world.timeofday + M.reagents.addiction_list.Add(new_reagent) + /datum/reagent/proc/on_mob_death(mob/living/M) //use this to have chems have a "death-triggered" effect return @@ -139,6 +152,8 @@ M.emote("twitch_s") if(prob(8)) M.emote("shiver") + if(prob(4)) + to_chat(M, "Your head hurts.") if(prob(4)) to_chat(M, "You begin craving [name]!") return STATUS_UPDATE_NONE @@ -147,23 +162,32 @@ if(prob(8)) M.emote("twitch") if(prob(4)) - to_chat(M, "You have the strong urge for some [name]!") + to_chat(M, "You have a pounding headache.") if(prob(4)) + to_chat(M, "You have the strong urge for some [name]!") + else if(prob(4)) to_chat(M, "You REALLY crave some [name]!") return STATUS_UPDATE_NONE /datum/reagent/proc/addiction_act_stage5(mob/living/M) var/update_flags = STATUS_UPDATE_NONE + if(minor_addiction) + if(prob(6)) + M.AdjustSlowed(3) + to_chat(M, "You feel [pick("tired", "exhausted", "sluggish")].") + else + if(prob(6)) + to_chat(M, "Your stomach lurches painfully!") + M.visible_message("[M] gags and retches!") + update_flags |= M.Stun(rand(2,4), FALSE) + update_flags |= M.Weaken(rand(2,4), FALSE) if(prob(8)) - M.emote("twitch") - if(prob(6)) - to_chat(M, "Your stomach lurches painfully!") - M.visible_message("[M] gags and retches!") - update_flags |= M.Stun(rand(2,4), FALSE) - update_flags |= M.Weaken(rand(2,4), FALSE) + M.emote(pick("twitch", "twitch_s", "shiver")) + if(prob(4)) + to_chat(M, "Your head is killing you!") if(prob(5)) to_chat(M, "You feel like you can't live without [name]!") - if(prob(5)) + else if(prob(5)) to_chat(M, "You would DIE for some [name] right now!") return update_flags diff --git a/code/modules/reagents/chemistry/reagents/admin.dm b/code/modules/reagents/chemistry/reagents/admin.dm index 6f22078b278..90e6cff3bf6 100644 --- a/code/modules/reagents/chemistry/reagents/admin.dm +++ b/code/modules/reagents/chemistry/reagents/admin.dm @@ -23,6 +23,7 @@ I.receive_damage(-5, FALSE) for(var/obj/item/organ/external/E in H.bodyparts) E.mend_fracture() + E.internal_bleeding = FALSE M.SetEyeBlind(0, FALSE) M.CureNearsighted(FALSE) M.CureBlind(FALSE) diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index d4d2bbe2d88..82a7bafe4c6 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -6,6 +6,8 @@ reagent_state = LIQUID nutriment_factor = 0 //So alcohol can fill you up! If they want to. color = "#404030" // rgb: 64, 64, 48 + addiction_chance = 1 + addiction_threshold = 10 var/dizzy_adj = 3 var/alcohol_perc = 1 //percentage of ethanol in a beverage 0.0 - 1.0 taste_description = "liquid fire" @@ -1190,15 +1192,17 @@ taste_description = "motor oil" /datum/reagent/consumable/ethanol/synthanol/on_mob_life(mob/living/M) - if(!M.isSynthetic()) + if(!(M.dna.species.reagent_tag & PROCESS_SYN)) holder.remove_reagent(id, 3.6) //gets removed from organics very fast if(prob(25)) holder.remove_reagent(id, 15) M.fakevomit() + return ..() + /datum/reagent/consumable/ethanol/synthanol/reaction_mob(mob/living/M, method=TOUCH, volume) - if(M.isSynthetic()) + if(M.dna.species.reagent_tag & PROCESS_SYN) return if(method == INGEST) to_chat(M, pick("That was awful!", "Yuck!")) diff --git a/code/modules/reagents/chemistry/reagents/drinks.dm b/code/modules/reagents/chemistry/reagents/drinks.dm index 6298e79d71d..a5a433b5ffe 100644 --- a/code/modules/reagents/chemistry/reagents/drinks.dm +++ b/code/modules/reagents/chemistry/reagents/drinks.dm @@ -276,7 +276,10 @@ adj_sleepy = -2 adj_temp_hot = 25 overdose_threshold = 45 - addiction_chance = 1 // It's true. + addiction_chance = 2 // It's true. + addiction_chance_additional = 20 + addiction_threshold = 10 + minor_addiction = TRUE heart_rate_increase = 1 drink_icon = "glass_brown" drink_name = "Glass of coffee" @@ -367,6 +370,10 @@ adj_drowsy = -1 adj_sleepy = -3 adj_temp_hot = 20 + addiction_chance = 1 + addiction_chance_additional = 1 + addiction_threshold = 10 + minor_addiction = TRUE drink_icon = "glass_brown" drink_name = "Glass of Tea" drink_desc = "A glass of hot tea. Perhaps a cup with a handle would have been smarter?" diff --git a/code/modules/reagents/chemistry/reagents/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm index 1e2099a901b..a8b4114344e 100644 --- a/code/modules/reagents/chemistry/reagents/drugs.dm +++ b/code/modules/reagents/chemistry/reagents/drugs.dm @@ -35,7 +35,8 @@ reagent_state = LIQUID color = "#9087A2" metabolization_rate = 0.2 - addiction_chance = 65 + addiction_chance = 15 + addiction_threshold = 10 heart_rate_decrease = 1 taste_description = "a synthetic high" @@ -88,7 +89,9 @@ reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 35 - addiction_chance = 70 + addiction_chance = 15 + addiction_threshold = 10 + minor_addiction = TRUE heart_rate_increase = 1 taste_description = "calm" @@ -154,7 +157,8 @@ reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 20 - addiction_chance = 50 + addiction_chance = 10 + addiction_threshold = 5 taste_description = "bitterness" /datum/reagent/crank/on_mob_life(mob/living/M) @@ -227,7 +231,8 @@ reagent_state = LIQUID color = "#0264B4" overdose_threshold = 20 - addiction_chance = 50 + addiction_chance = 10 + addiction_threshold = 10 taste_description = "very poor life choices" @@ -299,7 +304,8 @@ reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 20 - addiction_chance = 60 + addiction_chance = 10 + addiction_threshold = 5 metabolization_rate = 0.6 heart_rate_increase = 1 taste_description = "speed" @@ -360,7 +366,8 @@ reagent_state = SOLID color = "#FAFAFA" overdose_threshold = 20 - addiction_chance = 80 + addiction_chance = 15 + addiction_threshold = 5 metabolization_rate = 0.6 taste_description = "WAAAAGH" @@ -460,7 +467,8 @@ description = "Jenkem is a prison drug made from fermenting feces in a solution of urine. Extremely disgusting." reagent_state = LIQUID color = "#644600" - addiction_chance = 30 + addiction_chance = 5 + addiction_threshold = 5 taste_description = "the inside of a toilet... or worse" /datum/reagent/jenkem/on_mob_life(mob/living/M) @@ -517,6 +525,32 @@ M.Drowsy(10) return ..() +/datum/reagent/cbd + name = "Cannabidiol" + id = "cbd" + description = "A non-psychoactive phytocannabinoid extracted from the cannabis plant." + reagent_state = LIQUID + color = "#00e100" + taste_description = "relaxation" + +/datum/reagent/cbd/on_mob_life(mob/living/M) + var/update_flags = STATUS_UPDATE_NONE + if(prob(5)) + M.emote(pick("hsigh", "yawn")) + if(prob(5)) + to_chat(M, "[pick("You feel peaceful.", "You breathe softly.", "You feel chill.", "You vibe.")]") + if(prob(10)) + M.AdjustConfused(-5) + update_flags |= M.SetWeakened(0, FALSE) + if(volume >= 70 && prob(25)) + if(M.reagents.has_reagent("thc") <= 20) + M.Drowsy(10) + if(prob(25)) + update_flags |= M.adjustBruteLoss(-2, FALSE) + update_flags |= M.adjustFireLoss(-2, FALSE) + return ..() | update_flags + + /datum/reagent/fliptonium name = "Fliptonium" id = "fliptonium" @@ -526,7 +560,9 @@ metabolization_rate = 0.2 overdose_threshold = 15 process_flags = ORGANIC | SYNTHETIC //Flipping for everyone! - addiction_chance = 10 + addiction_chance = 1 + addiction_chance_additional = 20 + addiction_threshold = 10 taste_description = "flips" /datum/reagent/fliptonium/on_mob_life(mob/living/M) @@ -631,7 +667,8 @@ color = "#1BB1FF" process_flags = SYNTHETIC overdose_threshold = 20 - addiction_chance = 60 + addiction_chance = 10 + addiction_threshold = 5 metabolization_rate = 0.6 taste_description = "wiper fluid" @@ -684,7 +721,8 @@ process_flags = SYNTHETIC overdose_threshold = 20 - addiction_chance = 50 + addiction_chance = 10 + addiction_threshold = 5 taste_description = "silicon" diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index 5353dc54b88..f668807c1c5 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -149,6 +149,10 @@ description = "This is what makes chilis hot." reagent_state = LIQUID color = "#B31008" // rgb: 179, 16, 8 + addiction_chance = 1 + addiction_chance_additional = 10 + addiction_threshold = 2 + minor_addiction = TRUE taste_description = "HOTNESS" taste_mult = 1.5 @@ -651,6 +655,10 @@ reagent_state = LIQUID color = "#B2B139" overdose_threshold = 50 + addiction_chance = 2 + addiction_chance_additional = 10 + addiction_threshold = 5 + minor_addiction = TRUE harmless = FALSE taste_description = "cheese?" @@ -667,7 +675,10 @@ description = "Hell, I don't even know if this IS cheese. Whatever it is, it ain't normal. If you want to, pour it out to make it solid." reagent_state = SOLID color = "#50FF00" - addiction_chance = 5 + addiction_chance = 1 + addiction_chance_additional = 10 + addiction_threshold = 5 + minor_addiction = TRUE taste_description = "cheeeeeese...?" /datum/reagent/consumable/weird_cheese/on_mob_life(mob/living/M) diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index f77732087b8..4c68283d04b 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -6,7 +6,11 @@ /datum/reagent/medicine/on_mob_life(mob/living/M) current_cycle++ - holder.remove_reagent(id, (metabolization_rate / M.metabolism_efficiency) * M.digestion_ratio) //medicine reagents stay longer if you have a better metabolism + var/total_depletion_rate = (metabolization_rate / M.metabolism_efficiency) * M.digestion_ratio // Cache it + + handle_addiction(M, total_depletion_rate) + + holder.remove_reagent(id, total_depletion_rate) //medicine reagents stay longer if you have a better metabolism return STATUS_UPDATE_NONE /datum/reagent/medicine/hydrocodone @@ -293,7 +297,9 @@ color = "#C8A5DC" metabolization_rate = 0.2 overdose_threshold = 30 - addiction_chance = 5 + addiction_chance = 1 + addiction_chance_additional = 20 + addiction_threshold = 5 harmless = FALSE taste_description = "health" @@ -459,7 +465,9 @@ reagent_state = LIQUID color = "#C8A5DC" metabolization_rate = 0.2 - addiction_chance = 20 + addiction_chance = 1 + addiction_chance_additional = 20 + addiction_threshold = 10 harmless = FALSE taste_description = "oxygenation" @@ -481,7 +489,9 @@ color = "#C8A5DC" metabolization_rate = 0.3 overdose_threshold = 35 - addiction_chance = 25 + addiction_chance = 1 + addiction_chance = 10 + addiction_threshold = 10 harmless = FALSE taste_description = "stimulation" @@ -531,7 +541,8 @@ description = "Anti-allergy medication. May cause drowsiness, do not operate heavy machinery while using this." reagent_state = LIQUID color = "#5BCBE1" - addiction_chance = 10 + addiction_chance = 1 + addiction_threshold = 10 harmless = FALSE taste_description = "antihistamine" @@ -554,7 +565,8 @@ reagent_state = LIQUID color = "#C8A5DC" overdose_threshold = 20 - addiction_chance = 50 + addiction_chance = 10 + addiction_threshold = 15 shock_reduction = 50 harmless = FALSE taste_description = "a delightful numbing" @@ -902,7 +914,9 @@ description = "This experimental plasma-based compound seems to regulate body temperature." reagent_state = LIQUID color = "#D782E6" - addiction_chance = 20 + addiction_chance = 1 + addiction_chance_additional = 10 + addiction_threshold = 10 overdose_threshold = 50 taste_description = "warmth and stability" diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm index 17eee91080e..a1f2d74e77e 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -198,6 +198,7 @@ if(!S.reagents) S.create_reagents(volume) S.reagents.add_reagent("thermite", volume) + S.thermite = TRUE S.overlays.Cut() S.overlays = image('icons/effects/effects.dmi', icon_state = "thermite") if(S.active_hotspot) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index a069d386841..59f6d395aff 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -27,7 +27,7 @@ var/flush_count = 0 //this var adds 1 once per tick. When it reaches flush_every_ticks it resets and tries to flush. var/last_sound = 0 var/required_mode_to_deconstruct = -1 - var/deconstructs_to = PIPE_DISPOSALS_CHUTE + var/deconstructs_to = PIPE_DISPOSALS_BIN active_power_usage = 600 idle_power_usage = 100 @@ -98,21 +98,7 @@ return src.add_fingerprint(user) - if(mode<=0) // It's off - if(istype(I, /obj/item/screwdriver)) - if(contents.len > 0) - to_chat(user, "Eject the items first!") - return - if(mode==0) // It's off but still not unscrewed - mode=-1 // Set it to doubleoff l0l - playsound(src.loc, I.usesound, 50, 1) - to_chat(user, "You remove the screws around the power connection.") - return - else if(mode==-1) - mode=0 - playsound(src.loc, I.usesound, 50, 1) - to_chat(user, "You attach the screws around the power connection.") - return + if(istype(I, /obj/item/melee/energy/blade)) to_chat(user, "You can't place that item inside the disposal unit.") return @@ -158,6 +144,24 @@ update() + + + +/obj/machinery/disposal/screwdriver_act(mob/user, obj/item/I) + if(mode>0) // It's on + return + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(contents.len > 0) + to_chat(user, "Eject the items first!") + return + if(mode==0) // It's off but still not unscrewed + mode=-1 // Set it to doubleoff l0l + else if(mode==-1) + mode=0 + to_chat(user, "You [mode ? "unfasten": "fasten"] the screws around the power connection.") + /obj/machinery/disposal/welder_act(mob/user, obj/item/I) . = TRUE if(mode != required_mode_to_deconstruct) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 5bbf8d93f90..95e076d2670 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -273,8 +273,7 @@ icon_state = "intake" required_mode_to_deconstruct = 1 deconstructs_to = PIPE_DISPOSALS_CHUTE - - var/c_mode = 0 + var/can_deconstruct = FALSE /obj/machinery/disposal/deliveryChute/New() ..() @@ -345,21 +344,31 @@ update() return -/obj/machinery/disposal/deliveryChute/attackby(obj/item/I, mob/user, params) - if(!I || !user) +/obj/machinery/disposal/deliveryChute/screwdriver_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return + can_deconstruct = !can_deconstruct + to_chat(user, "You [can_deconstruct ? "unfasten": "fasten"] the screws around the power connection.") - if(istype(I, /obj/item/screwdriver)) - if(c_mode==0) - c_mode=1 - playsound(src.loc, I.usesound, 50, 1) - to_chat(user, "You remove the screws around the power connection.") - return - else if(c_mode==1) - c_mode=0 - playsound(src.loc, I.usesound, 50, 1) - to_chat(user, "You attach the screws around the power connection.") - return +/obj/machinery/disposal/deliveryChute/welder_act(mob/user, obj/item/I) + . = TRUE + if(!can_deconstruct) + return + if(contents.len > 0) + to_chat(user, "Eject the items first!") + return + if(!I.tool_use_check(user, 0)) + return + WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE + if(I.use_tool(src, user, 20, volume = I.tool_volume)) + WELDER_FLOOR_SLICE_SUCCESS_MESSAGE + var/obj/structure/disposalconstruct/C = new (loc) + C.ptype = deconstructs_to + C.update() + C.anchored = TRUE + C.density = TRUE + qdel(src) /obj/item/shippingPackage name = "Shipping package" diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 0bcdd3ba40d..2e7c668a83f 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -872,14 +872,6 @@ build_path = /obj/item/assembly/mousetrap category = list("initial", "Miscellaneous") -/datum/design/videocam - name = "Video Camera" - id = "videocam" - build_type = AUTOLATHE - materials = list(MAT_METAL = 120, MAT_GLASS = 60) - build_path = /obj/item/videocam - category = list("initial", "Miscellaneous") - /datum/design/logic_board name = "Logic Circuit" id = "logic_board" diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm index e1e3104e643..71a77d83655 100644 --- a/code/modules/security_levels/keycard authentication.dm +++ b/code/modules/security_levels/keycard authentication.dm @@ -99,7 +99,7 @@ if(href_list["reset"]) reset() if(href_list["ert"]) - ert_reason = input(usr, "Reason for ERT Call:", "", "") + ert_reason = stripped_input(usr, "Reason for ERT Call:", "", "") SSnanoui.update_uis(src) add_fingerprint(usr) @@ -165,9 +165,10 @@ feedback_inc("alert_keycard_auth_stationRevoke",1) if("Emergency Response Team") if(is_ert_blocked()) - to_chat(usr, "All Emergency Response Teams are dispatched and can not be called at this time.") + atom_say("All Emergency Response Teams are dispatched and can not be called at this time.") return - to_chat(usr, "ERT request transmitted.") + atom_say("ERT request transmitted!") + command_announcer.autosay("ERT request transmitted. Reason: [ert_reason]", name) print_centcom_report(ert_reason, station_time_timestamp() + " ERT Request") var/fullmin_count = 0 @@ -221,4 +222,4 @@ var/global/station_all_access = 0 D.emergency = 0 D.update_icon(0) minor_announcement.Announce("Access restrictions on all station airlocks have been re-added. Seek station AI or a colleague's assistance if you are stuck.") - station_all_access = 0 \ No newline at end of file + station_all_access = 0 diff --git a/code/modules/shuttle/ert.dm b/code/modules/shuttle/ert.dm index cbd007b32f9..9d124f78f29 100644 --- a/code/modules/shuttle/ert.dm +++ b/code/modules/shuttle/ert.dm @@ -4,6 +4,7 @@ shuttleId = "specops" possible_destinations = "specops_home;specops_away;specops_custom" resistance_flags = INDESTRUCTIBLE + flags = NODECONSTRUCT /obj/machinery/computer/camera_advanced/shuttle_docker/ert name = "specops navigation computer" @@ -16,6 +17,7 @@ x_offset = 0 y_offset = 0 resistance_flags = INDESTRUCTIBLE + flags = NODECONSTRUCT access_tcomms = FALSE access_construction = FALSE access_mining = FALSE \ No newline at end of file diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 5c0be6a78a5..6c3c4155ff0 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -9,6 +9,7 @@ shuttleId = "syndicate" possible_destinations = "syndicate_away;syndicate_z5;syndicate_z3;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s;syndicate_custom" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + flags = NODECONSTRUCT var/challenge = FALSE var/moved = FALSE diff --git a/code/modules/shuttle/vox.dm b/code/modules/shuttle/vox.dm index 3899a23dee1..21076b7683a 100644 --- a/code/modules/shuttle/vox.dm +++ b/code/modules/shuttle/vox.dm @@ -4,6 +4,7 @@ shuttleId = "skipjack" possible_destinations = "skipjack_away;skipjack_ne;skipjack_nw;skipjack_se;skipjack_sw;skipjack_z5;skipjack_custom" resistance_flags = INDESTRUCTIBLE + flags = NODECONSTRUCT /obj/machinery/computer/camera_advanced/shuttle_docker/vox name = "skipjack navigation computer" @@ -16,4 +17,5 @@ x_offset = -10 y_offset = -10 resistance_flags = INDESTRUCTIBLE + flags = NODECONSTRUCT access_derelict = TRUE diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index e9626a6b76d..fab2d0fd8a4 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -39,9 +39,9 @@ /obj/item/organ/internal/cyberimp/brain/anti_drop name = "Anti-drop implant" desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." - var/active = 0 - var/l_hand_ignore = 0 - var/r_hand_ignore = 0 + var/active = FALSE + var/l_hand_ignore = FALSE + var/r_hand_ignore = FALSE var/obj/item/l_hand_obj = null var/obj/item/r_hand_obj = null implant_color = "#DE7E00" @@ -56,17 +56,17 @@ r_hand_obj = owner.r_hand if(l_hand_obj) if(owner.l_hand.flags & NODROP) - l_hand_ignore = 1 + l_hand_ignore = TRUE else owner.l_hand.flags |= NODROP - l_hand_ignore = 0 + l_hand_ignore = FALSE if(r_hand_obj) if(owner.r_hand.flags & NODROP) - r_hand_ignore = 1 + r_hand_ignore = TRUE else owner.r_hand.flags |= NODROP - r_hand_ignore = 0 + r_hand_ignore = FALSE if(!l_hand_obj && !r_hand_obj) to_chat(owner, "You are not holding any items, your hands relax...") @@ -102,12 +102,15 @@ A = pick(oview(range)) L_item.throw_at(A, range, 2) to_chat(owner, "Your left arm spasms and throws the [L_item.name]!") + l_hand_obj = null if(R_item) A = pick(oview(range)) R_item.throw_at(A, range, 2) to_chat(owner, "Your right arm spasms and throws the [R_item.name]!") + r_hand_obj = null /obj/item/organ/internal/cyberimp/brain/anti_drop/proc/release_items() + active = FALSE if(!l_hand_ignore && l_hand_obj in owner.contents) l_hand_obj.flags ^= NODROP if(!r_hand_ignore && r_hand_obj in owner.contents) diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 2e3c9f7cae0..8ac73bf20d6 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index 745dd19aac7..589135b8701 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index e4e9fc0f859..8fd5f7d71b8 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/species/drask/uniform.dmi b/icons/mob/species/drask/uniform.dmi index 0828c290e05..25cfb51013c 100644 Binary files a/icons/mob/species/drask/uniform.dmi and b/icons/mob/species/drask/uniform.dmi differ diff --git a/icons/mob/species/grey/uniform.dmi b/icons/mob/species/grey/uniform.dmi index 1636097f72e..c956187ffa1 100644 Binary files a/icons/mob/species/grey/uniform.dmi and b/icons/mob/species/grey/uniform.dmi differ diff --git a/icons/mob/species/vox/back.dmi b/icons/mob/species/vox/back.dmi index a2f488122df..a0a8445964a 100644 Binary files a/icons/mob/species/vox/back.dmi and b/icons/mob/species/vox/back.dmi differ diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi index 6f050370f7c..3eb4fec6f6f 100644 Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index b67023a9935..1e185efd9c5 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 15a4adb9f41..bb7a1ce9188 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index c9293cbb7a7..33274c3fdb2 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/rust_g.dll b/rust_g.dll index 80d09ac19ca..9707322d7d1 100644 Binary files a/rust_g.dll and b/rust_g.dll differ