diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index d4721aa8114..62c97f8807c 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -443,8 +443,8 @@
if(pressure <= LAVALAND_EQUIPMENT_EFFECT_PRESSURE)
. = TRUE
-/proc/pollCandidatesWithVeto(adminclient, adminusr, max_slots, Question, be_special_type, antag_age_check = FALSE, poll_time = 300, ignore_respawnability = FALSE, min_hours = FALSE, flashwindow = TRUE, check_antaghud = TRUE, source)
- var/list/willing_ghosts = SSghost_spawns.poll_candidates(Question, be_special_type, antag_age_check, poll_time, ignore_respawnability, min_hours, flashwindow, check_antaghud, source)
+/proc/pollCandidatesWithVeto(adminclient, adminusr, max_slots, Question, be_special_type, antag_age_check = FALSE, poll_time = 300, ignore_respawnability = FALSE, min_hours = FALSE, flashwindow = TRUE, check_antaghud = TRUE, source, role_cleanname)
+ var/list/willing_ghosts = SSghost_spawns.poll_candidates(Question, be_special_type, antag_age_check, poll_time, ignore_respawnability, min_hours, flashwindow, check_antaghud, source, role_cleanname)
var/list/selected_ghosts = list()
if(!willing_ghosts.len)
return selected_ghosts
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
index 53040777467..3a0c58bffb3 100644
--- a/code/_globalvars/lists/misc.dm
+++ b/code/_globalvars/lists/misc.dm
@@ -40,6 +40,7 @@ GLOBAL_LIST_INIT(round_end_sounds, list(
'sound/AI/newroundsexy.ogg' = 2.3 SECONDS,
'sound/misc/apcdestroyed.ogg' = 3 SECONDS,
'sound/misc/bangindonk.ogg' = 1.6 SECONDS,
+ 'sound/misc/berightback.ogg' = 2.9 SECONDS,
'sound/goonstation/misc/newround1.ogg' = 6.9 SECONDS,
'sound/goonstation/misc/newround2.ogg' = 14.8 SECONDS
)) // Maps available round end sounds to their duration
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 7b53bce22de..a07a29ccc53 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -570,10 +570,7 @@ so as to remain in compliance with the most up-to-date laws."
G.ManualFollow(target)
/obj/screen/alert/notify_action/Topic(href, href_list)
- if(..())
- return TRUE
-
- if(href_list["signup"] && isobserver(usr) && poll?.sign_up(usr))
+ if(href_list["signup"] && poll?.sign_up(usr))
display_signed_up()
/obj/screen/alert/notify_action/proc/display_signed_up()
diff --git a/code/controllers/subsystem/ghost_spawns.dm b/code/controllers/subsystem/ghost_spawns.dm
index ea0aefb88bd..d8a4f29e20d 100644
--- a/code/controllers/subsystem/ghost_spawns.dm
+++ b/code/controllers/subsystem/ghost_spawns.dm
@@ -41,9 +41,10 @@ SUBSYSTEM_DEF(ghost_spawns)
* * flash_window - Whether the poll should flash a potential candidate's game window
* * check_antaghud - Whether to filter out potential candidates who enabled AntagHUD
* * source - The atom, atom prototype, icon or mutable appearance to display as an icon in the alert
+ * * role_cleanname - The name override to display to clients
*/
-/datum/controller/subsystem/ghost_spawns/proc/poll_candidates(question = "Would you like to play a special role?", role, antag_age_check = FALSE, poll_time = 30 SECONDS, ignore_respawnability = FALSE, min_hours = 0, flash_window = TRUE, check_antaghud = TRUE, source)
- log_debug("Polling candidates [role ? "for [get_roletext(role)]" : "\"[question]\""] for [poll_time / 10] seconds")
+/datum/controller/subsystem/ghost_spawns/proc/poll_candidates(question = "Would you like to play a special role?", role, antag_age_check = FALSE, poll_time = 30 SECONDS, ignore_respawnability = FALSE, min_hours = 0, flash_window = TRUE, check_antaghud = TRUE, source, role_cleanname)
+ log_debug("Polling candidates [role ? "for [role_cleanname || get_roletext(role)]" : "\"[question]\""] for [poll_time / 10] seconds")
// Start firing
polls_active = TRUE
@@ -130,7 +131,7 @@ SUBSYSTEM_DEF(ghost_spawns)
if(isatom(source))
act_jump = "\[Teleport]"
var/act_signup = "\[Sign Up]"
- to_chat(M, "Now looking for candidates [role ? "to play as \an [get_roletext(role)]" : "\"[question]\""]. [act_jump] [act_signup]")
+ to_chat(M, "Now looking for candidates [role ? "to play as \an [role_cleanname || get_roletext(role)]" : "\"[question]\""]. [act_jump] [act_signup]")
// Start processing it so it updates visually the timer
START_PROCESSING(SSprocessing, A)
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index aafe126a0b4..e4268c16cd5 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -518,8 +518,8 @@ GLOBAL_VAR_INIT(record_id_num, 1001)
clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
if("Shaft Miner")
- clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s = new /icon('icons/mob/uniform.dmi', "explorer_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "explorer"), ICON_UNDERLAY)
if("Lawyer")
clothes_s = new /icon('icons/mob/uniform.dmi', "internalaffairs_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 307d3c20445..cc8b2dd5e97 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -113,6 +113,11 @@
A.on_body_transfer(old_current, current)
transfer_antag_huds(hud_to_transfer) //inherit the antag HUD
transfer_actions(new_character)
+ if(martial_art)
+ if(martial_art.temporary)
+ martial_art.remove(current)
+ else
+ martial_art.teach(current)
if(active)
new_character.key = key //now transfer the key to link the client to our new body
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 20ff79041a9..adbed5f15eb 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -571,20 +571,22 @@
event = null
else if(href_list["killcrew"]) //shoot a crewmember
+ if(length(settlers) <= 0 || alive <= 0)
+ return
var/sheriff = remove_crewmember() //I shot the sheriff
- playsound(loc,'sound/weapons/gunshots/gunshot.ogg', 100, 1)
+ playsound(loc, 'sound/weapons/gunshots/gunshot.ogg', 100, 1)
- if(settlers.len == 0 || alive == 0)
+ if(length(settlers) == 0 || alive == 0)
atom_say("The last crewmember [sheriff], shot themselves, GAME OVER!")
if(emagged)
- usr.death(0)
- emagged = 0
- gameover = 1
+ usr.death(FALSE)
+ emagged = FALSE
+ gameover = TRUE
event = null
else if(emagged)
if(usr.name == sheriff)
atom_say("The crew of the ship chose to kill [usr.name]!")
- usr.death(0)
+ usr.death(FALSE)
if(event == ORION_TRAIL_LING) //only ends the ORION_TRAIL_LING event, since you can do this action in multiple places
event = null
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 1d6b572d9e5..a732348ac3c 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -56,7 +56,6 @@ GLOBAL_LIST_EMPTY(airlock_overlays)
autoclose = TRUE
explosion_block = 1
assemblytype = /obj/structure/door_assembly
- normalspeed = 1
siemens_strength = 1
var/security_level = 0 //How much are wires secured
var/aiControlDisabled = AICONTROLDISABLED_OFF
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 4ed92910c5a..a86ea7d4a6b 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -20,7 +20,7 @@
var/locked = FALSE //whether the door is bolted or not.
var/glass = FALSE
var/welded = FALSE
- var/normalspeed = 1
+ var/normalspeed = TRUE
var/auto_close_time = 150
var/auto_close_time_dangerous = 15
var/assemblytype //the type of door frame to drop during deconstruction
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index 61ba683ad18..8fdbf0880df 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -87,11 +87,15 @@
energy_drain = 100
range = MECHA_MELEE | MECHA_RANGED
var/atom/movable/locked
+ var/cooldown_timer = 0
var/mode = 1 //1 - gravsling 2 - gravpush
/obj/item/mecha_parts/mecha_equipment/gravcatapult/action(atom/movable/target)
if(!action_checks(target))
return
+ if(cooldown_timer > world.time)
+ occupant_message("[src] is still recharging.")
+ return
switch(mode)
if(1)
if(!locked)
@@ -106,6 +110,7 @@
locked.throw_at(target, 14, 1.5)
locked = null
send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",get_equip_info())
+ cooldown_timer = world.time + 3 SECONDS
return 1
else
locked = null
@@ -125,6 +130,7 @@
step_away(A,target)
sleep(2)
var/turf/T = get_turf(target)
+ cooldown_timer = world.time + 3 SECONDS
log_game("[key_name(chassis.occupant)] used a Gravitational Catapult in ([T.x],[T.y],[T.z])")
return 1
diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm
index 01033e6c123..185a00305de 100644
--- a/code/game/objects/items/control_wand.dm
+++ b/code/game/objects/items/control_wand.dm
@@ -1,6 +1,7 @@
#define WAND_OPEN "Open Door"
#define WAND_BOLT "Toggle Bolts"
#define WAND_EMERGENCY "Toggle Emergency Access"
+#define WAND_SPEED "Change Closing Speed"
/obj/item/door_remote
icon_state = "gangtool-white"
@@ -21,7 +22,7 @@
for(var/region in region_access)
ID.access += get_region_accesses(region)
ID.access += additional_access
- ID.access = uniquelist(ID.access) //remove duplicates
+ ID.access = uniquelist(ID.access)
/obj/item/door_remote/Destroy()
QDEL_NULL(ID)
@@ -34,8 +35,11 @@
if(WAND_BOLT)
mode = WAND_EMERGENCY
if(WAND_EMERGENCY)
+ mode = WAND_SPEED
+ if(WAND_SPEED)
mode = WAND_OPEN
- to_chat(user, "Now in mode: [mode].")
+
+ to_chat(user, "Now in mode: [mode].")
/obj/item/door_remote/afterattack(obj/machinery/door/airlock/D, mob/user)
if(!istype(D))
@@ -64,10 +68,13 @@
D.lock()
if(WAND_EMERGENCY)
if(D.emergency)
- D.emergency = 0
+ D.emergency = FALSE
else
- D.emergency = 1
+ D.emergency = TRUE
D.update_icon()
+ if(WAND_SPEED)
+ D.normalspeed = !D.normalspeed
+ to_chat(user, "[D] is now in [D.normalspeed ? "normal" : "fast"] mode.")
else
to_chat(user, "[src] does not have access to this door.")
@@ -144,3 +151,4 @@
#undef WAND_OPEN
#undef WAND_BOLT
#undef WAND_EMERGENCY
+#undef WAND_SPEED
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index 2305eabb654..f2ccc0c1aa1 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -10,11 +10,16 @@
throw_range = 20
origin_tech = "syndicate=1;engineering=3"
/// Integrated camera console to serve UI data
- var/obj/machinery/computer/security/integrated_console
+ var/obj/machinery/computer/security/camera_bug/integrated_console
+
+/obj/machinery/computer/security/camera_bug
+ name = "invasive camera utility"
+ desc = "How did this get here?! Please report this as a bug to github"
+ use_power = NO_POWER_USE
/obj/item/camera_bug/Initialize(mapload)
. = ..()
- integrated_console = new
+ integrated_console = new(src)
integrated_console.parent = src
integrated_console.network = list("SS13")
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 9f6844c8b9e..8b302cd338a 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -124,7 +124,7 @@ GLOBAL_LIST_INIT(leather_recipes, list (
new/datum/stack_recipe("leather satchel", /obj/item/storage/backpack/satchel, 5),
new/datum/stack_recipe("bandolier", /obj/item/storage/belt/bandolier, 5),
new/datum/stack_recipe("leather jacket", /obj/item/clothing/suit/jacket/leather, 7),
- new/datum/stack_recipe("leather shoes", /obj/item/clothing/shoes/laceup, 2),
+ new/datum/stack_recipe("leather shoes", /obj/item/clothing/shoes/leather, 2),
new/datum/stack_recipe("leather overcoat", /obj/item/clothing/suit/jacket/leather/overcoat, 10),
new/datum/stack_recipe("hide mantle", /obj/item/clothing/suit/unathi/mantle, 4)))
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 2390394b280..262fab1775c 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -3577,7 +3577,7 @@
var/datum/outfit/O = hunter_outfits[dresscode]
message_admins("[key_name_admin(mob)] is sending a ([dresscode]) to [killthem ? "assassinate" : "protect"] [key_name_admin(H)]...")
var/image/source = image('icons/obj/cardboard_cutout.dmi', "cutout_traitor")
- var/list/candidates = SSghost_spawns.poll_candidates("Play as a [killthem ? "murderous" : "protective"] [dresscode]?", ROLE_TRAITOR, TRUE, source = source)
+ var/list/candidates = SSghost_spawns.poll_candidates("Play as a [killthem ? "murderous" : "protective"] [dresscode]?", ROLE_TRAITOR, TRUE, source = source, role_cleanname = "[killthem ? "murderous" : "protective"] [dresscode]")
if(!candidates.len)
to_chat(usr, "ERROR: Could not create eventmob. No valid candidates.")
return
diff --git a/code/modules/admin/verbs/gimmick_team.dm b/code/modules/admin/verbs/gimmick_team.dm
index 3403a4417cf..3080ef5706d 100644
--- a/code/modules/admin/verbs/gimmick_team.dm
+++ b/code/modules/admin/verbs/gimmick_team.dm
@@ -53,7 +53,7 @@
players_to_spawn += candidate
else
to_chat(src, "Polling candidates...")
- players_to_spawn = SSghost_spawns.poll_candidates("Do you want to play as \a [O.name]?")
+ players_to_spawn = SSghost_spawns.poll_candidates("Do you want to play as \a [initial(O.name)]?")
if(!players_to_spawn.len)
to_chat(src, "Nobody volunteered.")
@@ -93,4 +93,3 @@
feedback_add_details("admin_verb","SPAWNGIM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
// ---------------------------------------------------------------------------------------------------------
-
diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm
index d4ea1a0dd2e..a4e12d8d768 100644
--- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm
+++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm
@@ -55,8 +55,8 @@ GLOBAL_VAR_INIT(sent_syndicate_infiltration_team, 0)
infiltrators += candidate
else
to_chat(src, "Polling candidates...")
- var/mutable_appearance/ma = new('icons/mob/simple_human.dmi', "syndicate")
- infiltrators = SSghost_spawns.poll_candidates("Do you want to play as a SYNDICATE INFILTRATOR?", ROLE_TRAITOR, TRUE, source = ma)
+ var/image/I = new('icons/obj/cardboard_cutout.dmi', "cutout_sit")
+ infiltrators = SSghost_spawns.poll_candidates("Do you want to play as a Syndicate infiltrator?", ROLE_TRAITOR, TRUE, source = I, role_cleanname = "Syndicate infiltrator")
if(!infiltrators.len)
to_chat(src, "Nobody volunteered.")
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 0e769ed3e73..779687b2501 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -137,8 +137,8 @@
var/confirm = alert("Are you sure?", "Confirm creation", "Yes", "No")
if(confirm != "Yes")
return 0
- var/mutable_appearance/ma = new('icons/mob/simple_human.dmi', "wizard")
- var/list/candidates = SSghost_spawns.poll_candidates("Do you wish to be considered for the position of a Wizard Foundation 'diplomat'?", "wizard", source = ma)
+ var/image/I = new('icons/mob/simple_human.dmi', "wizard")
+ var/list/candidates = SSghost_spawns.poll_candidates("Do you wish to be considered for the position of a Wizard Foundation 'diplomat'?", "wizard", source = I)
log_admin("[key_name(owner)] tried making a Wizard with One-Click-Antag")
message_admins("[key_name_admin(owner)] tried making a Wizard with One-Click-Antag")
diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm
index 405c1d3c3d2..dab21cfa8a1 100644
--- a/code/modules/admin/verbs/striketeam_syndicate.dm
+++ b/code/modules/admin/verbs/striketeam_syndicate.dm
@@ -45,7 +45,8 @@ GLOBAL_VAR_INIT(sent_syndicate_strike_team, 0)
break
// Find ghosts willing to be SST
- var/list/commando_ghosts = pollCandidatesWithVeto(src, usr, SYNDICATE_COMMANDOS_POSSIBLE, "Join the Syndicate Strike Team?",, 21, 60 SECONDS, TRUE, GLOB.role_playtime_requirements[ROLE_DEATHSQUAD], TRUE, FALSE)
+ var/image/I = new('icons/obj/cardboard_cutout.dmi', "cutout_commando")
+ var/list/commando_ghosts = pollCandidatesWithVeto(src, usr, SYNDICATE_COMMANDOS_POSSIBLE, "Join the Syndicate Strike Team?",, 21, 60 SECONDS, TRUE, GLOB.role_playtime_requirements[ROLE_DEATHSQUAD], TRUE, FALSE, source = I)
if(!commando_ghosts.len)
to_chat(usr, "Nobody volunteered to join the SST.")
return
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index 82f492d214b..35dfc22b1fb 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -46,8 +46,8 @@
checking = TRUE
to_chat(user, "You activate [src] and wait for confirmation.")
- var/mutable_appearance/ma = new('icons/mob/simple_human.dmi', "syndicate_space_sword")
- var/list/nuke_candidates = SSghost_spawns.poll_candidates("Do you want to play as a [rolename]?", ROLE_OPERATIVE, TRUE, 15 SECONDS, source = ma)
+ var/image/I = new('icons/mob/simple_human.dmi', "syndicate_space_sword")
+ var/list/nuke_candidates = SSghost_spawns.poll_candidates("Do you want to play as a [rolename]?", ROLE_OPERATIVE, TRUE, 15 SECONDS, source = I)
if(LAZYLEN(nuke_candidates))
checking = FALSE
if(QDELETED(src) || !check_usability(user))
diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm
index 50ca634a22f..cc8c1e9933b 100644
--- a/code/modules/martial_arts/martial.dm
+++ b/code/modules/martial_arts/martial.dm
@@ -140,9 +140,10 @@
return
if(H.mind.martial_art != src)
return
- H.mind.martial_art = base
- if(has_explaination_verb && !(base && base.has_explaination_verb))
- H.verbs -= /mob/living/carbon/human/proc/martial_arts_help
+ H.mind.martial_art = null // Remove reference
+ H.verbs -= /mob/living/carbon/human/proc/martial_arts_help
+ if(base)
+ base.teach(H)
/mob/living/carbon/human/proc/martial_arts_help()
set name = "Show Info"
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index fd2171335ef..675de65fb3e 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -263,6 +263,12 @@
if(prob(50 / severity) && severity < 3)
qdel(src)
+/obj/machinery/mineral/equipment_vendor/Destroy()
+ if(inserted_id)
+ inserted_id.forceMove(loc)
+ return ..()
+
+
/**********************Mining Equiment Vendor (Golem)**************************/
/obj/machinery/mineral/equipment_vendor/golem
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 54c23c89b5d..7de33866d46 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -220,8 +220,9 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
var/datum/wires/explosive/gibtonite/wires
/obj/item/twohanded/required/gibtonite/Destroy()
- SStgui.close_uis(wires)
- QDEL_NULL(wires)
+ if(wires)
+ SStgui.close_uis(wires)
+ QDEL_NULL(wires)
return ..()
/obj/item/twohanded/required/gibtonite/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index cf61162733e..87d7165b8d3 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -14,19 +14,20 @@ emp_act
return FALSE
if(P.is_reflectable)
var/can_reflect = check_reflect(def_zone)
- if(!can_reflect)
- return (..(P , def_zone)) //Bad luck
- else
- if(can_reflect == 2) //If target is holding a toy sword
- var/list/safe_list = list(/obj/item/projectile/beam/lasertag, /obj/item/projectile/beam/practice)
- if(!is_type_in_list(P, safe_list)) //And it's not safe
- return (..(P , def_zone)) //Bad luck
- visible_message("The [P.name] gets reflected by [src]!", \
+ if(can_reflect == 1) // proper reflection
+ visible_message("The [P.name] gets reflected by [src]!", \
"The [P.name] gets reflected by [src]!")
+ P.reflect_back(src)
+ return -1 // complete projectile permutation
- P.reflect_back(src)
+ else if(can_reflect == 2) //If target is holding a toy sword
+ var/list/safe_list = list(/obj/item/projectile/beam/lasertag, /obj/item/projectile/beam/practice)
+ if(is_type_in_list(P, safe_list)) //And it's safe
+ visible_message("The [P.name] gets reflected by [src]!", \
+ "The [P.name] gets reflected by [src]!")
+ P.reflect_back(src)
+ return -1 // complete projectile permutation
- return -1 // complete projectile permutation
//Shields
if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration))
diff --git a/code/modules/mob/living/carbon/human/species/diona.dm b/code/modules/mob/living/carbon/human/species/diona.dm
index 2ce011c7159..133a334a998 100644
--- a/code/modules/mob/living/carbon/human/species/diona.dm
+++ b/code/modules/mob/living/carbon/human/species/diona.dm
@@ -85,9 +85,8 @@
return ..()
/datum/species/diona/handle_life(mob/living/carbon/human/H)
- if(H.stat == DEAD)
- return
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
+ var/is_vamp = H.mind?.vampire != null
if(isturf(H.loc)) //else, there's considered to be no light
var/turf/T = H.loc
light_amount = min(1, T.get_lumcount()) - 0.5
@@ -95,9 +94,12 @@
H.clear_alert("nolight")
else
H.throw_alert("nolight", /obj/screen/alert/nolight)
- H.adjust_nutrition(light_amount * 10)
- if(H.nutrition > NUTRITION_LEVEL_ALMOST_FULL)
- H.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL)
+
+ if(!is_vamp)
+ H.adjust_nutrition(light_amount * 10)
+ if(H.nutrition > NUTRITION_LEVEL_ALMOST_FULL)
+ H.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL)
+
if(light_amount > 0.2 && !H.suiciding) //if there's enough light, heal
if(!pod && H.health <= 0)
return
@@ -106,7 +108,7 @@
H.adjustToxLoss(-1)
H.adjustOxyLoss(-1)
- if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
+ if(!is_vamp && H.nutrition < NUTRITION_LEVEL_STARVING + 50)
H.adjustBruteLoss(2)
..()
diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm
index 6ac5f8cded2..36d11b0f2a2 100644
--- a/code/modules/mob/living/silicon/silicon_defense.dm
+++ b/code/modules/mob/living/silicon/silicon_defense.dm
@@ -58,6 +58,7 @@
if(INTENT_HELP)
M.visible_message("[M] pets [src]!", \
"You pet [src]!")
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
if("grab")
grabbedby(M)
else
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm
index 8f423dfb5d2..e78acd08a90 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm
@@ -366,3 +366,7 @@
/obj/structure/spider/terrorweb/queen/CanAtmosPass(turf/T)
return FALSE
+/obj/structure/spider/terrorweb/queen/Destroy()
+ var/turf/T = get_turf(src)
+ . = ..()
+ T.air_update_turf(TRUE)
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 77f8cc40da9..d51a58662ef 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -513,16 +513,16 @@
if(4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(JOB_MINER)
- clothes_s = new /icon(uniform_dmi, "miner_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s = new /icon(uniform_dmi, "explorer_s")
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "explorer"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
if(prob(1))
clothes_s.Blend(new /icon('icons/mob/head.dmi', "bearpelt"), ICON_OVERLAY)
switch(backbag)
if(2)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "explorerpack"), ICON_OVERLAY)
if(3)
- clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-explorer"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(JOB_LAWYER)
diff --git a/code/modules/reagents/chemistry/reagents/drinks.dm b/code/modules/reagents/chemistry/reagents/drinks.dm
index 4bd061c14b4..53187fc8c35 100644
--- a/code/modules/reagents/chemistry/reagents/drinks.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks.dm
@@ -517,3 +517,15 @@
description = "Beloved of children and teetotalers."
color = "#E6CDFF"
taste_description = "grape soda"
+
+/datum/reagent/consumable/drink/coco/icecoco
+ name = "Iced Cocoa"
+ id = "icecoco"
+ description = "Hot cocoa and ice, refreshing and cool."
+ color = "#102838" // rgb: 16, 40, 56
+ adj_temp_hot = 0
+ adj_temp_cool = 5
+ drink_icon = "icedcoffeeglass"
+ drink_name = "Iced Cocoa"
+ drink_desc = "A sweeter drink to perk you up and refresh you!"
+ taste_description = "refreshingly cold cocoa"
diff --git a/code/modules/reagents/chemistry/recipes/drinks.dm b/code/modules/reagents/chemistry/recipes/drinks.dm
index 1f15c95bbf2..ab326d9d9ca 100644
--- a/code/modules/reagents/chemistry/recipes/drinks.dm
+++ b/code/modules/reagents/chemistry/recipes/drinks.dm
@@ -868,3 +868,11 @@
required_reagents = list("hooch" = 1, "absinthe" = 1, "manlydorf" = 1, "syndicatebomb" = 1)
result_amount = 4
mix_message = "The mixture turns to a sickening froth."
+
+/datum/chemical_reaction/icecoco
+ name = "Iced Cocoa"
+ id = "icecoco"
+ result = "icecoco"
+ required_reagents = list("ice" = 1, "hot_coco" = 3)
+ result_amount = 4
+ mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
diff --git a/icons/obj/cardboard_cutout.dmi b/icons/obj/cardboard_cutout.dmi
index da5f58d7f7c..63f65c7d07f 100644
Binary files a/icons/obj/cardboard_cutout.dmi and b/icons/obj/cardboard_cutout.dmi differ
diff --git a/sound/misc/berightback.ogg b/sound/misc/berightback.ogg
new file mode 100644
index 00000000000..e9a6f6c182b
Binary files /dev/null and b/sound/misc/berightback.ogg differ