diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 38f711500ff..7b30a0bb9a6 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -54,8 +54,13 @@ var/list/uplink_items = list() var/list/excludefrom = list() //Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something. var/list/job = null var/surplus = 100 //Chance of being included in the surplus crate (when pick() selects it) + var/hijack_only = 0 //can this item be purchased only during hijackings? /datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U) + 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.") + return if(item) U.uses -= max(cost, 0) U.used_TC += cost @@ -89,15 +94,16 @@ var/list/uplink_items = list() var/obj/I = spawn_item(get_turf(user), U) - if(ishuman(user)) - var/mob/living/carbon/human/A = user - A.put_in_any_hand_if_possible(I) + if(I) + if(ishuman(user)) + var/mob/living/carbon/human/A = user + A.put_in_any_hand_if_possible(I) - if(istype(I,/obj/item/weapon/storage/box/) && I.contents.len>0) - for(var/atom/o in I) - U.purchase_log += "\icon[o]" - else - U.purchase_log += "\icon[I]" + if(istype(I,/obj/item/weapon/storage/box/) && I.contents.len>0) + for(var/atom/o in I) + U.purchase_log += "\icon[o]" + else + U.purchase_log += "\icon[I]" //U.interact(user) return 1 @@ -174,6 +180,16 @@ var/list/uplink_items = list() cost = 13 job = list("Chaplain") +/datum/uplink_item/jobspecific/artistic_toolbox + name = "Artistic Toolbox" + desc = "An accursed toolbox that grants its followers extreme power at the cost of requiring repeated sacrifices to it. If sacrifices are not provided, it will turn on its follower." + reference = "HGAT" + item = /obj/item/weapon/storage/toolbox/green/memetic + cost = 20 + job = list("Chaplain") + surplus = 0 //No lucky chances from the crate; if you get this, this is ALL you're getting + hijack_only = 1 //This is a murderbone weapon, as such, it should only be available in those scenarios. + //Janitor /datum/uplink_item/jobspecific/cautionsign diff --git a/code/game/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm new file mode 100644 index 00000000000..1b9be2bec62 --- /dev/null +++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm @@ -0,0 +1,183 @@ +/obj/item/weapon/storage/toolbox/green + name = "artistic toolbox" + desc = "A metal container designed to hold various tools. This variety holds art supplies." + icon_state = "green" + item_state = "toolbox_green" + icon = 'icons/goonstation/objects/objects.dmi' + lefthand_file = 'icons/goonstation/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi' + +/obj/item/weapon/storage/toolbox/green/memetic + name = "artistic toolbox" + desc = "His Grace." + force = 5 + throwforce = 10 + var/list/servantlinks = list() + var/hunger = 0 + var/hunger_message_level = 0 + var/original_owner = null + var/activated = 0 + var/mindless_override = 0 + +/obj/item/weapon/storage/toolbox/green/memetic/attack_hand(mob/living/carbon/user) + if(!activated) + if(ishuman(user) && !user.HasDisease(new /datum/disease/memetic_madness(0))) + activated = 1 + user.ForceContractDisease(new /datum/disease/memetic_madness(0)) + for(var/datum/disease/memetic_madness/DD in user.viruses) + DD.progenitor = src + servantlinks.Add(DD) + break + force += 4 + throwforce += 4 + user << 'sound/goonstation/effects/screech.ogg' + shake_camera(user, 20, 1) + to_chat(user, "His Grace accepts thee, spread His will! All who look close to the Enlightened may share His gifts.") + original_owner = user + return + ..() + +/obj/item/weapon/storage/toolbox/green/memetic/attackby(obj/item/I, mob/user) + if(activated) + if(istype(I, /obj/item/weapon/grab/)) + var/obj/item/weapon/grab/G = I + if(!G.affecting) + return + if(!user.HasDisease(new /datum/disease/memetic_madness(0))) + to_chat(user, "You can't seem to find the latch to open this.") + return + if(!ishuman(G.affecting) || issmall(G.affecting)) + to_chat(user, "His Grace will not accept such a meager offering!") + return + if(!mindless_override) + if(G.affecting.mind == null && G.affecting.ckey == null) + to_chat(user, "His Grace will not accept a soulless shell for an offering!") + return + if(!G.affecting.stat && !G.affecting.restrained() && !G.affecting.weakened) + to_chat(user, "They're moving too much to feed to His Grace!") + return + user.visible_message("[user] is trying to feed [G.affecting] to [src]!") + if(!do_mob(user, G.affecting, 30)) + return + G.affecting.forceMove(src) + user.visible_message("[user] has fed [G.affecting] to [src]!") + + consume(G.affecting) + qdel(G) + + to_chat(user, "You have done well...") + force += 5 + throwforce += 5 + return + + ..() + +/obj/item/weapon/storage/toolbox/green/memetic/proc/consume(mob/M) + if (!M) + return + hunger = 0 + hunger_message_level = 0 + playsound(src.loc, 'sound/goonstation/misc/burp_alien.ogg', 50, 0) + M.emote("scream") + M.death() + M.ghostize() + if(M == original_owner) + qdel(M) + var/obj/item/weapon/storage/toolbox/green/fake_toolbox = new(get_turf(src)) + fake_toolbox.desc = "It looks a lot duller than it used to." + qdel(src) + +/obj/item/weapon/storage/toolbox/green/memetic/Destroy() + for(var/mob/living/carbon/human/H in src) + H.forceMove(get_turf(src)) + visible_message("[H] bursts out of [src]!") + + for(var/A in servantlinks) + var/datum/disease/memetic_madness/D = A + if(D) + D.cure() + break + + if(servantlinks) + servantlinks.Cut() + servantlinks = null + original_owner = null + visible_message("[src] screams!") + playsound(src.loc, 'sound/goonstation/effects/screech.ogg', 100, 1) + return ..() + +/datum/disease/memetic_madness + name = "Memetic Kill Agent" + max_stages = 4 + stage_prob = 8 + spread_text = "Non-Contagious" + spread_flags = SPECIAL + cure_text = "Unknown" + viable_mobtypes = list(/mob/living/carbon/human) + severity = BIOHAZARD + disease_flags = CURABLE + spread_flags = NON_CONTAGIOUS + var/obj/item/weapon/storage/toolbox/green/memetic/progenitor = null + +/datum/disease/memetic_madness/Destroy() + progenitor = null + if(affected_mob) + affected_mob.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE + return ..() + +/datum/disease/memetic_madness/stage_act() + ..() + if(!progenitor) //if someone admin spawns this, cure it right away; this should only ever be given directly from the toolbox itself. + cure() + return + if(progenitor in affected_mob.contents) + affected_mob.adjustOxyLoss(-5) + affected_mob.adjustBruteLoss(-12) + affected_mob.adjustFireLoss(-12) + affected_mob.adjustToxLoss(-5) + var/status = CANSTUN | CANWEAKEN | CANPARALYSE + affected_mob.status_flags &= ~status + affected_mob.dizziness = max(0, affected_mob.dizziness-10) + affected_mob.drowsyness = max(0, affected_mob.drowsyness-10) + affected_mob.SetSleeping(0) + stage = 1 + switch(progenitor.hunger) + if(10 to 60) + if(progenitor.hunger_message_level < 1) + progenitor.hunger_message_level = 1 + to_chat(affected_mob, "Feed Me the unclean ones...They will be purified...") + if(61 to 120) + if(progenitor.hunger_message_level < 2) + progenitor.hunger_message_level = 2 + to_chat(affected_mob, "I hunger for the flesh of the impure...") + if(121 to 210) + if(prob(10) && progenitor.hunger_message_level < 3) + progenitor.hunger_message_level = 3 + to_chat(affected_mob, "The hunger of your Master grows with every passing moment. Feed Me at once.") + if(211 to 399) + if(progenitor.hunger_message_level < 4) + progenitor.hunger_message_level = 4 + to_chat(affected_mob, "His Grace starves in your hands. Feed Me the unclean or suffer.") + if(400 to INFINITY) + affected_mob.visible_message("[progenitor] consumes [affected_mob] whole!") + progenitor.consume(affected_mob) + return + + progenitor.hunger += min(max((progenitor.force / 10), 1), 10) + + else + affected_mob.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE + + if(stage == 4) + if(get_dist(get_turf(progenitor), get_turf(affected_mob)) <= 7) + stage = 1 + return + if(prob(4)) + to_chat(affected_mob, "You are too far from His Grace...") + affected_mob.adjustToxLoss(5) + else if(prob(6)) + to_chat(affected_mob, "You feel weak.") + affected_mob.adjustBruteLoss(5) + + if(ismob(progenitor.loc)) + progenitor.hunger++ \ No newline at end of file diff --git a/icons/goonstation/mob/inhands/items_lefthand.dmi b/icons/goonstation/mob/inhands/items_lefthand.dmi index 5702ba238c1..3982141cbd0 100644 Binary files a/icons/goonstation/mob/inhands/items_lefthand.dmi and b/icons/goonstation/mob/inhands/items_lefthand.dmi differ diff --git a/icons/goonstation/mob/inhands/items_righthand.dmi b/icons/goonstation/mob/inhands/items_righthand.dmi index 9adcb9a22e8..d3b2dc7531f 100644 Binary files a/icons/goonstation/mob/inhands/items_righthand.dmi and b/icons/goonstation/mob/inhands/items_righthand.dmi differ diff --git a/icons/goonstation/objects/objects.dmi b/icons/goonstation/objects/objects.dmi new file mode 100644 index 00000000000..41523d18541 Binary files /dev/null and b/icons/goonstation/objects/objects.dmi differ diff --git a/paradise.dme b/paradise.dme index 6e79b17f2d0..0adb0c5b5b4 100644 --- a/paradise.dme +++ b/paradise.dme @@ -859,6 +859,7 @@ #include "code\game\objects\items\weapons\implants\implantuplink.dm" #include "code\game\objects\items\weapons\melee\energy.dm" #include "code\game\objects\items\weapons\melee\misc.dm" +#include "code\game\objects\items\weapons\storage\artistic_toolbox.dm" #include "code\game\objects\items\weapons\storage\backpack.dm" #include "code\game\objects\items\weapons\storage\bags.dm" #include "code\game\objects\items\weapons\storage\belt.dm" diff --git a/sound/goonstation/effects/screech.ogg b/sound/goonstation/effects/screech.ogg new file mode 100644 index 00000000000..4a63299ea1d Binary files /dev/null and b/sound/goonstation/effects/screech.ogg differ diff --git a/sound/goonstation/misc/burp_alien.ogg b/sound/goonstation/misc/burp_alien.ogg new file mode 100644 index 00000000000..3f9bdf2ab3a Binary files /dev/null and b/sound/goonstation/misc/burp_alien.ogg differ