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