From 3559a77d0f56a1a6e3557f4b7ff863b03aa424ad Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 19 Mar 2019 04:35:03 -0700 Subject: [PATCH 01/80] Uplink improvements --- code/datums/uplink_item.dm | 25 +++++++++++++------ .../effects/spawners/random_spawners.dm | 2 +- code/game/objects/items/devices/uplinks.dm | 7 ++++-- .../items/weapons/storage/uplink_kits.dm | 19 +++++++++++--- nano/templates/uplink.tmpl | 2 +- 5 files changed, 39 insertions(+), 16 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a22bdd371a6..e745ceaa0ba 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -90,7 +90,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) if(hijack_only) if(!(locate(/datum/objective/hijack) in usr.mind.objectives)) - to_chat(usr, "The Syndicate lacks resources to provide you with this item.") + to_chat(usr, "The Syndicate will only issue this extremely dangerous item to agents assigned the Hijack objective.") return if(item) @@ -910,7 +910,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb." reference = "SB" item = /obj/item/radio/beacon/syndicate/bomb - cost = 11 + hijack_only = TRUE + cost = 10 /datum/uplink_item/explosives/syndicate_minibomb name = "Syndicate Minibomb" @@ -960,12 +961,20 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) gamemodes = list(/datum/game_mode/nuclear) surplus = 0 -/datum/uplink_item/explosives/atmosgrenades - name = "Atmos Grenades" - desc = "A box of two (2) grenades that wreak havoc with the atmosphere of the target area. Capable of engulfing a large area in lit plasma, or N2O. Deploy with extreme caution!" - reference = "AGG" - item = /obj/item/storage/box/syndie_kit/atmosgasgrenades - cost = 11 +/datum/uplink_item/explosives/atmosn2ogrenades + name = "Knockout Gas Grenades" + desc = "A box of two (2) grenades that spread knockout gas over a large area. Equip internals before using one of these." + reference = "ANG" + item = /obj/item/storage/box/syndie_kit/atmosn2ogrenades + cost = 8 + +/datum/uplink_item/explosives/atmosfiregrenades + name = "Plasma Fire Grenades" + desc = "A box of two (2) grenades that cause large plasma fires. Can be used to deny access to a large area. Most useful if you have an atmospherics hardsuit." + reference = "APG" + item = /obj/item/storage/box/syndie_kit/atmosfiregrenades + hijack_only = TRUE + cost = 12 surplus = 0 /datum/uplink_item/explosives/emp diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 18392256fb8..510e5b90380 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -279,7 +279,7 @@ /obj/item/clothing/glasses/thermal = 1, /obj/item/chameleon = 1, /obj/item/reagent_containers/hypospray/autoinjector/stimulants = 1, - /obj/item/storage/box/syndie_kit/atmosgasgrenades = 1, + /obj/item/storage/box/syndie_kit/atmosn2ogrenades = 1, /obj/item/grenade/plastic/x4 = 1) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 247b5fb1a0d..1a6a881942d 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -72,7 +72,10 @@ var/list/world_uplinks = list() if(I.job && I.job.len) if(!(I.job.Find(job))) continue - dat += "[I.name] ([I.cost])
" + dat += "[I.name] ([I.cost])" + if(I.hijack_only) + dat += " (HIJACK ONLY)" + dat += "
" category_items++ dat += "Random Item (??)
" @@ -95,7 +98,7 @@ var/list/world_uplinks = list() if(I.job && I.job.len) if(!(I.job.Find(job))) continue - nano[nano.len]["items"] += list(list("Name" = sanitize(I.name), "Description" = sanitize(I.description()),"Cost" = I.cost, "obj_path" = I.reference)) + nano[nano.len]["items"] += list(list("Name" = sanitize(I.name), "Description" = sanitize(I.description()),"Cost" = I.cost, "hijack_only" = I.hijack_only, "obj_path" = I.reference)) reference[I.reference] = I var/datum/nano_item_lists/result = new diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index cac42bfced7..c96271d6ddd 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -262,13 +262,24 @@ new /obj/item/spellbook/oneuse/mime/greaterwall(src) new /obj/item/spellbook/oneuse/mime/fingergun(src) -/obj/item/storage/box/syndie_kit/atmosgasgrenades - name = "Atmos Grenades" -/obj/item/storage/box/syndie_kit/atmosgasgrenades/New() +/obj/item/storage/box/syndie_kit/atmosn2ogrenades + name = "Atmos N2O Grenades" + +/obj/item/storage/box/syndie_kit/atmosn2ogrenades/New() + ..() + new /obj/item/grenade/clusterbuster/n2o(src) + new /obj/item/grenade/clusterbuster/n2o(src) + + +/obj/item/storage/box/syndie_kit/atmosfiregrenades + name = "Plasma Fire Grenades" + +/obj/item/storage/box/syndie_kit/atmosfiregrenades/New() ..() new /obj/item/grenade/clusterbuster/plasma(src) - new /obj/item/grenade/clusterbuster/n2o(src) + new /obj/item/grenade/clusterbuster/plasma(src) + /obj/item/storage/box/syndie_kit/missionary_set name = "Missionary Starter Kit" diff --git a/nano/templates/uplink.tmpl b/nano/templates/uplink.tmpl index c67dbca9c61..3058bb10bbb 100644 --- a/nano/templates/uplink.tmpl +++ b/nano/templates/uplink.tmpl @@ -46,7 +46,7 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm {{for value.items :itemValue:itemIndex}}
- {{:helper.link( itemValue.Name, 'gear', {'buy_item' : itemValue.obj_path, 'cost' : itemValue.Cost}, itemValue.Cost > data.crystals ? 'disabled' : null, null)}} - {{:itemValue.Cost}} + {{:helper.link( itemValue.Name, 'gear', {'buy_item' : itemValue.obj_path, 'cost' : itemValue.Cost}, itemValue.Cost > data.crystals ? 'disabled' : null, null)}} - {{:itemValue.Cost}} {{if itemValue.hijack_only}}(HIJACK AGENTS ONLY){{/if}}
{{/for}} From 5db5b3055b5bdce2158a73b051573f2cbfff6b2c Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 19 Mar 2019 06:00:00 -0700 Subject: [PATCH 02/80] made hijack_only bomb/firegren nosurplus/nodiscount --- code/datums/uplink_item.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index e745ceaa0ba..a35dccd7b25 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -912,6 +912,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/radio/beacon/syndicate/bomb hijack_only = TRUE cost = 10 + surplus = 0 + cant_discount = TRUE /datum/uplink_item/explosives/syndicate_minibomb name = "Syndicate Minibomb" @@ -976,6 +978,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) hijack_only = TRUE cost = 12 surplus = 0 + cant_discount = TRUE /datum/uplink_item/explosives/emp name = "EMP Grenades and Implanter Kit" From b4ee075b398c8c6aaf75a8589bcd4a8dba655dd3 Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 19 Mar 2019 09:48:34 -0700 Subject: [PATCH 03/80] makes syndi bomb not hijack only again --- code/datums/uplink_item.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a35dccd7b25..787ac5e4463 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -910,7 +910,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb." reference = "SB" item = /obj/item/radio/beacon/syndicate/bomb - hijack_only = TRUE cost = 10 surplus = 0 cant_discount = TRUE From 04f780fc4eca8903658dd37071d786740ff4a12f Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 19 Mar 2019 09:50:09 -0700 Subject: [PATCH 04/80] cost --- code/datums/uplink_item.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 787ac5e4463..2f8c41dd379 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -910,7 +910,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb." reference = "SB" item = /obj/item/radio/beacon/syndicate/bomb - cost = 10 + cost = 11 surplus = 0 cant_discount = TRUE From 465166d46db5b1824d9ffb3f00427b82154685c0 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 24 Mar 2019 18:27:03 +0100 Subject: [PATCH 05/80] fixed antidrop and give --- code/modules/mob/living/carbon/give.dm | 8 ++++++++ .../mob/living/carbon/human/inventory.dm | 4 ++-- code/modules/mob/living/living.dm | 18 ++++++++++++------ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 473715367b4..60ee4d94558 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -33,10 +33,18 @@ to_chat(usr, " You need to stay in reaching distance while giving an object.") to_chat(target, " [usr.name] moved too far away.") return + if((I.flags & NODROP) || (I.flags & ABSTRACT)) + to_chat(usr, "\the [I.name] stays stuck to your hand when you try to give it!") + to_chat(target, "\the [I.name] stays stuck to [usr.name]'s hand when you try to take it!") + return if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I)) to_chat(usr, " You need to keep the item in your active hand.") to_chat(target, " [usr.name] seem to have given up on giving \the [I.name] to you.") return + if(target.resting) + to_chat(usr, " They are resting and can't accept \the [I.name].") + to_chat(target, " You can't can't accept \the [I.name] while resting.") + return if(target.r_hand != null && target.l_hand != null) to_chat(target, " Your hands are full.") to_chat(usr, " Their hands are full.") diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 7d83c7eaa1d..8d4ed90cada 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -434,11 +434,11 @@ if(slot_l_hand) if(l_hand) return 0 - return 1 + return !resting if(slot_r_hand) if(r_hand) return 0 - return 1 + return !resting if(slot_wear_mask) if(wear_mask) return 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bf933f568d4..0d077172e34 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -749,19 +749,25 @@ // Override if a certain mob should be behave differently when placing items (can't, for example) /mob/living/stripPanelEquip(obj/item/what, mob/who, where, var/silent = 0) what = get_active_hand() - if(what && (what.flags & NODROP)) - to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand!") - return if(what) + if(what.flags & NODROP) + to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand!") + return if(!what.mob_can_equip(who, where, 1)) + if(isliving(who)) + var/mob/living/L = who + if(L.resting) + to_chat(src, "[who.name] can't hold \the [what.name] while resting.") + return to_chat(src, "\The [what.name] doesn't fit in that place!") return if(!silent) visible_message("[src] tries to put [what] on [who].") if(do_mob(src, who, what.put_on_delay)) - if(what && Adjacent(who)) - unEquip(what) - who.equip_to_slot_if_possible(what, where, 0, 1) + if(what && Adjacent(who) && !(what.flags & NODROP)) + unEquip(what) + if(!who.equip_to_slot_if_possible(what, where, 0, 1)) + what.loc = who.loc add_attack_logs(src, who, "Equipped [what]") /mob/living/singularity_act() From 0a50a0e748d9c043dff7a92ae4f00dc314ec5bb0 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 24 Mar 2019 19:38:35 +0100 Subject: [PATCH 06/80] only when the target is resting --- code/modules/mob/living/living.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 0d077172e34..7dab672fd91 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -754,7 +754,7 @@ to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand!") return if(!what.mob_can_equip(who, where, 1)) - if(isliving(who)) + if((where == slot_l_hand || where == slot_r_hand) && isliving(who)) var/mob/living/L = who if(L.resting) to_chat(src, "[who.name] can't hold \the [what.name] while resting.") From a559b3b468ee50305cca7e0b0671f7ebf31b88a9 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 24 Mar 2019 21:14:07 +0100 Subject: [PATCH 07/80] Feedback fixes --- code/modules/mob/living/carbon/give.dm | 42 +++++-------------- .../mob/living/carbon/human/inventory.dm | 4 +- code/modules/mob/living/living.dm | 14 ++----- 3 files changed, 17 insertions(+), 43 deletions(-) diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 60ee4d94558..092995f22ea 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -4,22 +4,15 @@ if(!iscarbon(target)) //something is bypassing the give arguments, no clue what, adding a sanity check JIC to_chat(usr, "Wait a second... \the [target] HAS NO HANDS! AHH!")//cheesy messages ftw + return + if(target.incapacitated() || usr.incapacitated() || target.client == null) return - if(target.stat == 2 || usr.stat == 2|| target.client == null) - return - var/obj/item/I - if(!usr.hand && usr.r_hand == null) - to_chat(usr, " You don't have anything in your right hand to give to [target.name]") - return - if(usr.hand && usr.l_hand == null) - to_chat(usr, " You don't have anything in your left hand to give to [target.name]") - return - if(usr.hand) - I = usr.l_hand - else if(!usr.hand) - I = usr.r_hand + + var/obj/item/I = get_active_hand() + if(!I) + to_chat(usr, " You don't have anything in your hand to give to [target.name]") return if((I.flags & NODROP) || (I.flags & ABSTRACT)) to_chat(usr, "That's not exactly something you can give.") @@ -29,6 +22,8 @@ if("Yes") if(!I) return + if(target.incapacitated() || usr.incapacitated()) + return if(!Adjacent(target)) to_chat(usr, " You need to stay in reaching distance while giving an object.") to_chat(target, " [usr.name] moved too far away.") @@ -37,32 +32,17 @@ to_chat(usr, "\the [I.name] stays stuck to your hand when you try to give it!") to_chat(target, "\the [I.name] stays stuck to [usr.name]'s hand when you try to take it!") return - if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I)) + if(I != get_active_hand()) to_chat(usr, " You need to keep the item in your active hand.") to_chat(target, " [usr.name] seem to have given up on giving \the [I.name] to you.") return - if(target.resting) - to_chat(usr, " They are resting and can't accept \the [I.name].") - to_chat(target, " You can't can't accept \the [I.name] while resting.") - return if(target.r_hand != null && target.l_hand != null) to_chat(target, " Your hands are full.") to_chat(usr, " Their hands are full.") return - else - usr.drop_item() - if(target.r_hand == null) - target.r_hand = I - else - target.l_hand = I - I.loc = target - I.layer = 20 - I.plane = HUD_PLANE + usr.unEquip(I) + target.put_in_hands(I) I.add_fingerprint(target) - src.update_inv_l_hand() - src.update_inv_r_hand() - target.update_inv_l_hand() - target.update_inv_r_hand() target.visible_message(" [usr.name] handed \the [I.name] to [target.name].") I.on_give(usr, target) if("No") diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 8d4ed90cada..79b41e47cc3 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -434,11 +434,11 @@ if(slot_l_hand) if(l_hand) return 0 - return !resting + return !incapacitated() if(slot_r_hand) if(r_hand) return 0 - return !resting + return !incapacitated() if(slot_wear_mask) if(wear_mask) return 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 7dab672fd91..aa2ae7930ac 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -749,16 +749,11 @@ // Override if a certain mob should be behave differently when placing items (can't, for example) /mob/living/stripPanelEquip(obj/item/what, mob/who, where, var/silent = 0) what = get_active_hand() + if(what && what.flags & NODROP) + to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand!") + return if(what) - if(what.flags & NODROP) - to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand!") - return if(!what.mob_can_equip(who, where, 1)) - if((where == slot_l_hand || where == slot_r_hand) && isliving(who)) - var/mob/living/L = who - if(L.resting) - to_chat(src, "[who.name] can't hold \the [what.name] while resting.") - return to_chat(src, "\The [what.name] doesn't fit in that place!") return if(!silent) @@ -766,8 +761,7 @@ if(do_mob(src, who, what.put_on_delay)) if(what && Adjacent(who) && !(what.flags & NODROP)) unEquip(what) - if(!who.equip_to_slot_if_possible(what, where, 0, 1)) - what.loc = who.loc + who.equip_to_slot_if_possible(what, where, 0, 1) add_attack_logs(src, who, "Equipped [what]") /mob/living/singularity_act() From 2965046af7ac2d4fef36f947caa020829fdb0d9d Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 24 Mar 2019 21:15:27 +0100 Subject: [PATCH 08/80] brackets --- code/modules/mob/living/living.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index aa2ae7930ac..3b098e3cd26 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -749,7 +749,7 @@ // Override if a certain mob should be behave differently when placing items (can't, for example) /mob/living/stripPanelEquip(obj/item/what, mob/who, where, var/silent = 0) what = get_active_hand() - if(what && what.flags & NODROP) + if(what && (what.flags & NODROP)) to_chat(src, "You can't put \the [what.name] on [who], it's stuck to your hand!") return if(what) @@ -760,7 +760,7 @@ visible_message("[src] tries to put [what] on [who].") if(do_mob(src, who, what.put_on_delay)) if(what && Adjacent(who) && !(what.flags & NODROP)) - unEquip(what) + unEquip(what) who.equip_to_slot_if_possible(what, where, 0, 1) add_attack_logs(src, who, "Equipped [what]") From e7275d85eca9bd1ba66f24de874552d838a2216b Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 24 Mar 2019 21:39:39 +0100 Subject: [PATCH 09/80] fixes put_in_hands --- code/modules/mob/inventory.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index e53e3c9fd4d..471f82c1511 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -35,7 +35,7 @@ /mob/proc/put_in_l_hand(var/obj/item/W) if(!put_in_hand_check(W)) return 0 - if(!l_hand) + if(!l_hand && has_left_hand()) W.forceMove(src) //TODO: move to equipped? l_hand = W W.layer = 20 //TODO: move to equipped? @@ -51,7 +51,7 @@ /mob/proc/put_in_r_hand(var/obj/item/W) if(!put_in_hand_check(W)) return 0 - if(!r_hand) + if(!r_hand && has_right_hand()) W.forceMove(src) r_hand = W W.layer = 20 From 7a298ec9e48242128a8d822520107180e03aef5d Mon Sep 17 00:00:00 2001 From: Arkatos1 Date: Mon, 25 Mar 2019 01:35:50 +0100 Subject: [PATCH 10/80] Adds Medical Beamgun to a Syndicate Medical Cyborg --- code/modules/mob/living/silicon/robot/robot_modules.dm | 1 + code/modules/projectiles/guns/medbeam.dm | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 5cbdf9f3fa8..73f606c3fd2 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -427,6 +427,7 @@ modules += new /obj/item/bonesetter(src) modules += new /obj/item/surgicaldrill(src) modules += new /obj/item/gripper/medical(src) + modules += new /obj/item/gun/medbeam(src) modules += new /obj/item/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon modules += new /obj/item/card/emag(src) modules += new /obj/item/crowbar/cyborg(src) diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index d77621051e2..face61e79c3 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -54,8 +54,8 @@ feedback_add_details("gun_fired","[type]") /obj/item/gun/medbeam/process() - var/mob/living/carbon/human/H = loc - if(!istype(H)) + var/source = loc + if(!ishuman(source) && !isrobot(source)) LoseTarget() return @@ -68,9 +68,9 @@ last_check = world.time - if(get_dist(H,current_target)>max_range || !los_check(H,current_target)) + if(get_dist(source,current_target)>max_range || !los_check(source,current_target)) LoseTarget() - to_chat(H, "You lose control of the beam!") + to_chat(source, "You lose control of the beam!") return if(current_target) From 131450d54bc954c9e6ee928ba33f2e2363084b09 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 26 Mar 2019 05:08:00 -0400 Subject: [PATCH 11/80] Makes the Master Controller Actually Shutdown --- code/game/world.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/world.dm b/code/game/world.dm index 52f12a10c4e..d87ad886937 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -322,6 +322,7 @@ var/world_topic_spam_protect_time = world.timeofday //kick_clients_in_lobby("The round came to an end with you in the lobby.", 1) processScheduler.stop() + Master.Shutdown() //run SS shutdowns shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. for(var/client/C in GLOB.clients) From d52f4c188197d9aa56998e019c6894272e8d37f2 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Wed, 27 Mar 2019 12:11:29 +0100 Subject: [PATCH 12/80] Cloners now only clone a person once max --- code/game/machinery/computer/cloning.dm | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index c134747cd41..7b9f74edbd6 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -36,12 +36,25 @@ if(scanner.occupant && can_autoprocess()) scan_mob(scanner.occupant) - + + if(!length(records)) + return + var/list/toClone = records.Copy() + var/datum/dna2/record/lastEntry = toClone[length(toClone)] // Most recently added record + // Prevent double cloning + for(var/obj/machinery/clonepod/pod in pods) + if(pod.occupant) + for(var/datum/soullink/soulhook/hook in pod.sharedSoulhooks) //Check the soul hooks to see if the to be cloned person is in here + if(hook.soulowner.ckey == lastEntry.ckey) + toClone.Remove(lastEntry) // Fucker is getting cloned. No two bodies greedy shit + break + for(var/obj/machinery/clonepod/pod in pods) if(!(pod.occupant || pod.mess) && (pod.efficiency > 5)) - for(var/datum/dna2/record/R in src.records) + for(var/datum/dna2/record/R in toClone) if(!(pod.occupant || pod.mess)) if(pod.growclone(R)) + toClone.Remove(R) records.Remove(R) /obj/machinery/computer/cloning/proc/updatemodules() From 82096b5338621d657edfba8cd8d430b8a164b256 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Wed, 27 Mar 2019 12:23:12 +0100 Subject: [PATCH 13/80] also supports the directly put in body thing --- code/game/machinery/computer/cloning.dm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 7b9f74edbd6..8c7599a3189 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -44,10 +44,14 @@ // Prevent double cloning for(var/obj/machinery/clonepod/pod in pods) if(pod.occupant) - for(var/datum/soullink/soulhook/hook in pod.sharedSoulhooks) //Check the soul hooks to see if the to be cloned person is in here - if(hook.soulowner.ckey == lastEntry.ckey) - toClone.Remove(lastEntry) // Fucker is getting cloned. No two bodies greedy shit - break + if(pod.occupant.ckey == null) // Uses soulhooks + for(var/datum/soullink/soulhook/hook in pod.sharedSoulhooks) //Check the soul hooks to see if the to be cloned person is in here + if(hook.soulowner.ckey == lastEntry.ckey) + toClone.Remove(lastEntry) // Guy is getting cloned so remove the entry + break + else if(pod.occupant.ckey == lastEntry.ckey) // Directly put in body + toClone.Remove(lastEntry) // Guy is getting cloned so remove the entry + break for(var/obj/machinery/clonepod/pod in pods) if(!(pod.occupant || pod.mess) && (pod.efficiency > 5)) From db3e371e0b6cf1a82d3a9ab4e1bcfce5ab5393f7 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Thu, 28 Mar 2019 23:20:15 +0100 Subject: [PATCH 14/80] wrapping big objects now takes time --- code/modules/recycling/sortingmachinery.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 8cf0f52d847..ee274c927da 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -177,7 +177,9 @@ var/obj/structure/closet/crate/O = target if(O.opened) return - if(use(3)) + if(amount >= 3 && do_after_once(src, 15, target = target)) + if(O.opened || !use(3)) + return var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) P.icon_state = "deliverycrate" P.wrapped = O @@ -189,7 +191,9 @@ var/obj/structure/closet/O = target if(O.opened) return - if(use(3)) + if(amount >= 3 && do_after_once(src, 15, target = target)) + if(O.opened || !use(3)) + return var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) P.wrapped = O P.init_welded = O.welded From b8a414a5c4ab18c0823177c2995a2d5f2af9a3cf Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Thu, 28 Mar 2019 23:26:57 +0100 Subject: [PATCH 15/80] Also welding takes time now + usr --- code/game/objects/structures/crates_lockers/closets.dm | 2 ++ code/modules/recycling/sortingmachinery.dm | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 5be8c938f3e..a21ef0826e9 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -281,6 +281,8 @@ if(!WT.remove_fuel(0,user)) to_chat(user, "You need more welding fuel to complete this task.") return + if(!do_after_once(usr, 15, target = target )) + return welded = !welded update_icon() for(var/mob/M in viewers(src)) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index ee274c927da..be8785a1cae 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -177,7 +177,7 @@ var/obj/structure/closet/crate/O = target if(O.opened) return - if(amount >= 3 && do_after_once(src, 15, target = target)) + if(amount >= 3 && do_after_once(usr, 15, target = target)) if(O.opened || !use(3)) return var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) @@ -191,7 +191,7 @@ var/obj/structure/closet/O = target if(O.opened) return - if(amount >= 3 && do_after_once(src, 15, target = target)) + if(amount >= 3 && do_after_once(usr, 15, target = target)) if(O.opened || !use(3)) return var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) From 591b6b093f9055d69145d40b9834b404a7721f29 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Thu, 28 Mar 2019 23:29:36 +0100 Subject: [PATCH 16/80] spacing --- code/game/objects/structures/crates_lockers/closets.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index a21ef0826e9..58267d972a8 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -278,10 +278,10 @@ if(src == user.loc) to_chat(user, "You can not [welded?"unweld":"weld"] the locker from inside.") return - if(!WT.remove_fuel(0,user)) + if(!WT.remove_fuel(0, user)) to_chat(user, "You need more welding fuel to complete this task.") return - if(!do_after_once(usr, 15, target = target )) + if(!do_after_once(usr, 15, target = target)) return welded = !welded update_icon() From 7fabbe4a1ccd6cb948ac7919acf746a55c7f67cc Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Thu, 28 Mar 2019 22:22:51 -0400 Subject: [PATCH 17/80] New Crit Balance Tweaks--Blobs and Stands --- code/game/gamemodes/blob/blobs/blob_mobs.dm | 17 ++++++++++------- .../gamemodes/miniantags/guardian/guardian.dm | 4 ++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index a96b3e18620..16383256a09 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -65,15 +65,17 @@ /mob/living/simple_animal/hostile/blob/blobspore/Life(seconds, times_fired) if(!is_zombie && isturf(src.loc)) - for(var/mob/living/carbon/human/H in oview(src,1)) //Only for corpse right next to/on same tile - if(H.stat == DEAD) + for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile + if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD)) Zombify(H) break ..() -/mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(var/mob/living/carbon/human/H) +/mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(mob/living/carbon/human/H) + if(!H.check_death_method()) + H.death() var/obj/item/organ/external/head/head_organ = H.get_organ("head") - is_zombie = 1 + is_zombie = TRUE if(H.wear_suit) var/obj/item/clothing/suit/armor/A = H.wear_suit if(A.armor && A.armor["melee"]) @@ -87,14 +89,15 @@ icon = H.icon speak_emote = list("groans") icon_state = "zombie2_s" - head_organ.h_style = null + if(head_organ) + head_organ.h_style = null H.update_hair() human_overlays = H.overlays update_icons() - H.loc = src + H.forceMove(src) pressure_resistance = 20 //5 kPa difference required to push lowered throw_pressure_limit = 30 //15 kPa difference required to throw lowered - loc.visible_message("The corpse of [H.name] suddenly rises!") + visible_message("The corpse of [H.name] suddenly rises!") /mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) // Only execute the below if we successfuly died diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index f339be06b88..cee4d92008a 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -60,9 +60,9 @@ /mob/living/simple_animal/hostile/guardian/Life(seconds, times_fired) //Dies if the summoner dies ..() if(summoner) - if(summoner.stat == DEAD) + if(summoner.stat == DEAD || (!summoner.check_death_method() && summoner.health <= HEALTH_THRESHOLD_DEAD)) to_chat(src, "Your summoner has died!") - visible_message("The [src] dies along with its user!") + visible_message("[src] dies along with its user!") ghostize() qdel(src) snapback() From 7f8837723f9c282d2e77d1f25cd3c425382932d2 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 29 Mar 2019 09:05:30 +0100 Subject: [PATCH 18/80] target dun exist and user --- code/game/objects/structures/crates_lockers/closets.dm | 2 +- code/modules/recycling/sortingmachinery.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 58267d972a8..03b0172c959 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -281,7 +281,7 @@ if(!WT.remove_fuel(0, user)) to_chat(user, "You need more welding fuel to complete this task.") return - if(!do_after_once(usr, 15, target = target)) + if(!do_after_once(user, 15, target = src)) return welded = !welded update_icon() diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index be8785a1cae..239cb71328e 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -177,7 +177,7 @@ var/obj/structure/closet/crate/O = target if(O.opened) return - if(amount >= 3 && do_after_once(usr, 15, target = target)) + if(amount >= 3 && do_after_once(user, 15, target = target)) if(O.opened || !use(3)) return var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) @@ -191,7 +191,7 @@ var/obj/structure/closet/O = target if(O.opened) return - if(amount >= 3 && do_after_once(usr, 15, target = target)) + if(amount >= 3 && do_after_once(user, 15, target = target)) if(O.opened || !use(3)) return var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) From 5020c3a162d415d84772416a9d19e7c12eff90be Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 29 Mar 2019 09:15:48 +0100 Subject: [PATCH 19/80] Check in scan instead --- code/game/machinery/computer/cloning.dm | 29 ++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 8c7599a3189..9aa66bade29 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -39,26 +39,12 @@ if(!length(records)) return - var/list/toClone = records.Copy() - var/datum/dna2/record/lastEntry = toClone[length(toClone)] // Most recently added record - // Prevent double cloning - for(var/obj/machinery/clonepod/pod in pods) - if(pod.occupant) - if(pod.occupant.ckey == null) // Uses soulhooks - for(var/datum/soullink/soulhook/hook in pod.sharedSoulhooks) //Check the soul hooks to see if the to be cloned person is in here - if(hook.soulowner.ckey == lastEntry.ckey) - toClone.Remove(lastEntry) // Guy is getting cloned so remove the entry - break - else if(pod.occupant.ckey == lastEntry.ckey) // Directly put in body - toClone.Remove(lastEntry) // Guy is getting cloned so remove the entry - break for(var/obj/machinery/clonepod/pod in pods) if(!(pod.occupant || pod.mess) && (pod.efficiency > 5)) - for(var/datum/dna2/record/R in toClone) + for(var/datum/dna2/record/R in records) if(!(pod.occupant || pod.mess)) if(pod.growclone(R)) - toClone.Remove(R) records.Remove(R) /obj/machinery/computer/cloning/proc/updatemodules() @@ -409,6 +395,19 @@ SSnanoui.update_uis(src) return + for(var/obj/machinery/clonepod/pod in pods) + if(pod.occupant) + if(pod.occupant.ckey == null) // Uses soulhooks + for(var/datum/soullink/soulhook/hook in pod.sharedSoulhooks) //Check the soul hooks to see if the to be cloned person is in here + if(hook.soulowner.ckey == subject.ckey) + scantemp = "Subject already getting cloned." + SSnanoui.update_uis(src) + return + else if(pod.occupant.ckey == subject.ckey) // Directly put in body + scantemp = "Subject already getting cloned." + SSnanoui.update_uis(src) + return + subject.dna.check_integrity() var/datum/dna2/record/R = new /datum/dna2/record() From aca0105fe1116769cf48c2e6c830dfd269192306 Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 29 Mar 2019 04:23:43 -0700 Subject: [PATCH 20/80] Head playtime reqs now = 5h in department --- code/game/jobs/job/engineering.dm | 4 ++-- code/game/jobs/job/medical.dm | 4 ++-- code/game/jobs/job/science.dm | 4 ++-- code/game/jobs/job/security.dm | 4 ++-- code/game/jobs/job/silicon.dm | 4 ++-- code/game/jobs/job/supervisor.dm | 8 ++++---- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index e2cffabcfd0..ecae6919813 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -18,8 +18,8 @@ access_heads, access_construction, access_sec_doors, access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_minisat, access_mechanic, access_mineral_storeroom) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_ENGINEERING outfit = /datum/outfit/job/chief_engineer /datum/outfit/job/chief_engineer diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index aaf1a61a2a1..49e6b4486ac 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -16,8 +16,8 @@ access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, access_keycard_auth, access_sec_doors, access_psychiatrist, access_maint_tunnels, access_paramedic, access_mineral_storeroom) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_MEDICAL outfit = /datum/outfit/job/cmo /datum/outfit/job/cmo diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index a1711bf4fd8..435565434c8 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -18,8 +18,8 @@ access_research, access_robotics, access_xenobiology, access_ai_upload, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_maint_tunnels, access_mineral_storeroom, access_network) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_SCIENCE // All science-y guys get bonuses for maxing out their tech. required_objectives = list( /datum/job_objective/further_research diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index b425532bf30..407393eb489 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -18,8 +18,8 @@ access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_pilot, access_weapons) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_SECURITY disabilities_allowed = 0 outfit = /datum/outfit/job/hos diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index 0def40bc7b1..c239c1d3b3b 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -9,8 +9,8 @@ department_head = list("Captain") req_admin_notify = 1 minimal_player_age = 30 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_SILICON /datum/job/ai/equip(mob/living/carbon/human/H) if(!H) diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index 3cdbb9b7247..710835ca873 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -13,8 +13,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) access = list() //See get_access() minimal_access = list() //See get_access() minimal_player_age = 30 - exp_requirements = 2400 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_COMMAND disabilities_allowed = 0 outfit = /datum/outfit/job/captain @@ -68,8 +68,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) req_admin_notify = 1 is_command = 1 minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_COMMAND access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, From 2d8c62ff98138435673237bd7748c011f087bd5d Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 29 Mar 2019 08:18:10 -0700 Subject: [PATCH 21/80] Blobbernaut 2 --- code/game/gamemodes/blob/blobs/blob_mobs.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index b1ea3c199c4..ac6bbacabb0 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -45,7 +45,6 @@ var/obj/structure/blob/factory/factory = null var/list/human_overlays = list() var/is_zombie = 0 - gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE pressure_resistance = 100 //100 kPa difference required to push throw_pressure_limit = 120 //120 kPa difference required to throw @@ -174,7 +173,6 @@ force_threshold = 10 mob_size = MOB_SIZE_LARGE environment_smash = ENVIRONMENT_SMASH_RWALLS - gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE pressure_resistance = 100 //100 kPa difference required to push throw_pressure_limit = 120 //120 kPa difference required to throw From 76fdab51f1e979c9a204d14b875981971d635eab Mon Sep 17 00:00:00 2001 From: KasparoVy <12377767+KasparoVy@users.noreply.github.com> Date: Fri, 29 Mar 2019 21:37:08 -0400 Subject: [PATCH 22/80] Updates/Adds Vox-Fitted Blindfold & Taj Veil Sprites Updates Vox blindfold sprite, adds Vox-fitted Tajaran Veil sprites. --- code/modules/clothing/glasses/glasses.dm | 4 ++++ code/modules/clothing/glasses/hud.dm | 8 ++++++++ icons/mob/species/vox/eyes.dmi | Bin 10043 -> 12324 bytes icons/mob/species/vox/mask.dmi | Bin 32931 -> 32917 bytes 4 files changed, 12 insertions(+) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 35c5243de64..b527bb2717d 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -532,6 +532,10 @@ actions_types = list(/datum/action/item_action/toggle) up = 0 tint = 0 + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) /obj/item/clothing/glasses/tajblind/eng name = "industrial veil" diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index fb4f3736d6c..d778ea5e63a 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -165,6 +165,10 @@ flags_cover = GLASSESCOVERSEYES actions_types = list(/datum/action/item_action/toggle) up = 0 + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) /obj/item/clothing/glasses/hud/security/tajblind/attack_self() toggle_veil() @@ -177,6 +181,10 @@ flags_cover = GLASSESCOVERSEYES actions_types = list(/datum/action/item_action/toggle) up = 0 + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) /obj/item/clothing/glasses/hud/health/tajblind/attack_self() toggle_veil() diff --git a/icons/mob/species/vox/eyes.dmi b/icons/mob/species/vox/eyes.dmi index 99ee47ac1faf24613222f863ce8cfa6bc0e70f99..3d9a6c77bf8acd609dc8d05b4f616142bdf7c15c 100644 GIT binary patch literal 12324 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 diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi index 7022c296574cec07cf83af6d1c185da1efad9256..971978ccff4ff9cb329b0a52b56f823082564f0b 100644 GIT binary patch delta 9753 zcmaia2UJsSv+fS~iHd;v5kXossE7!NN>PMZK%|MH^b!>*5)crn0XBZ9AXSY@6QUr} zga}AcN)Ra`U3v|@L!>1kB-v+2zjOcptb5kIti?*Q%jDfN&ph+YJ4t)M^YQ`DN8BmF z@mR-}*K$CqRElO$MMB}DQ(4=@b~dyseCy2Wcp?2-Nqoru0|4v;^t8`iFT8j@eJ400 zxKFR+7c@`?9sWGe3|=F(8xCzdgy2Pt@*EOBtGGiTIMgcXs&+@Vu3l1GK*uiQQ#OC! z-LNu#=TT+S@TAtp-JO4HUKq8YzKpC7LDv}eu#B`Vp)Sq*2?q9xLb=U8Wd-K`tXy?!KpAgAjCt^I3y zOZdX8OtTzMd{KWlvF#a#Hn6(h2eIothyAB(g+RtPMwJ-dpAtmZ(XNq+Jp-Cp%eOTt zr+f;+&pLg3?aj8tVilrPe{57#q=ymx4{4A~O6~`<)r#F?!!%A8tm5%W99AQa(cO}4 zxiGkwzeQ8+Rut-WyC-YevvsPOm!>gnbtFW0r_|H>FSp+%+{CL74Grnu-}IAEbUmrD zZE_`~+_^n!D0dZu%IR6P6K;MV1}u$n&(TPpo|g^r4|NBQx3l!|X`y-^zQct?$s z^tSAzx>7+_lS|S48?b1!;Okq!PQX5^8!l(h?z^HHWOpIIqr=Jgkq>c2( zU4GIQ(^u0lH>A~144?!{+>P(CM*nt3R{K_zr{GoHrB}E2!7q0i<146T!?Omjjy43~ z@%D95d-L)1rJ0$T@QXzD`;ED{_?<-u-nScEi8w6uHS_{wT8sYKb)eX7IiWRhDzk1} zn8?ufVa{fN^&@JhzDcRQoTe`}+Ick`TwXmlnnb&jYgS0E^fYEQM|V7;s+ztiY>7$+ zv>u3zn*Vx7ple{KQ}})@EiEyA##LSqKe)H~DS2-e=ylwGWg`Bxx649*5w2RE)$Yd7=k|ZNJr?s$&VV-8JV(i0|(1^?H|I%*kJT6sn^3o=EKz9ph;ex0k)s$hWA(ji)Rqa8WTk-)A+Sl z`6V@1gNjxqB!Rj(Kv4L4S>DFhkSCV`J|N`b2L$1P_cagzE;*YN@`pTenf;mGccp}6 zS@^zlN4@=RCS`by=+oKN^|JZ(slt%3*C3Eqc#)*P5E!cBvv*VGt)7fdNyXuBz2u-G5d8AILondCPpAZ1))WogOAx+CedPA8(wq39y(=M=A$wE7|gB zds^`GzH)!Ba>iJs@*NZCnqPCGic!MDIavy3lS7An)$(A`X#69DE4dqeimxSma&xnu zvRQEOa_^HzE7F%8rtr+(tVLp5`kiXN zC&Zg-ATAI(O*8lx2lr0XX|L{b)-ni>&E$D{sDwf@y#pC{%a!r9@^(lnCyD&zjLj5c znM3BxGuBC<6tR4{?s3;@7Ga;c2sj9W7h*wmE${K@zDqd-_201!ZVLYt zyZKP~a(H++9Bq}UrUc<6RksK!4WD!JZYAGc=YT795(dOC%XRxHAu6W>dr%O`y?nVWluXZ(aCZ%0#LSSEB`7RM zS}wg(?bdXQ1?aK#8L8nLa|gT8w;CQU1)u9cQQS&~%&dxC`<}Ah$A3v7uV!CAay9FE zYH*;L6azo&5GMc$#jfpSG!!~I7`yk~`+io)7q8I}>dDFTF0UJ(uq-SHB+7+yJhW)} zu@0fKBjn98GH!l2_V&^F6OpW}txWLt8o8p#3L=BcBcXj+)F5}(s9Z+W?804*z4NDk zrP*SJFEzeWXxvIfz$?&9b!dF$V4zgy8W{Ix;@s-2g0;SEYvN0h{k!*^|uQ^E-)@w;Vvv%6eil=v+6hliIg77x^UpNZ&%T3T9M?=9rG z(Q7MdLKHV!YH(YiI~%9rT8h{8<5u{ZIw@hL?@o zCWEqIFbp|LlkGHUC@Y;TtK67?jIX2eYLhRO1baC{&`RC`r8@YroK~k>Np2+T62-hP zbJ@k)M=&fpbtmH{gGJg}87ofRW%rKb>*M3-lYRMs~}j5_pP0v2jKa z372e*ciBo{$)LOvtb`1ZQKUlx5HyV)zUO*&zja*T?iqA))ckYZ3vh zy(b)NmWImG%E~m}UrrV$#ilS?ZIxn|mg>_=O4J;i;@jKCg^JTQdwYv;=5FZ0FW$I7 zzt$Aa@~QRCcn#mX_u&Vz*Oc$+>q}@()=*P*?cD_yIT`qFA zE&CCe;6h$~;xKfd6zr_|EqKR|$6?Yxv^a#Xc6ws`9U1j6;_M2%oW%+txRiB87rScnL$;V>`2AVrF1n zC?AhGSEYLwKItw(8-8yNUvR@;w{wX?Eg_AuJKVt_l=`P(PC8? zzZ=cI70VpIG8xYSx007D-m{^(Rz=xaMJkqACRw0%y2%sfvZeP3H9gK&^?mZ5TqqPA zBExjkPkQ9L*e{}~shLKdI6TNL=?4v7-G$k8M;iEm(eQo;5^hT$K{I9PfkY(RsXkFtbe`t;;`tYyQi z9$SyL9c;{pR)o@TN`h6;UDx6A&mQ}q)y*y}G|kBlGoO@NLVGVho0!*>SVwuD+#Ii4 z1G!qnssd`$KjaF;&OjE`FCc_a?K9{|X+40Yu>c^A z;Wi-!xAh!X+^}3NgNpyY#e=JMdRq~E08mFHDEp}rj`Vw{1_2l;fpW zAL2;Nb@|61(OP_+TX@tzy-4LFjn2v68q)bN>mgDx_4QoI;q^V~f^XKhk0`vGd2sU+ zGr|hIIxnu@4&o&9D$(7xHHlV_^8f0${RwDY<+aex$2E$4E)H*>mv>?7aWyQZ z5MJQyd5(-U!PDEGK)xji9<~Ii^Ye`+Qv3iAal{f(ifcT$UlIuMiMzjD|Fex^`Wa~e z*d47h0sv2+0)jx*)mixRi1JRqQf8tl{aq*D7Qo6t`bNZ;&inuN7}sHrT?!$*9-R@= zyAQblk%xWUKBIf~C#6r?+>f9~&i+KTW%8_xlzl$w5VZXs-n9c%4=dcA8lKclL>x zhZp8}Q#mD~qi-rUHYmfdC0#WM$~Ygm-fabUy!nH@cWIP6d)?nSZ}G6QL&{Q^i4hjq z9Jzk6xW-8nj(58YPG|Do=i9FzppjLlwB;{f*9kQAH-ZmcM}1GUHI_e8%@EA^UR3n2 z@twOH-Z_f49bO-O-&bUKAXlt9f+2ZD82Cg&@-nmq^L0r69&HNx6*^hGz#CH#=C()q zb;`v6u-G8ZO^-{zn*%Evx+%5P-!r|q8{gH8#9z*eDP6nG`~#SO@Kwy@fVd7+Ewlc# z?!t6=p?d?zqov1%iza_|NeP0Dh5gJq%*L8GyrTGfSVOYK2sU`3CS@Lm9v7*yd?kA8 z;4Qq%qHJM$PLHm3O?9MFOspNq4heph-8FZU+BDHN{O}uXYMsJ;IV5?H%WmeCT4pr~`n<{XfkN3^`Fk)h&K7M76D_Cr+hoD-+IOK;TMEl{K7QeIDa5W`IX+ z5u+b3#b((k#=+SvM^V&w)5%Ih&efLIm&j>oV_Tf{|7|S0e1jJ=R6? zm(bmvN1_x?5&^B4{~fG|Dhs1{KruwB;=i-I>Y4h)wJUdR^U<)-vQve5cOk2Yc(juz zX#c`@%_171DEKnD;J6DW18XUF`w!sYOkX<2BwvQC8$w(;)H6{WYA0l7LV^69DDahV zN=I^JuVJ zcrp(#JF)+5W)CyU4EtE3^&_cL$!){{1r3n;3PvS_f+44?}BpeN}85`0OVY>3K_ z(I}>>T^+6W;feoFf-c_i1HgYnES7qtHsxBjjNsB*^2>$SLhHmutXEgL-(ot^CCTwq zDuPWe-i@D%{Rw%)r;X>q9I-Zt{^C}vciI~0a8P4g#h&xI)>9b| zo>(naU#@;jEhFXRKw7qZQ1cVimlCmY+Yt|o+qpkM5|rN#J$ng*+HZ-J&SlQb(WiCz zsXT*%K%NE>hkNmdISx7plVCeH>lIMrn9|@0wL8skAYEfO$)q#D@U6K)( zRStBTiQeP^&K45R`5l6Vg4%OO5%AON%F4<5lXuRO_h7FN6?@)-&xrZoq*?D79#b(QVM zKXTT;?uN)AsxpJB^TY$>lNP-N2_sQR(r&mJe@oN zt0%za#$%pQm~$VLBeYUq1EQ(gK)M1W8&b0U!tb2T@@x{^g2rT* zH&lFI*$pnQyZ+2VMX8aO8p6XFv9efEr6opy;pz3zbop0`EiLiv$E8bO=65JpGBH{( z4*pnt4=uWta$?1+D6B8Cg=oyVL(f&zYzZLyMq`V*{}1Kme&P25jNxmoOR*V5$f4Z3 zTP}a?aT5QDVkRc|e^|-nTIm_QZ?xy?pzL>TuiBrreb!FN|3V@$y#*)G=(!RMd8*}n zbS@`W=|7PoF$i7dWsHDVKFMy2PUrT)u*Zb|0j!06B`lvScYqI@(Ra(<}Xi zGT2y`OHrFK?Y{xDyP_pkY_J2Att@k?iZtK~$&wPYSqOWVHSXF`PmB%^U!U(0Ex0Id z&wL4!YQ3PA+d8?z5N-)tHhggFLVZ{e&%NUzWzuqm+-w25z*r6 zV)8W~4L{_Fzzp&{Ur`z%`R4K; z!KcH2LnqszoXaeQII$009=9;hIo@4+BCGE&U|dN^ICw@n!EEPEoj}3N?asbDev$u| zV!0p5RV)Dbrs$x+NZMbCsasQ0yH#GK_Ndzg>3k>)S1H3-yCIng3T zxXw%eCc^Uq7+x({jPzTzqKLK;nkDACXOhmqO@~j5Jzrc{9+o`ZH@)5UEJRYMP1%6U zr7c`8JD8LsTi2jGlZ8_bFF4c>x2FRyLDmL3LC|;tCT2a>JEphwA90cEHV@TswO$h> zBM*-e9D9!4{4_uaePAfKXr%7yZU-$kvna#wNn9iNz|BAHMmHhf%a`DBdzb1lMQ#E7 z&ClMuhv4!B0EU77Gu+zd*mL~F|7geD1rtq4fMC^Cd4jF8D0uZnzDU&r&#P;1j{Psa zm-=ZQbwhxsw>>EnaWu8J2;nhdr4`beq(&<4p020L)uzm6%Ur(wM?eL6__x7*vr(XM z?=>7ILBX~{3yt1m7w8$d#+-+Ra<07DZLI&ugYa;Re{{zYZCB{8kNH_tD7ICxHf2E9 zpUq7T{}0eQ_8sShDqJ675B8fZBw+L*xMlIu%7t=oorQiYncr=kPfOU(-!v}q8LYDm zI=eRYreYi4VlHPQgj0eV{aBGM7;r#da@<1N(aRAj-oD z?mh8={2~W(8;AUd>DWLce0SkgpzpMY@hzl)n66~CWcMlui8z#W)+X`Z! z!1Cp2_o!qIUuN^hE^hGh^Ny$|f=Sf^YJ*RQ?sph9%$2cL8Vd==TBjbLp5h+Wgm>gU z>!o}Tybc2bEiH6whAh>E|reQm^e8(slrC$mF+LWGcyeum4Yf6yk{^gMfKCARZxRS zH`k{gs0o#AEX$y|C*iG}23|jHZRu(m!L7^eO}bETin4v()BQGp`^Sv#;N#X`0)n8r z6QJZgYF=`A`*G@mb%FYF4m``4%JyIGH^7+2i|*6S11lj+WzKGHZ`Ip6t0CWa3N=R- zw1Q+S|Nk14X{r(ZwiVCQt4$|lZp}Cx=EldvLXpf`afP>zm2ur4 z-V^;(wmr61;^vu0uXx2&nbfx5qP_L^=!np2A^^S#f)$5j8~`*Jg`XIiW;d)Ig-%G* z(^PC|GX`!$(~;Smd}lbgVsgRgxH3a56bAqo%^84}x}lKB$FMTDGq}S)B|^{@?amh! zLPLGawl4EKRvtP+XPu0k5vrC@<$Qc=@7b58LPTX4^aJEc$0lE7U zk5z0kH#abJ>3ajX;U47)E$NMw6cZVjObT^$(5YOqCH~B6HUD_rlt7AY%yKfeB-1Z&7qVxH`eg%;SQAngFWj?%cx+!aj)BD~?c|(eg zSSz)EFVI`xzNK1bd$-(q#-&mGFF)-l?5@^O`iT8I!BPL-O#URoyMnWe7Ng{@uZm;4^Jr#<7FP|GDNpwT{52B;UfffI@{PyknSMV(Gu z4!WSN&2kou_IHpYxz7(S^!dbt}s= zUZB)oGV86V3#Yus;Qy_!^QCiON2xZ_eM{@zU+~Fy=$m7Myj90L)wHE6=Sw7{f>#Th z<&B5U#X-qR?&>B+HL$_Y!>9yK)(Lo3dfM7eXI7g%Yemc@y&+QRScL0Tf_qFj=L+}} z<6T!QOUzX8Zh)a6h<(fJSJSqiiQ?RxSRCaHS;Ph%I9K@09T21o=xIqCa~7O*gPH8FpD2Y zT^V8^S}S-dago%dn7!1xGP&<}5V3e`T^7xuW2{6eX%E*}N=i!nafcsQQMey34fTP&YBtAYhb{eewF8wn zV@k}>(I9%IOkO1uzf6custaPT%3z1Doo2HME~8_77{)nT6|a!ZNk%X{?OYDcsHX}s ze8(+ymtHwwBWt0a{b8~7@ZbtY&l3|lbn0%TC5tgVniOc;}c=53=e_YN|eNz9a>v??x^=fix!pfd^7jYLWMDT2G&T{;(~{c+*twvPNm=92eCbDuHSJI<__p!x~*^b~+={6F9-{ zYbI{i#WTTX-C<($nPt&slr>hvW6&TS%*6T*gHw>X?&e3}joZ$$t*mZq_hv3Oho#hD z2H!922lMM5B-f|DgPyw2u@%#e`#Ga1H0&)jr`1G`Lphq`hAF}kaL;#z(5gJnDB2L z;{9*A-`DK8%3ntxDpO4XN7V#!9Dd}J30+ij@J7QA0{!Jy5R<+%?c;duz2TFDjPm2d zTF^J{(nKrV9AB&89a)WP(5aY{53#Gy=uY6TVS24GaVCNfaxyneIdh8RJtUfnn8&^zFU54V}%ho zJF=hjy@0WvZQ8!x;;VXQXNuoKe&3aPu_fBYp66gP-x!u;C4xj^Sv9g~j4pd4T=}nG z@`8aCa%jcPCMUSIi8RLP)_mpHlo6+A$%ih2K|Xk&IviFMEMw*7FD97RqRQz(%Ssg1 zv^u*6TZ7GIo^uVFYf$Gr><~9=9Cj*kswa9_DR>Cc*%zfSzA&nNzBcu&5x0|8BiUsI z*Dh-+1aFQRqm+o?T0!q; zdwjV|zaB5myP0P0C{Y$HZEwl@n|&_Y{B43NCI&NS`+Kr@=r>x+f1RIg=pk!uPMgT( zg>!DG%Q9OZlBvUZd;P!nsoV6r)+Nvp^@E?XFj3^yWF&GK{u$0VR;hF(lSb5CC~+SY zv*nBRn#mVF1wW6zH8B7@4(G$-JY`o2R6@Eqxk#2!@^*LjW33xfRKL}~N+sRwc z2#sY``)WhaV;}KTk`$u8uN;&`B1wrpCU@qq89OS0eeW2U(~z9mu!n=|fcK29k96J~ znRDziCQBx-Y?e4Stx;0%jty9Ts@xLCqiJEz2OKN7*&3p&4W8jJ#`WUjCG)sH{Ya^t zcpfjz-oHG7r$)=wOPObiM^5DFPloqAh@GUoE8s54)STn*hF@QVaz{tY>?W)F83A2~ zqPwae@fUg%HC3lT)+5G`WBb*i_&S+B>LqB(BgVhMg)cU88!9K1lm!S>mgjvs?IHs;@Ty90l~WFWuhvtwXlHC#O3` zJW0Mp?Q-Tm5F*qtqF+}Rtmr}_Z9S2951ie5$PZ%5!&^vnE zT-)38RR_y%J-*eIrdvGV+u`6K9_{hCICbFL?0UkclRZf8*j{8PhN&VbXoE~2a?NH_ z3^$h#U4f|NEW74*torb{f2{&Pc1@3ca%xFbxrtw{ax9ycs=HW$85S-xndSN0TTvX7 zc~g4CCf~j+norL2>ir7sGKWP4>27&gr7UH>2HCH%GkD z+S(dxV6$Xd*^ag&lX^oHv4Iy_%}J?LYVX&F8A;?JOTVpnhvIdAe}h>PXvd)WRAxx3 z6Dlfxb`ZVixH8?P3KXKyM)R7%pE=rom{?o23HdfmxpwZ zj09*`L|2S|y;}0@h8%x$#39-5Hq?)1jmsm|Ah9%cbaZrXX(`gIX5OSIkVXHhfwy8Q z0XbK;UJZ|)+WwJhUqI}LJ$Yi!_%?|sX66U`$Uaf7>iCQ{_!stuSCIr4>txd359`S-)?F+;y4!hs-4J6|im13<9ppXagkNA5Xl^89en+@m@ z73(e6TRN%>t^Iq(1nwXL|1eVXC9Hcc`vNP=%Ta~cX_WHWU_9oJp#p0Tr+$`%qZK-}C;HvssnSp;Y7X$GEDss`e+ z-^y7h@Om;5l$`YQ-88O#fR+rQN4nP5)&s5aiU##AQY!3ciVp2x9#$^dXPf4lYc~v* zIY~-Pln=S8=TT0X5H>g({DSO{@DbwW=!pfuA(RGv+ZS~Z)#V7KsA z*1c}Hs>r=QSjDa{?@p1ePVs(rvgd+0wu8AX#9NWf360Zl^m}IK{@8n{Av4xS1Ywd9 z;%0Co?(Do&d|RS2F+v_Mj5|q1{X@z#?~c*S4qRh(5|{?s+O4XeY91Y-flGb)3bVE5 zWmph|{0ZL8MMIam7*H^{9c!^7Nl)dGKQhgR+;K^_mHzbZ%Wttk`O`Kfa6`9sxbEVP znKVTQfY*fG{hH2;}9`?r@u z7(bD+Cv!p5+#;`~!8>@Y?^2USX!OBasbP^-AtQC!h|qp!t76$uyC$U}G&HU>!2ie0 zY#9?X{g|0oC_g|!Yb=$XLD_2$5(B>OkQ?Sw^`#dR33N!(M{*kFTVYDA3i|b;77p#ml&GdqTTCSPJ|Ma1w6 z(NL`N=vGY~nb8`ld_fbdyFuD&!vx4MX#Ql;A`gc%Dx1Th$?C+?Lgu2cc0&{kvCB<14&Z_s*z>w;i zAsd{ZjSGWxdf^pp)F!boxm!Y*+wq)T+u!EmKv|azRk@-ouiXSE%G5U zcC~J?XA`f?UX8ic^u((o`Gu$0R#yQM^Zr50+Xv4&g5Vj5cNITqDb9?wzJNElv6i;I z@m4ky=g{^&eE**jN1-xfR}HY~1aiU3IB+b0If?9msR`XEgWlH1VMKpGv=7kKx^-as zH@!+)k@GfbvKX3oKYUAa!9ov zI)oo;neWXNr58P0y4xyr@6Ue#z-_7ti}=vV3jn&y58C7a02t&7!*RLX17CK&udkWp zOg1#sK)wd%4>)vkE-6KR%*~ZaRQ0fbRJpX12)fO*#>25SvJa;8h|oLLUM||&!(Kx! zlWO8R^Pq!+!v$4ZZ@K?OW##l+%h$c#i<2bF;`@3RdX~`J-_4rJQf?Dfk0d82hxEMu z47F(l)_5&Jqh!?roALlAhIV2FRE$O!iZS@}({JaS>eh6Rt-eWI`!2-e3@wAcX0L@N z;WsMTUY{kElkzQv%&a|4hIXzZSwr4D%(Gaw88=xs(tEf3O^A~$O4`+AMxU(J0Zb$= z+XBgj!8KcW32yd9IYCA~vvsK~P5;!K0M=JYvJmc;r5aazNt7i&*Piyzo&yUG9c&xi z2P>(ay@i2FxGt-QTq!s;Yoq;^q9~b*(7WCj!nI^JnXQG3x4s4rM2RU#O0Ww<=TL}l zG024&)h~vCR&uf~Y-}mow}y^Xd+U08dtXadQ?fy7Qc|mJ#79P=bukzWoP#pn5s}Wi zn?*%Vq=G^1O3#J9t<@Aw)}+ULj)M2{@Z92JYm=X8K}m^XqPn-MbN{DfT4fGKi&3HS zhN(8{qi}A--M2X}s!Q>~(ZR(6V!|l&q%iQIW_{qF--AQMziUx&B{q7(2Hjc2m{^-| z)KHP6gaq4}7!|kn!+?^BJBZe_NYK)Z(mboh*j$N*o#xcPH~VTatOXYHO4`F&j7?(d zQa^$yEjO7UaFAxjYfj+x0J}QbMkbFI6n__W$?@ED0kg406s4U-Ch(=Z<`MX|A z(NKj1>*D6;;mhEsb6kgo{@yz=q^SwZ65?=`haHPf?ds}643)bW(BmTdpd@ydaVgs< zd~}YN6>_!ZnM;+G++x`-yBwDWfc=!)3BM4zNgNUj8*;7Ak0~@jI>Vf3n4kYm|BXI) zf|DbnJ3exQ@->Ua3QMIASxDvr8z!pWK-n+ws?7cTc{o5ycYL{eMNZbd`1k@muj&Vu5Dhx+3| z{T2QPPI%_@<={aMwU8@kQw9&O!Zd!PSuNr&hv$E^$VF5M+4yKr-s)lhl4l%u!r;p` zJjao8zUwoMx>{?mF83z4j@YvXawNgzX6=Hhs9=DG+L_F|;$?tP2ifL9SCMI_BpHi>$ z;dcN)+>leyTzJnBLQlh7FY~w!4!u5Ma1MuI{9?gc?UO;=z{Sh;fqW_eaF&fbcHbU+ zXdDm_U|!-RoQMA)(MNI&S83u5AQtrX0G=Rj3x$IRDGGwJL4rANDW-C<25klRK0U6o zI&Et$ZRqI51-vNKxK_&8>HXe9;kh71HSOg7+IN`;HGO!^(1-;&Tf>mtIVFC+&pJ63 zr#yjtBLH(uhksv2uUQX0!h&=o9B28E7wlYqy=yg0q*fx_+OnXzOy`9S+IT_U(Hf|2 zh&dl*)B_wcUK|8~I294`T8xcVPCnJr)43sKC|7dVz)v&N;%WIK!}yu@S1U$EKS6)d zPN)&#KNI}}@_ggGoy=1~1#RK6L`hoGIeo|*zMOPqxDN`;$3x`N4Pp`dYEe6ap}MkY zS&T|rrw*30jht;DNf}rm+LO-SyM{LZ_7<8N^U6i33jd|zj9I#%diJGT|L7O?kfr1d z$aMq&4y++508YW_A+FP75BP0|4;qbrI}b0(joa`697cP_0id+{y}^y|(~qU6DFBf6 zFprA|2zt(uwNd);<)%}aP4&H`yw6gZT1SCSi#6a@Pv(dJag@!Z8&xUSmFq}QhUrGy zS!3=y+C@$+f>q_AT?;afES>y_45=XQgGqoFxN*`Eh&bitQrlmO1qi$#Hbqlx%}*Rq85F`ANh6c!A3xd@T>7tMY)rW1-^%R=AkTv)07^9-=nd?h^E24sb@ zzIZl;`>-XQKp8-TeLzCqrl_kCZDHLcc!7 zUvk(DPpjodAmGB-kA>3LJqWusD8r5yckhug&h60&u=FV&kIx%W>NEm)fQLa6yGAAY zdcFsXVqm16dTzQeM91&i^y8}Aa4>Is89U18i$&f*jZ#l$%IyR!%*9UzC;A+=kO}@I zf#L~2KdK|1broK@CcUm_BsZ#H(XvF}lge{y47b#+fD@4t4RCZ70$<} z_n~oSPxyD=bAGqIbJhJe&h^P55NLAzy3>toanA5RksQ@+ z4t2&`_(C{(H&E~3V#URaH^c?Lc`=DdPZe+~NDx95)@&&5@D+{67r#zk7h_?}x=AL* z9$LB3k|Vuc->aR6O0aH&&78T;B!+fEUOnN3&>lh9t#{Mc|94y)?j3`%I&cHsE!-pw zqzNY+s%@Em{3yHd(F>Rn4}9eU5;_jVT$qUD11_%b83TZqF9ALP*u(iMaOYQyFMPS0 zTbNB%E-uiE?3V^!UKc+Q?w8;3kSbWkmLR>AdF+D7Ai>-yY90&lU96{SZiKP-dyLP9 z@ZHS-v4r@YpWHwFyu||1TiZnegs?wR;nSv&Wn&PVkaf_%Kr|DQkr_}WOWQz0 z?vI7}JBB^=mdq*=KhqkMz<6R~m=Iq8Il$VQwfR$R3v-=0R?{fFvLmEk!s!j$pA{X+ zj?RN|OY{I`4PmC#;SD)Is_1R~dRpMGf>XG9ZAypC>4BtpBCopZwlGvjl_cmn?P8() z;96h+pJI2Cbe!KD~ z=yZU?zVFIE?-l@n1Vh|C&j+}>_xFKm(;HOk130Oxz`nkic>3{QV*EOOSZdksG2mj$ z+`>Xj_`%QNdA-COn1|uyl{4Vk(?Z1FEZNHyM0siCtdr=bm)i_$y(2C(kMd@_-tc*% zCBS2GxkTz*0w#SUaMheB(Yxf?bLSbcSEWLpE9vdMiH8`0oE06uy9gW5AkuWoUG}j{ zr~Xbii{LOj<{sNf;|!sd zUr<%DF%gBikGsyg_+{JE=&E)D0k!?v$DOEb`y&T=%DU)@yI0eqa)T$y+ANgP3sK(v z$D%U47WGuH2Vl>TG~)%g_ndo`SM@UiTnw@FYWj97DvXqJ)}?kc#m@`WU@_$<^GmLW zWhxI_#TCI;{yQ&@l`9-8_?Zt*#i0{gmrf?gyp?MoRa=M&4c!`ln~Xph6IhK(-iI8W zsUY@$<78-z9W7GJ13gREy!7zQzt9l)7p_er>pF1&Q2T0K;W;kN_7o>QgD-C!`=w<1 z7DdutX%M-Btl(ofhLoyjN$} zJO$*iu;>)QNhHN{13|a{EZPMNrjzMKR=1RMj2mHD^h^UQ=&4ip9}W~XaDkzC<4!&( zQhQS*A1^^dPYp&jeKNT58vuer4%gk@=%28xdOVHTG=?mnu`4)!fn{{d8VW3;7+qbO zMLRQbd2I6gY>L}fLqSo_%JhbeE~sflD832rX?*-4gkp`Jk+7wy$C6TpVPmo+ljr1yb3-eaTa&%TI^x%tUpLEeiaN^$e`pvdN|Kd)}{*$kj zl&x_rx0ZGl-|q^PL4gmvTPgpVDB_qn&vy;8*pBGr<(LRt0)ys10Ik9ImOXk^*`8d$SxO~`1`jxH z9bSdSM{l1Wdu#FLVpWaW#K07%pzsh^uhe(~*T?NzMt8aCpo=uE6`2VwoE}h3?S)Jg z(jf0QwjI(L8=%7p_1R~1@@a#42C{>xmj~u~Gz7N)D<=LeC6?NlsN&z!MBr+*rmArB zROjgPdfE)kS*@_Af5WD!;&-~c{~slH0h~;SUB?Nt1Z&-{U)5G^Lu^O^EH)gyWUm}9 zz)SR5Hze?xbvcPMXVT26e~tl1%F=m)yXJpY1Wu=P3f(K|;di_dPL6^)hb_5|2n*@( z|0$ppq;s&k-0GE6gm4W8LfNZNAH59gzb2v5K*^~5ZDkn`q@^8R>mU^?~5y$ zwMCF@=<$~~(12(noelkRbU+LV`YqAWkj^~H4kkFb5Gj;xOxcEgY7IZ41oo-wt_`T* z=A!C@81^q2bJiL%=yfc6#c)XK<x>Sa39H z5(!F=JHHidy6>J&l27kWpfiPU&)8*Q062f$@>d;~t}?Yx1*pA|;=f$w{5?h*fuMlQ z^$wyad8?_v$|H-M#QzRnOVNdoe`jo0NDsT!^9~p)kHqBRTjU8E>f2K|yKK8r&M3Tr zFXlb$uKUC9q*2Nd1Oo0uMT8397~)kPe%S^$TO=g3=v~o#=4Lq-`4>K42h#q~fHx7$ zwY39wgYdSeb$?p_wfuv%@&u5%wiurzE*xNuHAy55dI5g`C6NJ#WqDaqUT|8)3seaBQY2v{4$tlxd(_~<2aEo|APCf%`>J|1VawIRns~B|J-PbrN0(l)c22 zCT5ro;8$W9k`n2&3^8|Fl4{uya;Q}LBq0M8B<|f>%EeGgxaf1dPEBVwQX0!I9vw>A zJK?)3j(yQ{OoQJaq!Wc4&@4K4W^N%~jWI-E4Gq$|g6rxv*`7wo*d;8j%A#4U@T}kY zwIJpPYK0D{-LNc%3M&j`J$28SHiEV$oSSkmFr`3o6=#|h$M%i^r5TsyFMWG9j7Kjc zFTkx0p8AxP&5$}eBg%XK@Ma6EetG>>;j;8J(J+%;)Ti#>o}>c*b2;P@=Ns&z+tyfO z%M{V+y6>ewdd<+uZ7NjWS0O9(rK=%irt>=Z9k=;rSIEjjik6)3R(ovf)HvfkIQL>i zJ@5bmq1b`-uySt{)E$9j3MwTMeP;v=I3tJ)k( z-YWhm z_DE`GC2$b1XnejU{MChw1&a=Lffs1JLakxmrlSZ1IXXHZ4<$V6y`nxbpG!cZ1}Yy7 zlTfI&Ud_yI=;2LSE9Pnls#V-)>}kX<^2$VneBkQF7K;mV)mUgADPCMC+9DtyZ}~WP zf8eabsW%c5`iNJJ(S`Wq5)zENuwu7Z{&*X1oMf>tMC2CAfsMUp4zC{YL@V8P!9@Go zsrKCaIX4$dfEWaMoqhYN(TqWoJ_3QHcZP_F>`+&ulij8qzL=$aDeOUh-FzcKYYb6S zd;PpK(THIpeOXTDe${hi%`qgy6LH-?~? zpc@F7fF-cjUH(ma;D|32523}D>URW{D=dnvT4HM8o(-p=J^ZBGFyz`8+=qeL*T~3d z*qtb*7f4N!580|FL~QjFCD=|m2O;mbz2(TE^K7m!&1;lUVd3y~O8@QCjS#!4qmc;r z{8fJJ4>Zes%^I225`q?RsV`JL?KHOTNP|S|_aXwW26}A(#~kMe1u6Za)*VlJ{-y+M z7DUdXw+!nY;~y`s+@~@M(SgNlQvsQEWTPBLRq{ZL^ex*N>B1Kk9grJmwRJFwhaK8d z4nxd*FkF&%{MSpPd{!6}Sw>G9pFt%uoMeN#vza+JxSi|6-k!Ca2Xl=$QoZS6GZ46t zUt!PL01pjiF&MFjt|eY@srAwZ;nv`LF6_)EUa0U6UITwe&8JzW_)K7pqsfz+^<-ZD zXHw$+&KG(Vf~#w~%BIk>Pq#?9raIaUv8e5D%^k*|g6%afW;iz*6CT>4wOJJ!>eIM3 zjc{MR+!5Lo0M38E>z_K3l1v#SHKOG~Cujc|6AI5t0Ghd8!Ir*`q6krPOi(ZKjWiDv zQ{61;9S0bTw8brf>$!g{kK@VNle2OkmpkO*wiDQj5xng=|h~ZqrE)5WK#EUC4d2+ED!J=7>M$n%@4M zA$t?sRMxe|;u0@VLnz*OMG1*fyt^H9?C-r%j*xFdAfqX=%X3vFL|pyVq>)NKSW3;2 zDhUlG;n}?I47iV){e|T{nYql%%TL~>Y-&|&TKYbYk)V@;W-n=&Y(>qX*NWW6{Y(Bq znB%98OH7z_Uq9^!`6 zmhvzGf8`O9!>#~4X<~wO)WqSobq4LhS8vAQBjx|Bgc=Z%FrA^!cSk0SG@f1H9_xqzO| Lb?t)7cmMu>cZQ@A From f70ecb438738871aa2b78814b6e62b3fdc96aee6 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Fri, 29 Mar 2019 23:33:46 -0400 Subject: [PATCH 23/80] Adds Trick Revolver --- code/datums/uplink_item.dm | 8 ++ code/game/objects/items/toys.dm | 91 +++++++++++++------- code/modules/examine/descriptions/weapons.dm | 5 ++ 3 files changed, 71 insertions(+), 33 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 392908127d0..4a67b7626d4 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -182,6 +182,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 3 job = list("Clown") +/datum/uplink_item/jobspecific/trick_revolver + name = "Trick Revolver" + desc = "A revolver that will fire backwards and kill whoever attempts to use it. Perfect for those pesky vigilante or just a good laugh." + reference = "CTR" + item = /obj/item/toy/russian_revolver/trick_revolver + cost = 1 + job = list("Clown") + //mime /datum/uplink_item/jobspecific/caneshotgun name = "Cane Shotgun and Assassination Shells" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 7607ca52319..c719dfe6ad4 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1372,7 +1372,8 @@ obj/item/toy/cards/deck/syndicate/black force = 5 origin_tech = "combat=1" attack_verb = list("struck", "hit", "bashed") - var/bullet_position = 1 + var/bullets_left = 0 + var/max_shots = 6 /obj/item/toy/russian_revolver/suicide_act(mob/user) user.visible_message("[user] quickly loads six bullets into [src]'s cylinder and points it at [user.p_their()] head before pulling the trigger! It looks like [user.p_theyre()] trying to commit suicide.") @@ -1380,46 +1381,70 @@ obj/item/toy/cards/deck/syndicate/black return BRUTELOSS /obj/item/toy/russian_revolver/New() - spin_cylinder() ..() - + spin_cylinder() /obj/item/toy/russian_revolver/attack_self(mob/user) - if(!bullet_position) - user.visible_message("[user] loads a bullet into [src]'s cylinder.") - bullet_position = 1 - else + if(!bullets_left) + user.visible_message("[user] loads a bullet into [src]'s cylinder before spinning it.") spin_cylinder() - user.visible_message("[user] spins the cylinder on [src]!") - -/obj/item/toy/russian_revolver/attack(mob/living/carbon/human/M, mob/living/carbon/human/user) - if(M != user) //can't use this on other people - return ..() - if(!bullet_position) - to_chat(user, "[src] is empty.") - return - if(!(user.has_organ("head"))) //For sanity - to_chat(user, "Playing this game without a head would be classed as cheating.") - return - user.visible_message("[user] points [src] at [user.p_their()] head, ready to pull the trigger!") - if(do_after(user, 30, target = user)) - if(bullet_position > 1) - user.visible_message("*click*") - playsound(src, 'sound/weapons/empty.ogg', 100, 1) - bullet_position-- - return - else - bullet_position = null - playsound(src, 'sound/weapons/gunshots/gunshot_strong.ogg', 50, 1) - user.visible_message("[src] goes off!") - user.apply_damage(200, BRUTE, "head", sharp = 1, used_weapon = "Self-inflicted gunshot wound to the head.") - user.death() else - user.visible_message("[user] lowers [src] from [user.p_their()] head.") + user.visible_message("[user] spins the cylinder on [src]!") + spin_cylinder() + +/obj/item/toy/russian_revolver/attack(mob/M, mob/living/user) + return + +/obj/item/toy/russian_revolver/afterattack(atom/target, mob/user, proximity) + shoot_gun(user) /obj/item/toy/russian_revolver/proc/spin_cylinder() - bullet_position = rand(1,6) + bullets_left = rand(1, max_shots) +/obj/item/toy/russian_revolver/proc/post_shot(mob/user) + return + +/obj/item/toy/russian_revolver/proc/shoot_gun(mob/living/carbon/human/user) + if(bullets_left > 1) + bullets_left-- + user.visible_message("*click*") + playsound(src, 'sound/weapons/empty.ogg', 100, 1) + return FALSE + if(bullets_left == 1) + bullets_left = 0 + var/zone = "head" + if(!(user.has_organ(zone))) // If they somehow don't have a head. + zone = "chest" + playsound(src, 'sound/weapons/gunshots/gunshot_strong.ogg', 50, 1) + user.visible_message("[src] goes off!") + post_shot(user) + user.apply_damage(300, BRUTE, zone, sharp = TRUE, used_weapon = "Self-inflicted gunshot wound to the [zone].") + user.bleed(BLOOD_VOLUME_NORMAL) + user.death() // Just in case + return TRUE + else + to_chat(user, "[src] needs to be reloaded.") + return FALSE + +/obj/item/toy/russian_revolver/trick_revolver + name = "\improper .357 revolver" + desc = "A suspicious revolver. Uses .357 ammo." + icon_state = "revolver" + max_shots = 1 + var/fake_bullets = 0 + +/obj/item/toy/russian_revolver/trick_revolver/New() + ..() + fake_bullets = rand(2, 7) + +/obj/item/toy/russian_revolver/trick_revolver/examine(mob/user) //Sneaky sneaky + ..() + to_chat(user, "Has [fake_bullets] round\s remaining.") + to_chat(user, "[fake_bullets] of those are live rounds.") + +/obj/item/toy/russian_revolver/trick_revolver/post_shot(user) + to_chat(user, "[src] did look pretty dodgey!") + SEND_SOUND(user, 'sound/misc/sadtrombone.ogg') //HONK /* * Rubber Chainsaw */ diff --git a/code/modules/examine/descriptions/weapons.dm b/code/modules/examine/descriptions/weapons.dm index 98f60d01ac4..286391f1387 100644 --- a/code/modules/examine/descriptions/weapons.dm +++ b/code/modules/examine/descriptions/weapons.dm @@ -55,6 +55,11 @@ then click where you want to fire. After firing, you will need to pump the gun, by clicking on the gun in your hand. To reload, load more shotgun \ shells into the gun." +/obj/item/toy/russian_revolver/trick_revolver //oh no + description_info = "This is a ballistic weapon. To fire the weapon, have your gun mode set to 'fire', \ + then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropriate ammo. The description \ + will tell you what caliber you need." + //******* //*Melee* //******* From 4bde616e4dcd6d3c8b101a746683624017ff7b0a Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 29 Mar 2019 21:48:10 -0700 Subject: [PATCH 24/80] fixes bug, refactor to use consistent procs --- code/game/jobs/job_exp.dm | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index fa13fbdb4b7..311ee84aef5 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -108,18 +108,12 @@ var/global/list/role_playtime_requirements = list( return 0 if(config.use_exp_restrictions_admin_bypass && check_rights(R_ADMIN, 0, C.mob)) return 0 - var/list/play_records = params2list(C.prefs.exp) - var/isexempt = text2num(play_records[EXP_TYPE_EXEMPT]) - if(isexempt) + + var/datum/job/job = job_master.GetJob(role) + if(!job) return 0 - var/minimal_player_hrs = role_playtime_requirements[role] - if(!minimal_player_hrs) - return 0 - var/req_mins = minimal_player_hrs * 60 - var/my_exp = text2num(play_records[EXP_TYPE_CREW]) - if(!isnum(my_exp)) - return req_mins - return max(0, req_mins - my_exp) + return job.available_in_playtime(C) + /datum/job/proc/available_in_playtime(client/C) if(!C) From b13c19ce655cdcf6c4662b3bf6c4d3c2598bb715 Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 29 Mar 2019 22:32:30 -0700 Subject: [PATCH 25/80] clarify --- code/game/jobs/job_exp.dm | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index 311ee84aef5..218b0761eb3 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -100,6 +100,7 @@ var/global/list/role_playtime_requirements = list( // Procs /proc/role_available_in_playtime(client/C, role) + // "role" is a special role defined in role_playtime_requirements above. e.g: ROLE_ERT. This is *not* a job title. if(!C) return 0 if(!role) @@ -108,11 +109,18 @@ var/global/list/role_playtime_requirements = list( return 0 if(config.use_exp_restrictions_admin_bypass && check_rights(R_ADMIN, 0, C.mob)) return 0 - - var/datum/job/job = job_master.GetJob(role) - if(!job) + var/list/play_records = params2list(C.prefs.exp) + var/isexempt = text2num(play_records[EXP_TYPE_EXEMPT]) + if(isexempt) return 0 - return job.available_in_playtime(C) + var/minimal_player_hrs = role_playtime_requirements[role] + if(!minimal_player_hrs) + return 0 + var/req_mins = minimal_player_hrs * 60 + var/my_exp = text2num(play_records[EXP_TYPE_CREW]) + if(!isnum(my_exp)) + return req_mins + return max(0, req_mins - my_exp) /datum/job/proc/available_in_playtime(client/C) From 41eb7c24764e564128756717de4f86586b4ec90d Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sat, 30 Mar 2019 05:15:47 -0400 Subject: [PATCH 26/80] adminbus --- code/game/gamemodes/wizard/rightandwrong.dm | 15 ++++++++++++--- code/modules/admin/secrets.dm | 4 +++- code/modules/admin/topic.dm | 12 ++++++++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index 9150f25736a..aff40200c6b 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,12 +1,12 @@ -/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic - var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam") +/mob/proc/rightandwrong(summon_type, revolver_fight = FALSE, fake_revolver_fight = FALSE) //0 = Summon Guns, 1 = Summon Magic + var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam", "fakerevolver") var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special") var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic") to_chat(usr, "You summoned [summon_type ? "magic" : "guns"]!") - message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]!") + message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]! ([revolver_fight ? "Revolver duel!" : ""] [fake_revolver_fight ? "Suicidal revolver duel!" : ""])") for(var/mob/living/carbon/human/H in GLOB.player_list) if(H.stat == 2 || !(H.client)) @@ -17,6 +17,13 @@ var/randomizeguns = pick(gunslist) var/randomizemagic = pick(magiclist) var/randomizemagicspecial = pick(magicspeciallist) + if(revolver_fight) + randomizeguns = "revolver" + if(fake_revolver_fight) + if(prob(50)) + randomizeguns = "revolver" + else + randomizeguns = "fakerevolver" if(!summon_type) switch(randomizeguns) if("taser") @@ -88,6 +95,8 @@ new /obj/item/gun/projectile/revolver/grenadelauncher(get_turf(H)) if("medibeam") new /obj/item/gun/medbeam(get_turf(H)) + if("fakerevolver") + new /obj/item/toy/russian_revolver/trick_revolver(get_turf(H)) //lol playsound(get_turf(H), 'sound/magic/summon_guns.ogg', 50, 1) else diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index fe487ae6431..cec31ffc2ac 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -113,7 +113,9 @@ Japanese Animes Mode   Egalitarian Station Mode
Summon Guns   - Summon Magic + Summon Magic   + Summon Revolver Duel   + Summon Suicidal Revolver Duel
Roll the Dice

diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 03d2940b32d..62ef01eecec 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2843,11 +2843,19 @@ if("guns") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SG") - usr.rightandwrong(0) + usr.rightandwrong(FALSE) if("magic") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SM") - usr.rightandwrong(1) + usr.rightandwrong(TRUE) + if("revolver") + feedback_inc("admin_secrets_fun_used", 1) + feedback_add_details("admin_secrets_fun_used", "SRD") + usr.rightandwrong(FALSE, revolver_fight = TRUE) + if("fakerevolver") + feedback_inc("admin_secrets_fun_used", 1) + feedback_add_details("admin_secrets_fun_used", "SFD") + usr.rightandwrong(FALSE, fake_revolver_fight = TRUE) if("tdomereset") var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel") if(delete_mobs == "Cancel") From 64362f2d3b800533de932e0870875917b44ffb66 Mon Sep 17 00:00:00 2001 From: Ty-Omaha Date: Sat, 30 Mar 2019 10:34:03 -0400 Subject: [PATCH 27/80] start_now --- code/controllers/configuration.dm | 6 ++++++ code/modules/admin/admin.dm | 5 +++-- config/example/config.txt | 5 ++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 71a3bce0fbe..aa5f1c3df0b 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -213,6 +213,9 @@ // Automatic localhost admin disable var/disable_localhost_admin = 0 + + //Start now warning + var/start_now_confirmation = 0 /datum/configuration/New() for(var/T in subtypesof(/datum/game_mode)) @@ -636,6 +639,9 @@ if("disable_karma") config.disable_karma = 1 + + if("start_now_confirmation") + config.start_now_confirmation = 1 if("tick_limit_mc_init") config.tick_limit_mc_init = text2num(value) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index ce76dc4e282..3c073d2556f 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -671,8 +671,9 @@ var/global/nologevent = 0 alert("Unable to start the game as it is not set up.") return if(ticker.current_state == GAME_STATE_PREGAME) - if(alert(usr, "Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes") - return + if(config.start_now_confirmation) + if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes") + return ticker.current_state = GAME_STATE_SETTING_UP log_admin("[key_name(usr)] has started the game.") message_admins("[key_name_admin(usr)] has started the game.") diff --git a/config/example/config.txt b/config/example/config.txt index 40d9d870cf4..a853a09b4b1 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -399,4 +399,7 @@ DISABLE_HIGH_POP_MC_MODE_AMOUNT 60 ##DEVELOPER_EXPRESS_START ## Uncomment to disable automatic admin for localhost -#DISABLE_LOCALHOST_ADMIN \ No newline at end of file +#DISABLE_LOCALHOST_ADMIN + +## Uncomment to give a confirmation before hitting start now +#START_NOW_CONFIRMATION \ No newline at end of file From 250e8ec7b4aa1f1f70c39c33b59819b1f2edeefd Mon Sep 17 00:00:00 2001 From: Ty-Omaha Date: Sat, 30 Mar 2019 12:07:57 -0400 Subject: [PATCH 28/80] super cool powerloss sound --- code/modules/events/grid_check.dm | 4 ++++ sound/effects/powerloss.ogg | Bin 0 -> 101303 bytes 2 files changed, 4 insertions(+) create mode 100644 sound/effects/powerloss.ogg diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 8c099f22a91..45584229bb1 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -6,6 +6,10 @@ /datum/event/grid_check/start() power_failure(0) + for(var/mob/M in GLOB.player_list) + if(!M.client) + continue + SEND_SOUND(M, sound('sound/effects/powerloss.ogg')) /datum/event/grid_check/announce() event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg') diff --git a/sound/effects/powerloss.ogg b/sound/effects/powerloss.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9a0835ecdb6a7db03f47916668f4abf875417ea4 GIT binary patch literal 101303 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%0DRq4Iu{EWC%mJCg?jejBr>h;%bgu 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�e1FQdZT>Y`1FIhc>P3=`@VFP>kibc%aJ zKraT63x@>u`bhtQ>3~nhv1#-IX7yYAgKw&UvgmZIKWjX2>iwnMb>(?@^TGDdX1mY9 zs5k1$Bc~V(vq;meC{QelTf4z&|I7J4L{0bHTk5QZIp3DlFL)nyC~H->(7}O1hMqPp zgU@VIYQ&~FLX+9UeXWiv;zaS=Ofzk=%0n5?S_}fq!Q_}XCPx49n3D6i?0l$&^q9M zZAwe@$nAqwrv!jxBq%oY1;L1pwallCfoK@ApD}j1Q5sOTzATNgZ=i6v=ngY^kJb3) zN%fOisuH5NWyZLav4`GyQOWxC)~jsAM$AO{&t

%^!9`R~o5&#s&^roqQ?m3x@cz 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 literal 0 HcmV?d00001 From a5401b40f114b602260b74d5e14f0dc8a579e886 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sat, 30 Mar 2019 17:30:19 +0100 Subject: [PATCH 29/80] github suggestions --- code/game/machinery/computer/cloning.dm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 9aa66bade29..7bb4b17930e 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -37,7 +37,7 @@ if(scanner.occupant && can_autoprocess()) scan_mob(scanner.occupant) - if(!length(records)) + if(!LAZYLEN(records)) return for(var/obj/machinery/clonepod/pod in pods) @@ -403,10 +403,6 @@ scantemp = "Subject already getting cloned." SSnanoui.update_uis(src) return - else if(pod.occupant.ckey == subject.ckey) // Directly put in body - scantemp = "Subject already getting cloned." - SSnanoui.update_uis(src) - return subject.dna.check_integrity() From 451253dc5bfc695d58282175e747d8cdd0ffa77d Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sat, 30 Mar 2019 17:31:54 +0100 Subject: [PATCH 30/80] one if --- code/game/machinery/computer/cloning.dm | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 7bb4b17930e..cbc3ebe7f67 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -396,13 +396,12 @@ return for(var/obj/machinery/clonepod/pod in pods) - if(pod.occupant) - if(pod.occupant.ckey == null) // Uses soulhooks - for(var/datum/soullink/soulhook/hook in pod.sharedSoulhooks) //Check the soul hooks to see if the to be cloned person is in here - if(hook.soulowner.ckey == subject.ckey) - scantemp = "Subject already getting cloned." - SSnanoui.update_uis(src) - return + if(pod.occupant && pod.occupant.ckey == null) + for(var/datum/soullink/soulhook/hook in pod.sharedSoulhooks) //Check the soul hooks to see if the to be cloned person is in here + if(hook.soulowner.ckey == subject.ckey) + scantemp = "Subject already getting cloned." + SSnanoui.update_uis(src) + return subject.dna.check_integrity() From 066a79fa737ad96aa588510037d3c9b2f2e375f9 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sat, 30 Mar 2019 18:35:07 -0400 Subject: [PATCH 31/80] Fixes Sound --- code/game/sound.dm | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/code/game/sound.dm b/code/game/sound.dm index d76c767593f..6c4e919bf32 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -19,15 +19,19 @@ listeners = listeners & hearers(maxdistance, turf_source) for(var/P in listeners) var/mob/M = P - if(!M || !M.client || M.z != turf_source.z) + if(!M || !M.client) continue + + var/turf/T = get_turf(M) + if(!T) + continue + if(T.z != turf_source.z) + continue + var/distance = get_dist(M, turf_source) if(distance <= maxdistance) - var/turf/T = get_turf(M) - - if(T && T.z == turf_source.z) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S) + M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S) /mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S) if(!client || !can_hear()) @@ -156,4 +160,4 @@ soundin = pick('sound/effects/bone_break_1.ogg', 'sound/effects/bone_break_2.ogg', 'sound/effects/bone_break_3.ogg', 'sound/effects/bone_break_4.ogg', 'sound/effects/bone_break_5.ogg', 'sound/effects/bone_break_6.ogg') if("honkbot_e") soundin = pick('sound/items/bikehorn.ogg', 'sound/items/AirHorn2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/items/AirHorn.ogg', 'sound/items/WEEOO1.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bcreep.ogg','sound/magic/Fireball.ogg' ,'sound/effects/pray.ogg', 'sound/voice/hiss1.ogg','sound/machines/buzz-sigh.ogg', 'sound/machines/ping.ogg', 'sound/weapons/flashbang.ogg', 'sound/weapons/bladeslice.ogg') - return soundin + return soundin \ No newline at end of file From 5b443dd0ee43cb9dadfb25804aba1f0b192d1b72 Mon Sep 17 00:00:00 2001 From: Ty-Omaha Date: Sat, 30 Mar 2019 21:22:01 -0400 Subject: [PATCH 32/80] update --- code/modules/events/grid_check.dm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 45584229bb1..22931c61b76 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -1,16 +1,18 @@ /datum/event/grid_check //NOTE: Times are measured in master controller ticks! announceWhen = 5 - + var/power_loss_sound = sound('sound/effects/powerloss.ogg') + /datum/event/grid_check/setup() endWhen = rand(30,120) /datum/event/grid_check/start() power_failure(0) - for(var/mob/M in GLOB.player_list) - if(!M.client) + for(var/mob/living/M in GLOB.player_list) + var/turf/T = get_turf(M) + if(!M.client || !is_station_level(T.z)) continue - SEND_SOUND(M, sound('sound/effects/powerloss.ogg')) - + SEND_SOUND(M, power_loss_sound) + /datum/event/grid_check/announce() event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg') From cbcc4aab4516bc1c91368ecb75a1e1a66be110b5 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sun, 31 Mar 2019 03:29:27 -0400 Subject: [PATCH 33/80] Flash Powder, Sonic Powder, and Flashbang Refactor --- .../items/weapons/grenades/flashbang.dm | 96 +++++---- code/modules/reagents/chemistry/holder.dm | 5 +- .../chemistry/reagents/pyrotechnic.dm | 12 -- code/modules/reagents/chemistry/recipes.dm | 2 - .../chemistry/recipes/pyrotechnics.dm | 192 +++++++----------- .../reagents/chemistry/recipes/toxins.dm | 2 +- 6 files changed, 125 insertions(+), 184 deletions(-) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 2e7bacd4426..5ae889ceaab 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -6,6 +6,7 @@ light_power = 10 light_color = LIGHT_COLOR_WHITE var/light_time = 2 + var/range = 7 /obj/item/grenade/flashbang/prime() update_mob() @@ -15,60 +16,65 @@ set_light(7) - for(var/mob/living/M in hearers(7, flashbang_turf)) - bang(get_turf(M), M) + do_sparks(rand(5, 9), FALSE, src) + playsound(flashbang_turf, 'sound/effects/bang.ogg', 25, 1) + bang(flashbang_turf, range, src) - for(var/obj/structure/blob/B in hear(8,flashbang_turf)) //Blob damage here - var/damage = round(30/(get_dist(B,get_turf(src))+1)) + for(var/obj/structure/blob/B in hear(8, flashbang_turf)) //Blob damage here + var/damage = round(30 / (get_dist(B, get_turf(src)) + 1)) B.health -= damage B.update_icon() spawn(light_time) qdel(src) -/obj/item/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/M) - M.show_message("BANG", 2) - playsound(loc, 'sound/effects/bang.ogg', 25, 1) +/proc/bang(turf/T, atom/A, range = 7, flash = TRUE, bang = TRUE) + for(var/mob/living/M in hearers(range, T)) + if(M.stat == DEAD) + continue + M.show_message("BANG", 2) -//Checking for protections - var/ear_safety = M.check_ear_prot() - var/distance = max(1,get_dist(src,T)) + //Checking for protections + var/ear_safety = M.check_ear_prot() + var/distance = max(1, get_dist(get_turf(A), get_turf(M))) -//Flash - if(M.weakeyes) - M.visible_message("[M] screams and collapses!") - to_chat(M, "AAAAGH!") - M.Weaken(15) //hella stunned - M.Stun(15) - if(ishuman(M)) - M.emote("scream") - var/mob/living/carbon/human/H = M - var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) - if(E) - E.receive_damage(8, 1) + //Flash + if(flash) + if(M.weakeyes) + M.visible_message("[M] screams and collapses!") + to_chat(M, "AAAAGH!") + M.Weaken(15) //hella stunned + M.Stun(15) + if(ishuman(M)) + M.emote("scream") + var/mob/living/carbon/human/H = M + var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) + if(E) + E.receive_damage(8, 1) - if(M.flash_eyes(affect_silicon = 1)) - M.Stun(max(10/distance, 3)) - M.Weaken(max(10/distance, 3)) + if(M.flash_eyes(affect_silicon = TRUE)) + M.Stun(max(10 / distance, 3)) + M.Weaken(max(10 / distance, 3)) -//Bang - if(get_turf(M) == get_turf(src))//Holding on person or being exactly where lies is significantly more dangerous and voids protection - M.Stun(10) - M.Weaken(10) - if(!ear_safety) - M.Stun(max(10/distance, 3)) - M.Weaken(max(10/distance, 3)) - M.AdjustEarDamage(rand(0, 5), 15) - if(iscarbon(M)) - var/mob/living/carbon/C = M - var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) - if(istype(ears)) - if(ears.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(ears.ear_damage - 5)) - to_chat(M, "You can't hear anything!") - M.BecomeDeaf() - else - if(ears.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") + //Bang + if(bang) + if(!distance || A.loc == M || A.loc == M.loc) //Holding on person or being exactly where lies is significantly more dangerous and voids protection + M.Stun(10) + M.Weaken(10) + if(!ear_safety) + M.Stun(max(10 / distance, 3)) + M.Weaken(max(10 / distance, 3)) + M.AdjustEarDamage(rand(0, 5), 15) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears)) + if(ears.ear_damage >= 15) + to_chat(M, "Your ears start to ring badly!") + if(prob(ears.ear_damage - 5)) + to_chat(M, "You can't hear anything!") + M.BecomeDeaf() + else + if(ears.ear_damage >= 5) + to_chat(M, "Your ears start to ring!") \ No newline at end of file diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6e4379d1fc9..ae80807b90b 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -466,7 +466,7 @@ var/const/INGEST = 2 var/list/seen = viewers(4, get_turf(my_atom)) for(var/mob/M in seen) - if(!C.no_message) + if(C.mix_message) to_chat(M, "[bicon(my_atom)] [C.mix_message]") if(istype(my_atom, /obj/item/slime_extract)) @@ -478,7 +478,8 @@ var/const/INGEST = 2 ME2.name = "used slime extract" ME2.desc = "This extract has been used up." - playsound(get_turf(my_atom), C.mix_sound, 80, 1) + if(C.mix_sound) + playsound(get_turf(my_atom), C.mix_sound, 80, 1) C.on_reaction(src, created_volume) reaction_occured = 1 diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm index fb58e351a03..d91a76da7fc 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -262,12 +262,6 @@ T.create_reagents(50) T.reagents.add_reagent("sorium", 5) -/datum/reagent/sorium_vortex - name = "sorium_vortex" - id = "sorium_vortex" - reagent_state = LIQUID - color = "#FFA500" - /datum/reagent/liquid_dark_matter name = "Liquid Dark Matter" id = "liquid_dark_matter" @@ -285,12 +279,6 @@ T.create_reagents(50) T.reagents.add_reagent("liquid_dark_matter", 5) -/datum/reagent/ldm_vortex - name = "LDM Vortex" - id = "ldm_vortex" - reagent_state = LIQUID - color = "#800080" - /datum/reagent/blackpowder name = "Black Powder" id = "blackpowder" diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 288abeb5f4d..a881f191594 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -11,13 +11,11 @@ var/required_other = 0 // an integer required for the reaction to happen var/result_amount = 0 - var/secondary = 0 // set to nonzero if secondary reaction var/list/secondary_results = list() //additional reagents produced by the reaction var/min_temp = 0 //Minimum temperature required for the reaction to occur (heat to/above this). min_temp = 0 means no requirement var/max_temp = 9999 //Maximum temperature allowed for the reaction to occur (cool to/below this). var/mix_message = "The solution begins to bubble." var/mix_sound = 'sound/effects/bubbles.ogg' - var/no_message = 0 /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume) return diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 5aca554ae03..a21a7fcf1c2 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -89,55 +89,59 @@ name = "Sorium" id = "sorium" result = "sorium" - required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1) + required_reagents = list("mercury" = 1, "carbon" = 1, "nitrogen" = 1, "oxygen" = 1, "stabilizing_agent" = 1) result_amount = 4 + mix_message = "The mixture pops and crackles before settling down." -/datum/chemical_reaction/sorium/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) +/datum/chemical_reaction/sorium_explosion + name = "Sorium Explosion" + id = "sorium_explosion" + required_reagents = list("mercury" = 1, "carbon" = 1, "nitrogen" = 1, "oxygen" = 1) + result_amount = 1 + mix_message = "The mixture explodes with a big bang." + +/datum/chemical_reaction/sorium_explosion/on_reaction(datum/reagents/holder, created_volume) + var/turf/T = get_turf(holder.my_atom) + if(!T) return - var/turf/simulated/T = get_turf(holder.my_atom) goonchem_vortex(T, 0, created_volume) - holder.remove_reagent("sorium", created_volume) -/datum/chemical_reaction/sorium_vortex +/datum/chemical_reaction/sorium_explosion/sorium name = "sorium_vortex" id = "sorium_vortex" - result = "sorium_vortex" required_reagents = list("sorium" = 1) - result_amount = 1 min_temp = T0C + 200 - -/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, created_volume) - holder.remove_reagent("sorium_vortex", created_volume) + mix_sound = null + mix_message = null /datum/chemical_reaction/liquid_dark_matter name = "Liquid Dark Matter" id = "liquid_dark_matter" result = "liquid_dark_matter" + required_reagents = list("plasma" = 1, "radium" = 1, "carbon" = 1, "stabilizing_agent" = 1) + result_amount = 4 + mix_message = "The mixture begins to glow in a dark purple." + +/datum/chemical_reaction/ldm_implosion + name = "Implosion" + id = "implosion" required_reagents = list("plasma" = 1, "radium" = 1, "carbon" = 1) - result_amount = 3 + result_amount = 1 + mix_message = "The mixture implodes suddenly." -/datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) - return +/datum/chemical_reaction/ldm_implosion/on_reaction(datum/reagents/holder, created_volume) var/turf/simulated/T = get_turf(holder.my_atom) + if(!T) + return goonchem_vortex(T, 1, created_volume) - holder.remove_reagent("liquid_dark_matter", created_volume) -/datum/chemical_reaction/ldm_vortex +/datum/chemical_reaction/ldm_implosion/liquid_dark_matter name = "LDM Vortex" id = "ldm_vortex" - result = "ldm_vortex" required_reagents = list("liquid_dark_matter" = 1) - result_amount = 1 min_temp = T0C + 200 - -/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, created_volume) - holder.remove_reagent("ldm_vortex", created_volume) + mix_sound = null + mix_message = null /datum/chemical_reaction/blackpowder name = "Black Powder" @@ -154,7 +158,7 @@ required_reagents = list("blackpowder" = 1) result_amount = 1 min_temp = T0C + 200 - no_message = 1 + mix_message = null mix_sound = null /datum/chemical_reaction/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume) @@ -175,42 +179,35 @@ spawn(0) qdel(holder.my_atom) -datum/chemical_reaction/flash_powder +/datum/chemical_reaction/flash_powder name = "Flash powder" id = "flash_powder" result = "flash_powder" - required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1) - result_amount = 3 + required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1, "stabilizing_agent" = 1) + result_amount = 5 + mix_message = "The chemicals hiss and fizz briefly before falling still." -/datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - var/location = get_turf(holder.my_atom) - do_sparks(2, 1, location) - for(var/mob/living/carbon/C in viewers(5, location)) - if(C.flash_eyes()) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) - holder.remove_reagent("flash_powder", created_volume) - -/datum/chemical_reaction/flash_powder_flash - name = "Flash powder activation" - id = "flash_powder_flash" +/datum/chemical_reaction/flash + name = "Flash" + id = "flash" result = null + required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1) + mix_message = "The chemicals catch fire, burning brightly and violently!" + mix_sound = 'sound/effects/bang.ogg' + +/datum/chemical_reaction/flash/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + if(!location) + return + do_sparks(2, 1, location) + bang(location, holder.my_atom, 5, flash = TRUE, bang = FALSE) + +/datum/chemical_reaction/flash/flash_powder + name = "flash_powder_flash" + id = "flash_powder_flash" required_reagents = list("flash_powder" = 1) min_temp = T0C + 100 - -/datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - do_sparks(2, 1, location) - for(var/mob/living/carbon/C in viewers(5, location)) - if(C.flash_eyes()) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) + mix_message = null /datum/chemical_reaction/phlogiston name = "Phlogiston" @@ -250,7 +247,7 @@ datum/chemical_reaction/flash_powder name = "smoke_powder" id = "smoke_powder" result = "smoke_powder" - required_reagents = list("stabilizing_agent" = 1, "potassium" = 1, "sugar" = 1, "phosphorus" = 1) + required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1, "stabilizing_agent" = 1) result_amount = 3 mix_message = "The mixture sets into a greyish powder!" @@ -285,7 +282,6 @@ datum/chemical_reaction/flash_powder id = "smoke_powder_smoke" required_reagents = list("smoke_powder" = 1) min_temp = T0C + 100 - secondary = 1 result_amount = 1 forbidden_reagents = list("stimulants") mix_sound = null @@ -294,78 +290,30 @@ datum/chemical_reaction/flash_powder name = "sonic_powder" id = "sonic_powder" result = "sonic_powder" + required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1, "stabilizing_agent" = 1) + result_amount = 2 + mix_message = "The mixture begins to bubble slighly!" + +/datum/chemical_reaction/sonic_deafen + name = "sonic_deafen" + id = "sonic_deafen" + result = null required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1) - result_amount = 3 + mix_message = "The mixture begins to bubble furiously!" + mix_sound = 'sound/effects/bang.ogg' -/datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) - return +/datum/chemical_reaction/sonic_deafen/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) - playsound(location, 'sound/effects/bang.ogg', 25, 1) - for(var/mob/living/M in hearers(5, location)) - var/ear_safety = 0 - var/distance = max(1,get_dist(src,T)) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) - ear_safety++ - to_chat(C, "BANG") - if(!ear_safety) - M.Stun(max(10/distance, 3)) - M.Weaken(max(10/distance, 3)) - M.AdjustEarDamage(rand(0, 5), 15) - if(iscarbon(M)) - var/mob/living/carbon/C = M - var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) - if(istype(ears)) - if(ears.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(ears.ear_damage - 5)) - to_chat(M, "You can't hear anything!") - M.BecomeDeaf() - else - if(ears.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") - holder.remove_reagent("sonic_powder", created_volume) + if(!location) + return + bang(location, holder.my_atom, 5, flash = FALSE, bang = TRUE) -/datum/chemical_reaction/sonic_powder_deafen +/datum/chemical_reaction/sonic_deafen/sonic_powder name = "sonic_powder_deafen" id = "sonic_powder_deafen" - result = null required_reagents = list("sonic_powder" = 1) min_temp = T0C + 100 - -/datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - playsound(location, 'sound/effects/bang.ogg', 25, 1) - for(var/mob/living/M in hearers(5, location)) - var/ear_safety = 0 - var/distance = max(1,get_dist(src,T)) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) - ear_safety++ - to_chat(M, "BANG") - if(!ear_safety) - M.Stun(max(10/distance, 3)) - M.Weaken(max(10/distance, 3)) - M.AdjustEarDamage(rand(0, 5), 15) - if(iscarbon(M)) - var/mob/living/carbon/C = M - var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) - if(istype(ears)) - if(ears.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(ears.ear_damage - 5)) - to_chat(M, "You can't hear anything!") - M.BecomeDeaf() - else - if(ears.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") + mix_message = null /datum/chemical_reaction/cryostylane name = "cryostylane" diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index 54e3ce4fdb8..1a073eae598 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -15,7 +15,7 @@ result_amount = 1 min_temp = T0C + 400 mix_sound = null - no_message = 1 + mix_message = null /datum/chemical_reaction/cyanide name = "Cyanide" From ac78e8479e5cb93c32f62e84c5ca553d639ad81b Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sun, 31 Mar 2019 03:48:47 -0400 Subject: [PATCH 34/80] abstract camera mobs --- code/modules/reagents/chemistry/holder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index ae80807b90b..66f010b86e3 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -465,7 +465,7 @@ var/const/INGEST = 2 add_reagent(S, C.result_amount * C.secondary_results[S] * multiplier) var/list/seen = viewers(4, get_turf(my_atom)) - for(var/mob/M in seen) + for(var/mob/living/M in seen) if(C.mix_message) to_chat(M, "[bicon(my_atom)] [C.mix_message]") From 82966ddc8b37c6e443a58a42f67b74350562078c Mon Sep 17 00:00:00 2001 From: Ty-Omaha Date: Sun, 31 Mar 2019 09:01:52 -0400 Subject: [PATCH 35/80] update2 --- code/modules/events/grid_check.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 22931c61b76..d8d1f46ad9b 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -1,17 +1,17 @@ /datum/event/grid_check //NOTE: Times are measured in master controller ticks! announceWhen = 5 - var/power_loss_sound = sound('sound/effects/powerloss.ogg') /datum/event/grid_check/setup() endWhen = rand(30,120) /datum/event/grid_check/start() power_failure(0) + var/sound/S = sound('sound/effects/powerloss.ogg') for(var/mob/living/M in GLOB.player_list) var/turf/T = get_turf(M) if(!M.client || !is_station_level(T.z)) continue - SEND_SOUND(M, power_loss_sound) + SEND_SOUND(M, S) /datum/event/grid_check/announce() event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg') From 5bb8b5759eb3359db354482e0d8ff54d8461f503 Mon Sep 17 00:00:00 2001 From: Arkatos1 Date: Mon, 1 Apr 2019 02:46:48 +0200 Subject: [PATCH 36/80] Added antag sounds themes when adding antags via traitor panel, added cult theme for new cult converts and added traitor/malf theme for autotraitored crew/ai --- code/datums/mind.dm | 6 ++++++ code/game/gamemodes/autotraitor/autotraitor.dm | 2 ++ code/game/gamemodes/cult/cult.dm | 1 + 3 files changed, 9 insertions(+) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0658c81d90f..f06725bd21c 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -870,6 +870,7 @@ special_role = SPECIAL_ROLE_WIZARD //ticker.mode.learn_basic_spells(current) ticker.mode.update_wiz_icons_added(src) + SEND_SOUND(current, 'sound/ambience/antag/ragesmages.ogg') to_chat(current, "You are a Space Wizard!") current.faction = list("wizard") log_admin("[key_name(usr)] has wizarded [key_name(current)]") @@ -911,6 +912,7 @@ ticker.mode.grant_changeling_powers(current) ticker.mode.update_change_icons_added(src) special_role = SPECIAL_ROLE_CHANGELING + SEND_SOUND(current, 'sound/ambience/antag/ling_aler.ogg') to_chat(current, "Your powers have awoken. A flash of memory returns to us... we are a changeling!") log_admin("[key_name(usr)] has changelinged [key_name(current)]") message_admins("[key_name_admin(usr)] has changelinged [key_name_admin(current)]") @@ -955,6 +957,7 @@ slaved.masters += src som = slaved //we MIGT want to mindslave someone special_role = SPECIAL_ROLE_VAMPIRE + SEND_SOUND(current, 'sound/ambience/antag/vampalert.ogg') to_chat(current, "Your powers have awoken. Your lust for blood grows... You are a Vampire!") log_admin("[key_name(usr)] has vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has vampired [key_name_admin(current)]") @@ -1157,6 +1160,9 @@ if(isAI(current)) var/mob/living/silicon/ai/A = current ticker.mode.add_law_zero(A) + SEND_SOUND(current, 'sound/ambience/antag/malf.ogg') + else + SEND_SOUND(current, 'sound/ambience/antag/tatoralert.ogg') ticker.mode.update_traitor_icons_added(src) if("autoobjectives") diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index bf9fbb5a9e5..97371f6d35b 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -130,8 +130,10 @@ forge_traitor_objectives(newtraitor.mind) if(istype(newtraitor, /mob/living/silicon)) + SEND_SOUND(newtraitor, 'sound/ambience/antag/malf.ogg') add_law_zero(newtraitor) else + SEND_SOUND(newtraitor, 'sound/ambience/antag/tatoralert.ogg') equip_traitor(newtraitor) traitors += newtraitor.mind diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 865d8e603d2..9e45cab4292 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -185,6 +185,7 @@ var/global/list/all_cults = list() cult_mind.current.faction |= "cult" var/datum/action/innate/cultcomm/C = new() C.Grant(cult_mind.current) + SEND_SOUND(cult_mind.current, 'sound/ambience/antag/bloodcult.ogg') cult_mind.current.create_attack_log("Has been converted to the cult!") if(jobban_isbanned(cult_mind.current, ROLE_CULTIST) || jobban_isbanned(cult_mind.current, ROLE_SYNDICATE)) replace_jobbanned_player(cult_mind.current, ROLE_CULTIST) From 6fadf083d7d7181f3609c036282a5ce9e12d465f Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Mon, 1 Apr 2019 01:27:49 -0400 Subject: [PATCH 37/80] OHHHH SHITTTT ANTTTSSS --- .../effects/decals/Cleanable/humans.dm | 13 ++----- .../objects/effects/decals/Cleanable/misc.dm | 30 ++++----------- code/game/objects/effects/decals/cleanable.dm | 26 +------------ code/game/objects/effects/decals/misc.dm | 13 +++++++ code/game/objects/effects/effects.dm | 36 +++++++++++++++++- code/modules/food_and_drinks/drinks/drinks.dm | 1 + code/modules/food_and_drinks/food.dm | 36 +++++++++++++++++- .../reagents/chemistry/reagents/toxins.dm | 5 +++ .../reagent_containers/glass_containers.dm | 2 +- .../reagents/reagent_containers/pill.dm | 1 + icons/goonstation/effects/effects.dmi | Bin 0 -> 1417 bytes 11 files changed, 101 insertions(+), 62 deletions(-) create mode 100644 icons/goonstation/effects/effects.dmi diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 53072d7e82c..7cfd8bbec45 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -192,7 +192,7 @@ var/global/list/image/splatter_cache = list() icon = 'icons/effects/blood.dmi' icon_state = "gibbl5" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") - noclear = TRUE + no_clear = TRUE var/fleshcolor = "#FFFFFF" /obj/effect/decal/cleanable/blood/gibs/update_icon() @@ -221,18 +221,11 @@ var/global/list/image/splatter_cache = list() /obj/effect/decal/cleanable/blood/gibs/core random_icon_states = list("gibmid1", "gibmid2", "gibmid3") - -/obj/effect/decal/cleanable/blood/gibs/Initialize() - . = ..() - reagents.add_reagent("liquidgibs", 5) + scoop_reagents = list("liquidgibs" = 5) /obj/effect/decal/cleanable/blood/gibs/cleangibs //most ironic name ever... - -/obj/effect/decal/cleanable/blood/gibs/cleangibs/Initialize() //no reagent! - . = ..() - reagents.remove_reagent("liquidgibs",5) - + scoop_reagents = null /obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions) set waitfor = 0 diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index d601283a703..7b5f255fcfb 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -15,10 +15,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "ash" anchored = TRUE - -/obj/effect/decal/cleanable/ash/Initialize() - . = ..() - reagents.add_reagent("ash", 10) + scoop_reagents = list("ash" = 10) /obj/effect/decal/cleanable/dirt name = "dirt" @@ -40,11 +37,8 @@ /obj/effect/decal/cleanable/dirt/blackpowder name = "black powder" mouse_opacity = TRUE - noscoop = TRUE - -/obj/effect/decal/cleanable/dirt/blackpowder/Initialize() - . = ..() - reagents.add_reagent("blackpowder", 40) // size 2 explosion when activated + no_scoop = TRUE + scoop_reagents = list("blackpowder" = 40) // size 2 explosion when activated /obj/effect/decal/cleanable/flour name = "flour" @@ -127,22 +121,15 @@ icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") - noclear = TRUE - -/obj/effect/decal/cleanable/vomit/Initialize() - . = ..() - reagents.add_reagent("vomit", 5) + no_clear = TRUE + scoop_reagents = list("vomit" = 5) /obj/effect/decal/cleanable/vomit/green name = "green vomit" desc = "It's all gummy. Ew." icon_state = "gvomit_1" random_icon_states = list("gvomit_1", "gvomit_2", "gvomit_3", "gvomit_4") - -/obj/effect/decal/cleanable/vomit/green/Initialize() - . = ..() - reagents.remove_reagent("vomit", 5) - reagents.add_reagent("green_vomit", 5) + scoop_reagents = list("green_vomit" = 5) /obj/effect/decal/cleanable/tomato_smudge name = "tomato smudge" @@ -189,10 +176,7 @@ icon = 'icons/effects/effects.dmi' icon_state = "flour" color = "#D5820B" - -/obj/effect/decal/cleanable/fungus/Initialize() - . = ..() - reagents.add_reagent("fungus", 10) + scoop_reagents = list("fungus" = 10) /obj/effect/decal/cleanable/confetti //PARTY TIME! name = "confetti" diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 52ec24df16c..461273bccdb 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,8 +1,6 @@ /obj/effect/decal/cleanable anchored = TRUE var/list/random_icon_states = list() - var/noscoop = FALSE //if it has this, don't let it be scooped up - var/noclear = FALSE //if it has this, don't delete it when its' scooped up /obj/effect/decal/cleanable/proc/can_bloodcrawl_in() return FALSE @@ -10,7 +8,6 @@ /obj/effect/decal/cleanable/New() if(random_icon_states && length(src.random_icon_states) > 0) src.icon_state = pick(src.random_icon_states) - create_reagents(100) if(smooth) queue_smooth(src) queue_smooth_neighbors(src) @@ -19,25 +16,4 @@ /obj/effect/decal/cleanable/Destroy() if(smooth) queue_smooth_neighbors(src) - return ..() - -/obj/effect/decal/cleanable/attackby(obj/item/W as obj, mob/user as mob,) - if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks)) - if(src.reagents && W.reagents && !noscoop) - if(!src.reagents.total_volume) - to_chat(user, "There isn't enough [src] to scoop up!") - return - if(W.reagents.total_volume >= W.reagents.maximum_volume) - to_chat(user, "[W] is full!") - return - to_chat(user, "You scoop the [src] into [W]!") - reagents.trans_to(W, reagents.total_volume) - if(!reagents.total_volume && !noclear) //scooped up all of it - qdel(src) - return - -/obj/effect/decal/cleanable/ex_act() - if(reagents) - for(var/datum/reagent/R in reagents.reagent_list) - R.on_ex_act() - ..() \ No newline at end of file + return ..() \ No newline at end of file diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 52ad55c48a4..64561630d06 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -54,3 +54,16 @@ /obj/effect/decal/straw/edge icon_state = "strawscatterededge" + +/obj/effect/decal/ants + name = "space ants" + desc = "A bunch of space ants." + icon = 'icons/goonstation/effects/effects.dmi' + icon_state = "spaceants" + scoop_reagents = list("ants" = 20) + +/obj/effect/decal/ants/Initialize(mapload) + . = ..() + var/scale = (rand(2, 10) / 10) + (rand(0, 5) / 100) + transform = matrix(transform, scale, scale, MATRIX_SCALE) + setDir(pick(NORTH, SOUTH, EAST, WEST)) \ No newline at end of file diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 21b9759df62..07c7137d719 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -13,4 +13,38 @@ return /obj/effect/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) - return FALSE \ No newline at end of file + return FALSE + +/obj/effect/decal + var/no_scoop = FALSE //if it has this, don't let it be scooped up + var/no_clear = FALSE //if it has this, don't delete it when its' scooped up + var/list/scoop_reagents = null + +/obj/effect/decal/Initialize(mapload) + . = ..() + if(scoop_reagents) + create_reagents(100) + reagents.add_reagent_list(scoop_reagents) + +/obj/effect/decal/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks)) + scoop(I, user) + +/obj/effect/decal/proc/scoop(obj/item/I, mob/user) + if(reagents && I.reagents && !no_scoop) + if(!reagents.total_volume) + to_chat(user, "There isn't enough [src] to scoop up!") + return + if(I.reagents.total_volume >= I.reagents.maximum_volume) + to_chat(user, "[I] is full!") + return + to_chat(user, "You scoop [src] into [I]!") + reagents.trans_to(I, reagents.total_volume) + if(!reagents.total_volume && !no_clear) //scooped up all of it + qdel(src) + +/obj/effect/decal/ex_act() + if(reagents) + for(var/datum/reagent/R in reagents.reagent_list) + R.on_ex_act() + ..() \ No newline at end of file diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 52a4a9dcd35..785231a588d 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -11,6 +11,7 @@ possible_transfer_amounts = list(5,10,15,20,25,30,50) volume = 50 burn_state = FIRE_PROOF + antable = FALSE /obj/item/reagent_containers/food/drinks/New() ..() diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 0ecff55cba0..e931db813cf 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -13,10 +13,42 @@ var/transfer_efficiency = 1.0 var/instant_application = 0 //if we want to bypass the forcedfeed delay var/taste = TRUE//whether you can taste eating from this + var/antable = TRUE // Will ants come near it? + var/ant_location = null + var/ant_timer = null burn_state = FLAMMABLE container_type = INJECTABLE -/obj/item/reagent_containers/food/New() - ..() +/obj/item/reagent_containers/food/Initialize(mapload) + . = ..() pixel_x = rand(-5, 5) //Randomizes postion pixel_y = rand(-5, 5) + if(antable) + ant_location = get_turf(src) + ant_timer = addtimer(CALLBACK(src, .proc/check_for_ants), 3000, TIMER_STOPPABLE) + +/obj/item/reagent_containers/food/Destroy() + ant_location = null + if(ant_timer) + deltimer(ant_timer) + return ..() + +/obj/item/reagent_containers/food/proc/check_for_ants() + if(!antable) + return + var/turf/T = get_turf(src) + if(isturf(loc) && !locate(/obj/structure/table) in T) + if(ant_location == T) + if(prob(15)) + if(!locate(/obj/effect/decal/ants) in T) + new /obj/effect/decal/ants(T) + antable = FALSE + desc += " It appears to be infested with ants. Yuck!" + reagents.add_reagent("ants", 1) // Don't eat things with ants in i you weirdo. + if(ant_timer) + deltimer(ant_timer) + else + ant_location = T + if(ant_timer) + deltimer(ant_timer) + ant_timer = addtimer(CALLBACK(src, .proc/check_for_ants), 3000, TIMER_STOPPABLE) \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 510f3ca1368..031e15e81fa 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -1057,6 +1057,11 @@ update_flags |= M.adjustToxLoss(1, FALSE) return ..() | update_flags +/datum/reagent/pestkiller/reaction_obj(obj/O, volume) + if(istype(O, /obj/effect/decal/ants)) + O.visible_message("The ants die.") + qdel(O) + /datum/reagent/pestkiller/reaction_mob(mob/living/M, method=TOUCH, volume) if(iscarbon(M)) var/mob/living/carbon/C = M diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index cc866f7a2c7..4bd5d25ed3c 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -113,7 +113,7 @@ to_chat(user, "You cannot fill [target] while it is sealed.") return - else if(istype(target, /obj/effect/decal/cleanable)) //stops splashing while scooping up fluids + else if(istype(target, /obj/effect/decal)) //stops splashing while scooping up fluids return else if(reagents.total_volume) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 54a9867be60..4b66482cf1d 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -11,6 +11,7 @@ volume = 100 consume_sound = null taste = FALSE + antable = FALSE /obj/item/reagent_containers/food/pill/New() ..() diff --git a/icons/goonstation/effects/effects.dmi b/icons/goonstation/effects/effects.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8f38e42718eb8f5345e5b1ad83cfac87667adeef GIT binary patch literal 1417 zcmV;41$O$0P)L zF|VXpiHkEOv#1!Pk&82}C^0t`#5MxzOG(X1tORM(AsTWiE4cc(fE@$?*Y_r%{#OSI z000E2Nkljn3VIy0 zp@Hx-6TK`!>qsaCUuT{{D=!68e%OjjhSn6{e6acN>Ua?T0R%6A|Hef4Hj`0DN5_A~ zvr8kN2doYo&z^#Dv{pyuC;#OY%=$fA0)v-Xs9DJX#7pG37qnT93R<(EoK?~QbB1&a z4j#c;4Z7i=Z`S%S#EZOzF@XFr@70dBz!WyLmou^8^gG{71TO?hNG1h3InT+D6N5^La4M%Q|)J(AX4!Sqrl2?b|4NwcSue!*>f&j=TH(soL z#f0mxxi&`l#I(%AYR|Ua4oiOXT98d_yNr8sKK}0SLF3Uq7U7X( z;zX)s@4^Orz2L1>Il{X@xo4%%8hd3Lvx>09yCAS{h4UWrgEsP&r--4Kv%K<_5(s-1 zBEM7~=XoCFye>%oRYB)9RepkYYZSm|VYS{p-MXY1kHGKg&57_LGVHRM0K^N_z5}rB zS^TPBXJj%qxB=7`oekEk5xVt=;(M)pn-GYkG>C7_&YnHI|@gJ zS1uURl;z8PWiukVV72lHFY2Op*@9;%{2$K%@f^@Vf(!UzRGTE8u-4w4FKD4zRn*|r z%^ljK!>Ql9$&8J<-@5_+Zu7_12d|#>LuAjcfEPgDyD9mSLxQr&sH3CfB%r+-WpAbn zK35n~wsDYru23E6P=+Ms=J)i^5u)!ST7oa=-gj0~76R2asyz4fh%)>ueh>w??b~UB z-i!_lo`L4gi3Yg8kBG)T_r|!4-(zPB?A!XmMAPq~?<1 XRE4=Egyr6900000NkvXXu0mjfhGVP6 literal 0 HcmV?d00001 From 3e9e057a1a9c75673bb9e0b29cd5891e919983c4 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Mon, 1 Apr 2019 03:16:21 -0400 Subject: [PATCH 38/80] Fixes Bees --- code/modules/hydroponics/beekeeping/beebox.dm | 60 ++++++++++++------- .../mob/living/simple_animal/hostile/bees.dm | 20 +++---- 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 7acd3efc961..5d3ffc80c6c 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -8,26 +8,26 @@ /mob/proc/bee_friendly() - return 0 + return FALSE /mob/living/simple_animal/hostile/poison/bees/bee_friendly() - return 1 + return TRUE /mob/living/simple_animal/bot/bee_friendly() if(paicard) - return 0 - return 1 + return FALSE + return TRUE /mob/living/simple_animal/diona/bee_friendly() - return 1 + return TRUE /mob/living/carbon/human/bee_friendly() if(isdiona(src)) //bees pollinate plants, duh. - return 1 + return TRUE if((wear_suit && (wear_suit.flags & THICKMATERIAL)) && (head && (head.flags & THICKMATERIAL))) - return 1 - return 0 + return TRUE + return FALSE /obj/structure/beebox @@ -35,8 +35,9 @@ desc = "Dr Miles Manners is just your average Wasp themed super hero by day, but by night he becomes DR BEES!" icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "beebox" - anchored = 1 - density = 1 + anchored = TRUE + density = TRUE + max_integrity = 300 var/mob/living/simple_animal/hostile/poison/bees/queen/queen_bee = null var/list/bees = list() //bees owned by the box, not those inside it var/list/honeycombs = list() @@ -44,8 +45,8 @@ var/bee_resources = 0 -/obj/structure/beebox/New() - ..() +/obj/structure/beebox/Initialize(mapload) + . = ..() processing_objects.Add(src) @@ -66,12 +67,11 @@ var/random_reagent = FALSE -/obj/structure/beebox/premade/New() - ..() - +/obj/structure/beebox/premade/Initialize(mapload) + . = ..() var/datum/reagent/R = null if(random_reagent) - R = get_random_reagent_id() + R = GLOB.chemical_reagents_list[get_random_reagent_id()] queen_bee = new(src) queen_bee.beehome = src @@ -93,7 +93,7 @@ /obj/structure/beebox/process() - if(queen_bee && (!queen_bee.beegent || !queen_bee.beegent.can_synth)) + if(queen_bee) if(bee_resources >= BEE_RESOURCE_HONEYCOMB_COST) if(honeycombs.len < get_max_honeycomb()) bee_resources = max(bee_resources-BEE_RESOURCE_HONEYCOMB_COST, 0) @@ -152,14 +152,16 @@ if(istype(I, /obj/item/honey_frame)) var/obj/item/honey_frame/HF = I if(honey_frames.len < BEEBOX_MAX_FRAMES) + if(!user.unEquip(HF)) + return visible_message("[user] adds a frame to the apiary.") - user.unEquip(HF) HF.forceMove(src) honey_frames += HF else to_chat(user, "There's no room for anymore frames in the apiary!") + return - if(istype(I, /obj/item/wrench)) + if(iswrench(I)) if(default_unfasten_wrench(user, I, time = 20)) return @@ -169,14 +171,16 @@ return var/obj/item/queen_bee/qb = I - user.unEquip(qb) if(!qb.queen.beegent || (qb.queen.beegent && qb.queen.beegent.can_synth)) + if(!user.unEquip(qb)) + return qb.queen.forceMove(src) bees += qb.queen queen_bee = qb.queen qb.queen = null else visible_message("The [qb] refuses to settle down. Maybe it's something to do with its reagent?") + return if(queen_bee) visible_message("[user] sets [qb] down inside the apiary, making it [user.p_their()] new home.") @@ -187,7 +191,7 @@ bees -= B B.beehome = null if(B.loc == src) - B.forceMove(get_turf(src)) + B.forceMove(drop_location()) relocated++ if(relocated) to_chat(user, "This queen has a different reagent to some of the bees who live here, those bees will not return to this apiary!") @@ -196,6 +200,8 @@ to_chat(user, "The queen bee disappeared! bees disappearing has been in the news lately...") qdel(qb) + return + return ..() /obj/structure/beebox/attack_hand(mob/user) @@ -208,7 +214,7 @@ if(B.isqueen) continue if(B.loc == src) - B.forceMove(get_turf(src)) + B.forceMove(drop_location()) B.target = user bees = TRUE if(bees) @@ -254,3 +260,13 @@ QB.forceMove(get_turf(src)) visible_message("[user] removes the queen from the apiary.") queen_bee = null + +/obj/structure/beebox/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/wood(loc, 20) + for(var/mob/living/simple_animal/hostile/poison/bees/B in bees) + if(B.loc == src) + B.forceMove(drop_location()) + for(var/obj/item/honey_frame/HF in honey_frames) + honey_frames -= HF + HF.forceMove(drop_location()) + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 4516a44a935..717d7ef2512 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -263,15 +263,12 @@ var/mob/living/simple_animal/hostile/poison/bees/queen/queen /obj/item/queen_bee/attackby(obj/item/I, mob/user, params) - if(istype(I,/obj/item/reagent_containers/syringe)) + if(istype(I, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/S = I if(S.reagents.has_reagent("royal_bee_jelly")) //checked twice, because I really don't want royal bee jelly to be duped - if(S.reagents.has_reagent("royal_bee_jelly",5)) + if(S.reagents.has_reagent("royal_bee_jelly", 5)) S.reagents.remove_reagent("royal_bee_jelly", 5) - if(!queen.beegent.can_synth) - to_chat(user, "You inject [src] with the royal bee jelly. It's ineffective! Maybe it's something to do with the [src] reagent.") - return - var/obj/item/queen_bee/qb = new(get_turf(user)) + var/obj/item/queen_bee/qb = new(user.drop_location()) qb.queen = new(qb) if(queen && queen.beegent) qb.queen.assign_reagent(queen.beegent) //Bees use the global singleton instances of reagents, so we don't need to worry about one bee being deleted and her copies losing their reagents. @@ -282,16 +279,17 @@ else var/datum/reagent/R = GLOB.chemical_reagents_list[S.reagents.get_master_reagent_id()] if(R && S.reagents.has_reagent(R.id, 5)) - S.reagents.remove_reagent(R.id,5) + S.reagents.remove_reagent(R.id, 5) queen.assign_reagent(R) - user.visible_message("[user] injects [src]'s genome with [R.name], mutating it's DNA!","You inject [src]'s genome with [R.name], mutating it's DNA!") + user.visible_message("[user] injects [src]'s genome with [R.name], mutating its DNA!", "You inject [src]'s genome with [R.name], mutating its DNA!") name = queen.name else to_chat(user, "You don't have enough units of that chemical to modify the bee's DNA!") - ..() + else + return ..() -/obj/item/queen_bee/bought/New() - ..() +/obj/item/queen_bee/bought/Initialize(mapload) + . = ..() queen = new(src) /obj/item/queen_bee/Destroy() From e487b8b58e231a49c7e7f172e40a1eb311abd3b3 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Mon, 1 Apr 2019 16:22:20 -0400 Subject: [PATCH 39/80] gosh dang --- code/datums/supplypacks.dm | 2 +- code/modules/hydroponics/beekeeping/beebox.dm | 15 +- .../mob/living/simple_animal/hostile/bees.dm | 245 +++++++++--------- 3 files changed, 129 insertions(+), 133 deletions(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 328482f9892..ec43330a8eb 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1199,7 +1199,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/organic/hydroponics/beekeeping_fullkit name = "Beekeeping Starter Kit" - contains = list(/obj/structure/beebox, + contains = list(/obj/structure/beebox/unwrenched, /obj/item/honey_frame, /obj/item/honey_frame, /obj/item/honey_frame, diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 5d3ffc80c6c..371822643a1 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -32,7 +32,7 @@ /obj/structure/beebox name = "apiary" - desc = "Dr Miles Manners is just your average Wasp themed super hero by day, but by night he becomes DR BEES!" + desc = "Dr. Miles Manners is just your average wasp-themed super hero by day, but by night he becomes DR. BEES!" icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "beebox" anchored = TRUE @@ -83,7 +83,7 @@ honey_frames += HF for(var/i in 1 to get_max_bees()) - var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src) + var/mob/living/simple_animal/hostile/poison/bees/B = new(src) bees += B B.beehome = src B.assign_reagent(R) @@ -109,7 +109,7 @@ if((bee_resources >= BEE_RESOURCE_NEW_BEE_COST && prob(BEE_PROB_NEW_BEE)) || freebee) if(!freebee) bee_resources = max(bee_resources - BEE_RESOURCE_NEW_BEE_COST, 0) - var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src) + var/mob/living/simple_animal/hostile/poison/bees/B = new(get_turf(src)) B.beehome = src B.assign_reagent(queen_bee.beegent) bees += B @@ -186,7 +186,7 @@ visible_message("[user] sets [qb] down inside the apiary, making it [user.p_their()] new home.") var/relocated = 0 for(var/b in bees) - var/mob/living/simple_animal/hostile/poison/bees/worker/B = b + var/mob/living/simple_animal/hostile/poison/bees/B = b if(B.reagent_incompatible(queen_bee)) bees -= B B.beehome = null @@ -267,6 +267,9 @@ if(B.loc == src) B.forceMove(drop_location()) for(var/obj/item/honey_frame/HF in honey_frames) - honey_frames -= HF HF.forceMove(drop_location()) - qdel(src) \ No newline at end of file + honey_frames -= HF + qdel(src) + +/obj/structure/beebox/unwrenched + anchored = FALSE \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 717d7ef2512..5ebefeba405 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -11,7 +11,7 @@ /mob/living/simple_animal/hostile/poison/bees name = "bee" - desc = "buzzy buzzy bee, stingy sti- Ouch!" + desc = "Buzzy buzzy bee, stingy sti- Ouch!" icon_state = "" icon_living = "" icon = 'icons/mob/bees.dmi' @@ -33,25 +33,28 @@ environment_smash = 0 mouse_opacity = MOUSE_OPACITY_OPAQUE pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - flying = 1 - search_objects = 1 //have to find those plant trays! - density = 0 + density = FALSE mob_size = MOB_SIZE_TINY + flying = TRUE + search_objects = TRUE //have to find those plant trays! //Spaceborn beings don't get hurt by space atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 - del_on_death = 1 + del_on_death = TRUE var/datum/reagent/beegent = null //hehe, beegent var/obj/structure/beebox/beehome = null - var/isqueen = FALSE var/idle = 0 + var/isqueen = FALSE + var/bee_syndicate = FALSE var/icon_base = "bee" var/static/list/bee_icons = list() + var/static/beehometypecache = typecacheof(/obj/structure/beebox) + var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics) /mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0) - return 1 + return TRUE /mob/living/simple_animal/hostile/poison/bees/New() ..() @@ -65,6 +68,20 @@ beehome = null return ..() +/mob/living/simple_animal/hostile/poison/bees/death(gibbed) + . = ..() + if(!.) + return + if(beehome) + if(beehome.bees) + beehome.bees.Remove(src) + beehome = null + +/mob/living/simple_animal/hostile/poison/bees/examine(mob/user) + ..() + if(!bee_syndicate && !beehome) + to_chat(user, "This bee is homeless!") + /mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals() overlays.Cut() @@ -94,21 +111,45 @@ //We don't attack beekeepers/people dressed as bees//Todo: bee costume /mob/living/simple_animal/hostile/poison/bees/CanAttack(atom/the_target) . = ..() - return . + if(!.) + return FALSE + if(!bee_syndicate && isliving(the_target)) + var/mob/living/H = the_target + return !H.bee_friendly() /mob/living/simple_animal/hostile/poison/bees/Found(atom/A) if(isliving(A)) - var/mob/living/L = A - return !L.bee_friendly() - return 0 + var/mob/living/H = A + return !H.bee_friendly() + if(istype(A, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/Hydro = A + if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit) + wanted_objects |= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted + return TRUE + return FALSE /mob/living/simple_animal/hostile/poison/bees/AttackingTarget() - if(beegent && isliving(target)) - var/mob/living/L = target - if(!isnull(target.reagents)) - beegent.reaction_mob(L, INGEST) - L.reagents.add_reagent(beegent.id, rand(1,5)) - target.attack_animal(src) + //Pollinate + if(istype(target, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/Hydro = target + pollinate(Hydro) + else if(istype(target, /obj/structure/beebox)) + if(target == beehome) + var/obj/structure/beebox/BB = target + forceMove(BB) + target = null + wanted_objects -= beehometypecache //so we don't attack beeboxes when not going home + return //no don't attack the goddamm box + else + ..() + if(isliving(target)) + var/mob/living/L = target + if(L.reagents) + if(beegent) + beegent.reaction_mob(L, INGEST) + L.reagents.add_reagent(beegent.id, rand(1, 5)) + else + L.reagents.add_reagent("spidertoxin", 5) /mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R) if(istype(R)) @@ -116,81 +157,13 @@ name = "[initial(name)] ([R.name])" generate_bee_visuals() -/mob/living/simple_animal/hostile/poison/bees/handle_automated_action() - . = ..() - if(!.) - return - -/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B) - if(!B) - return 0 - if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent) - return 1 - return 0 - -//Botany Worker Bees -/mob/living/simple_animal/hostile/poison/bees/worker - //Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee) - - -/mob/living/simple_animal/hostile/poison/bees/worker/Destroy() - if(beehome) - if(beehome.bees) - beehome.bees.Remove(src) - beehome = null - return ..() - -/mob/living/simple_animal/hostile/poison/bees/worker/death(gibbed) - . = ..() - if(!.) - return - if(beehome) - if(beehome.bees) - beehome.bees.Remove(src) - beehome = null - -/mob/living/simple_animal/hostile/poison/bees/worker/examine(mob/user) - ..() - - if(!beehome) - to_chat(user, "This bee is homeless!") - -/mob/living/simple_animal/hostile/poison/bees/worker/Found(atom/A) - if(istype(A, /obj/machinery/hydroponics)) - var/obj/machinery/hydroponics/Hydro = A - if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit && !Hydro.lid_state) - wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered - return 1 - ..() - -/mob/living/simple_animal/hostile/poison/bees/worker/CanAttack(atom/the_target) - . = ..() - if(!.) - return 0 - if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case - var/mob/living/L = the_target - return !L.bee_friendly() - -/mob/living/simple_animal/hostile/poison/bees/worker/AttackingTarget() - //Pollinate - if(istype(target, /obj/machinery/hydroponics)) - var/obj/machinery/hydroponics/Hydro = target - pollinate(Hydro) - else if(target == beehome) - var/obj/structure/beebox/BB = target - forceMove(BB) - target = null - wanted_objects -= /obj/structure/beebox //so we don't attack beeboxes when not going home - else - ..() - -/mob/living/simple_animal/hostile/poison/bees/worker/proc/pollinate(obj/machinery/hydroponics/Hydro) +/mob/living/simple_animal/hostile/poison/bees/proc/pollinate(obj/machinery/hydroponics/Hydro) if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit || Hydro.lid_state) target = null return target = null //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity - wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered + wanted_objects -= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted Hydro.recent_bee_visit = TRUE spawn(BEE_TRAY_RECENT_VISIT) if(Hydro) @@ -210,58 +183,72 @@ if(beehome) beehome.bee_resources = min(beehome.bee_resources + growth, 100) -/mob/living/simple_animal/hostile/poison/bees/worker/handle_automated_action() +/mob/living/simple_animal/hostile/poison/bees/handle_automated_action() . = ..() if(!.) return - if(!isqueen) - if(loc == beehome) - idle = min(100, ++idle) - if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM)) - forceMove(get_turf(beehome)) - else - idle = max(0, --idle) - if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME)) - if(!FindTarget()) - wanted_objects += /obj/structure/beebox //so we don't attack beeboxes when not going home - target = beehome - if(!beehome) //add outselves to a beebox (of the same reagent) if we have no home - for(var/obj/structure/beebox/BB in view(vision_range, src)) - if(reagent_incompatible(BB.queen_bee) || BB.bees.len >= BB.get_max_bees()) - continue - BB.bees |= src - beehome = BB - + if(!bee_syndicate) + if(!isqueen) + if(loc == beehome) + idle = min(100, ++idle) + if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM)) + forceMove(beehome.drop_location()) + else + idle = max(0, --idle) + if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME)) + if(!FindTarget()) + wanted_objects |= beehometypecache //so we don't attack beeboxes when not going home + target = beehome + if(!beehome) //add ourselves to a beebox (of the same reagent) if we have no home + for(var/obj/structure/beebox/BB in view(vision_range, src)) + if(reagent_incompatible(BB.queen_bee) || BB.bees.len >= BB.get_max_bees()) + continue + BB.bees |= src + beehome = BB + break // End loop after the first compatible find. //Botany Queen Bee /mob/living/simple_animal/hostile/poison/bees/queen name = "queen bee" - desc = "she's the queen of bees, BZZ BZZ" + desc = "She's the queen of bees, BZZ BZZ" icon_base = "queen" isqueen = TRUE - //the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself +//the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself /mob/living/simple_animal/hostile/poison/bees/queen/Found(atom/A) - return 0 + return FALSE + +//leave pollination for the peasent bees +/mob/living/simple_animal/hostile/poison/bees/queen/AttackingTarget() + ..() + if(beegent && isliving(target)) + var/mob/living/L = target + beegent.reaction_mob(L, TOUCH) + L.reagents.add_reagent(beegent.id, rand(1, 5)) + +//PEASENT BEES +/mob/living/simple_animal/hostile/poison/bees/queen/pollinate() + return + +/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B) + if(!B) + return FALSE + if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent) + return TRUE + return FALSE -/mob/living/simple_animal/hostile/poison/bees/queen/CanAttack(atom/the_target) - . = ..() - if(!.) - return 0 - if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case - var/mob/living/L = the_target - return !L.bee_friendly() /obj/item/queen_bee name = "queen bee" - desc = "she's the queen of bees, BZZ BZZ" + desc = "She's the queen of bees, BZZ BZZ" icon_state = "queen_item" item_state = "" icon = 'icons/mob/bees.dmi' var/mob/living/simple_animal/hostile/poison/bees/queen/queen + /obj/item/queen_bee/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/S = I @@ -297,7 +284,6 @@ return ..() - //Syndicate Bees /mob/living/simple_animal/hostile/poison/bees/syndi name = "syndi-bee" @@ -307,10 +293,14 @@ maxHealth = 25 health = 25 faction = list("hostile", "syndicate") - search_objects = 0 //these bees don't care about trivial things like plants, especially when there is havoc to sow - beegent = new /datum/reagent/facid() //prepare to die + search_objects = FALSE //these bees don't care about trivial things like plants, especially when there is havoc to sow + bee_syndicate = TRUE var/list/master_and_friends = list() +/mob/living/simple_animal/hostile/poison/bees/syndi/New() + beegent = GLOB.chemical_reagents_list["facid"] //Prepare to die + ..() + /mob/living/simple_animal/hostile/poison/bees/syndi/Destroy() master_and_friends.Cut() return ..() @@ -318,24 +308,27 @@ /mob/living/simple_animal/hostile/poison/bees/syndi/assign_reagent(datum/reagent/R) return -/mob/living/simple_animal/hostile/poison/bees/syndi/Found(atom/A) - return CanAttack(A) +/mob/living/simple_animal/hostile/poison/bees/syndi/pollinate() // No Pollination + return + +/mob/living/simple_animal/hostile/poison/bees/syndi/Found(atom/A) //Typical usual hostile mob targeting list + return /mob/living/simple_animal/hostile/poison/bees/syndi/CanAttack(atom/the_target) . = ..() if(!.) - return 0 + return FALSE if(isliving(the_target)) var/mob/living/L = the_target if(ishuman(L)) var/mob/living/carbon/human/H = L if(H in master_and_friends) - return 0 - return 1 + return FALSE + return TRUE /mob/living/simple_animal/hostile/poison/bees/syndi/AttackingTarget() ..() if(target && isliving(target)) var/mob/living/L = target if(L.stat) - LoseTarget() + LoseTarget() \ No newline at end of file From a2842652e04b5a7b2e84e8ca2b39295b6533cec9 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Mon, 1 Apr 2019 17:11:56 -0400 Subject: [PATCH 40/80] typecache for wants objects --- code/modules/mob/living/simple_animal/hostile/hostile.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index ccbd37f2f4c..50568fb37d0 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -53,6 +53,7 @@ if(!targets_from) targets_from = src environment_target_typecache = typecacheof(environment_target_typecache) + wanted_objects = typecacheof(wanted_objects) /mob/living/simple_animal/hostile/Destroy() targets_from = null @@ -205,7 +206,7 @@ return 0 return 1 if(isobj(the_target)) - if(is_type_in_list(the_target, wanted_objects)) + if(is_type_in_typecache(the_target, wanted_objects)) return 1 return 0 From 2922578c6bc30386c24d17d3b3efc4c839a9ce7d Mon Sep 17 00:00:00 2001 From: farie82 Date: Mon, 1 Apr 2019 23:31:46 +0200 Subject: [PATCH 41/80] no more \the --- code/modules/mob/living/carbon/give.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 092995f22ea..c0dba9b77e5 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -29,12 +29,12 @@ to_chat(target, " [usr.name] moved too far away.") return if((I.flags & NODROP) || (I.flags & ABSTRACT)) - to_chat(usr, "\the [I.name] stays stuck to your hand when you try to give it!") - to_chat(target, "\the [I.name] stays stuck to [usr.name]'s hand when you try to take it!") + to_chat(usr, "[I] stays stuck to your hand when you try to give it!") + to_chat(target, "[I] stays stuck to [usr.name]'s hand when you try to take it!") return if(I != get_active_hand()) to_chat(usr, " You need to keep the item in your active hand.") - to_chat(target, " [usr.name] seem to have given up on giving \the [I.name] to you.") + to_chat(target, " [usr.name] seem to have given up on giving [I] to you.") return if(target.r_hand != null && target.l_hand != null) to_chat(target, " Your hands are full.") @@ -43,9 +43,9 @@ usr.unEquip(I) target.put_in_hands(I) I.add_fingerprint(target) - target.visible_message(" [usr.name] handed \the [I.name] to [target.name].") + target.visible_message(" [usr.name] handed [I] to [target.name].") I.on_give(usr, target) if("No") - target.visible_message(" [usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.") + target.visible_message(" [usr.name] tried to hand [I] to [target.name] but [target.name] didn't want it.") else to_chat(usr, " [target.name]'s hands are full.") From 444d49af3d70239cd8c6c7280e9ec2b8ade2a2d2 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Mon, 1 Apr 2019 17:51:41 -0400 Subject: [PATCH 42/80] comment --- code/game/sound.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/sound.dm b/code/game/sound.dm index 6c4e919bf32..3846e2edeaa 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -22,7 +22,7 @@ if(!M || !M.client) continue - var/turf/T = get_turf(M) + var/turf/T = get_turf(M) // These checks need to be changed if z-levels are ever further refactored if(!T) continue if(T.z != turf_source.z) From 8985b3d8391c55cbdaac863942e720b4a9fcae9c Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 1 Apr 2019 19:50:50 -0400 Subject: [PATCH 43/80] Automatic changelog generation for PR #11117 [ci skip] --- html/changelogs/AutoChangeLog-pr-11117.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11117.yml diff --git a/html/changelogs/AutoChangeLog-pr-11117.yml b/html/changelogs/AutoChangeLog-pr-11117.yml new file mode 100644 index 00000000000..e609d052b4f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11117.yml @@ -0,0 +1,6 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "Antidrop give edge case fixed" + - bugfix: "Can't give items to resting people now" + - bugfix: "put_in_hands now checks if you actually have hands" From 462279663df87852a4b1307147403a3773ccbbf3 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 00:02:11 +0000 Subject: [PATCH 44/80] Automatic changelog compile, [ci skip] --- html/changelog.html | 12 ++++++++++++ html/changelogs/.all_changelog.yml | 7 +++++++ html/changelogs/AutoChangeLog-pr-11117.yml | 6 ------ html/changelogs/AutoChangeLog-pr-11165.yml | 4 ---- 4 files changed, 19 insertions(+), 10 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-11117.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11165.yml diff --git a/html/changelog.html b/html/changelog.html index 37c457468ef..713693563b9 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,18 @@ -->

+

02 April 2019

+

Markolie updated:

+
    +
  • Fixed some issues the compiler doesn't spot and some start up issues.
  • +
+

farie82 updated:

+
    +
  • Antidrop give edge case fixed
  • +
  • Can't give items to resting people now
  • +
  • put_in_hands now checks if you actually have hands
  • +
+

01 April 2019

Arkatos updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index fbd9f77ca57..364bbddf602 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9610,3 +9610,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Bluespace golems no longer can crash the server - tweak: Spontaneous combustion now has a minimum stacksize of 1. No more getting wet from the fire virus +2019-04-02: + Markolie: + - bugfix: Fixed some issues the compiler doesn't spot and some start up issues. + farie82: + - bugfix: Antidrop give edge case fixed + - bugfix: Can't give items to resting people now + - bugfix: put_in_hands now checks if you actually have hands diff --git a/html/changelogs/AutoChangeLog-pr-11117.yml b/html/changelogs/AutoChangeLog-pr-11117.yml deleted file mode 100644 index e609d052b4f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11117.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Antidrop give edge case fixed" - - bugfix: "Can't give items to resting people now" - - bugfix: "put_in_hands now checks if you actually have hands" diff --git a/html/changelogs/AutoChangeLog-pr-11165.yml b/html/changelogs/AutoChangeLog-pr-11165.yml deleted file mode 100644 index 8926714b10b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11165.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Fixed some issues the compiler doesn't spot and some start up issues." From a7633d01dd6ba703f3ee9f1c6bd89786c53bc366 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 1 Apr 2019 20:12:07 -0400 Subject: [PATCH 45/80] Automatic changelog generation for PR #11136 [ci skip] --- html/changelogs/AutoChangeLog-pr-11136.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11136.yml diff --git a/html/changelogs/AutoChangeLog-pr-11136.yml b/html/changelogs/AutoChangeLog-pr-11136.yml new file mode 100644 index 00000000000..d332c222e52 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11136.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes the Master Controller not actually shutting down on round end" From 6c4f07143a5aa0a1d458adafd401618a7174ef2e Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 1 Apr 2019 20:12:27 -0400 Subject: [PATCH 46/80] Automatic changelog generation for PR #11186 [ci skip] --- html/changelogs/AutoChangeLog-pr-11186.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11186.yml diff --git a/html/changelogs/AutoChangeLog-pr-11186.yml b/html/changelogs/AutoChangeLog-pr-11186.yml new file mode 100644 index 00000000000..52be3d8ebc6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11186.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes some mobs not being able to hear sounds" From 7d19a9ba1411ea6469d1ec93ecabdf95a30a02ea Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 01:09:11 +0000 Subject: [PATCH 47/80] Automatic changelog compile, [ci skip] --- html/changelog.html | 5 +++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-11136.yml | 4 ---- html/changelogs/AutoChangeLog-pr-11186.yml | 4 ---- 4 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-11136.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11186.yml diff --git a/html/changelog.html b/html/changelog.html index 713693563b9..4837e7fa3f8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,6 +57,11 @@

    02 April 2019

    +

    Fox McCloud updated:

    +
      +
    • Fixes some mobs not being able to hear sounds
    • +
    • Fixes the Master Controller not actually shutting down on round end
    • +

    Markolie updated:

    • Fixed some issues the compiler doesn't spot and some start up issues.
    • diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 364bbddf602..c5c9ad3aac2 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9611,6 +9611,9 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Spontaneous combustion now has a minimum stacksize of 1. No more getting wet from the fire virus 2019-04-02: + Fox McCloud: + - bugfix: Fixes some mobs not being able to hear sounds + - bugfix: Fixes the Master Controller not actually shutting down on round end Markolie: - bugfix: Fixed some issues the compiler doesn't spot and some start up issues. farie82: diff --git a/html/changelogs/AutoChangeLog-pr-11136.yml b/html/changelogs/AutoChangeLog-pr-11136.yml deleted file mode 100644 index d332c222e52..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11136.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes the Master Controller not actually shutting down on round end" diff --git a/html/changelogs/AutoChangeLog-pr-11186.yml b/html/changelogs/AutoChangeLog-pr-11186.yml deleted file mode 100644 index 52be3d8ebc6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11186.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes some mobs not being able to hear sounds" From d5d0863428594c5dbab77b5313ec81d34ca86d07 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 06:26:06 -0400 Subject: [PATCH 48/80] Automatic changelog generation for PR #11197 [ci skip] --- html/changelogs/AutoChangeLog-pr-11197.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11197.yml diff --git a/html/changelogs/AutoChangeLog-pr-11197.yml b/html/changelogs/AutoChangeLog-pr-11197.yml new file mode 100644 index 00000000000..8d901fe2404 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11197.yml @@ -0,0 +1,6 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "Appropriate antagonist sound theme now plays when an antagonist is selected via Traitor Panel" + - tweak: "Cult sound theme now plays for a new cult converts" + - tweak: "Traitor/Malfunction sound theme now plays for newly autotraitored crew/AI" From 62fb1ea680da664c44c9ce575fce51dcedb4e66e Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 06:26:28 -0400 Subject: [PATCH 49/80] Automatic changelog generation for PR #11198 [ci skip] --- html/changelogs/AutoChangeLog-pr-11198.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11198.yml diff --git a/html/changelogs/AutoChangeLog-pr-11198.yml b/html/changelogs/AutoChangeLog-pr-11198.yml new file mode 100644 index 00000000000..ceac2172d75 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11198.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - rscadd: "Adds space ants to the game; leave your food on tables or inside a container to avoid infestation!" From f689e720cac77164a5982387dfaea5b9ba75cf0a Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 06:26:46 -0400 Subject: [PATCH 50/80] Automatic changelog generation for PR #11199 [ci skip] --- html/changelogs/AutoChangeLog-pr-11199.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11199.yml diff --git a/html/changelogs/AutoChangeLog-pr-11199.yml b/html/changelogs/AutoChangeLog-pr-11199.yml new file mode 100644 index 00000000000..88d4a6acb51 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11199.yml @@ -0,0 +1,8 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes bees not properly generating if they have a reagent in them" + - rscadd: "Can break bee boxes" + - bugfix: "Fixes bees breaking things they shouldn't" + - bugfix: "Fixes bees not properly injecting toxin if they lacked a reagent" + - tweak: "purchased bee boxes are no longer wrenched down by default" From 9f299e790aadb1858139dbffe1dc0160888848d8 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 06:30:45 -0400 Subject: [PATCH 51/80] Automatic changelog generation for PR #11177 [ci skip] --- html/changelogs/AutoChangeLog-pr-11177.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11177.yml diff --git a/html/changelogs/AutoChangeLog-pr-11177.yml b/html/changelogs/AutoChangeLog-pr-11177.yml new file mode 100644 index 00000000000..c48da27260d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11177.yml @@ -0,0 +1,4 @@ +author: "Ty-Omaha" +delete-after: True +changes: + - tweak: "Start now confirmation is now a config option" From 4ef4c6a6f9049571733d808813bb9980c1862944 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 06:33:25 -0400 Subject: [PATCH 52/80] Automatic changelog generation for PR #11170 [ci skip] --- html/changelogs/AutoChangeLog-pr-11170.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11170.yml diff --git a/html/changelogs/AutoChangeLog-pr-11170.yml b/html/changelogs/AutoChangeLog-pr-11170.yml new file mode 100644 index 00000000000..89c13163765 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11170.yml @@ -0,0 +1,5 @@ +author: "Fox McCloud" +delete-after: True +changes: + - rscadd: "Adds trick revolver to the syndicate uplink for the clown. Teach those pesky validhunters a lesson!" + - rscadd: "Adds the ability for admins to start a revolver only summon gun version; there's also a suicidal version that makes half the guns summoned real and the other half trick revolvers" From 8c202b0375b2b4fb6b6526c5f72104dd718569f4 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 06:33:38 -0400 Subject: [PATCH 53/80] Automatic changelog generation for PR #11168 [ci skip] --- html/changelogs/AutoChangeLog-pr-11168.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11168.yml diff --git a/html/changelogs/AutoChangeLog-pr-11168.yml b/html/changelogs/AutoChangeLog-pr-11168.yml new file mode 100644 index 00000000000..62e808b1532 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11168.yml @@ -0,0 +1,6 @@ +author: "KasparoVy" +delete-after: True +changes: + - rscadd: "Adds Vox-fitted Tajaran veil sprites." + - rscdel: "Removed stray pixel from Vox-fitted gasmask sprites." + - tweak: "Adjusts the Vox-fitted blindfold sprite." From 41d3511d7f2b4816af336b257abcd535aff082b0 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 06:34:07 -0400 Subject: [PATCH 54/80] Automatic changelog generation for PR #11156 [ci skip] --- html/changelogs/AutoChangeLog-pr-11156.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11156.yml diff --git a/html/changelogs/AutoChangeLog-pr-11156.yml b/html/changelogs/AutoChangeLog-pr-11156.yml new file mode 100644 index 00000000000..6af852dcc7c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11156.yml @@ -0,0 +1,5 @@ +author: "farie82" +delete-after: True +changes: + - tweak: "Wrapping lockers and crates now takes 1.5 seconds to do" + - tweak: "Welding lockers now takes 1.5 seconds to do" From 91b849c19b81fccf6ea5b57129509b471a600c2e Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 07:19:53 -0400 Subject: [PATCH 55/80] Automatic changelog generation for PR #11126 [ci skip] --- html/changelogs/AutoChangeLog-pr-11126.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11126.yml diff --git a/html/changelogs/AutoChangeLog-pr-11126.yml b/html/changelogs/AutoChangeLog-pr-11126.yml new file mode 100644 index 00000000000..a74fcf27b98 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11126.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Added Medical Beamgun to a Syndicate Medical Cyborg" From 1bfb702a422b08181da588e126fadd3f315777dc Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 11:44:19 +0000 Subject: [PATCH 56/80] Automatic changelog compile, [ci skip] --- html/changelog.html | 27 ++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 26 +++++++++++++++++++++ html/changelogs/AutoChangeLog-pr-11126.yml | 4 ---- html/changelogs/AutoChangeLog-pr-11156.yml | 5 ---- html/changelogs/AutoChangeLog-pr-11168.yml | 6 ----- html/changelogs/AutoChangeLog-pr-11170.yml | 5 ---- html/changelogs/AutoChangeLog-pr-11177.yml | 4 ---- html/changelogs/AutoChangeLog-pr-11197.yml | 6 ----- html/changelogs/AutoChangeLog-pr-11198.yml | 4 ---- html/changelogs/AutoChangeLog-pr-11199.yml | 8 ------- 10 files changed, 53 insertions(+), 42 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-11126.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11156.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11168.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11170.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11177.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11197.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11198.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11199.yml diff --git a/html/changelog.html b/html/changelog.html index 4837e7fa3f8..17a76f56919 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,20 +57,47 @@

      02 April 2019

      +

      Arkatos updated:

      +
        +
      • Added Medical Beamgun to a Syndicate Medical Cyborg
      • +
      • Appropriate antagonist sound theme now plays when an antagonist is selected via Traitor Panel
      • +
      • Cult sound theme now plays for a new cult converts
      • +
      • Traitor/Malfunction sound theme now plays for newly autotraitored crew/AI
      • +

      Fox McCloud updated:

      • Fixes some mobs not being able to hear sounds
      • Fixes the Master Controller not actually shutting down on round end
      • +
      • Adds space ants to the game; leave your food on tables or inside a container to avoid infestation!
      • +
      • Fixes bees not properly generating if they have a reagent in them
      • +
      • Can break bee boxes
      • +
      • Fixes bees breaking things they shouldn't
      • +
      • Fixes bees not properly injecting toxin if they lacked a reagent
      • +
      • purchased bee boxes are no longer wrenched down by default
      • +
      • Adds trick revolver to the syndicate uplink for the clown. Teach those pesky validhunters a lesson!
      • +
      • Adds the ability for admins to start a revolver only summon gun version; there's also a suicidal version that makes half the guns summoned real and the other half trick revolvers
      • +
      +

      KasparoVy updated:

      +
        +
      • Adds Vox-fitted Tajaran veil sprites.
      • +
      • Removed stray pixel from Vox-fitted gasmask sprites.
      • +
      • Adjusts the Vox-fitted blindfold sprite.

      Markolie updated:

      • Fixed some issues the compiler doesn't spot and some start up issues.
      +

      Ty-Omaha updated:

      +
        +
      • Start now confirmation is now a config option
      • +

      farie82 updated:

      • Antidrop give edge case fixed
      • Can't give items to resting people now
      • put_in_hands now checks if you actually have hands
      • +
      • Wrapping lockers and crates now takes 1.5 seconds to do
      • +
      • Welding lockers now takes 1.5 seconds to do

      01 April 2019

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index c5c9ad3aac2..c9ba185c8e6 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9611,12 +9611,38 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Spontaneous combustion now has a minimum stacksize of 1. No more getting wet from the fire virus 2019-04-02: + Arkatos: + - rscadd: Added Medical Beamgun to a Syndicate Medical Cyborg + - tweak: Appropriate antagonist sound theme now plays when an antagonist is selected + via Traitor Panel + - tweak: Cult sound theme now plays for a new cult converts + - tweak: Traitor/Malfunction sound theme now plays for newly autotraitored crew/AI Fox McCloud: - bugfix: Fixes some mobs not being able to hear sounds - bugfix: Fixes the Master Controller not actually shutting down on round end + - rscadd: Adds space ants to the game; leave your food on tables or inside a container + to avoid infestation! + - bugfix: Fixes bees not properly generating if they have a reagent in them + - rscadd: Can break bee boxes + - bugfix: Fixes bees breaking things they shouldn't + - bugfix: Fixes bees not properly injecting toxin if they lacked a reagent + - tweak: purchased bee boxes are no longer wrenched down by default + - rscadd: Adds trick revolver to the syndicate uplink for the clown. Teach those + pesky validhunters a lesson! + - rscadd: Adds the ability for admins to start a revolver only summon gun version; + there's also a suicidal version that makes half the guns summoned real and the + other half trick revolvers + KasparoVy: + - rscadd: Adds Vox-fitted Tajaran veil sprites. + - rscdel: Removed stray pixel from Vox-fitted gasmask sprites. + - tweak: Adjusts the Vox-fitted blindfold sprite. Markolie: - bugfix: Fixed some issues the compiler doesn't spot and some start up issues. + Ty-Omaha: + - tweak: Start now confirmation is now a config option farie82: - bugfix: Antidrop give edge case fixed - bugfix: Can't give items to resting people now - bugfix: put_in_hands now checks if you actually have hands + - tweak: Wrapping lockers and crates now takes 1.5 seconds to do + - tweak: Welding lockers now takes 1.5 seconds to do diff --git a/html/changelogs/AutoChangeLog-pr-11126.yml b/html/changelogs/AutoChangeLog-pr-11126.yml deleted file mode 100644 index a74fcf27b98..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11126.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added Medical Beamgun to a Syndicate Medical Cyborg" diff --git a/html/changelogs/AutoChangeLog-pr-11156.yml b/html/changelogs/AutoChangeLog-pr-11156.yml deleted file mode 100644 index 6af852dcc7c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11156.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - tweak: "Wrapping lockers and crates now takes 1.5 seconds to do" - - tweak: "Welding lockers now takes 1.5 seconds to do" diff --git a/html/changelogs/AutoChangeLog-pr-11168.yml b/html/changelogs/AutoChangeLog-pr-11168.yml deleted file mode 100644 index 62e808b1532..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11168.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "KasparoVy" -delete-after: True -changes: - - rscadd: "Adds Vox-fitted Tajaran veil sprites." - - rscdel: "Removed stray pixel from Vox-fitted gasmask sprites." - - tweak: "Adjusts the Vox-fitted blindfold sprite." diff --git a/html/changelogs/AutoChangeLog-pr-11170.yml b/html/changelogs/AutoChangeLog-pr-11170.yml deleted file mode 100644 index 89c13163765..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11170.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscadd: "Adds trick revolver to the syndicate uplink for the clown. Teach those pesky validhunters a lesson!" - - rscadd: "Adds the ability for admins to start a revolver only summon gun version; there's also a suicidal version that makes half the guns summoned real and the other half trick revolvers" diff --git a/html/changelogs/AutoChangeLog-pr-11177.yml b/html/changelogs/AutoChangeLog-pr-11177.yml deleted file mode 100644 index c48da27260d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11177.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ty-Omaha" -delete-after: True -changes: - - tweak: "Start now confirmation is now a config option" diff --git a/html/changelogs/AutoChangeLog-pr-11197.yml b/html/changelogs/AutoChangeLog-pr-11197.yml deleted file mode 100644 index 8d901fe2404..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11197.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Appropriate antagonist sound theme now plays when an antagonist is selected via Traitor Panel" - - tweak: "Cult sound theme now plays for a new cult converts" - - tweak: "Traitor/Malfunction sound theme now plays for newly autotraitored crew/AI" diff --git a/html/changelogs/AutoChangeLog-pr-11198.yml b/html/changelogs/AutoChangeLog-pr-11198.yml deleted file mode 100644 index ceac2172d75..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11198.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscadd: "Adds space ants to the game; leave your food on tables or inside a container to avoid infestation!" diff --git a/html/changelogs/AutoChangeLog-pr-11199.yml b/html/changelogs/AutoChangeLog-pr-11199.yml deleted file mode 100644 index 88d4a6acb51..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11199.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes bees not properly generating if they have a reagent in them" - - rscadd: "Can break bee boxes" - - bugfix: "Fixes bees breaking things they shouldn't" - - bugfix: "Fixes bees not properly injecting toxin if they lacked a reagent" - - tweak: "purchased bee boxes are no longer wrenched down by default" From 8a57de956bb7ad9291c638d07bb8cdcbcf9af342 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 08:33:19 -0400 Subject: [PATCH 57/80] Automatic changelog generation for PR #11190 [ci skip] --- html/changelogs/AutoChangeLog-pr-11190.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11190.yml diff --git a/html/changelogs/AutoChangeLog-pr-11190.yml b/html/changelogs/AutoChangeLog-pr-11190.yml new file mode 100644 index 00000000000..d785502aa15 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11190.yml @@ -0,0 +1,6 @@ +author: "Fox McCloud" +delete-after: True +changes: + - tweak: "stabilizing agent gets used up in reactions that utilize it" + - tweak: "flashbangs spark when they initially go off" + - bugfix: "Fixes mech users being stunned by their own flashbangs" From 13fc0e5768418808c765c15e6ff2fc0a97801669 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 14:05:34 +0000 Subject: [PATCH 58/80] Automatic changelog compile, [ci skip] --- html/changelog.html | 3 +++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-11190.yml | 6 ------ 3 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-11190.yml diff --git a/html/changelog.html b/html/changelog.html index 17a76f56919..45700594ec5 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -76,6 +76,9 @@
    • purchased bee boxes are no longer wrenched down by default
    • Adds trick revolver to the syndicate uplink for the clown. Teach those pesky validhunters a lesson!
    • Adds the ability for admins to start a revolver only summon gun version; there's also a suicidal version that makes half the guns summoned real and the other half trick revolvers
    • +
    • stabilizing agent gets used up in reactions that utilize it
    • +
    • flashbangs spark when they initially go off
    • +
    • Fixes mech users being stunned by their own flashbangs

    KasparoVy updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index c9ba185c8e6..f5743f06f80 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9632,6 +9632,9 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Adds the ability for admins to start a revolver only summon gun version; there's also a suicidal version that makes half the guns summoned real and the other half trick revolvers + - tweak: stabilizing agent gets used up in reactions that utilize it + - tweak: flashbangs spark when they initially go off + - bugfix: Fixes mech users being stunned by their own flashbangs KasparoVy: - rscadd: Adds Vox-fitted Tajaran veil sprites. - rscdel: Removed stray pixel from Vox-fitted gasmask sprites. diff --git a/html/changelogs/AutoChangeLog-pr-11190.yml b/html/changelogs/AutoChangeLog-pr-11190.yml deleted file mode 100644 index d785502aa15..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11190.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "stabilizing agent gets used up in reactions that utilize it" - - tweak: "flashbangs spark when they initially go off" - - bugfix: "Fixes mech users being stunned by their own flashbangs" From c845e9860f36e193dbd8c811948161c2d598c5a9 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Tue, 2 Apr 2019 17:54:39 +0200 Subject: [PATCH 59/80] uses clonemind instead --- code/game/machinery/computer/cloning.dm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index cbc3ebe7f67..22d74f9d814 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -396,12 +396,10 @@ return for(var/obj/machinery/clonepod/pod in pods) - if(pod.occupant && pod.occupant.ckey == null) - for(var/datum/soullink/soulhook/hook in pod.sharedSoulhooks) //Check the soul hooks to see if the to be cloned person is in here - if(hook.soulowner.ckey == subject.ckey) - scantemp = "Subject already getting cloned." - SSnanoui.update_uis(src) - return + if(pod.occupant && pod.occupant.ckey == null && pod.clonemind == subject.mind) + scantemp = "Subject already getting cloned." + SSnanoui.update_uis(src) + return subject.dna.check_integrity() From f5e60f4ed281aff56af3a4bc3ad72e065f734af4 Mon Sep 17 00:00:00 2001 From: lass9030 Date: Tue, 2 Apr 2019 19:44:12 +0200 Subject: [PATCH 60/80] capitalization, fuck off --- _maps/map_files/RandomZLevels/spacehotel.dmm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm index 7f144031668..b107cfec5b9 100644 --- a/_maps/map_files/RandomZLevels/spacehotel.dmm +++ b/_maps/map_files/RandomZLevels/spacehotel.dmm @@ -2364,42 +2364,42 @@ /area/awaymission/spacehotel) "ev" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 110 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ew" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 111 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ex" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 112 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ey" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 210 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ez" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 211 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "eA" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 212 }, /turf/unsimulated/floor/carpet, From bba407c88991889a939dae6c1e2b00868ddd0575 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Tue, 2 Apr 2019 20:16:46 +0200 Subject: [PATCH 61/80] fixed deathnettle --- code/modules/hydroponics/grown/nettle.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index af829387525..444939ca861 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -95,7 +95,8 @@ force = round((5 + seed.potency / 2.5), 1) /obj/item/grown/nettle/death/pickup(mob/living/carbon/user) - if(..() && ishuman(user)) // If the pickup succeeded and is humanoid + . = ..() + if(. && ishuman(user)) // If the pickup succeeded and is humanoid var/mob/living/carbon/human/H = user if(!H.gloves && prob(50)) user.Paralyse(5) From 4b444860fd0c3ac88a7634ca0be759f01086bc2c Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 2 Apr 2019 14:25:29 -0400 Subject: [PATCH 62/80] Fixes Some Species Having Oxy Damage --- code/modules/mob/living/carbon/human/human_damage.dm | 2 ++ code/modules/mob/living/carbon/human/status_procs.dm | 1 + code/modules/mob/living/damage_procs.dm | 4 ++++ code/modules/mob/living/status_procs.dm | 1 + 4 files changed, 8 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index b4cb92af01e..7e9739a816d 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -172,6 +172,7 @@ // Defined here solely to take species flags into account without having to recast at mob/living level. /mob/living/carbon/human/adjustOxyLoss(amount) if(NO_BREATHE in dna.species.species_traits) + oxyloss = 0 return FALSE if(dna.species && amount > 0) amount = amount * dna.species.oxy_mod @@ -179,6 +180,7 @@ /mob/living/carbon/human/setOxyLoss(amount) if(NO_BREATHE in dna.species.species_traits) + oxyloss = 0 return FALSE if(dna.species && amount > 0) amount = amount * dna.species.oxy_mod diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 9a1c7a5bbd6..30653023751 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -1,5 +1,6 @@ /mob/living/carbon/human/SetLoseBreath(amount) if(NO_BREATHE in dna.species.species_traits) + losebreath = 0 return FALSE . = ..() diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index e3005292c95..afca9ad8798 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -122,8 +122,10 @@ /mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) + oxyloss = 0 return FALSE //godmode if(BREATHLESS in mutations) + oxyloss = 0 return FALSE var/old_oxyloss = oxyloss oxyloss = max(oxyloss + amount, 0) @@ -137,8 +139,10 @@ /mob/living/proc/setOxyLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) + oxyloss = 0 return FALSE //godmode if(BREATHLESS in mutations) + oxyloss = 0 return FALSE var/old_oxyloss = oxyloss oxyloss = amount diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 2eea5755293..d47f21b8d46 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -298,6 +298,7 @@ /mob/living/SetLoseBreath(amount) if(BREATHLESS in mutations) + losebreath = 0 return FALSE losebreath = max(amount, 0) From 3bbfcc8755c307d911b31f4d8c70c798e3129641 Mon Sep 17 00:00:00 2001 From: AzuleUtama <44248086+AzuleUtama@users.noreply.github.com> Date: Tue, 2 Apr 2019 20:36:52 +0100 Subject: [PATCH 63/80] Cleans up some uplink code for showing descriptions --- code/game/objects/items/devices/uplinks.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 247b5fb1a0d..5eb835e2940 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -23,7 +23,6 @@ var/list/world_uplinks = list() var/used_TC = 0 var/job = null - var/show_descriptions = 0 var/temp_category var/uplink_type = "traitor" @@ -231,7 +230,6 @@ var/list/world_uplinks = list() data["welcome"] = welcome data["crystals"] = uses data["menu"] = nanoui_menu - data["descriptions"] = show_descriptions if(!nanoui_items) generate_items(user) data["nano_items"] = nanoui_items @@ -266,12 +264,6 @@ var/list/world_uplinks = list() if(href_list["menu"]) nanoui_menu = text2num(href_list["menu"]) update_nano_data(href_list["id"]) - if(href_list["menu"]) - nanoui_menu = text2num(href_list["menu"]) - update_nano_data(href_list["id"]) - if(href_list["descriptions"]) - show_descriptions = !show_descriptions - update_nano_data() if(href_list["category"]) temp_category = href_list["category"] update_nano_data() From c6e89900c258dd5827430f65a752744b9abd8660 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 17:49:40 -0400 Subject: [PATCH 64/80] Automatic changelog generation for PR #11163 [ci skip] --- html/changelogs/AutoChangeLog-pr-11163.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11163.yml diff --git a/html/changelogs/AutoChangeLog-pr-11163.yml b/html/changelogs/AutoChangeLog-pr-11163.yml new file mode 100644 index 00000000000..03a8a8aebe9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11163.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - tweak: "Changed playtime requirements for command jobs. HoS/RD/CE/CMO/AI now require 5h played in their department to be playable. HoP/Captain now require 5h played as a member of the command staff." From 4b44eee3eef7a6ed7a51418072c2183912fa68e1 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 18:12:08 -0400 Subject: [PATCH 65/80] Automatic changelog generation for PR #11164 [ci skip] --- html/changelogs/AutoChangeLog-pr-11164.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11164.yml diff --git a/html/changelogs/AutoChangeLog-pr-11164.yml b/html/changelogs/AutoChangeLog-pr-11164.yml new file mode 100644 index 00000000000..1006827237a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11164.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "Blob mobs can definitely no longer be spawned in xenobio." From 3e62a227b738b399bc501a07448525c7df0368c0 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 18:13:14 -0400 Subject: [PATCH 66/80] Automatic changelog generation for PR #11213 [ci skip] --- html/changelogs/AutoChangeLog-pr-11213.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11213.yml diff --git a/html/changelogs/AutoChangeLog-pr-11213.yml b/html/changelogs/AutoChangeLog-pr-11213.yml new file mode 100644 index 00000000000..274e464ea42 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11213.yml @@ -0,0 +1,4 @@ +author: "Alonefromhell & AffectedArc07" +delete-after: True +changes: + - bugfix: "Fixed an edgecase compile error for spacehotel.dmm" From 23c73b3796d596bea30926a777eb0efa5d3b1651 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 18:16:17 -0400 Subject: [PATCH 67/80] Automatic changelog generation for PR #11179 [ci skip] --- html/changelogs/AutoChangeLog-pr-11179.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11179.yml diff --git a/html/changelogs/AutoChangeLog-pr-11179.yml b/html/changelogs/AutoChangeLog-pr-11179.yml new file mode 100644 index 00000000000..5b490840445 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11179.yml @@ -0,0 +1,4 @@ +author: "Ty-Omaha" +delete-after: True +changes: + - rscadd: "Grid check event sound effect" From be48d4483fd37d1f4fe2c6befa5fad6d28e8e400 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 18:31:21 -0400 Subject: [PATCH 68/80] Automatic changelog generation for PR #11215 [ci skip] --- html/changelogs/AutoChangeLog-pr-11215.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11215.yml diff --git a/html/changelogs/AutoChangeLog-pr-11215.yml b/html/changelogs/AutoChangeLog-pr-11215.yml new file mode 100644 index 00000000000..b69a4a09708 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11215.yml @@ -0,0 +1,4 @@ +author: "AzuleUtama" +delete-after: True +changes: + - tweak: "Cleaned up some outdated code left in uplinks.dm" From d64e2a0889f9ef9087f16aa93760b8d36e18e35a Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 18:49:50 -0400 Subject: [PATCH 69/80] Automatic changelog generation for PR #11211 [ci skip] --- html/changelogs/AutoChangeLog-pr-11211.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11211.yml diff --git a/html/changelogs/AutoChangeLog-pr-11211.yml b/html/changelogs/AutoChangeLog-pr-11211.yml new file mode 100644 index 00000000000..db5d9fafada --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11211.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes necromantic stone not working properly and other edge cases where you had O2 damage and could become O2 damage immune" From ebb590e1f24e9e853c4f038bf05ef826677cfbf7 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 22:57:06 +0000 Subject: [PATCH 70/80] Automatic changelog compile, [ci skip] --- html/changelog.html | 15 +++++++++++++++ html/changelogs/.all_changelog.yml | 12 ++++++++++++ html/changelogs/AutoChangeLog-pr-11163.yml | 4 ---- html/changelogs/AutoChangeLog-pr-11164.yml | 4 ---- html/changelogs/AutoChangeLog-pr-11179.yml | 4 ---- html/changelogs/AutoChangeLog-pr-11211.yml | 4 ---- html/changelogs/AutoChangeLog-pr-11213.yml | 4 ---- html/changelogs/AutoChangeLog-pr-11215.yml | 4 ---- 8 files changed, 27 insertions(+), 24 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-11163.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11164.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11179.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11211.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11213.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11215.yml diff --git a/html/changelog.html b/html/changelog.html index 45700594ec5..57e7a4d8013 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,6 +57,10 @@

      02 April 2019

      +

      Alonefromhell & AffectedArc07 updated:

      +
        +
      • Fixed an edgecase compile error for spacehotel.dmm
      • +

      Arkatos updated:

      • Added Medical Beamgun to a Syndicate Medical Cyborg
      • @@ -64,6 +68,10 @@
      • Cult sound theme now plays for a new cult converts
      • Traitor/Malfunction sound theme now plays for newly autotraitored crew/AI
      +

      AzuleUtama updated:

      +
        +
      • Cleaned up some outdated code left in uplinks.dm
      • +

      Fox McCloud updated:

      • Fixes some mobs not being able to hear sounds
      • @@ -79,6 +87,7 @@
      • stabilizing agent gets used up in reactions that utilize it
      • flashbangs spark when they initially go off
      • Fixes mech users being stunned by their own flashbangs
      • +
      • Fixes necromantic stone not working properly and other edge cases where you had O2 damage and could become O2 damage immune

      KasparoVy updated:

        @@ -86,6 +95,11 @@
      • Removed stray pixel from Vox-fitted gasmask sprites.
      • Adjusts the Vox-fitted blindfold sprite.
      +

      Kyep updated:

      +
        +
      • Blob mobs can definitely no longer be spawned in xenobio.
      • +
      • Changed playtime requirements for command jobs. HoS/RD/CE/CMO/AI now require 5h played in their department to be playable. HoP/Captain now require 5h played as a member of the command staff.
      • +

      Markolie updated:

      • Fixed some issues the compiler doesn't spot and some start up issues.
      • @@ -93,6 +107,7 @@

        Ty-Omaha updated:

        • Start now confirmation is now a config option
        • +
        • Grid check event sound effect

        farie82 updated:

          diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f5743f06f80..e4f4790be12 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9611,12 +9611,16 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Spontaneous combustion now has a minimum stacksize of 1. No more getting wet from the fire virus 2019-04-02: + Alonefromhell & AffectedArc07: + - bugfix: Fixed an edgecase compile error for spacehotel.dmm Arkatos: - rscadd: Added Medical Beamgun to a Syndicate Medical Cyborg - tweak: Appropriate antagonist sound theme now plays when an antagonist is selected via Traitor Panel - tweak: Cult sound theme now plays for a new cult converts - tweak: Traitor/Malfunction sound theme now plays for newly autotraitored crew/AI + AzuleUtama: + - tweak: Cleaned up some outdated code left in uplinks.dm Fox McCloud: - bugfix: Fixes some mobs not being able to hear sounds - bugfix: Fixes the Master Controller not actually shutting down on round end @@ -9635,14 +9639,22 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: stabilizing agent gets used up in reactions that utilize it - tweak: flashbangs spark when they initially go off - bugfix: Fixes mech users being stunned by their own flashbangs + - bugfix: Fixes necromantic stone not working properly and other edge cases where + you had O2 damage and could become O2 damage immune KasparoVy: - rscadd: Adds Vox-fitted Tajaran veil sprites. - rscdel: Removed stray pixel from Vox-fitted gasmask sprites. - tweak: Adjusts the Vox-fitted blindfold sprite. + Kyep: + - bugfix: Blob mobs can definitely no longer be spawned in xenobio. + - tweak: Changed playtime requirements for command jobs. HoS/RD/CE/CMO/AI now require + 5h played in their department to be playable. HoP/Captain now require 5h played + as a member of the command staff. Markolie: - bugfix: Fixed some issues the compiler doesn't spot and some start up issues. Ty-Omaha: - tweak: Start now confirmation is now a config option + - rscadd: Grid check event sound effect farie82: - bugfix: Antidrop give edge case fixed - bugfix: Can't give items to resting people now diff --git a/html/changelogs/AutoChangeLog-pr-11163.yml b/html/changelogs/AutoChangeLog-pr-11163.yml deleted file mode 100644 index 03a8a8aebe9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11163.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - tweak: "Changed playtime requirements for command jobs. HoS/RD/CE/CMO/AI now require 5h played in their department to be playable. HoP/Captain now require 5h played as a member of the command staff." diff --git a/html/changelogs/AutoChangeLog-pr-11164.yml b/html/changelogs/AutoChangeLog-pr-11164.yml deleted file mode 100644 index 1006827237a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11164.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "Blob mobs can definitely no longer be spawned in xenobio." diff --git a/html/changelogs/AutoChangeLog-pr-11179.yml b/html/changelogs/AutoChangeLog-pr-11179.yml deleted file mode 100644 index 5b490840445..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11179.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ty-Omaha" -delete-after: True -changes: - - rscadd: "Grid check event sound effect" diff --git a/html/changelogs/AutoChangeLog-pr-11211.yml b/html/changelogs/AutoChangeLog-pr-11211.yml deleted file mode 100644 index db5d9fafada..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11211.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes necromantic stone not working properly and other edge cases where you had O2 damage and could become O2 damage immune" diff --git a/html/changelogs/AutoChangeLog-pr-11213.yml b/html/changelogs/AutoChangeLog-pr-11213.yml deleted file mode 100644 index 274e464ea42..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11213.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Alonefromhell & AffectedArc07" -delete-after: True -changes: - - bugfix: "Fixed an edgecase compile error for spacehotel.dmm" diff --git a/html/changelogs/AutoChangeLog-pr-11215.yml b/html/changelogs/AutoChangeLog-pr-11215.yml deleted file mode 100644 index b69a4a09708..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11215.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AzuleUtama" -delete-after: True -changes: - - tweak: "Cleaned up some outdated code left in uplinks.dm" From 882472ccbbe4df5d2698314cd73bde4364934d06 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 19:05:34 -0400 Subject: [PATCH 71/80] Automatic changelog generation for PR #11210 [ci skip] --- html/changelogs/AutoChangeLog-pr-11210.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11210.yml diff --git a/html/changelogs/AutoChangeLog-pr-11210.yml b/html/changelogs/AutoChangeLog-pr-11210.yml new file mode 100644 index 00000000000..cf0fec5e2d2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11210.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "Death nettle can be picked up again" From 4a74ea8feafb64cfa7ac30a9e1864b5ae00206a4 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 2 Apr 2019 20:34:48 -0400 Subject: [PATCH 72/80] Fixes Mob Performance Issue --- code/modules/surgery/organs/blood.dm | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 0ff4273daa1..d2d758529aa 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -18,23 +18,11 @@ // Takes care blood loss and regeneration /mob/living/carbon/human/handle_blood() - var/list/blood_data = get_blood_data(get_blood_id())//PROCCEPTION - if(NO_BLOOD in dna.species.species_traits) bleed_rate = 0 return if(bodytemperature >= 225 && !(NOCLONE in mutations)) //cryosleep or husked people do not pump the blood. - - //Blood regeneration if there is some space - if(blood_volume < max_blood && blood_volume) - if(mind) //Handles vampires "eating" blood that isn't their own. - if(mind in ticker.mode.vampires) - if(nutrition >= NUTRITION_LEVEL_WELL_FED) - return //We don't want blood tranfusions making vampires fat. - if(blood_data["donor"] != src) - nutrition += (15 * REAGENTS_METABOLISM) - return //Only process one blood per tick, to maintain the same metabolism as nutriment for non-vampires. if(blood_volume < BLOOD_VOLUME_NORMAL) blood_volume += 0.1 // regenerate blood VERY slowly @@ -56,7 +44,7 @@ if(prob(15)) Paralyse(rand(1,3)) to_chat(src, "You feel extremely [word].") - if(0 to BLOOD_VOLUME_SURVIVE) + if(-INFINITY to BLOOD_VOLUME_SURVIVE) death() var/temp_bleed = 0 From 9f3db45998e5481ff01183b560684efa9f7801c1 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 2 Apr 2019 21:09:26 -0400 Subject: [PATCH 73/80] Automatic changelog generation for PR #11216 [ci skip] --- html/changelogs/AutoChangeLog-pr-11216.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11216.yml diff --git a/html/changelogs/AutoChangeLog-pr-11216.yml b/html/changelogs/AutoChangeLog-pr-11216.yml new file mode 100644 index 00000000000..697680f8dd9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11216.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Dramatically improves human life performance (sorry, doesn't fix your actual crappy real life)" From e5012a8b20fe20ee9c66bfd66ebd89af959a2615 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 3 Apr 2019 01:42:57 +0000 Subject: [PATCH 74/80] Automatic changelog compile, [ci skip] --- html/changelog.html | 10 ++++++++++ html/changelogs/.all_changelog.yml | 6 ++++++ html/changelogs/AutoChangeLog-pr-11210.yml | 4 ---- html/changelogs/AutoChangeLog-pr-11216.yml | 4 ---- 4 files changed, 16 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-11210.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11216.yml diff --git a/html/changelog.html b/html/changelog.html index 57e7a4d8013..a86cfa42a28 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,16 @@ -->
          +

          03 April 2019

          +

          Fox McCloud updated:

          +
            +
          • Dramatically improves human life performance (sorry, doesn't fix your actual crappy real life)
          • +
          +

          farie82 updated:

          +
            +
          • Death nettle can be picked up again
          • +
          +

          02 April 2019

          Alonefromhell & AffectedArc07 updated:

            diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index e4f4790be12..3e59c050561 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9661,3 +9661,9 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: put_in_hands now checks if you actually have hands - tweak: Wrapping lockers and crates now takes 1.5 seconds to do - tweak: Welding lockers now takes 1.5 seconds to do +2019-04-03: + Fox McCloud: + - bugfix: Dramatically improves human life performance (sorry, doesn't fix your + actual crappy real life) + farie82: + - bugfix: Death nettle can be picked up again diff --git a/html/changelogs/AutoChangeLog-pr-11210.yml b/html/changelogs/AutoChangeLog-pr-11210.yml deleted file mode 100644 index cf0fec5e2d2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11210.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Death nettle can be picked up again" diff --git a/html/changelogs/AutoChangeLog-pr-11216.yml b/html/changelogs/AutoChangeLog-pr-11216.yml deleted file mode 100644 index 697680f8dd9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11216.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Dramatically improves human life performance (sorry, doesn't fix your actual crappy real life)" From 530ff1353f205d292c7a5cb801b907f4ff5d2d52 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Wed, 3 Apr 2019 09:31:25 +0200 Subject: [PATCH 75/80] no more ckey check required --- code/game/machinery/computer/cloning.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 22d74f9d814..acdbc1110f3 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -396,7 +396,7 @@ return for(var/obj/machinery/clonepod/pod in pods) - if(pod.occupant && pod.occupant.ckey == null && pod.clonemind == subject.mind) + if(pod.occupant && pod.clonemind == subject.mind) scantemp = "Subject already getting cloned." SSnanoui.update_uis(src) return From f08cc1bb8f6012c790ba59869e52ef43ad488869 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 3 Apr 2019 14:32:24 -0400 Subject: [PATCH 76/80] Automatic changelog generation for PR #11146 [ci skip] --- html/changelogs/AutoChangeLog-pr-11146.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11146.yml diff --git a/html/changelogs/AutoChangeLog-pr-11146.yml b/html/changelogs/AutoChangeLog-pr-11146.yml new file mode 100644 index 00000000000..4d2a14ce69f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11146.yml @@ -0,0 +1,5 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "Auto cloning now doesn't clone a person more than once." + - tweak: "A person in the cloning scanner won't be scanned if he's already being cloned" From c7a6465f11e4930d155dc32774e4d55acd88668d Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 3 Apr 2019 14:34:34 -0400 Subject: [PATCH 77/80] Automatic changelog generation for PR #11160 [ci skip] --- html/changelogs/AutoChangeLog-pr-11160.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11160.yml diff --git a/html/changelogs/AutoChangeLog-pr-11160.yml b/html/changelogs/AutoChangeLog-pr-11160.yml new file mode 100644 index 00000000000..b1ca726884b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11160.yml @@ -0,0 +1,6 @@ +author: "Fox McCloud" +delete-after: True +changes: + - tweak: "Blobspores will additionally zomify all players who have 200 damage or more" + - tweak: "Holoparasites will additionally die once their host has 200 damage or more" + - bugfix: "Fixes blob zombies who infect players who have no head being invisible" From ae0ba5f90e9b6af41b5e61b6d2de112dd49bee54 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 3 Apr 2019 20:25:14 +0000 Subject: [PATCH 78/80] Automatic changelog compile, [ci skip] --- html/changelog.html | 5 +++++ html/changelogs/.all_changelog.yml | 7 +++++++ html/changelogs/AutoChangeLog-pr-11146.yml | 5 ----- html/changelogs/AutoChangeLog-pr-11160.yml | 6 ------ 4 files changed, 12 insertions(+), 11 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-11146.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11160.yml diff --git a/html/changelog.html b/html/changelog.html index a86cfa42a28..b81214a498e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -60,10 +60,15 @@

            Fox McCloud updated:

            • Dramatically improves human life performance (sorry, doesn't fix your actual crappy real life)
            • +
            • Blobspores will additionally zomify all players who have 200 damage or more
            • +
            • Holoparasites will additionally die once their host has 200 damage or more
            • +
            • Fixes blob zombies who infect players who have no head being invisible

            farie82 updated:

            • Death nettle can be picked up again
            • +
            • Auto cloning now doesn't clone a person more than once.
            • +
            • A person in the cloning scanner won't be scanned if he's already being cloned

            02 April 2019

            diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3e59c050561..13190f55004 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9665,5 +9665,12 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Fox McCloud: - bugfix: Dramatically improves human life performance (sorry, doesn't fix your actual crappy real life) + - tweak: Blobspores will additionally zomify all players who have 200 damage or + more + - tweak: Holoparasites will additionally die once their host has 200 damage or more + - bugfix: Fixes blob zombies who infect players who have no head being invisible farie82: - bugfix: Death nettle can be picked up again + - bugfix: Auto cloning now doesn't clone a person more than once. + - tweak: A person in the cloning scanner won't be scanned if he's already being + cloned diff --git a/html/changelogs/AutoChangeLog-pr-11146.yml b/html/changelogs/AutoChangeLog-pr-11146.yml deleted file mode 100644 index 4d2a14ce69f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11146.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Auto cloning now doesn't clone a person more than once." - - tweak: "A person in the cloning scanner won't be scanned if he's already being cloned" diff --git a/html/changelogs/AutoChangeLog-pr-11160.yml b/html/changelogs/AutoChangeLog-pr-11160.yml deleted file mode 100644 index b1ca726884b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11160.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Blobspores will additionally zomify all players who have 200 damage or more" - - tweak: "Holoparasites will additionally die once their host has 200 damage or more" - - bugfix: "Fixes blob zombies who infect players who have no head being invisible" From 6b81eb3842f0e2057983878cc6f81a2259994fca Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 3 Apr 2019 21:30:58 -0400 Subject: [PATCH 79/80] Automatic changelog generation for PR #11081 [ci skip] --- html/changelogs/AutoChangeLog-pr-11081.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11081.yml diff --git a/html/changelogs/AutoChangeLog-pr-11081.yml b/html/changelogs/AutoChangeLog-pr-11081.yml new file mode 100644 index 00000000000..bac4ffe884b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11081.yml @@ -0,0 +1,6 @@ +author: "Kyep" +delete-after: True +changes: + - tweak: "Improved the interface for Syndicate Uplinks. They now clearly mark which items are hijack-only and which are not. If you attempt to purchase a hijack-only item without hijack, they will explain why you can't." + - tweak: "Atmos Gas Grenades (the uplink grenade kit) are now split into Knockout grenades (2 N2O grenades, 8 TC, available to all agents), and Plasma Fire grenades (2 plasma fire grenades, 12 TC, only available if you have hijack). This both makes knockout grenades more useful for normal traitors, and also prevents non-hijackers using a plasma fire grenade to cause massive casualties/damage." + - tweak: "Plasma Grenades and the Syndicate Bomb can no longer show up in surplus crates, or be discounted. This means while you can buy one if you intend to, you're not randomly encouraged to bomb your target." From aa44ffa74ee657a6ed902a262e37fdd30ee3cca1 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 4 Apr 2019 03:32:52 +0000 Subject: [PATCH 80/80] Automatic changelog compile, [ci skip] --- html/changelog.html | 8 ++++++++ html/changelogs/.all_changelog.yml | 13 +++++++++++++ html/changelogs/AutoChangeLog-pr-11081.yml | 6 ------ 3 files changed, 21 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-11081.yml diff --git a/html/changelog.html b/html/changelog.html index b81214a498e..af410acc732 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,14 @@ -->
            +

            04 April 2019

            +

            Kyep updated:

            +
              +
            • Improved the interface for Syndicate Uplinks. They now clearly mark which items are hijack-only and which are not. If you attempt to purchase a hijack-only item without hijack, they will explain why you can't.
            • +
            • Atmos Gas Grenades (the uplink grenade kit) are now split into Knockout grenades (2 N2O grenades, 8 TC, available to all agents), and Plasma Fire grenades (2 plasma fire grenades, 12 TC, only available if you have hijack). This both makes knockout grenades more useful for normal traitors, and also prevents non-hijackers using a plasma fire grenade to cause massive casualties/damage.
            • +
            • Plasma Grenades and the Syndicate Bomb can no longer show up in surplus crates, or be discounted. This means while you can buy one if you intend to, you're not randomly encouraged to bomb your target.
            • +
            +

            03 April 2019

            Fox McCloud updated:

              diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 13190f55004..748a8e97b2b 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9674,3 +9674,16 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Auto cloning now doesn't clone a person more than once. - tweak: A person in the cloning scanner won't be scanned if he's already being cloned +2019-04-04: + Kyep: + - tweak: Improved the interface for Syndicate Uplinks. They now clearly mark which + items are hijack-only and which are not. If you attempt to purchase a hijack-only + item without hijack, they will explain why you can't. + - tweak: Atmos Gas Grenades (the uplink grenade kit) are now split into Knockout + grenades (2 N2O grenades, 8 TC, available to all agents), and Plasma Fire grenades + (2 plasma fire grenades, 12 TC, only available if you have hijack). This both + makes knockout grenades more useful for normal traitors, and also prevents non-hijackers + using a plasma fire grenade to cause massive casualties/damage. + - tweak: Plasma Grenades and the Syndicate Bomb can no longer show up in surplus + crates, or be discounted. This means while you can buy one if you intend to, + you're not randomly encouraged to bomb your target. diff --git a/html/changelogs/AutoChangeLog-pr-11081.yml b/html/changelogs/AutoChangeLog-pr-11081.yml deleted file mode 100644 index bac4ffe884b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11081.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - tweak: "Improved the interface for Syndicate Uplinks. They now clearly mark which items are hijack-only and which are not. If you attempt to purchase a hijack-only item without hijack, they will explain why you can't." - - tweak: "Atmos Gas Grenades (the uplink grenade kit) are now split into Knockout grenades (2 N2O grenades, 8 TC, available to all agents), and Plasma Fire grenades (2 plasma fire grenades, 12 TC, only available if you have hijack). This both makes knockout grenades more useful for normal traitors, and also prevents non-hijackers using a plasma fire grenade to cause massive casualties/damage." - - tweak: "Plasma Grenades and the Syndicate Bomb can no longer show up in surplus crates, or be discounted. This means while you can buy one if you intend to, you're not randomly encouraged to bomb your target."