From 94490f12d190602c00feb58ffc35195bf4671992 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Wed, 2 Sep 2015 20:32:38 -0400 Subject: [PATCH 01/76] Adds some meat spike functionality. --- .../items/stacks/sheets/sheet_types.dm | 1 + code/game/objects/structures/kitchen_spike.dm | 215 ++++++++++-------- .../changelogs/bgobandit - hardmeatspikes.yml | 4 + icons/obj/kitchen.dmi | Bin 19756 -> 20934 bytes 4 files changed, 127 insertions(+), 93 deletions(-) create mode 100644 html/changelogs/bgobandit - hardmeatspikes.yml diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 7d780f9bdd1..37be2211ce5 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -31,6 +31,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \ null, \ new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \ new/datum/stack_recipe("light fixture frame", /obj/item/light_fixture_frame, 2), \ diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 07936884c99..338288debdf 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -2,13 +2,47 @@ #define SKINTYPE_MONKEY 1 #define SKINTYPE_ALIEN 2 #define SKINTYPE_BEAR 3 +#define SKINTYPE_CORGI 4 #define MEATTYPE_MONKEY 1 #define MEATTYPE_ALIEN 2 #define MEATTYPE_BEAR 3 +#define MEATTYPE_CORGI 4 //////Kitchen Spike +/obj/structure/kitchenspike_frame + name = "meatspike frame" + icon = 'icons/obj/kitchen.dmi' + icon_state = "spikeframe" + desc = "The frame of a meat spike." + density = 1 + anchored = 0 + +/obj/structure/kitchenspike_frame/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) + if(istype(W)) + user << "You begin [anchored ? "un" : ""]securing [name]..." + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + if(do_after(user, time, target = src)) + user << "You [anchored ? "un" : ""]secure [name]." + anchored = !anchored + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + return 1 + return 0 + +/obj/structure/kitchenspike_frame/attackby(obj/item/I, mob/user, params) + add_fingerprint(user) + if(default_unfasten_wrench(user, I)) + return + else if(istype(I, /obj/item/stack/rods)) + var/obj/item/stack/rods/R = I + if(R.get_amount() >= 4) + R.use(4) + user << "You add spikes to the frame." + var/obj/F = new /obj/structure/kitchenspike(src.loc,) + transfer_fingerprints_to(F) + qdel(src) + /obj/structure/kitchenspike name = "meat spike" icon = 'icons/obj/kitchen.dmi' @@ -25,55 +59,55 @@ /obj/structure/kitchenspike/attack_paw(mob/user) return src.attack_hand(usr) -/obj/structure/kitchenspike/attackby(obj/item/weapon/grab/G, mob/user, params) - if(!istype(G, /obj/item/weapon/grab)) - return - if(istype(G.affecting, /mob/living/carbon/monkey)) - if(src.occupied == 0) - src.icon_state = "spikebloody" - src.occupied = 1 - src.meat = 5 - src.meattype = MEATTYPE_MONKEY - src.skin = 1 - src.skintype = SKINTYPE_MONKEY - for(var/mob/O in viewers(src, null)) - O.show_message(text("[user] has forced [G.affecting] onto the spike, killing them instantly!")) - qdel(G.affecting) - qdel(G) - +/obj/structure/kitchenspike/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/crowbar)) + playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) + if(do_after(user, 20, target = src)) + user << "You pry the spikes out of the frame." + new /obj/item/stack/rods(loc, 4) + var/obj/F = new /obj/structure/kitchenspike_frame(src.loc,) + transfer_fingerprints_to(F) + qdel(src) + else if(istype(I, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = I + if(istype(G.affecting, /mob/living/carbon/monkey) || istype (G.affecting, /mob/living/carbon/alien) || istype (G.affecting, /mob/living/simple_animal/hostile/bear) || istype (G.affecting, /mob/living/simple_animal/pet/dog/corgi)) + if(src.occupied == 0) + src.occupied = 1 + src.meat = 5 + src.skin = 1 + if(istype(G.affecting, /mob/living/carbon/monkey)) + src.meattype = MEATTYPE_MONKEY + src.skintype = SKINTYPE_MONKEY + src.icon_state = "spikebloody" + if(istype(G.affecting, /mob/living/carbon/alien)) + src.icon_state = "spikebloodygreen" + src.meattype = MEATTYPE_ALIEN + src.skintype = SKINTYPE_ALIEN + if(istype(G.affecting, /mob/living/simple_animal/hostile/bear)) + src.icon_state = "spikebloodybearz" + src.meattype = MEATTYPE_BEAR + src.skintype = SKINTYPE_BEAR + if(istype(G.affecting, /mob/living/simple_animal/pet/dog/corgi)) + src.icon_state = "spikecorgi" + src.meattype = MEATTYPE_CORGI + src.skintype = SKINTYPE_CORGI + var/mob/living/O = G.affecting + O.show_message(text("[user] has forced [G.affecting] onto the spike, killing them instantly!")) + qdel(G.affecting) + qdel(G) + else + user << "The spike already has something on it, finish collecting its meat first!" + else if(istype(G.affecting, /mob/living/carbon/human)) + user.changeNext_move(CLICK_CD_MELEE) + playsound(src.loc, "sound/effects/splat.ogg", 25, 1) + var/mob/living/carbon/human/H = G.affecting + H.visible_message("[user] slams [G.affecting] into the meat spike!", "[user] slams you into the meat spike!", "You hear a squishy wet noise.") + H.adjustBruteLoss(25) else - user << "The spike already has something on it, finish collecting its meat first!" - else if(istype(G.affecting, /mob/living/carbon/alien)) - if(src.occupied == 0) - src.icon_state = "spikebloodygreen" - src.occupied = 1 - src.meat = 5 - src.meattype = MEATTYPE_ALIEN - src.skin = 1 - src.skintype = SKINTYPE_ALIEN - for(var/mob/O in viewers(src, null)) - O.show_message(text("[user] has forced [G.affecting] onto the spike, killing them instantly!")) - qdel(G.affecting) - qdel(G) - else - user << "The spike already has something on it, finish collecting its meat first!" - else if(istype(G.affecting, /mob/living/simple_animal/hostile/bear)) - if(src.occupied == 0) - src.icon_state = "spikebloodybearz" - src.occupied = 1 - src.meat = 5 - src.meattype = MEATTYPE_BEAR - src.skin = 1 - src.skintype = SKINTYPE_BEAR - for(var/mob/O in viewers(src, null)) - O.show_message(text("[user] has forced [G.affecting] onto the spike, killing them instantly!")) - qdel(G.affecting) - qdel(G) - else - user << "The spike already has something on it, finish collecting its meat first!" + user << "You can't use that on the spike!" + return else - user << "They are too big for the spike, try something smaller!" - return + ..() ///obj/structure/kitchenspike/MouseDrop_T(var/atom/movable/C, mob/user) // if(istype(C, /obj/mob/carbon/monkey) @@ -84,57 +118,52 @@ if(..()) return if(src.occupied) - if(src.meattype == MEATTYPE_MONKEY && src.skintype == SKINTYPE_MONKEY) - if(src.skin >= 1) - src.skin-- - new /obj/item/stack/sheet/animalhide/monkey(src.loc) - user << "You remove the hide from the monkey." - else if(src.meat > 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey(src.loc ) - usr << "You remove some meat from the monkey." - else if(src.meat == 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey(src.loc) - usr << "You remove the last piece of meat from the monkey." - src.icon_state = "spike" - src.occupied = 0 - else if(src.meattype == MEATTYPE_ALIEN && src.skintype == SKINTYPE_ALIEN) - if(src.skin >= 1) - src.skin-- - new /obj/item/stack/sheet/animalhide/xeno(src.loc) - user << "You remove the hide from the alien." - else if(src.meat > 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno(src.loc ) - usr << "You remove some meat from the alien." - else if(src.meat == 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno(src.loc) - usr << "You remove the last piece of meat from the alien." - src.icon_state = "spike" - src.occupied = 0 - else if(src.meattype == MEATTYPE_BEAR && src.skintype == SKINTYPE_BEAR) - if(src.skin >= 1) - src.skin-- - new /obj/item/clothing/head/bearpelt(src.loc) - user << "You remove the hide from the bear." - else if(src.meat > 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear(src.loc ) - usr << "You remove some meat from the bear." - else if(src.meat == 1) - src.meat-- - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear(src.loc) - usr << "You remove the last piece of meat from the bear." - src.icon_state = "spike" - src.occupied = 0 + if(src.skin >=1) + switch(src.skintype) + if(SKINTYPE_MONKEY) + new /obj/item/stack/sheet/animalhide/monkey(src.loc) + if(SKINTYPE_ALIEN) + new /obj/item/stack/sheet/animalhide/xeno(src.loc) + if(SKINTYPE_BEAR) + new /obj/item/clothing/head/bearpelt(src.loc) + if(SKINTYPE_CORGI) + new /obj/item/stack/sheet/animalhide/corgi(src.loc) + src.skin-- + usr << "You remove the hide from [src]." + else if (src.meat > 1) + switch(src.meattype) + if(MEATTYPE_MONKEY) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey(src.loc ) + if(MEATTYPE_ALIEN) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno(src.loc ) + if(MEATTYPE_BEAR) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear(src.loc ) + if(MEATTYPE_CORGI) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(src,loc ) + src.meat-- + usr << "You remove some meat from [src]." + else if (src.meat == 1) + switch(src.meattype) + if(MEATTYPE_MONKEY) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey(src.loc) + if(MEATTYPE_ALIEN) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno(src.loc) + if(MEATTYPE_BEAR) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear(src.loc) + if(MEATTYPE_CORGI) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(src.loc) + src.meat-- + src.icon_state = "spike" + src.occupied = 0 + usr << "You remove the last piece of meat from [src]." #undef SKINTYPE_MONKEY #undef SKINTYPE_ALIEN #undef SKINTYPE_BEAR +#undef SKINTYPE_CORGI #undef MEATTYPE_MONKEY #undef MEATTYPE_ALIEN -#undef MEATTYPE_BEAR \ No newline at end of file +#undef MEATTYPE_BEAR +#undef MEATTYPE_CORGI \ No newline at end of file diff --git a/html/changelogs/bgobandit - hardmeatspikes.yml b/html/changelogs/bgobandit - hardmeatspikes.yml new file mode 100644 index 00000000000..023e14b3658 --- /dev/null +++ b/html/changelogs/bgobandit - hardmeatspikes.yml @@ -0,0 +1,4 @@ +author: bgobandit +delete-after: True +changes: + - rscadd: "Meatspikes can now be constructed and deconstructed with metal and rods, as well as wrenched and unwrenched! Humans and corgis can be used on them as well." \ No newline at end of file diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index d485b53a828cf68ca929efc4f26a2cdeeb753f46..329ca9de64838e09d93e92118aac814295bb8eb9 100644 GIT binary patch literal 20934 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 W$3B-uI1BJ+gf#Eys1>Q01^fqJQl2^h literal 19756 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%0D#JvK#?L0 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 Y52qVDBpe*3B>(^b07*qoM6N<$g6~-+#Q*>R From 64089be82db898d89fe4be718435df182212b585 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Wed, 2 Sep 2015 20:43:12 -0400 Subject: [PATCH 02/76] I love typos --- code/game/objects/structures/kitchen_spike.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 338288debdf..064b98f6b4b 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -139,7 +139,7 @@ if(MEATTYPE_BEAR) new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear(src.loc ) if(MEATTYPE_CORGI) - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(src,loc ) + new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(src.loc ) src.meat-- usr << "You remove some meat from [src]." else if (src.meat == 1) From 1db6cc9d9a715e4e3d88ecaabdd84999b0e9a0e6 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Wed, 2 Sep 2015 22:04:22 -0400 Subject: [PATCH 03/76] Addresses super's concerns. Adjusts damage down. --- code/game/objects/structures/kitchen_spike.dm | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 064b98f6b4b..6efa9aa679f 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -61,17 +61,20 @@ /obj/structure/kitchenspike/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/crowbar)) - playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) - if(do_after(user, 20, target = src)) - user << "You pry the spikes out of the frame." - new /obj/item/stack/rods(loc, 4) - var/obj/F = new /obj/structure/kitchenspike_frame(src.loc,) - transfer_fingerprints_to(F) - qdel(src) + if(!src.occupied) + playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) + if(do_after(user, 20, target = src)) + user << "You pry the spikes out of the frame." + new /obj/item/stack/rods(loc, 4) + var/obj/F = new /obj/structure/kitchenspike_frame(src.loc,) + transfer_fingerprints_to(F) + qdel(src) + else + user << "You can't do that while something's on the spike!" else if(istype(I, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = I if(istype(G.affecting, /mob/living/carbon/monkey) || istype (G.affecting, /mob/living/carbon/alien) || istype (G.affecting, /mob/living/simple_animal/hostile/bear) || istype (G.affecting, /mob/living/simple_animal/pet/dog/corgi)) - if(src.occupied == 0) + if(!src.occupied) src.occupied = 1 src.meat = 5 src.skin = 1 @@ -102,7 +105,7 @@ playsound(src.loc, "sound/effects/splat.ogg", 25, 1) var/mob/living/carbon/human/H = G.affecting H.visible_message("[user] slams [G.affecting] into the meat spike!", "[user] slams you into the meat spike!", "You hear a squishy wet noise.") - H.adjustBruteLoss(25) + H.adjustBruteLoss(20) else user << "You can't use that on the spike!" return @@ -118,19 +121,7 @@ if(..()) return if(src.occupied) - if(src.skin >=1) - switch(src.skintype) - if(SKINTYPE_MONKEY) - new /obj/item/stack/sheet/animalhide/monkey(src.loc) - if(SKINTYPE_ALIEN) - new /obj/item/stack/sheet/animalhide/xeno(src.loc) - if(SKINTYPE_BEAR) - new /obj/item/clothing/head/bearpelt(src.loc) - if(SKINTYPE_CORGI) - new /obj/item/stack/sheet/animalhide/corgi(src.loc) - src.skin-- - usr << "You remove the hide from [src]." - else if (src.meat > 1) + if (src.meat > 1) switch(src.meattype) if(MEATTYPE_MONKEY) new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey(src.loc ) @@ -153,9 +144,20 @@ if(MEATTYPE_CORGI) new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(src.loc) src.meat-- + else if(src.skin >=1) + switch(src.skintype) + if(SKINTYPE_MONKEY) + new /obj/item/stack/sheet/animalhide/monkey(src.loc) + if(SKINTYPE_ALIEN) + new /obj/item/stack/sheet/animalhide/xeno(src.loc) + if(SKINTYPE_BEAR) + new /obj/item/clothing/head/bearpelt(src.loc) + if(SKINTYPE_CORGI) + new /obj/item/stack/sheet/animalhide/corgi(src.loc) + src.skin-- + usr << "You remove the hide from [src]." src.icon_state = "spike" src.occupied = 0 - usr << "You remove the last piece of meat from [src]." #undef SKINTYPE_MONKEY From ae37baf75a5a573e6e8419872e498142f5f9655b Mon Sep 17 00:00:00 2001 From: bgobandit Date: Wed, 2 Sep 2015 22:59:48 -0400 Subject: [PATCH 04/76] Implements the absolute height of inconsistent stupidity. --- code/game/machinery/machinery.dm | 2 +- code/game/objects/structures/kitchen_spike.dm | 11 ----------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index a4cdf6f6470..99e09d08084 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -366,7 +366,7 @@ Class Procs: return 1 return 0 -/obj/machinery/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) +/obj/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) if(istype(W)) user << "You begin [anchored ? "un" : ""]securing [name]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 6efa9aa679f..45d2de8db64 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -19,17 +19,6 @@ density = 1 anchored = 0 -/obj/structure/kitchenspike_frame/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) - if(istype(W)) - user << "You begin [anchored ? "un" : ""]securing [name]..." - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, time, target = src)) - user << "You [anchored ? "un" : ""]secure [name]." - anchored = !anchored - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - return 1 - return 0 - /obj/structure/kitchenspike_frame/attackby(obj/item/I, mob/user, params) add_fingerprint(user) if(default_unfasten_wrench(user, I)) From 0adb97522ff39ce0e5380778462941df5c939494 Mon Sep 17 00:00:00 2001 From: duncathan Date: Wed, 2 Sep 2015 22:05:59 -0600 Subject: [PATCH 05/76] improves defines and meat/skin creation --- code/game/objects/structures/kitchen_spike.dm | 67 ++++++------------- 1 file changed, 21 insertions(+), 46 deletions(-) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 45d2de8db64..266773bc996 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -1,13 +1,13 @@ -#define SKINTYPE_MONKEY 1 -#define SKINTYPE_ALIEN 2 -#define SKINTYPE_BEAR 3 -#define SKINTYPE_CORGI 4 +#define SKINTYPE_MONKEY /obj/item/stack/sheet/animalhide/monkey +#define SKINTYPE_ALIEN /obj/item/stack/sheet/animalhide/xeno +#define SKINTYPE_BEAR /obj/item/clothing/head/bearpelt +#define SKINTYPE_CORGI /obj/item/stack/sheet/animalhide/corgi -#define MEATTYPE_MONKEY 1 -#define MEATTYPE_ALIEN 2 -#define MEATTYPE_BEAR 3 -#define MEATTYPE_CORGI 4 +#define MEATTYPE_MONKEY /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey +#define MEATTYPE_ALIEN /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno +#define MEATTYPE_BEAR /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear +#define MEATTYPE_CORGI /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi //////Kitchen Spike @@ -109,44 +109,19 @@ /obj/structure/kitchenspike/attack_hand(mob/user) if(..()) return - if(src.occupied) - if (src.meat > 1) - switch(src.meattype) - if(MEATTYPE_MONKEY) - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey(src.loc ) - if(MEATTYPE_ALIEN) - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno(src.loc ) - if(MEATTYPE_BEAR) - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear(src.loc ) - if(MEATTYPE_CORGI) - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(src.loc ) - src.meat-- - usr << "You remove some meat from [src]." - else if (src.meat == 1) - switch(src.meattype) - if(MEATTYPE_MONKEY) - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey(src.loc) - if(MEATTYPE_ALIEN) - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno(src.loc) - if(MEATTYPE_BEAR) - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear(src.loc) - if(MEATTYPE_CORGI) - new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(src.loc) - src.meat-- - else if(src.skin >=1) - switch(src.skintype) - if(SKINTYPE_MONKEY) - new /obj/item/stack/sheet/animalhide/monkey(src.loc) - if(SKINTYPE_ALIEN) - new /obj/item/stack/sheet/animalhide/xeno(src.loc) - if(SKINTYPE_BEAR) - new /obj/item/clothing/head/bearpelt(src.loc) - if(SKINTYPE_CORGI) - new /obj/item/stack/sheet/animalhide/corgi(src.loc) - src.skin-- - usr << "You remove the hide from [src]." - src.icon_state = "spike" - src.occupied = 0 + if(occupied) + if(meat >= 1) + new meattype(src.loc) + meat-- + if(meat > 1) + usr << "You remove some meat from [src]." + return + if(src.skin >=1) + new skintype(src.loc) + skin-- + usr << "You remove the hide from [src]." + src.icon_state = "spike" + src.occupied = 0 #undef SKINTYPE_MONKEY From 22b2c803fd7d8200550ddaae64e158537c9922d9 Mon Sep 17 00:00:00 2001 From: duncathan Date: Wed, 2 Sep 2015 22:39:58 -0600 Subject: [PATCH 06/76] improves setting of icon_state, meattype, and skintype in attackby() --- code/game/objects/structures/kitchen_spike.dm | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 266773bc996..1acee34f3a0 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -45,6 +45,19 @@ var/skin = 0 var/skintype = null + var/global/list/meatlist = list( + "monkey" = MEATTYPE_MONKEY, + "alien" = MEATTYPE_ALIEN, + "bear" = MEATTYPE_BEAR, + "corgi" = MEATTYPE_CORGI, + ) + var/global/list/skinlist = list( + "monkey" = SKINTYPE_MONKEY, + "alien" = SKINTYPE_ALIEN, + "bear" = SKINTYPE_BEAR, + "corgi" = SKINTYPE_CORGI, + ) + /obj/structure/kitchenspike/attack_paw(mob/user) return src.attack_hand(usr) @@ -67,24 +80,17 @@ src.occupied = 1 src.meat = 5 src.skin = 1 - if(istype(G.affecting, /mob/living/carbon/monkey)) - src.meattype = MEATTYPE_MONKEY - src.skintype = SKINTYPE_MONKEY - src.icon_state = "spikebloody" - if(istype(G.affecting, /mob/living/carbon/alien)) - src.icon_state = "spikebloodygreen" - src.meattype = MEATTYPE_ALIEN - src.skintype = SKINTYPE_ALIEN - if(istype(G.affecting, /mob/living/simple_animal/hostile/bear)) - src.icon_state = "spikebloodybearz" - src.meattype = MEATTYPE_BEAR - src.skintype = SKINTYPE_BEAR - if(istype(G.affecting, /mob/living/simple_animal/pet/dog/corgi)) - src.icon_state = "spikecorgi" - src.meattype = MEATTYPE_CORGI - src.skintype = SKINTYPE_CORGI - var/mob/living/O = G.affecting - O.show_message(text("[user] has forced [G.affecting] onto the spike, killing them instantly!")) + + var/list/affecting_path = text2list(path2text(G.affecting.type), "/") //we want affecting_type to be the last part of affecting's type path + var/affecting_type = affecting_path[affecting_path.len] //ex. if affecting.type is /mob/living/carbon/monkey, this will set affecting_type to "monkey" + + //set these vars to the appropriate values based on type + icon_state = "spikebloody[affecting_type]" + meattype = meatlist["[affecting_type]"] + skintype = skinlist["[affecting_type]"] + + var/mob/living/O = G.affecting + O.show_message(text("[user] has forced [G.affecting] onto the spike, killing them instantly!")) qdel(G.affecting) qdel(G) else From 6c2dd46b078269d3ee5458af7e6c758e7bf67862 Mon Sep 17 00:00:00 2001 From: duncathan Date: Thu, 3 Sep 2015 00:10:29 -0600 Subject: [PATCH 07/76] fixes my mistakes haha woops --- code/game/objects/structures/kitchen_spike.dm | 51 +++++++++++------- icons/obj/kitchen.dmi | Bin 20934 -> 20942 bytes 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 1acee34f3a0..2587f2db3f1 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -1,4 +1,3 @@ - #define SKINTYPE_MONKEY /obj/item/stack/sheet/animalhide/monkey #define SKINTYPE_ALIEN /obj/item/stack/sheet/animalhide/xeno #define SKINTYPE_BEAR /obj/item/clothing/head/bearpelt @@ -45,6 +44,13 @@ var/skin = 0 var/skintype = null + var/global/list/allowed_types = list( //ugh I know it's a whitelist but it's not as god-awful and hacky as before. at least this way it's sustainable. i don't think there's even a better way than this. + /mob/living/carbon/monkey, + /mob/living/carbon/alien, + /mob/living/simple_animal/hostile/bear, + /mob/living/simple_animal/pet/dog/corgi, + ) + var/global/list/meatlist = list( "monkey" = MEATTYPE_MONKEY, "alien" = MEATTYPE_ALIEN, @@ -61,6 +67,12 @@ /obj/structure/kitchenspike/attack_paw(mob/user) return src.attack_hand(usr) +/obj/structure/kitchenspike/proc/is_mob_allowed(var/obj/item/weapon/grab/G) + for(var/I in allowed_types) + if(istype(G.affecting, I)) + return I + return 0 + /obj/structure/kitchenspike/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/crowbar)) if(!src.occupied) @@ -73,16 +85,19 @@ qdel(src) else user << "You can't do that while something's on the spike!" - else if(istype(I, /obj/item/weapon/grab)) + return + if(istype(I, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = I - if(istype(G.affecting, /mob/living/carbon/monkey) || istype (G.affecting, /mob/living/carbon/alien) || istype (G.affecting, /mob/living/simple_animal/hostile/bear) || istype (G.affecting, /mob/living/simple_animal/pet/dog/corgi)) - if(!src.occupied) - src.occupied = 1 - src.meat = 5 - src.skin = 1 + var/allowed_type = is_mob_allowed(G) + if(allowed_type) + if(!occupied) + occupied = 1 + meat = 5 + skin = 1 - var/list/affecting_path = text2list(path2text(G.affecting.type), "/") //we want affecting_type to be the last part of affecting's type path - var/affecting_type = affecting_path[affecting_path.len] //ex. if affecting.type is /mob/living/carbon/monkey, this will set affecting_type to "monkey" + var/list/affecting_path = text2list("[allowed_type]", "/") //we want a specific part of the type path for this: the last part of the path in allowed_types + var/affecting_type = affecting_path[affecting_path.len] //ex. 1 if affecting.type is /mob/living/carbon/monkey, this will set affecting_type to "monkey" + //ex. 2 if affecting.type is /mob/living/carbon/alien/humanoid/queen, this will set affecting_type to "alien" //set these vars to the appropriate values based on type icon_state = "spikebloody[affecting_type]" @@ -90,22 +105,22 @@ skintype = skinlist["[affecting_type]"] var/mob/living/O = G.affecting - O.show_message(text("[user] has forced [G.affecting] onto the spike, killing them instantly!")) + O.visible_message(text("[user] has forced [G.affecting] onto the spike, killing them instantly!")) qdel(G.affecting) qdel(G) else - user << "The spike already has something on it, finish collecting its meat first!" - else if(istype(G.affecting, /mob/living/carbon/human)) + user << "The spike already has something on it; finish collecting its meat first!" + return + if(istype(G.affecting, /mob/living/carbon/human)) user.changeNext_move(CLICK_CD_MELEE) playsound(src.loc, "sound/effects/splat.ogg", 25, 1) var/mob/living/carbon/human/H = G.affecting H.visible_message("[user] slams [G.affecting] into the meat spike!", "[user] slams you into the meat spike!", "You hear a squishy wet noise.") H.adjustBruteLoss(20) - else - user << "You can't use that on the spike!" return - else - ..() + user << "You can't use that on the spike!" + return + ..() ///obj/structure/kitchenspike/MouseDrop_T(var/atom/movable/C, mob/user) // if(istype(C, /obj/mob/carbon/monkey) @@ -126,8 +141,8 @@ new skintype(src.loc) skin-- usr << "You remove the hide from [src]." - src.icon_state = "spike" - src.occupied = 0 + icon_state = "spike" + occupied = 0 #undef SKINTYPE_MONKEY diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 329ca9de64838e09d93e92118aac814295bb8eb9..6e03c9f6f144174567e761ff882e2c0c53e3085e 100644 GIT binary patch delta 464 zcmV;>0Wbc>qXEvN0gxnrwt7@pbVOxyV{&P5bZKvH004NLotCj~+%OD=XZtCHWNnKi z*VRjLL2*O!3I;7vvV5|5pye~}?K>C=azj9>n+1G7#b2Z-Kbk+Ue^2k`_;zZq$V;Sb zI`jM2Q`>COmC#zkICXP(=C#xu;gf8SF>B62rK z5p#`TrhLYms9;Jd=FnfFCOVN!dE&DOopbcEf141l$Ramy3WOBQvx0e2FoT9kL{2Wy z2dGJZCp9K^QnnH}W~Zn?V5ObF6U+)~UF7x%99@zz&(Q@fMi<33+tHxpU&=(_(1}|N3A01)^`v~ZALO)#3VKwNzA6KK+-VIJvB$oE z+&rH-SJBfND&tRU_>Vn&&lNo~R?&5_cgGsVv_^|853`+<$K$XTtLTxn*l|cia)QyK zWrVrELeayPGWHvIub6T7B0G|$1f@cEg&b1?y{l8tJp+-*)WYs(;Tfr#E$cJ+&906mU_U zdb+!Bn=RNps!kmq+h&B|$Gjg>))`c%ZqgdgaMLz6P*Rg z)EKZVVT@t%{Td{G5qZiXomuF-1jj2k5%dL!<>pO*pn!Q0F!usxkT9|WeSwnjcTyr^ zCwVEJ!eRv#@FbMuY0|TRDv56oPr*hWa}=zXVz>$(*p7N3$7gRPG>{TjkiQi9v283w z{jNH7_;a{^lo7Rm1Z#24Vl y@6!O9KBP;s7wwL;hBFu>A7rQ_J^z}4TlM^QRL9p-`w0S-8FzbrKi;$B0qaja%h-Yd From b1f3ba46a677b66ffe88d6a9aea1888276b35e04 Mon Sep 17 00:00:00 2001 From: Ergovisavi Date: Sun, 30 Aug 2015 16:27:51 -0700 Subject: [PATCH 08/76] Swarmer revision 2 --- .../living/simple_animal/bot_swarm/swarmer.dm | 136 +++++++++++++----- .../living/simple_animal/hostile/hostile.dm | 18 ++- icons/mob/swarmer.dmi | Bin 12804 -> 15396 bytes 3 files changed, 110 insertions(+), 44 deletions(-) diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm index 24af1978011..169e705481f 100644 --- a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm +++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm @@ -60,7 +60,7 @@ faction = list("swarmer") AIStatus = AI_OFF projectiletype = /obj/item/projectile/beam/disabler - pass_flags = PASSTABLE | PASSMOB + pass_flags = PASSTABLE ventcrawler = 2 ranged = 1 projectiletype = /obj/item/projectile/beam/disabler @@ -95,8 +95,9 @@ /mob/living/simple_animal/hostile/swarmer/emp_act() if(health > 1) health = 1 - ..() - health = 0 + return + else + death() /mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O) if(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other @@ -172,6 +173,12 @@ /obj/machinery/dominator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S << "This device is attempting to corrupt our entire network; attempting to interact with it is too risky. Aborting." +/obj/effect/decal/cleanable/crayon/gang/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Searching... sensor malfunction! Target lost. Aborting." + +/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Searching... sensor malfunction! Target lost. Aborting." + /obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S << "Destroying this object would cause a chain reaction. Aborting." @@ -181,6 +188,15 @@ /obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S << "An inhospitable area may be created as a result of destroying this object. Aborting." +/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting." + +/obj/machinery/message_server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting." + +/obj/machinery/blackbox_recorder/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "This machine has recorded large amounts of data on this structure and its inhabitants, it will be a useful resource to our masters in the future. Aborting. " + /obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S << "Disrupting the power grid would bring no benefit to us. Aborting." @@ -188,15 +204,17 @@ S << "This bluespace source will be important to us later. Aborting." /turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(locate(/turf/space) in range(1, src)) - S << "Destroying this object has the potential to cause a hull breach. Aborting." - return + for(var/turf/T in range(1, src)) + if(istype(T, /turf/space) || istype(T.loc, /area/space)) + S << "Destroying this object has the potential to cause a hull breach. Aborting." + return ..() /obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(locate(/turf/space) in range(1, src)) - S << "Destroying this object has the potential to cause a hull breach. Aborting." - return + for(var/turf/T in range(1, src)) + if(istype(T, /turf/space) || istype(T.loc, /area/space)) + S << "Destroying this object has the potential to cause a hull breach. Aborting." + return ..() /obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource @@ -233,6 +251,10 @@ resources++ do_attack_animation(target) changeNext_move(CLICK_CD_MELEE) + var/obj/effect/swarmer/integrate/I = new /obj/effect/swarmer/integrate(get_turf(target)) + I.pixel_x = target.pixel_x + I.pixel_y = target.pixel_y + I.pixel_z = target.pixel_z if(istype(target, /obj/item/stack)) var/obj/item/stack/S = target S.use(1) @@ -244,7 +266,7 @@ return /mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(var/atom/movable/target) - new /obj/effect/effect/sparks(get_turf(target)) + new /obj/effect/swarmer/disintegration(get_turf(target)) do_attack_animation(target) changeNext_move(CLICK_CD_MELEE) target.ex_act(3) @@ -280,14 +302,20 @@ /mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target) do_attack_animation(target) src << "We begin to dismantle this machine. We will need to be uninterrupted." - new /obj/effect/effect/sparks(get_turf(target)) + var/obj/effect/swarmer/dismantle/D = new /obj/effect/swarmer/dismantle(get_turf(target)) + D.pixel_x = target.pixel_x + D.pixel_y = target.pixel_y + D.pixel_z = target.pixel_z if(do_mob(src, target, 100)) src << "Dismantling complete." var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc) M.amount = 5 for(var/obj/item/I in target.component_parts) I.loc = M.loc - new /obj/effect/effect/sparks(get_turf(target)) + var/obj/effect/swarmer/disintegration/N = new /obj/effect/swarmer/disintegration(get_turf(target)) + N.pixel_x = target.pixel_x + N.pixel_y = target.pixel_y + N.pixel_z = target.pixel_z target.dropContents() if(istype(target, /obj/machinery/computer)) var/obj/machinery/computer/C = target @@ -295,42 +323,75 @@ C.circuit.loc = M.loc qdel(target) -/obj/effect/swarmer //Default destroyable object for swarmer constructions - name = "swarmer construction" - desc = "Debug swarmer item, this shouldn't be here. Yell at a coder." + +/obj/effect/swarmer //Default swarmer effect object visual feedback + name = "swarmer ui" + desc = null gender = NEUTER icon = 'icons/mob/swarmer.dmi' icon_state = "ui_light" + mouse_opacity = 0 + layer = 4 + unacidable = 1 + +/obj/effect/swarmer/disintegration + icon_state = "disintegrate" + +/obj/effect/swarmer/disintegration/New() + playsound(src.loc, "sparks", 100, 1) + spawn(10) + qdel(src) + +/obj/effect/swarmer/dismantle + icon_state = "dismantle" + +/obj/effect/swarmer/dismantle/New() + spawn(25) + qdel(src) + +/obj/effect/swarmer/integrate + icon_state = "integrate" + +/obj/effect/swarmer/integrate/New() + spawn(5) + qdel(src) + +/obj/effect/swarmer/destructible //Default destroyable object for swarmer constructions luminosity = 1 + mouse_opacity = 1 var/health = 30 -/obj/effect/swarmer/proc/TakeDamage(damage) +/obj/effect/swarmer/destructible/proc/TakeDamage(damage) health -= damage if(health <= 0) qdel(src) -/obj/effect/swarmer/bullet_act(obj/item/projectile/Proj) +/obj/effect/swarmer/destructible/bullet_act(obj/item/projectile/Proj) if(Proj.damage) if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) TakeDamage(Proj.damage) ..() -/obj/effect/swarmer/attackby(obj/item/weapon/I, mob/living/user, params) +/obj/effect/swarmer/destructible/attackby(obj/item/weapon/I, mob/living/user, params) if(istype(I, /obj/item/weapon)) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) TakeDamage(I.force) return -/obj/effect/swarmer/ex_act() +/obj/effect/swarmer/destructible/ex_act() qdel(src) return -/obj/effect/swarmer/blob_act() +/obj/effect/swarmer/destructible/blob_act() qdel(src) return -/obj/effect/swarmer/attack_animal(mob/living/user) +/obj/effect/swarmer/destructible/emp_act() + qdel(src) + return + +/obj/effect/swarmer/destructible/attack_animal(mob/living/user) if(isanimal(user)) var/mob/living/simple_animal/S = user S.do_attack_animation(src) @@ -343,24 +404,27 @@ set name = "Create trap" set category = "Swarmer" set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources" - if(/obj/effect/swarmer/trap in loc) + if(/obj/effect/swarmer/destructible/trap in loc) src << "There is already a trap here. Aborting." return - Fabricate(/obj/effect/swarmer/trap, 5) + Fabricate(/obj/effect/swarmer/destructible/trap, 5) return -/obj/effect/swarmer/trap +/obj/effect/swarmer/destructible/trap name = "swarmer trap" - desc = "A quickly assembled electric trap. Will not retain its form if damaged enough." + desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough." icon_state = "trap" luminosity = 1 health = 10 -/obj/effect/swarmer/trap/Crossed(var/atom/movable/AM) +/obj/effect/swarmer/destructible/trap/Crossed(var/atom/movable/AM) if(isliving(AM)) var/mob/living/L = AM if(!istype(L, /mob/living/simple_animal/hostile/swarmer)) + playsound(loc,'sound/effects/snap.ogg',50, 1, -1) L.electrocute_act(0, src, 1, 1) + if(isrobot(L)) + L.Weaken(5) qdel(src) ..() @@ -368,13 +432,17 @@ set name = "Create barricade" set category = "Swarmer" set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through." - if(/obj/effect/swarmer/blockade in loc) + if(/obj/effect/swarmer/destructible/blockade in loc) src << "There is already a blockade here. Aborting." return - Fabricate(/obj/effect/swarmer/blockade, 5) + if(resources < 5) + src << "We do not have the resources for this!" + return + if(do_mob(src, src, 10)) + Fabricate(/obj/effect/swarmer/destructible/blockade, 5) return -/obj/effect/swarmer/blockade +/obj/effect/swarmer/destructible/blockade name = "swarmer blockade" desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through." icon_state = "barricade" @@ -383,7 +451,7 @@ density = 1 anchored = 1 -/obj/effect/swarmer/blockade/CanPass(atom/movable/O) +/obj/effect/swarmer/destructible/blockade/CanPass(atom/movable/O) if(isswarmer(O)) return 1 if(istype(O, /obj/item/projectile/beam/disabler)) @@ -436,7 +504,7 @@ /obj/screen/swarmer/FabricateTrap icon_state = "ui_trap" - name = "Create trap" + name = "Create trap (Costs 5 Resources)" desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 5 resources)" /obj/screen/swarmer/FabricateTrap/Click() @@ -446,7 +514,7 @@ /obj/screen/swarmer/Barricade icon_state = "ui_barricade" - name = "Create barricade" + name = "Create barricade (Costs 5 Resources)" desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 5 resources)" /obj/screen/swarmer/Barricade/Click() @@ -456,8 +524,8 @@ /obj/screen/swarmer/Replicate icon_state = "ui_replicate" - name = "Replicate" - desc = "Creates a another of our kind. (Costs 50 resources)" + name = "Replicate (Costs 50 Resources)" + desc = "Creates a another of our kind." /obj/screen/swarmer/Replicate/Click() if(isswarmer(usr)) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 613e0d1eda9..12a73e8edc4 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -223,22 +223,21 @@ var/target = the_target visible_message("[src] [ranged_message] at [target]!") - var/tturf = get_turf(target) if(rapid) spawn(1) - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype(get_turf(src)) spawn(4) - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype(get_turf(src)) spawn(6) - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype(get_turf(src)) else - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype ranged_cooldown = ranged_cooldown_cap @@ -248,17 +247,16 @@ if(target == start) return - var/obj/item/projectile/A = new projectiletype(user:loc) + var/obj/item/projectile/A = new projectiletype(src.loc) playsound(user, projectilesound, 100, 1) if(!A) return - - if (!istype(target, /turf)) - qdel(A) - return A.current = target A.firer = src A.yo = target:y - start:y A.xo = target:x - start:x + if(AIStatus == AI_OFF)//Don't want mindless mobs to have their movement screwed up firing in space + newtonian_move(get_dir(target, user)) + A.original = target A.fire() return diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi index 96a9f9ae09e1870344142cbb3439434468f5082e..dffd6b2490c25cdcfa963bd11f26e2797cb1fa44 100644 GIT binary patch literal 15396 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 aVy1f^im#v1JOg+C0*WtGWQ(7h2L3NIHA!p$ literal 12804 zcmaL8by!qw^ftPO8hS{T21x-yx|yLnRU{+?1ZkvuMnn(=X%z*A5D){9kZ$SDk#1q6 z2asmY=KY=TT<5yZ_nm+C>^-xeUeA5sYprKujSaP^$eGCj0HD&*RyPFz2zU!DkdlDc zO_ge6@MAmVp1Gg;V_yd!7jHioFHZmn%7{H6O?ow zY0{}Hyh{X?|XBbm8*e9 z*tY|(m#=ge9v!~E$y)j;O^R2K2sZHHxt$uVVwlBU)A;MV3v={=qIr76XJ;PQ-til`qm@8k^Uo!6*&>l{%4W4h zl-6HwR8%)`ieS~hz+M<92pjEvtdgy~kqW&h$l*UxI_sRc-7q8C*X$g)HFAdu z6NPyW*0<}BGs+LvvKn`^=C6fE+_(PQD1Q{Ormz+^e=@L~g)Yg@CuU`3t%+4Ek!Wsd zS!AmwTv+IOv=W*LdE+O^9#=05^zEb!^kxr7TO3-Mve|GFHw z0n{IvNSDEa$5sY~Z=oftq1Km^oah-s$BxSpRzL>uT1nBxaj>h*a1a42{F;ffoDoMJ zi~#UyWUIhof1xt0q!-Sz5(-HN>r8AQL4<~W$H^oQynC_joisz|#O57RL>|#b3&^1Qy7+^Kgw%xm?E~ogC{8AgFKt>V&PFq@Y79R4 z7$c(rS*uslDU>ovHNZ89AVrg0&PE>+|M%CCD9As*47 zlGPNPYXrAIf!dcAM9m{et_mSSBGLsv8fx>i<-choKHDf5@wcjkcSC}#0UH(+24|F( zMV%skGM7Hqe!uz1EWdGdbyZ!S`196opE~KL|4HcWd7-luRuqO9v*GR4w;RFqs)Qhzd;T@4u+RfYy)+=Yc-0WB=0cF~a7~1z3 zaDDLZiAFeJWkDGzVaa}nYp{vNSvF!;(Ns9BqO8S4G&kT0_&RemXa1A_hFRUI43mZ- zoHmVo0GsP54Aqd^2@lM5_3&%RUN9a@zvUy9JkYaI>e+i#d*1MNC+*_#crako=0^Bw zANZ`LuW96Hs_VS!zpmd6zTi6yVOEB5-X&?~LbB+4)w}X#reSg*E z2oDV5$qd9Ct)lg)jgJ(;&akqkYw&G}3I#)CWo5+)d⩽rRN}#}3why&bjd`-5=w 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 From 6df9d4975a151fbafc7c7b686916bcc048e07015 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 5 Sep 2015 19:48:37 +0200 Subject: [PATCH 09/76] Adds abductor event Adds event gamemode white/blacklist Moves and renames some helper procs Some QoL for baton --- code/__HELPERS/game.dm | 50 +++++++++ code/controllers/subsystem/events.dm | 2 + .../gamemodes/abduction/abduction_gear.dm | 20 +++- .../machinery/computer/camera_advanced.dm | 2 +- code/modules/admin/verbs/one_click_antag.dm | 104 ++---------------- code/modules/events/event.dm | 3 + tgstation.dme | 1 + 7 files changed, 81 insertions(+), 101 deletions(-) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 21626590306..32593329621 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -380,3 +380,53 @@ return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y) +/proc/pollCandidates(var/Question, var/jobbanType, var/datum/game_mode/gametypeCheck) + var/list/mob/dead/observer/candidates = list() + var/time_passed = world.time + if (!Question) + Question = "Would you like to be a special role?" + + for(var/mob/dead/observer/G in player_list) + if(!G.key || !G.client) + continue + if (gametypeCheck) + if(!gametypeCheck.age_check(G.client)) + continue + if (jobbanType) + if(jobban_isbanned(G, jobbanType) || jobban_isbanned(G, "Syndicate")) + continue + spawn(0) + G << 'sound/misc/notice2.ogg' //Alerting them to their consideration + switch(alert(G,Question,"Please answer in 30 seconds!","Yes","No")) + if("Yes") + G << "Choice registered: Yes." + if((world.time-time_passed)>300)//If more than 30 game seconds passed. + G << "Sorry, you were too late for the consideration!" + G << 'sound/machines/buzz-sigh.ogg' + return + candidates += G + if("No") + G << "Choice registered: No." + return + else + return + sleep(300) + + //Check all our candidates, to make sure they didn't log off during the 30 second wait period. + for(var/mob/dead/observer/G in candidates) + if(!G.key || !G.client) + candidates.Remove(G) + + return candidates + +/proc/makeBody(mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character + if(!G_found || !G_found.key) return + + //First we spawn a dude. + var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned. + + G_found.client.prefs.copy_to(new_character) + ready_dna(new_character) + new_character.key = G_found.key + + return new_character \ No newline at end of file diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index b381803ba67..eb5b6b5db80 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -64,6 +64,8 @@ var/datum/subsystem/events/SSevent for(var/datum/round_event_control/E in control) if(E.occurrences >= E.max_occurrences) continue if(E.earliest_start >= world.time) continue + if(ticker.mode.config_tag in E.gamemode_blacklist) continue + if(E.gamemode_whitelist && !(ticker.mode.config_tag in E.gamemode_whitelist)) continue if(E.holidayID) if(!holidays || !holidays[E.holidayID]) continue if(E.weight < 0) //for round-start events etc. diff --git a/code/game/gamemodes/abduction/abduction_gear.dm b/code/game/gamemodes/abduction/abduction_gear.dm index 9595f0883b9..0793989952f 100644 --- a/code/game/gamemodes/abduction/abduction_gear.dm +++ b/code/game/gamemodes/abduction/abduction_gear.dm @@ -460,11 +460,16 @@ Congratulations! You are now trained for xenobiology research!"} /obj/item/weapon/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user) if(L.stunned) L.SetSleeping(60) - L.visible_message("[user] has induced sleep in [L] with [src]!", \ + L.visible_message("[user] has induced sleep in [L] with [src]!", \ "You suddenly feel very drowsy!") - playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - add_logs(user, L, "put to sleep") + add_logs(user, L, "put to sleep") + else + L.drowsyness += 1 + user << "Sleep inducement works fully only on stunned specimens! " + L.visible_message("[user] tried to induce sleep in [L] with [src]!", \ + "You suddenly feel drowsy!") return /obj/item/weapon/abductor_baton/proc/CuffAttack(mob/living/L,mob/living/user) @@ -490,13 +495,22 @@ Congratulations! You are now trained for xenobiology research!"} "[user] probes you!") var/species = "Unknown species" + var/helptext = "Species unsuitable for experiments." + if(ishuman(L)) var/mob/living/carbon/human/H = L if(H.dna && H.dna.species) species = "[H.dna.species.name]" if(L.mind && L.mind.changeling) species = "Changeling lifeform" + var/obj/item/organ/internal/gland/temp = locate() in H.internal_organs + if(temp) + helptext = "Experimental gland detected!" + else + helptext = "Subject suitable for experiments." + user << "Probing result:[species]" + user << "[helptext]" /obj/item/weapon/restraints/handcuffs/energy name = "hard-light energy field" diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index d7b9be9aaac..4cc24bf776b 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -38,7 +38,7 @@ GrantActions(user) current_user = user eyeobj.user = user - eyeobj.name = "Camere Eye ([user.name])" + eyeobj.name = "Camera Eye ([user.name])" L.remote_view = 1 L.remote_control = eyeobj L.client.perspective = EYE_PERSPECTIVE diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 25b84838539..b8c43ebdb6c 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -233,7 +233,7 @@ /datum/admins/proc/makeNukeTeam() var/datum/game_mode/nuclear/temp = new - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for a nuke team being sent in?", "operative", temp) + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for a nuke team being sent in?", "operative", temp) var/list/mob/dead/observer/chosen = list() var/mob/dead/observer/theghost = null @@ -307,7 +307,7 @@ // DEATH SQUADS /datum/admins/proc/makeDeathsquad() var/mission = input("Assign a mission to the deathsquad", "Assign Mission", "Leave no witnesses.") - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an elite Nanotrasen Strike Team?", "deathsquad", null) + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for an elite Nanotrasen Strike Team?", "deathsquad", null) var/squadSpawned = 0 if(candidates.len >= 2) //Minimum 2 to be considered a squad @@ -413,7 +413,7 @@ /datum/admins/proc/makeOfficial() var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.") - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered to be a Centcom Official?", "pAI") + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered to be a Centcom Official?", "pAI") if(candidates.len) var/mob/dead/observer/chosen_candidate = pick(candidates) @@ -466,7 +466,7 @@ return makeOfficial() var/teamsize = min(7,input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num) var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", "Assist the station.") - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for a Code [alert] Nanotrasen Emergency Response Team?", "deathsquad", null) + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for a Code [alert] Nanotrasen Emergency Response Team?", "deathsquad", null) var/teamSpawned = 0 if(candidates.len > 0) @@ -559,50 +559,11 @@ //Abductors /datum/admins/proc/makeAbductorTeam() - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an Abductor Team?", "abductor", null) - - if(candidates.len >= 2) - //Oh god why we can't have static functions - var/number = ticker.mode.abductor_teams + 1 - - var/datum/game_mode/abduction/temp - if(ticker.mode.config_tag == "abduction") - temp = ticker.mode - else - temp = new - - var/agent_mind = pick(candidates) - candidates -= agent_mind - var/scientist_mind = pick(candidates) - - var/mob/living/carbon/human/agent=makeBody(agent_mind) - var/mob/living/carbon/human/scientist=makeBody(scientist_mind) - - agent_mind = agent.mind - scientist_mind = scientist.mind - - temp.scientists.len = number - temp.agents.len = number - temp.abductors.len = 2*number - temp.team_objectives.len = number - temp.team_names.len = number - temp.scientists[number] = scientist_mind - temp.agents[number] = agent_mind - temp.abductors |= list(agent_mind,scientist_mind) - temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) - temp.post_setup_team(number) - - ticker.mode.abductor_teams++ - - if(ticker.mode.config_tag != "abduction") - ticker.mode.abductors |= temp.abductors - - return 1 - else - return + new /datum/round_event/abductor + return 1 /datum/admins/proc/makeRevenant() - var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for becoming a revenant?", "revenant", null) + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for becoming a revenant?", "revenant", null) if(candidates.len >= 1) var/spook_op = pick(candidates) var/mob/dead/observer/O = spook_op @@ -644,54 +605,3 @@ candidates.Remove(H) return 1 return 0 - -/datum/admins/proc/getCandidates(var/Question, var/jobbanType, var/datum/game_mode/gametypeCheck) - var/list/mob/dead/observer/candidates = list() - var/time_passed = world.time - if (!Question) - Question = "Would you like to be a special role?" - - for(var/mob/dead/observer/G in player_list) - if(!G.key || !G.client) - continue - if (gametypeCheck) - if(!gametypeCheck.age_check(G.client)) - continue - if (jobbanType) - if(jobban_isbanned(G, jobbanType) || jobban_isbanned(G, "Syndicate")) - continue - spawn(0) - G << 'sound/misc/notice2.ogg' //Alerting them to their consideration - switch(alert(G,Question,"Please answer in 30 seconds!","Yes","No")) - if("Yes") - G << "Choice registered: Yes." - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - G << "Sorry, you were too late for the consideration!" - G << 'sound/machines/buzz-sigh.ogg' - return - candidates += G - if("No") - G << "Choice registered: No." - return - else - return - sleep(300) - - //Check all our candidates, to make sure they didn't log off during the 30 second wait period. - for(var/mob/dead/observer/G in candidates) - if(!G.key || !G.client) - candidates.Remove(G) - - return candidates - -/datum/admins/proc/makeBody(mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character - if(!G_found || !G_found.key) return - - //First we spawn a dude. - var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned. - - G_found.client.prefs.copy_to(new_character) - ready_dna(new_character) - new_character.key = G_found.key - - return new_character diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm index 07dbff7d269..6d555cc8448 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -20,6 +20,9 @@ var/alertadmins = 1 //should we let the admins know this event is firing //should be disabled on events that fire a lot + var/gamemode_blacklist = list() // Event won't happen in these gamemodes + var/gamemode_whitelist = list() // Event will happen ONLY in these gamemodes if not empty + /datum/round_event_control/wizard wizardevent = 1 diff --git a/tgstation.dme b/tgstation.dme index 252a8f2c178..ccd81493634 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -950,6 +950,7 @@ #include "code\modules\detectivework\footprints_and_rag.dm" #include "code\modules\detectivework\scanner.dm" #include "code\modules\emoji\emoji_parse.dm" +#include "code\modules\events\abductor.dm" #include "code\modules\events\alien_infestation.dm" #include "code\modules\events\anomaly.dm" #include "code\modules\events\anomaly_bluespace.dm" From cd7806818ed8d0bb080e2e43ea20cbef0496ae83 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 5 Sep 2015 20:16:22 +0200 Subject: [PATCH 10/76] whoops --- code/modules/events/abductor.dm | 61 +++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 code/modules/events/abductor.dm diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm new file mode 100644 index 00000000000..7e0146a2c97 --- /dev/null +++ b/code/modules/events/abductor.dm @@ -0,0 +1,61 @@ +/datum/round_event_control/abductor + name = "Abductors" + typepath = /datum/round_event/abductor + weight = 5 + max_occurrences = 1 + + earliest_start = 180000 // 30 min + + gamemode_blacklist = list("nuclear","wizard","cult","gang","revolution","abduction","blob") + +/datum/round_event/abductor + +/datum/round_event/abductor/start() + //spawn abductor team + if(!makeAbductorTeam()) + message_admins("Abductor event failed to find players. Retrying in 30s.") + spawn(30) + makeAbductorTeam() + +/datum/round_event/abductor/proc/makeAbductorTeam() + var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for an Abductor Team?", "abductor", null) + + if(candidates.len >= 2) + //Oh god why we can't have static functions + var/number = ticker.mode.abductor_teams + 1 + + var/datum/game_mode/abduction/temp + if(ticker.mode.config_tag == "abduction") + temp = ticker.mode + else + temp = new + + var/agent_mind = pick(candidates) + candidates -= agent_mind + var/scientist_mind = pick(candidates) + + var/mob/living/carbon/human/agent=makeBody(agent_mind) + var/mob/living/carbon/human/scientist=makeBody(scientist_mind) + + agent_mind = agent.mind + scientist_mind = scientist.mind + + temp.scientists.len = number + temp.agents.len = number + temp.abductors.len = 2*number + temp.team_objectives.len = number + temp.team_names.len = number + temp.scientists[number] = scientist_mind + temp.agents[number] = agent_mind + temp.abductors |= list(agent_mind,scientist_mind) + temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) + temp.post_setup_team(number) + + ticker.mode.abductor_teams++ + + if(ticker.mode.config_tag != "abduction") + ticker.mode.abductors |= temp.abductors + + return 1 + else + return 0 \ No newline at end of file From d9073aefece55f432352e606fc7c89cea8f1bbc4 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 5 Sep 2015 23:07:32 +0200 Subject: [PATCH 11/76] Makes blob event not happen during blob Makes abductor event happen during gang,blob or cult --- code/modules/events/abductor.dm | 2 +- code/modules/events/blob.dm | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index 7e0146a2c97..3a4aacbb116 100644 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -6,7 +6,7 @@ earliest_start = 180000 // 30 min - gamemode_blacklist = list("nuclear","wizard","cult","gang","revolution","abduction","blob") + gamemode_blacklist = list("nuclear","wizard","revolution","abduction") /datum/round_event/abductor diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index c678bdab8dc..323908775fe 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -6,6 +6,8 @@ earliest_start = 48000 // 1 hour 20 minutes + gamemode_blacklist = list("blob") // Just in case blob survives that long + /datum/round_event/blob announceWhen = 12 endWhen = 120 From 51934abbc85086aa068f32b6fb27a22ed20bcf50 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Sun, 6 Sep 2015 21:14:44 +0100 Subject: [PATCH 12/76] Reworked nuke deconstruction. New nuke sprites. More++ Changelog --- code/game/gamemodes/nuclear/nuclearbomb.dm | 129 ++++++++---------- code/game/objects/items/nuke_tools.dm | 66 ++++++--- .../items/weapons/storage/uplink_kits.dm | 1 - html/changelogs/xxalpha-n_u_c_l_e_a_r.yml | 7 + icons/mob/inhands/items_lefthand.dmi | Bin 98771 -> 99996 bytes icons/mob/inhands/items_righthand.dmi | Bin 97002 -> 98209 bytes icons/obj/machines/bignuke.dmi | Bin 4570 -> 0 bytes icons/obj/machines/nuke.dmi | Bin 2568 -> 3239 bytes icons/obj/machines/nuke_terminal.dmi | Bin 0 -> 4866 bytes icons/obj/nuke_tools.dmi | Bin 1729 -> 2480 bytes 10 files changed, 113 insertions(+), 90 deletions(-) create mode 100644 html/changelogs/xxalpha-n_u_c_l_e_a_r.yml delete mode 100644 icons/obj/machines/bignuke.dmi create mode 100644 icons/obj/machines/nuke_terminal.dmi diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 7e14fb75726..57bf264664b 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -1,8 +1,7 @@ -#define NUKESTATE_INTACT 6 -#define NUKESTATE_OPEN 5 -#define NUKESTATE_OPEN_TRAP 4 -#define NUKESTATE_WIRES_TIED 3 -#define NUKESTATE_CUT_LINES 2 +#define NUKESTATE_INTACT 5 +#define NUKESTATE_UNSCREWED 4 +#define NUKESTATE_PANEL_REMOVED 3 +#define NUKESTATE_WELDED 2 #define NUKESTATE_CORE_EXPOSED 1 #define NUKESTATE_CORE_REMOVED 0 @@ -33,21 +32,20 @@ var/bomb_set var/obj/item/nuke_core/core = null var/deconstruction_state = NUKESTATE_INTACT var/image/lights = null - var/image/panel = null var/image/interior = null - var/image/glow = null /obj/machinery/nuclearbomb/New() ..() nuke_list += src core = new /obj/item/nuke_core(src) + SSobj.processing -= core update_icon() previous_level = get_security_level() /obj/machinery/nuclearbomb/selfdestruct name = "station self-destruct terminal" desc = "For when it all gets too much to bear. Do not taunt." - icon = 'icons/obj/machines/bignuke.dmi' + icon = 'icons/obj/machines/nuke_terminal.dmi' icon_state = "nuclearbomb_base" anchored = 1 //stops it being moved layer = 4 @@ -65,67 +63,69 @@ var/bomb_set if(NUKESTATE_INTACT) if(istype(I, /obj/item/weapon/screwdriver/nuke)) playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "You start removing the front panel's screws..." - if(do_after(user, 100,target=src)) - deconstruction_state = NUKESTATE_OPEN - user << "You remove the screws and the front panel slides open." + user << "You start removing [src]'s front panel's screws..." + if(do_after(user, 60,target=src)) + deconstruction_state = NUKESTATE_UNSCREWED + user << "You remove the screws from [src]'s front panel." update_icon() return - if(NUKESTATE_OPEN,NUKESTATE_OPEN_TRAP) - if((deconstruction_state == NUKESTATE_OPEN) && istype(I, /obj/item/weapon/wirecutters)) - playsound(loc, 'sound/effects/sparks4.ogg', 100, 1) - playsound(loc, 'sound/effects/EMPulse.ogg', 100, 1) - user << "You must have cut the wrong wire!" - for(var/mob/living/L in range(5,src)) - L.irradiate(200) - deconstruction_state = NUKESTATE_OPEN_TRAP //cant cut wires no more - else - if(istype(I, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/S = I - user << "You start tying the wires..." - if(do_after(user,30,target=src)) - if(S.use(15)) - user << "You tie the wires with some cable, clearing the insides of [src]." - deconstruction_state = NUKESTATE_WIRES_TIED - update_icon() - else - user << "You need more cable to do that." - else - user << "You can't do anything with this tangle of cables in the way." - return - if(NUKESTATE_WIRES_TIED) - if(istype(I, /obj/item/weapon/pen)) - user << "You start drawing cut lines..." + if(NUKESTATE_UNSCREWED) + if(istype(I, /obj/item/weapon/crowbar)) + user << "You start removing [src]'s front panel..." + playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) if(do_after(user,30,target=src)) - user << "You draw cut lines inside [src]." - deconstruction_state = NUKESTATE_CUT_LINES + user << "You remove [src]'s front panel." + deconstruction_state = NUKESTATE_PANEL_REMOVED update_icon() return - if(NUKESTATE_CUT_LINES) + if(NUKESTATE_PANEL_REMOVED) if(istype(I, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/welder = I playsound(loc, 'sound/items/Welder.ogg', 100, 1) - user << "You start cutting into [src]'s warhead..." + user << "You start cutting [src]'s inner plate..." if(welder.remove_fuel(1,user)) - if(do_after(user,50,target=src)) - playsound(loc, 'sound/items/Deconstruct.ogg', 100, 1) - user << "You cut into [src]'s warhead. You can see the core's green glow." - deconstruction_state = NUKESTATE_CORE_EXPOSED + if(do_after(user,80,target=src)) + user << "You cut [src]'s inner plate." + deconstruction_state = NUKESTATE_WELDED update_icon() - SSobj.processing += core return + if(NUKESTATE_WELDED) + if(istype(I, /obj/item/weapon/crowbar)) + user << "You start prying off [src]'s inner plate..." + playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) + if(do_after(user,50,target=src)) + user << "You pry off [src]'s inner plate. You can see the core's green glow!" + deconstruction_state = NUKESTATE_CORE_EXPOSED + update_icon() + SSobj.processing += core if(NUKESTATE_CORE_EXPOSED) if(istype(I, /obj/item/nuke_core_container)) var/obj/item/nuke_core_container/core_box = I user << "You start loading the plutonium core into [core_box]..." if(do_after(user,50,target=src)) - if(core_box.load(core,src)) + if(core_box.load(core, user)) user << "You load the plutonium core into [core_box]." deconstruction_state = NUKESTATE_CORE_REMOVED update_icon() + core = null else user << "You fail to load the plutonium core into [core_box]. [core_box] has already been used!" return + if(istype(I, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/M = I + if(M.amount >= 20) + user << "You begin repairing [src]'s inner metal plate..." + if(do_after(user, 100, target=src)) + if(M.use(20)) + user << "You repair [src]'s inner metal plate. The radiation is contained." + deconstruction_state = NUKESTATE_PANEL_REMOVED + SSobj.processing -= core + update_icon() + else + user << "You need more metal to do that!" + else + user << "You need more metal to do that!" + return else ..() @@ -143,6 +143,7 @@ var/bomb_set if(deconstruction_state == NUKESTATE_INTACT) switch(get_nuke_state()) if(NUKE_OFF_LOCKED, NUKE_OFF_UNLOCKED) + icon_state = "nuclearbomb_base" update_icon_interior() update_icon_lights() if(NUKE_ON_TIMING) @@ -152,51 +153,39 @@ var/bomb_set overlays.Cut() icon_state = "nuclearbomb_exploding" else + icon_state = "nuclearbomb_base" update_icon_interior() update_icon_lights() /obj/machinery/nuclearbomb/proc/update_icon_interior() overlays -= interior - overlays -= glow switch(deconstruction_state) - if(NUKESTATE_OPEN_TRAP,NUKESTATE_OPEN) - glow = null + if(NUKESTATE_UNSCREWED) + interior = image(icon,"panel-unscrewed") + if(NUKESTATE_PANEL_REMOVED) interior = image(icon,"panel-removed") - if(NUKESTATE_CORE_REMOVED,NUKESTATE_CUT_LINES,NUKESTATE_WIRES_TIED) - glow = null - interior = image(icon,"wires-sorted") + if(NUKESTATE_WELDED) + interior = image(icon,"plate-welded") if(NUKESTATE_CORE_EXPOSED) - glow = image(icon,"core-exposed") - interior = image(icon,"wires-sorted") + interior = image(icon,"plate-removed") + if(NUKESTATE_CORE_REMOVED) + interior = image(icon,"core-removed") if(NUKESTATE_INTACT) - glow = null - interior = image(icon,"panel-overlay") + interior = null overlays += interior - overlays += glow /obj/machinery/nuclearbomb/proc/update_icon_lights() overlays -= lights - overlays -= panel - panel = null switch(get_nuke_state()) if(NUKE_OFF_LOCKED) - lights = image(icon,"lights-off") - if(deconstruction_state != NUKESTATE_INTACT) - panel = image(icon,"panel-removed-blue") + lights = null if(NUKE_OFF_UNLOCKED) lights = image(icon,"lights-safety") - if(deconstruction_state != NUKESTATE_INTACT) - panel = image(icon,"panel-removed-blue") if(NUKE_ON_TIMING) lights = image(icon,"lights-timing") - if(deconstruction_state != NUKESTATE_INTACT) - panel = image(icon,"panel-removed-timing") if(NUKE_ON_EXPLODING) lights = image(icon,"lights-exploding") - if(deconstruction_state != NUKESTATE_INTACT) - panel = image(icon,"panel-removed-exploding") overlays += lights - overlays += panel /obj/machinery/nuclearbomb/process() if (timing > 0) diff --git a/code/game/objects/items/nuke_tools.dm b/code/game/objects/items/nuke_tools.dm index 109985e306a..ee10b83dbc9 100644 --- a/code/game/objects/items/nuke_tools.dm +++ b/code/game/objects/items/nuke_tools.dm @@ -6,15 +6,25 @@ desc = "Extremely radioactive. Wear goggles." icon = 'icons/obj/nuke_tools.dmi' icon_state = "plutonium_core" + item_state = "plutoniumcore" var/pulse = 0 var/cooldown = 0 +/obj/item/nuke_core/New() + SSobj.processing += src + +/obj/item/nuke_core/attackby(obj/item/nuke_core_container/container, mob/user) + if(istype(container)) + container.load(src, user) + else + ..() + /obj/item/nuke_core/process() - if(cooldown < world.time - 40) + if(cooldown < world.time - 60) cooldown = world.time - for(var/mob/living/L in range(8,get_turf(src))) - var/rads = 100 - get_dist(L,src)*7 - L.irradiate(rads) + flick("plutonium_core_pulse", src) + for(var/mob/living/L in range(4,get_turf(src))) + L.irradiate(40) //nuke core box, for carrying the core /obj/item/nuke_core_container @@ -22,33 +32,51 @@ desc = "Solid container for radioactive objects." icon = 'icons/obj/nuke_tools.dmi' icon_state = "core_container_empty" + item_state = "tile" var/obj/item/nuke_core/core = null -/obj/item/nuke_core_container/proc/load(obj/item/nuke_core/ncore, obj/machinery/nuclearbomb/nuke) - if(core) +/obj/item/nuke_core_container/proc/load(obj/item/nuke_core/ncore, mob/user) + if(core || !istype(ncore)) return 0 - SSobj.processing -= ncore ncore.loc = src core = ncore - nuke.core = null icon_state = "core_container_loaded" + user << "Container is sealing..." + spawn(50) + SSobj.processing -= core + icon_state = "core_container_sealed" + playsound(loc, 'sound/items/Deconstruct.ogg', 100, 1) + if(loc == user) + user << "Container is sealed, the radiation is contained." return 1 +/obj/item/nuke_core_container/attackby(obj/item/nuke_core/core, mob/user) + if(istype(core)) + if(!user.unEquip(core)) + user << "The [core] is stuck to your hand!" + return + else + load(core, user) + else + ..() + //snowflake screwdriver, works as a key to start nuke theft, traitor only /obj/item/weapon/screwdriver/nuke name = "screwdriver" desc = "A screwdriver with an ultra thin tip." + icon = 'icons/obj/nuke_tools.dmi' + icon_state = "screwdriver_nuke" + item_state = "screwdriver_nuke" + +/obj/item/weapon/screwdriver/nuke/New() +//to skip screwdriver icon update /obj/item/weapon/paper/nuke_instructions - info = "How to break into a Nanotrasen self-destruct terminal and remove it's plutonium core:
\ + info = "How to break into a Nanotrasen self-destruct terminal and remove its plutonium core:
\