diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 0692eabf7cb..b9c202d09e6 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -288,7 +288,7 @@ var/list/gamemode_cache = list() if (M.votable) src.votable_modes += M.config_tag src.votable_modes += ROUNDTYPE_STR_SECRET - votable_modes += ROUNDTYPE_STR_MIXED_SECRET +// votable_modes += ROUNDTYPE_STR_MIXED_SECRET /datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist var/list/Lines = file2list(filename) @@ -594,7 +594,7 @@ var/list/gamemode_cache = list() if("alert_yellow") config.alert_desc_yellow_to = value - + if("alert_delta") config.alert_desc_delta = value @@ -821,7 +821,7 @@ var/list/gamemode_cache = list() access_deny_vms = text2num(value) if("access_warn_vms") access_warn_vms = text2num(value) - + if("cargo_load_items_from") cargo_load_items_from = value diff --git a/code/controllers/subsystems/initialization/misc_early.dm b/code/controllers/subsystems/initialization/misc_early.dm index 1785f3e33b4..8f2d6bbac8e 100644 --- a/code/controllers/subsystems/initialization/misc_early.dm +++ b/code/controllers/subsystems/initialization/misc_early.dm @@ -1,5 +1,6 @@ // This is one of the first subsystems initialized by the MC. // Stuff that should be loaded before everything else that isn't significant enough to get its own SS goes here. +// The area list is put together here, because some things need it early on. Turrets controls, for example. /datum/controller/subsystem/misc_early name = "Early Miscellaneous Init" @@ -8,6 +9,10 @@ /datum/controller/subsystem/misc_early/Initialize(timeofday) uplink = new + + // Generate the area list. + resort_all_areas() + // Create the data core, whatever that is. data_core = new /datum/datacore() @@ -43,3 +48,10 @@ discord_bot.alert_server_visibility() ..() + +/proc/resort_all_areas() + all_areas = list() + for (var/area/A in world) + all_areas += A + + sortTim(all_areas, /proc/cmp_name_asc) \ No newline at end of file diff --git a/code/controllers/subsystems/initialization/misc_late.dm b/code/controllers/subsystems/initialization/misc_late.dm index 71eef46405e..cb7214a52a9 100644 --- a/code/controllers/subsystems/initialization/misc_late.dm +++ b/code/controllers/subsystems/initialization/misc_late.dm @@ -1,5 +1,4 @@ // This subsystem loads later in the init process. Not last, but after most major things are done. -// We sort the area list here because SSatoms needs to run first. /datum/controller/subsystem/misc_late name = "Late Miscellaneous Init" @@ -7,9 +6,6 @@ flags = SS_NO_FIRE | SS_NO_DISPLAY /datum/controller/subsystem/misc_late/Initialize(timeofday) - // Generate the area list. - resort_all_areas() - var/turf/picked // Setup the teleport locs. for (var/thing in all_areas) @@ -42,13 +38,6 @@ ..(timeofday) -/proc/resort_all_areas() - all_areas = list() - for (var/area/A in world) - all_areas += A - - sortTim(all_areas, /proc/cmp_name_asc) - /proc/sorted_add_area(area/A) all_areas += A diff --git a/code/datums/trading/unique.dm b/code/datums/trading/unique.dm index 5602da4f22d..0b523aec697 100644 --- a/code/datums/trading/unique.dm +++ b/code/datums/trading/unique.dm @@ -154,11 +154,11 @@ /datum/trader/ship/unique/vaurca origin = "The Hive Shop" name_language = LANGUAGE_VAURCA + want_multiplier = 1 possible_wanted_items = list( /obj/item/weapon/reagent_containers/food/snacks/koisbar = TRADER_THIS_TYPE, /obj/item/weapon/reagent_containers/food/snacks/grown/kois = TRADER_THIS_TYPE, - /obj/item/weapon/reagent_containers/food/snacks/koisbar = TRADER_THIS_TYPE, /obj/item/stack/material/phoron = TRADER_THIS_TYPE ) @@ -194,7 +194,6 @@ /datum/trader/ship/unique/bluespace name = "Maximus Crane" origin = "Bluespace Emporium" - trade_flags = TRADER_WANTED_ONLY|TRADER_GOODS|TRADER_MONEY possible_wanted_items = list( /obj/item/bluespace_crystal = TRADER_ALL, diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm index 1943c29b1c1..c55c75822ce 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm @@ -83,6 +83,7 @@ sleep(200) if(prob(30)) user <<"Reset attempt failed!" + user.hacking = 0 return if(target) user << "Successfully sent reset signal to cyborg.." diff --git a/code/game/gamemodes/vampire/vampire_helpers.dm b/code/game/gamemodes/vampire/vampire_helpers.dm index a0cac794841..8c427564e39 100644 --- a/code/game/gamemodes/vampire/vampire_helpers.dm +++ b/code/game/gamemodes/vampire/vampire_helpers.dm @@ -76,7 +76,7 @@ if (!mind.vampire) return 0 - if ((mind.vampire.status & VAMP_FULLPOWER) && !(T.mind.vampire && (T.mind.vampire.status & VAMP_FULLPOWER))) + if ((mind.vampire.status & VAMP_FULLPOWER) && !(T.mind && T.mind.vampire && (T.mind.vampire.status & VAMP_FULLPOWER))) return 1 if (T.mind) @@ -95,7 +95,8 @@ return 0 if(is_special_character(T) && (!(T.mind.vampire.status & VAMP_ISTHRALL))) - user << "\The [T]'s mind is too strong to be affected by our powers!" + if (notify) + to_chat(src, "\The [T]'s mind is too strong to be affected by our powers!") return 0 if (account_loyalty_implant) @@ -179,13 +180,9 @@ if (next_alert && message) if (!vampire.last_frenzy_message || vampire.last_frenzy_message + next_alert < world.time) - to_chat(usr, message) + to_chat(src, message) vampire.last_frenzy_message = world.time - // Remove one point per every life() tick. - if (vampire.frenzy > 0) - vampire.frenzy-- - /mob/proc/vampire_start_frenzy(var/force_frenzy = 0) var/datum/vampire/vampire = mind.vampire @@ -243,6 +240,10 @@ if (mind.vampire.blood_usable < 10) mind.vampire.frenzy += 2 + else if (mind.vampire.frenzy > 0) + mind.vampire.frenzy = max(0, mind.vampire.frenzy -= Clamp(mind.vampire.blood_usable * 0.1, 1, 10)) + + mind.vampire.frenzy = min(mind.vampire.frenzy, 450) vampire_check_frenzy() diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 85744c8c9d9..ebe85b020f7 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -247,19 +247,19 @@ if(occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE - occupant.loc = loc + occupant.forceMove(loc) occupant = null - for(var/atom/movable/A in src) // In case an object was dropped inside or something + for(var/atom/movable/A in (contents - component_parts)) // In case an object was dropped inside or something if(A == beaker) continue - A.loc = loc + A.forceMove(loc) update_use_power(1) update_icon() toggle_filter() /obj/machinery/sleeper/proc/remove_beaker() if(beaker) - beaker.loc = loc + beaker.forceMove(loc) beaker = null toggle_filter() diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index eb58d8e7012..fa11f745638 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -53,6 +53,12 @@ var/const/HOLOPAD_MODE = RANGE_BASED var/obj/machinery/hologram/holopad/targetpad var/last_message +/obj/machinery/hologram/holopad/check_eye(mob/user) + if (user && user == caller_id) + return 0 + + return -1 + /obj/machinery/hologram/holopad/attack_hand(var/mob/living/carbon/human/user) //Carn: Hologram requests. if(!istype(user)) return @@ -109,8 +115,9 @@ var/const/HOLOPAD_MODE = RANGE_BASED /obj/machinery/hologram/holopad/proc/take_call(mob/living/carbon/user) incoming_connection = 0 + caller_id.set_machine(src) caller_id.reset_view(src) - if(!masters[caller_id])//If there is no hologram, possibly make one. + if(!masters[caller_id]) //If there is no hologram, possibly make one. activate_holocall(caller_id) /obj/machinery/hologram/holopad/proc/end_call(mob/user) @@ -119,19 +126,21 @@ var/const/HOLOPAD_MODE = RANGE_BASED caller_id.reset_view() //Send the caller back to his body clear_holo(null, caller_id) // destroy the hologram caller_id = null + if(user) user.unset_machine() user.reset_view() //Send the caller back to his body clear_holo(null, user) // destroy the hologram user = null + /obj/machinery/hologram/holopad/proc/activate_holocall(mob/living/carbon/caller_id) if(caller_id) - create_holo(0,caller_id)//Create one. - src.visible_message("A holographic image of [caller_id] flicks to life right before your eyes!") + create_holo(0, caller_id)//Create one. + visible_message("A holographic image of [caller_id] flicks to life right before your eyes!") else to_chat(caller_id, "ERROR: Unable to project hologram.") return - + /obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) return @@ -223,16 +232,14 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(hacked == 0) var/obj/effect/overlay/hologram = new(T)//Spawn a blank effect at the location. if(caller_id) - var/tempicon = 0 - for(var/datum/data/record/t in data_core.locked) - if(t.fields["name"] == caller_id.name) - tempicon = t.fields["image"] + var/tempicon = getFlatIcon(caller_id) + hologram.name = "[caller_id.name] (Hologram)" hologram.loc = get_step(src,1) masters[caller_id] = hologram - add_overlay(getHologramIcon(icon(tempicon))) // Add the callers image as an overlay to keep coloration! + hologram.icon = getHologramIcon(icon(tempicon)) // Add the callers image as an overlay to keep coloration! else - add_overlay(A.holo_icon) // Add the AI's configured holo Icon + hologram.icon = A.holo_icon // Add the AI's configured holo Icon hologram.name = "[A.name] (Hologram)"//If someone decides to right click. A.holo = src masters[A] = hologram @@ -253,14 +260,14 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ A.holo = src return 1 -/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user, mob/living/carbon/caller_id) +/obj/machinery/hologram/holopad/proc/clear_holo(mob/living/silicon/ai/user, mob/living/carbon/call_user) if(user) qdel(masters[user])//Get rid of user's hologram user.holo = null masters -= user //Discard AI from the list of those who use holopad - if(caller_id) - qdel(masters[caller_id])//Get rid of user's hologram - masters -= caller_id //Discard the caller from the list of those who use holopad + if(call_user) + qdel(masters[call_user]) //Get rid of user's hologram + masters -= call_user //Discard the caller from the list of those who use holopad if (!masters.len)//If no users left set_light(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted) icon_state = "holopad0" @@ -289,7 +296,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ sourcepad.audible_message("The holopad connection timed out") sourcepad = 0 if (caller_id && sourcepad) - if(caller_id.loc!=sourcepad.loc) + if(caller_id.loc != sourcepad.loc) sourcepad.visible_message("Severing connection to distant holopad.") visible_message("The connection has been terminated by [caller_id].") end_call() diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 3ed02fe7d3a..336b6bf4f72 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -235,6 +235,7 @@ t1 += "[printedmessage]
" P.info = t1 P.name = "Transcript" + usr.put_in_hands(P) canprint = 0 sleep(300) canprint = 1 diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index d732edb5585..96c753c8ad2 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -474,9 +474,9 @@ /obj/item/weapon/storage/backpack/messenger/syndie name = "syndicate messenger bag" desc = "A sturdy backpack worn over one shoulder. This one is in red and black menacing colors." - icon_state = "courierbag" + icon_state = "courierbagsyndie" /obj/item/weapon/storage/backpack/messenger/wizard name = "wizardly messenger bag" desc = "A wizardly backpack worn over one shoulder. This one is in blue and purple colors. " - icon_state = "courierbag" + icon_state = "courierbagwizard" diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index ff2f614d46a..f87887c63de 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -130,11 +130,6 @@ desc = "A warning sign which reads 'NO SMOKING'." icon_state = "nosmoking2" -/obj/structure/sign/redcross - name = "medbay" - desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here." - icon_state = "redcross" - /obj/structure/sign/greencross name = "medbay" desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here." diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index bc743231363..7565ff30a91 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -415,7 +415,7 @@ var/atype = alert(usr, "Do you want to fill or empty \the [RG] at \the [src]?", "Fill or Empty", "Fill", "Empty", "Cancel") if(!usr.Adjacent(src)) return - if(RG.loc != usr || (usr.l_hand != RG && usr.r_hand != RG)) return + if(RG.loc != usr) return if(busy) usr << "Someone's already using \the [src]." return diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 4b72efafe33..28cbca4e4dc 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -148,3 +148,13 @@ prefix = "" if((target.mob in messagemobs) || display_remote) target << "" + create_text_tag("looc", "LOOC:", target) + " [prefix][display_name][admin_stuff]: [msg]" + +/client/verb/stop_all_sounds() + set name = "Stop all sounds" + set desc = "Stop all sounds that are currently playing." + set category = "OOC" + + if(!mob) + return + + mob << sound(null) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm index e28731062de..f9ebc5decc5 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm @@ -76,7 +76,7 @@ m_chains["blue-jeweled bands"] = /obj/item/clothing/ears/skrell/bluejeweled_band m_chains["silver bands"] = /obj/item/clothing/ears/skrell/silver_band m_chains["blue cloth"] = /obj/item/clothing/ears/skrell/blue_skrell_cloth_band_male - m_chains["blue cloth"] = /obj/item/clothing/ears/skrell/purple_skrell_cloth_male + m_chains["purple cloth"] = /obj/item/clothing/ears/skrell/purple_skrell_cloth_male gear_tweaks += new/datum/gear_tweak/path(m_chains) //vaurca items diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 61ab553f077..796edf4e1b6 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -116,7 +116,7 @@ All custom items with worn sprites must follow the contained sprite system: http slot_flags = SLOT_MASK | SLOT_TIE -/obj/item/clothing/ears/skrell/fluff/dompesh_cloth //Skrell Purple Head Cloth - Shkor-Dyet Dom'Pesh - mofo1995 +/obj/item/clothing/ears/skrell/purple_skrell_cloth_male/fluff/dompesh_cloth //Skrell Purple Head Cloth - Shkor-Dyet Dom'Pesh - mofo1995 name = "male skrell purple head cloth" desc = "A set of purple headcloths fit for a skrell's head tails. This one has a small SAMPLe logo on the interior of each cloth, perfect for scientific skrell." diff --git a/code/modules/law/laws/low_severity.dm b/code/modules/law/laws/low_severity.dm index 993cf559a3a..a73bbc7fa26 100644 --- a/code/modules/law/laws/low_severity.dm +++ b/code/modules/law/laws/low_severity.dm @@ -14,7 +14,7 @@ /datum/law/low_severity/petty_theft name = "i102 - Petty Theft" - desc = "To take mundane items from areas one does not have access to, or to take items belonging to others or the station as a whole." + desc = "To take mundane items from areas one does not have access to, or to take items belonging to others or the station as a whole. Includes theft of credits up to 500cr. For higher amounts see i220 - Fraud." id = "i102" min_brig_time = 3 @@ -47,7 +47,7 @@ /datum/law/low_severity/hooliganism name = "i105 - Hooliganism" - desc = "To present an unnecessary nuisance to members of the crew including excessive departmental radio usage for private affairs, being intentionally unclothed, or otherwise disturbing the crew.." + desc = "To present an unnecessary nuisance to members of the crew including excessive departmental radio usage for private affairs, being intentionally unclothed, or otherwise disturbing the crew." id = "i105" min_brig_time = 5 @@ -58,7 +58,7 @@ /datum/law/low_severity/suspicious_conduct name = "i106 - Suspicious Conduct" - desc = " To possess a suspiciously wide skill set not indicated in employee record, wielding dangerous weapons near other staff, extensive inquiring about critical areas, or stalking other employees. " + desc = " To possess a suspiciously wide skill set not indicated in employee record, wielding dangerous weapons near other staff, extensive inquiring about critical areas, or stalking other employees." id = "i106" min_brig_time = 2 @@ -179,7 +179,7 @@ /datum/law/low_severity/excessive_detainment name = "i117 - Excessive Use of Force in Detainment" - desc = "To use more than the required force to subdue a suspect. " + desc = "To use more than the required force to subdue a suspect." id = "i117" min_brig_time = 5 diff --git a/code/modules/law/laws/med_severity.dm b/code/modules/law/laws/med_severity.dm index 1fef8588071..c591dac2280 100644 --- a/code/modules/law/laws/med_severity.dm +++ b/code/modules/law/laws/med_severity.dm @@ -156,3 +156,11 @@ min_brig_time = 10 max_brig_time = 25 + +/datum/law/med_severity/fraud + name = "i220 - Fraud" + desc = "To steal or use deliberate deception in order to obtain credits from someone. Applies to amounts greater than 500 credits. For lesser amounts, see i102 - Petty Theft. For items of equivalent value, see i215 - Grand Theft." + id = "i220" + + min_brig_time = 15 + max_brig_time = 20 \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 7cca06dcfc7..0f3f46c77da 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -114,13 +114,15 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images if(istype(target)) ManualFollow(target) -/mob/dead/observer/proc/initialise_postkey() +/mob/dead/observer/proc/initialise_postkey(set_timers = TRUE) //This function should be run after a ghost has been created and had a ckey assigned + if (!set_timers) + return //Death times are initialised if they were unset //get/set death_time functions are in mob_helpers.dm if (!get_death_time(ANIMAL)) - set_death_time(ANIMAL, world.time - RESPAWN_ANIMAL)//allow instant mouse spawning + set_death_time(ANIMAL, world.time - RESPAWN_ANIMAL) //allow instant mouse spawning if (!get_death_time(MINISYNTH)) set_death_time(MINISYNTH, world.time - RESPAWN_MINISYNTH) //allow instant drone spawning if (!get_death_time(CREW)) @@ -174,25 +176,15 @@ Works together with spawning an observer, noted above. C.images += target.hud_list[SPECIALROLE_HUD] return 1 -/mob/proc/ghostize(var/can_reenter_corpse = 1, var/should_set_timer = 1) +/mob/proc/ghostize(var/can_reenter_corpse = TRUE, var/should_set_timer = TRUE) if(ckey) var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc. ghost.can_reenter_corpse = can_reenter_corpse ghost.timeofdeath = src.stat == DEAD ? src.timeofdeath : world.time - if(should_set_timer) - //This is duplicated for robustness in cases where death might not be called. - //It is also set in the mob/death proc - if (isanimal(src)) - set_death_time(ANIMAL, world.time) - else if (ispAI(src) || isDrone(src)) - set_death_time(MINISYNTH, world.time) - else - set_death_time(CREW, world.time)//Crew is the fallback - ghost.ckey = ckey ghost.client = client - ghost.initialise_postkey() + ghost.initialise_postkey(should_set_timer) if(ghost.client) if(!ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index bd30db99b54..86a9895dd8c 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -278,6 +278,9 @@ if(H.stat == DEAD) // He's dead, Jim return null + if(isipc(H)) + return null + if(H in ignored) return null @@ -353,7 +356,7 @@ var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN) if(!t) return - if(!in_range(src, usr) && loc != usr) + if(!in_range(src, user) && loc != user) return created_name = t else diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index edd0bdf8fc8..d1368fb0683 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -310,6 +310,7 @@ /mob/living/silicon/robot/drone/proc/transfer_personality(var/client/player) if(!player) return + stat = 0 src.ckey = player.ckey if(player.mob && player.mob.mind) diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 89b02b03b85..aa3907d9997 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -253,11 +253,11 @@ G = module_state_1 if (!G.wrapped && G.grip_item(W, src, 1)) return 1 - if (istype(module_state_2, /obj/item/weapon/gripper)) + else if (istype(module_state_2, /obj/item/weapon/gripper)) G = module_state_2 if (!G.wrapped && G.grip_item(W, src, 0)) return 1 - if (istype(module_state_2, /obj/item/weapon/gripper)) + else if (istype(module_state_3, /obj/item/weapon/gripper)) G = module_state_3 if (!G.wrapped && G.grip_item(W, src, 0)) return 1 @@ -292,4 +292,4 @@ return 1 if (I.loc != src) return 1//Allows objects inside grippers - return 0//don't allow dropping our modules \ No newline at end of file + return 0//don't allow dropping our modules diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 1e3895945fc..0d1574fdc9b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -479,7 +479,12 @@ announce_ghost_joinleave(client, 0) + // Run this here to null out death timers for the next go. + var/mob/new_player/M = new /mob/new_player() + + M.reset_death_timers() + if(!client) log_game("[usr.key] AM failed due to disconnect.",ckey=key_name(usr)) qdel(M) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 7ad6b85acb3..532837e1db9 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -991,6 +991,26 @@ proc/is_blind(A) P.time_of_death[which] = value return 1 +/** + * Resets death timers for a mob. Should only be called during new player creation. + */ +/mob/proc/reset_death_timers() + var/datum/preferences/P + if (client) + P = client.prefs + else if (ckey) + // To avoid runtimes during adminghost. + if (copytext(ckey, 1, 2) == "@") + P = preferences_datums[copytext(ckey, 2)] + else + P = preferences_datums[ckey] + else + return + + if (!P) + return + + P.time_of_death.Cut() //Below here is stuff related to devouring, but which is generally helpful and thus placed here //See Devour.dm for more info in how these are used @@ -1045,7 +1065,7 @@ proc/is_blind(A) "donor" = WEAKREF(src), "viruses" = null, "species" = name, - "blood_DNA" = md5("\ref[src]"), + "blood_DNA" = md5("\ref[src]"), "blood_colour" = "#a10808", "blood_type" = null, "resistances" = null, diff --git a/code/modules/modular_computers/computers/subtypes/dev_tablet.dm b/code/modules/modular_computers/computers/subtypes/dev_tablet.dm index 6c7789a71b0..d2b8839a3bf 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_tablet.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_tablet.dm @@ -1,5 +1,6 @@ /obj/item/modular_computer/tablet name = "tablet computer" + desc = "A portable device for your needs on the go." icon = 'icons/obj/modular_tablet.dmi' icon_state = "tablet" icon_state_unpowered = "tablet" diff --git a/code/modules/modular_computers/file_system/programs/app_presets.dm b/code/modules/modular_computers/file_system/programs/app_presets.dm index d74f990668c..f772035c93d 100644 --- a/code/modules/modular_computers/file_system/programs/app_presets.dm +++ b/code/modules/modular_computers/file_system/programs/app_presets.dm @@ -209,4 +209,4 @@ new/datum/computer_file/program/chatclient(), new /datum/computer_file/program/merchant() ) - return _prg_list + return _prg_list \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/civilian/cargo_control.dm b/code/modules/modular_computers/file_system/programs/civilian/cargo_control.dm index 8972e08674f..f4a91a58cc5 100644 --- a/code/modules/modular_computers/file_system/programs/civilian/cargo_control.dm +++ b/code/modules/modular_computers/file_system/programs/civilian/cargo_control.dm @@ -7,6 +7,7 @@ available_on_ntnet = 1 required_access_download = access_hop required_access_run = access_cargo + usage_flags = PROGRAM_CONSOLE | PROGRAM_TELESCREEN nanomodule_path = /datum/nano_module/program/civilian/cargocontrol/ /datum/nano_module/program/civilian/cargocontrol/ diff --git a/code/modules/modular_computers/file_system/programs/civilian/cargo_order.dm b/code/modules/modular_computers/file_system/programs/civilian/cargo_order.dm index 3e8d213581d..c4925b40beb 100644 --- a/code/modules/modular_computers/file_system/programs/civilian/cargo_order.dm +++ b/code/modules/modular_computers/file_system/programs/civilian/cargo_order.dm @@ -5,6 +5,7 @@ size = 10 requires_ntnet = 1 available_on_ntnet = 1 + usage_flags = PROGRAM_LAPTOP | PROGRAM_TELESCREEN | PROGRAM_CONSOLE nanomodule_path = /datum/nano_module/program/civilian/cargoorder/ /datum/nano_module/program/civilian/cargoorder/ diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm index d75b547d9e7..37364ede63d 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -6,7 +6,7 @@ extended_desc = "Program for programming employee ID cards to access parts of the station." required_access_run = access_change_ids required_access_download = access_change_ids - usage_flags = PROGRAM_CONSOLE + usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP requires_ntnet = 0 size = 8 color = LIGHT_COLOR_BLUE diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm index cb08ceb4e36..be6a21e2555 100644 --- a/code/modules/modular_computers/file_system/programs/command/comm.dm +++ b/code/modules/modular_computers/file_system/programs/command/comm.dm @@ -13,7 +13,7 @@ required_access_download = access_heads requires_ntnet = 1 size = 12 - usage_flags = PROGRAM_CONSOLE + usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP network_destination = "station long-range communication array" var/datum/comm_message_listener/message_core = new var/intercept = 0 diff --git a/code/modules/modular_computers/file_system/programs/engineering/_engineering.dm b/code/modules/modular_computers/file_system/programs/engineering/_engineering.dm index a27b7e4157d..af3f21d8395 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/_engineering.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/_engineering.dm @@ -72,12 +72,12 @@ requires_ntnet = 1 network_destination = "atmospheric control system" requires_ntnet_feature = NTNET_SYSTEMCONTROL - usage_flags = PROGRAM_CONSOLE + usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP size = 17 color = LIGHT_COLOR_CYAN /datum/computer_file/program/rcon_console - filename = "rconconsole" + filename = "rcon" filedesc = "RCON Remote Control" nanomodule_path = /datum/nano_module/rcon program_icon_state = "generic" diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm index 3ff9e8e9bbc..8709930a304 100644 --- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm +++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm @@ -9,5 +9,5 @@ requires_ntnet = 1 network_destination = "crew lifesigns monitoring system" size = 11 - usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP + usage_flags = PROGRAM_LAPTOP | PROGRAM_TELESCREEN | PROGRAM_CONSOLE color = LIGHT_COLOR_CYAN diff --git a/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm b/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm index e876f12d4a0..6ea1da656c4 100644 --- a/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm +++ b/code/modules/modular_computers/file_system/programs/research/ai_restorer.dm @@ -11,6 +11,7 @@ nanomodule_path = /datum/nano_module/program/computer_aidiag/ var/restoring = 0 color = LIGHT_COLOR_PURPLE + usage_flags = PROGRAM_CONSOLE /datum/computer_file/program/aidiag/proc/get_ai() if(computer && computer.ai_slot && computer.ai_slot.check_functionality() && computer.ai_slot.enabled && computer.ai_slot.stored_card && computer.ai_slot.stored_card.carded_ai) diff --git a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm index 20ad0fc3b3c..f1ef264f63b 100644 --- a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm +++ b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm @@ -19,7 +19,6 @@ var/warrant_uid = 0 available_on_ntnet = 1 required_access_download = access_hos required_access_run = access_security - usage_flags = PROGRAM_ALL nanomodule_path = /datum/nano_module/program/digitalwarrant/ /datum/nano_module/program/digitalwarrant/ diff --git a/code/modules/modular_computers/file_system/programs/system/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/system/ntdownloader.dm index 046f729ea2a..52b4a7c2db2 100644 --- a/code/modules/modular_computers/file_system/programs/system/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/system/ntdownloader.dm @@ -189,6 +189,7 @@ var/list/all_entries[0] var/datum/computer_file/program/ntnetdownload/prog = program var/list/data = list() + data["hackedavailable"] = 0 for(var/datum/computer_file/program/P in ntnet_global.available_station_software) var/installed = 0 for(var/datum/computer_file/program/Q in program.holder.stored_files) @@ -200,6 +201,9 @@ // Only those programs our user can run will show in the list if(!P.can_download(user) && P.requires_access_to_download) continue + + if(!P.is_supported_by_hardware(program.computer.hardware_flag)) + continue all_entries.Add(list(list( "filename" = P.filename, @@ -207,7 +211,6 @@ "fileinfo" = P.extended_desc, "size" = P.size ))) - data["hackedavailable"] = 0 if(prog.computer_emagged) // If we are running on emagged computer we have access to some "bonus" software var/list/hacked_programs[0] diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index 0ea03104021..a03139b4855 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -8,13 +8,13 @@ var/max_paper = 10 var/paperamount = 0 var/list/shred_amounts = list( - /obj/item/weapon/photo = 1, + /obj/item/weapon/photo = -1, /obj/item/weapon/shreddedp = 1, /obj/item/weapon/paper = 1, /obj/item/weapon/newspaper = 3, - /obj/item/weapon/card/id = 3, + /obj/item/weapon/card/id = -1, /obj/item/weapon/paper_bundle = 3 - ) + )// use -1 if it doesn't generate paper /obj/machinery/papershredder/attackby(var/obj/item/W, var/mob/user) if (istype(W, /obj/item/weapon/storage)) @@ -43,7 +43,8 @@ if(paperamount == max_paper) user << "\The [src] is full; please empty it before you continue." return - paperamount += paper_result + if (paper_result > 0) + paperamount += paper_result user.drop_from_inventory(W) qdel(W) playsound(src.loc, 'sound/items/pshred.ogg', 75, 1) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 790582476fa..d3731ad909c 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -702,6 +702,7 @@ matter = list("glass" = 100) brightness_range = 5 brightness_power = 0.75 + brightness_color = LIGHT_COLOR_TUNGSTEN lighttype = "bulb" /obj/item/weapon/light/bulb/colored/red diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index ce72f5862cb..ca4299519e1 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -549,6 +549,8 @@ slime_temp_adj = 15 /datum/reagent/capsaicin/condensed/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) +#define EYES_PROTECTED 1 +#define EYES_MECH 2 var/eyes_covered = 0 var/mouth_covered = 0 var/no_pain = 0 @@ -563,13 +565,18 @@ protection = list(H.head, H.glasses, H.wear_mask) if(H.species && (H.species.flags & NO_PAIN)) no_pain = 1 //TODO: living-level can_feel_pain() proc + + // Robo-eyes are immune to pepperspray now. Wee. + var/obj/item/organ/eyes/E = H.get_eyes() + if (istype(E) && (E.status & (ORGAN_ROBOT|ORGAN_ADV_ROBOT))) + eyes_covered |= EYES_MECH else protection = list(M.wear_mask) for(var/obj/item/I in protection) if(I) if(I.body_parts_covered & EYES) - eyes_covered = 1 + eyes_covered |= EYES_PROTECTED eye_protection = I.name if((I.body_parts_covered & FACE) && !(I.item_flags & FLEXIBLEMATERIAL)) mouth_covered = 1 @@ -577,8 +584,10 @@ var/message = null if(eyes_covered) - if(!mouth_covered) + if (!mouth_covered && (eyes_covered & EYES_PROTECTED)) message = "Your [eye_protection] protects your eyes from the pepperspray!" + else if (eyes_covered & EYES_MECH) + message = "Your mechanical eyes are invulnurable pepperspray!" else message = "The pepperspray gets in your eyes!" if(mouth_covered) @@ -597,6 +606,8 @@ M.custom_emote(2, "[pick("coughs!","coughs hysterically!","splutters!")]") M.Stun(5) M.Weaken(5) +#undef EYES_PROTECTED +#undef EYES_MECH /datum/reagent/condensedcapsaicin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(ishuman(M)) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index 6cd9da1713f..0ec0dbcfacc 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -429,7 +429,7 @@ color = "#ffff40" scannable = 1 metabolism = REM * 0.25 - taste_description = "bolted fire" + taste_description = "bottled fire" var/datum/modifier/modifier /datum/reagent/estus/affect_blood(var/mob/living/carbon/M, var/removed) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index a67377e62ac..e577603fd55 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -73,7 +73,7 @@ /obj/item/weapon/reagent_containers/spray/proc/Spray_at(atom/A as mob|obj, mob/user as mob, proximity) if (A.density && proximity) - A.visible_message("[usr] sprays [A] with [src].") + A.visible_message("[user] sprays [A] with [src].") reagents.splash(A, amount_per_transfer_from_this) else spawn(0) @@ -157,12 +157,12 @@ /obj/item/weapon/reagent_containers/spray/pepper/attack_self(var/mob/user) safety = !safety - usr << "You switch the safety [safety ? "on" : "off"]." + user << "You switch the safety [safety ? "on" : "off"]." playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) -/obj/item/weapon/reagent_containers/spray/pepper/Spray_at(atom/A as mob|obj) +/obj/item/weapon/reagent_containers/spray/pepper/Spray_at(atom/A as mob|obj, mob/user) if(safety) - usr << "The safety is on!" + user << "The safety is on!" return ..() diff --git a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm b/code/modules/spells/aoe_turf/conjure/druidic_spells.dm index cec585c0cb6..dfc1c9f0e79 100644 --- a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm +++ b/code/modules/spells/aoe_turf/conjure/druidic_spells.dm @@ -24,7 +24,7 @@ charge_max = 300 invocation = "Bla'yo daya!" invocation_type = SpI_SHOUT - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 3) + level_max = list(Sp_TOTAL = 3, Sp_SPEED = 4, Sp_POWER = 3) range = 1 diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index d6db4d4c2fc..b2e15414263 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -137,10 +137,10 @@ SSnanoui.update_uis(src) - if (locate(/datum/reagent/toxin) in beaker.reagents.reagent_list && toxins < 100) + if ((locate(/datum/reagent/toxin) in beaker.reagents.reagent_list) && toxins < 100) for(var/datum/reagent/toxin/T in beaker.reagents.reagent_list) toxins += max(T.strength,1) - beaker.reagents.remove_reagent(T.id,1) + beaker.reagents.remove_reagent(T.id, 1) if(toxins > 100) toxins = 100 break diff --git a/config/example/config.txt b/config/example/config.txt index abb53117325..0eee64f11d0 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -122,6 +122,19 @@ PROBABILITY S NINJA 1 PROBABILITY S HEIST 1 PROBABILITY S VAMPIRE 1 PROBABILITY S EXTEND-A-TRAITORMONGOUS 6 +PROBABILITY S CONFLUX 1 +PROBABILITY S CROSSFIRE 1 +PROBABILITY S PARANOIA 1 +PROBABILITY S UPRISING 1 +PROBABILITY S VISITORS 1 +PROBABILITY S INTRIGUE 1 +PROBABILITY S SIEGE 1 +PROBABILITY S EXTENDED 1 +PROBABILITY S INFILTRATION 1 +PROBABILITY S VEILPARTY 1 +PROBABILITY S FEEDING 1 +PROBABILITY S TRAITORLING 1 + PROBABILITY MS CONFLUX 1 PROBABILITY MS CROSSFIRE 1 PROBABILITY MS PARANOIA 1 diff --git a/html/changelog.html b/html/changelog.html index de9701b9dac..9b53c19cd06 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,54 @@ -->
+

11 November 2017

+

TheGreatJorge updated:

+ + +

05 November 2017

+

Chaoko99 updated:

+ +

Karolis2011 updated:

+ +

Printer16 updated:

+ + +

30 October 2017

+

Alberyk updated:

+ + +

29 October 2017

+

Skull132 updated:

+ +

28 October 2017

Alberyk updated: