Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into BookClub

This commit is contained in:
Aurorablade
2016-05-21 21:59:29 -04:00
231 changed files with 3836 additions and 1842 deletions
+48 -2
View File
@@ -41,7 +41,7 @@
if(href_list["create_area"])
if(get_area_type()==AREA_SPACE)
create_area()
updateUsrDialog()
//One-use area creation permits.
@@ -77,6 +77,12 @@
icon_state = "blueprints"
fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage."
w_class = 3
var/list/showing = list()
var/client/viewing
/obj/item/areaeditor/blueprints/Destroy()
clear_viewer()
return ..()
/obj/item/areaeditor/blueprints/attack_self(mob/user as mob)
@@ -85,6 +91,11 @@
if(get_area_type() == AREA_STATION)
. += "<p>According to the [src], you are now in <b>\"[sanitize(A.name)]\"</b>.</p>"
. += "<p>You may <a href='?src=\ref[src];edit_area=1'> move an amendment</a> to the drawing.</p>"
if(!viewing)
. += "<p><a href='?src=\ref[src];view_blueprints=1'>View structural data</a></p>"
else
. += "<p><a href='?src=\ref[src];refresh=1'>Refresh structural data</a></p>"
. += "<p><a href='?src=\ref[src];hide_blueprints=1'>Hide structural data</a></p>"
var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
popup.set_content(.)
popup.open()
@@ -97,8 +108,43 @@
if(get_area_type()!=AREA_STATION)
return
edit_area()
updateUsrDialog()
if(href_list["view_blueprints"])
set_viewer(usr, "<span class='notice'>You flip the blueprints over to view the complex information diagram.</span>")
if(href_list["hide_blueprints"])
clear_viewer(usr, "<span class='notice'>You flip the blueprints over to view the simple information diagram.</span>")
if(href_list["refresh"])
clear_viewer(usr)
set_viewer(usr)
attack_self(usr)
/obj/item/areaeditor/blueprints/proc/get_images(turf/T, viewsize)
. = list()
for(var/tt in RANGE_TURFS(viewsize, T))
var/turf/TT = tt
if(TT.blueprint_data)
. += TT.blueprint_data
/obj/item/areaeditor/blueprints/proc/set_viewer(mob/user, message = "")
if(user && user.client)
if(viewing)
clear_viewer()
viewing = user.client
showing = get_images(get_turf(user), viewing.view)
viewing.images |= showing
if(message)
to_chat(user, message)
/obj/item/areaeditor/blueprints/proc/clear_viewer(mob/user, message = "")
if(viewing)
viewing.images -= showing
viewing = null
showing.Cut()
if(message)
to_chat(user, message)
/obj/item/areaeditor/blueprints/dropped(mob/user)
..()
clear_viewer()
/obj/item/areaeditor/proc/get_area()
var/turf/T = get_turf(usr)
+15 -15
View File
@@ -29,35 +29,35 @@
new /obj/item/weapon/reagent_containers/food/pill/zoom( src )
new /obj/item/weapon/reagent_containers/food/pill/zoom( src )
/obj/item/weapon/reagent_containers/food/pill/random_drugs
name = "pill"
desc = ""
desc = "A cocktail of illicit designer drugs, who knows what might be in here."
/obj/item/weapon/reagent_containers/food/pill/random_drugs/New()
..()
icon_state = "pill" + pick("2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20")
name = pick("lunar","vorpal","hardcore","willow", "void","loopy","electro", "cyber","heavy", "ninja", "hydro", "blue", "red", "green", "purple", "strong", "divine","carp" ,"deadly","dead","vicious" ,"wild" ,"demon", "chill", "solid", "liquid", "crazy", "super", "hyper", "space", "wizard", "rainbow", "star", "turbo", "prism", "sticky") + " " + pick("jack","zero","null","beat","nip","bubbles" ,"ice","medicine","venom","shock","solar" ,"spice" ,"shredder", "heart" , "heat", "pill","hopper","scum","fruit", "bolt", "deck", "butter", "runoff", "grease", "flair", "sweat", "zone", "blast")
name = "[pick_list("chemistry_tools.json", "CYBERPUNK_drug_prefixes")] [pick_list("chemistry_tools.json", "CYBERPUNK_drug_suffixes")]"
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" , "hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" ,"hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" , "hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
var/primaries = rand(1,3)
var/adulterants = rand(2,4)
while(primaries > 0)
primaries--
reagents.add_reagent(pick_list("chemistry_tools.json", "CYBERPUNK_drug_primaries"), 6)
while(adulterants > 0)
adulterants--
reagents.add_reagent(pick_list("chemistry_tools.json", "CYBERPUNK_drug_adulterants"), 3)
/obj/item/weapon/storage/pill_bottle/random_drug_bottle
name = "odd pill bottle"
desc = "You're not sure if you trust the contents of this bottle..."
name = "pill bottle (???)"
desc = "Huh."
/obj/item/weapon/storage/pill_bottle/random_drug_bottle/New()
..()
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
for(var/i in 1 to 5)
new /obj/item/weapon/reagent_containers/food/pill/random_drugs(src)
@@ -77,6 +77,11 @@
if (!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
if((HULK in H.mutations) || (H.species.flags & NOGUNS))
user << "<span class='warning'>Your fingers can't press the button!</span>"
return
add_fingerprint(user)
@@ -56,6 +56,7 @@
dir=ndir
b_stat=1
on = 0
global_intercoms.Add(src)
update_icon()
/obj/item/device/radio/intercom/department/medbay/New()
@@ -104,6 +105,7 @@
/obj/item/device/radio/intercom/Destroy()
processing_objects.Remove(src)
global_intercoms.Remove(src)
return ..()
/obj/item/device/radio/intercom/attack_ai(mob/user as mob)
@@ -422,11 +422,13 @@ var/global/list/default_medbay_channels = list(
//#### Sending the signal to all subspace receivers ####//
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
R.receive_signal(signal)
spawn(0)
R.receive_signal(signal)
// Allinone can act as receivers.
for(var/obj/machinery/telecomms/allinone/R in telecomms_list)
R.receive_signal(signal)
spawn(0)
R.receive_signal(signal)
// Receiving code can be located in Telecommunications.dm
return signal.data["done"] && position.z in signal.data["level"]
@@ -475,7 +477,8 @@ var/global/list/default_medbay_channels = list(
signal.frequency = connection.frequency // Quick frequency set
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
R.receive_signal(signal)
spawn(0)
R.receive_signal(signal)
sleep(rand(10,25)) // wait a little...
@@ -520,7 +523,7 @@ var/global/list/default_medbay_channels = list(
// what the range is in which mobs will hear the radio
// returns: -1 if can't receive, range otherwise
if (wires.IsIndexCut(WIRE_RECEIVE))
if (!wires || wires.IsIndexCut(WIRE_RECEIVE))
return -1
if(!listening)
return -1
+5
View File
@@ -161,6 +161,11 @@
desc = "A flag proudly proclaiming the superior heritage of Vulpkanin."
icon_state = "vulpflag"
/obj/item/flag/species/drask
name = "Drask flag"
desc = "A flag proudly proclaiming the superior heritage of Drask."
icon_state = "draskflag"
//Department Flags
/obj/item/flag/cargo
+2 -2
View File
@@ -166,7 +166,7 @@ var/list/tape_roll_applications = list()
/obj/item/tape/attack_hand(mob/user as mob)
if (user.a_intent == I_HELP && src.allowed(user))
user.show_viewers("\blue [user] lifts [src], allowing passage.")
user.visible_message("<span class=notice>[user] lifts [src], allowing passage.</span>", "<span class=notice>You lift [src], allowing passage.</span>")
src.density = 0
spawn(200)
src.density = 1
@@ -180,7 +180,7 @@ var/list/tape_roll_applications = list()
if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user))))
to_chat(user, "You can't break the [src] with that!")
return
user.show_viewers("\blue [user] breaks the [src]!")
user.visible_message("<span class=warning>[user] breaks the [src]!</span>", "<span class=warning>You break the [src]!</span>")
var/dir[2]
var/icon_dir = src.icon_state
+3
View File
@@ -949,6 +949,9 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/plushie/attack(mob/M as mob, mob/user as mob)
playsound(loc, poof_sound, 20, 1) // Play the whoosh sound in local area
if(iscarbon(M))
if(prob(10))
M.reagents.add_reagent("hugs", 10)
return ..()
/obj/item/toy/plushie/attack_self(mob/user as mob)
+41 -18
View File
@@ -7,62 +7,85 @@
w_class = 1.0
desc = "This is rubbish."
raisins
/obj/item/trash/raisins
name = "4no raisins"
icon_state= "4no_raisins"
candy
/obj/item/trash/candy
name = "Candy"
icon_state= "candy"
cheesie
/obj/item/trash/cheesie
name = "Cheesie honkers"
icon_state = "cheesie_honkers"
chips
/obj/item/trash/chips
name = "Chips"
icon_state = "chips"
popcorn
/obj/item/trash/popcorn
name = "Popcorn"
icon_state = "popcorn"
sosjerky
/obj/item/trash/sosjerky
name = "Scaredy's Private Reserve Beef Jerky"
icon_state = "sosjerky"
syndi_cakes
/obj/item/trash/syndi_cakes
name = "Syndi cakes"
icon_state = "syndi_cakes"
waffles
/obj/item/trash/waffles
name = "Waffles"
icon_state = "waffles"
plate
/obj/item/trash/plate
name = "Plate"
icon_state = "plate"
snack_bowl
/obj/item/trash/snack_bowl
name = "Snack bowl"
icon_state = "snack_bowl"
pistachios
/obj/item/trash/pistachios
name = "Pistachios pack"
icon_state = "pistachios_pack"
semki
/obj/item/trash/semki
name = "Semki pack"
icon_state = "semki_pack"
tray
/obj/item/trash/tray
name = "Tray"
icon_state = "tray"
candle
/obj/item/trash/candle
name = "candle"
icon = 'icons/obj/candle.dmi'
icon_state = "candle4"
liquidfood
/obj/item/trash/liquidfood
name = "\improper \"LiquidFood\" ration"
icon_state = "liquidfood"
can
/obj/item/trash/can
name = "crushed can"
icon_state = "cola"
gum
/obj/item/trash/gum
name = "chewed gum"
desc = "NOT free candy."
icon_state = "gum"
tastybread
/obj/item/trash/tastybread
name = "bread tube"
icon_state = "tastybread"
/obj/item/trash/tapetrash
name = "old duct tape"
icon_state = "tape"
desc = "Not sticky anymore."
throw_range = 1
/obj/item/trash/attack(mob/M as mob, mob/living/user as mob)
return
+86 -5
View File
@@ -74,6 +74,12 @@ RCD
src.spark_system.start()
return
if(3)
mode = 4
to_chat(user, "<span class='notice'>Changed mode to 'Windows'</span>")
if(prob(20))
src.spark_system.start()
return
if(4)
mode = 1
to_chat(user, "<span class='notice'>Changed mode to 'Floor & Walls'</span>")
if(prob(20))
@@ -88,7 +94,7 @@ RCD
if(!proximity) return
if(istype(A,/area/shuttle)||istype(A,/turf/space/transit))
return 0
if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock)))
if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/window)))
return 0
switch(mode)
@@ -97,7 +103,8 @@ RCD
if(useResource(1, user))
to_chat(user, "Building Floor...")
activate()
A:ChangeTurf(/turf/simulated/floor/plating)
var/turf/AT = A
AT.ChangeTurf(/turf/simulated/floor/plating)
return 1
return 0
@@ -108,7 +115,8 @@ RCD
if(do_after(user, 20, target = A))
if(!useResource(3, user)) return 0
activate()
A:ChangeTurf(/turf/simulated/wall)
var/turf/AT = A
AT.ChangeTurf(/turf/simulated/wall)
return 1
return 0
@@ -136,7 +144,8 @@ RCD
if(do_after(user, 40, target = A))
if(!useResource(5, user)) return 0
activate()
A:ChangeTurf(/turf/simulated/floor/plating)
var/turf/AT = A
AT.ChangeTurf(/turf/simulated/floor/plating)
return 1
return 0
@@ -147,7 +156,8 @@ RCD
if(do_after(user, 50, target = A))
if(!useResource(5, user)) return 0
activate()
A:ChangeTurf(/turf/space)
var/turf/AT = A
AT.ChangeTurf(/turf/space)
return 1
return 0
@@ -161,7 +171,78 @@ RCD
qdel(A)
return 1
return 0
if(istype(A, /obj/structure/window)) // You mean the grille of course, do you?
A = locate(/obj/structure/grille) in A.loc
if(istype(A, /obj/structure/grille))
if(!checkResource(2, user))
return 0
to_chat(user, "Deconstructing window...")
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
if(!do_after(user, 20, target = A))
return 0
if(locate(/obj/structure/window/full/shuttle) in A.contents)
return 0 // Let's not give shuttle-griefers an easy time.
if(!useResource(2, user))
return 0
activate()
var/turf/T1 = get_turf(A)
qdel(A)
A = null
for(var/obj/structure/window/W in T1.contents)
W.disassembled = 1
W.density = 0
qdel(W)
for(var/cdir in cardinal)
var/turf/T2 = get_step(T1, cdir)
if(locate(/obj/structure/window/full/shuttle) in T2.contents)
continue // Shuttle windows? Nah. We don't need extra windows there.
if(!(locate(/obj/structure/grille) in T2.contents))
continue
for(var/obj/structure/window/W in T2.contents)
if(W.dir == turn(cdir, 180))
W.disassembled = 1
W.density = 0
qdel(W)
var/obj/structure/window/reinforced/W = new(T2)
W.dir = turn(cdir, 180)
return 1
return 0
if(4)
if(istype(A, /turf/simulated/floor))
if(locate(/obj/structure/grille) in contents)
return 0 // We already have window
if(!checkResource(2, user))
return 0
to_chat(user, "Constructing window...")
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
if(!do_after(user, 20, target = A))
return 0
if(locate(/obj/structure/grille) in A.contents)
return 0 // We already have window
if(!useResource(2, user))
return 0
activate()
new /obj/structure/grille(A)
for(var/obj/structure/window/W in contents)
W.disassembled = 1 // Prevent that annoying glass breaking sound
W.density = 0
qdel(W)
for(var/cdir in cardinal)
var/turf/T = get_step(A, cdir)
if(locate(/obj/structure/grille) in T.contents)
for(var/obj/structure/window/W in T.contents)
if(W.dir == turn(cdir, 180))
W.disassembled = 1
W.density = 0
qdel(W)
else // Build a window!
var/obj/structure/window/reinforced/W = new(A)
W.dir = cdir
var/turf/AT = A
AT.ChangeTurf(/turf/simulated/floor/plating) // Platings go under windows.
return 1
else
to_chat(user, "ERROR: RCD in MODE: [mode] attempted use by [user]. Send this text #coderbus or an admin.")
return 0
@@ -0,0 +1,79 @@
/obj/item/weapon/bee_briefcase
name = "briefcase"
desc = "This briefcase has easy-release clasps and smells vaguely of honey and blood..."
icon = 'icons/obj/storage.dmi'
icon_state = "briefcase"
item_state = "briefcase"
flags = CONDUCT
hitsound = "swing_hit"
force = 10
throw_speed = 2
throw_range = 4
w_class = 4
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
var/bees_left = 10
var/list/blood_list = list()
var/sound_file = 'sound/misc/briefcase_bees.ogg'
var/next_sound = 0
/obj/item/weapon/bee_briefcase/examine(mob/user)
..()
if(loc == user)
if(bees_left)
to_chat(user, "<span class='warning'>There are [bees_left] bees still inside in briefcase!</span>")
else
to_chat(user, "<span class='danger'>The bees are gone... Colony collapse disorder?</span>")
/obj/item/weapon/bee_briefcase/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/reagent_containers/syringe))
var/obj/item/weapon/reagent_containers/syringe/S = I
if(!bees_left)
to_chat(user, "<span class='warning'>The briefcase is empty, so there is no point in injecting something into it.</span>")
return
if(S.reagents && S.reagents.total_volume)
to_chat(user, "<span class='notice'>You inject [src] with [S].</span>")
for(var/datum/reagent/A in S.reagents.reagent_list)
if(A.id == "blood")
if(!(A.data["donor"] in blood_list))
blood_list += A.data["donor"]
if(A.id == "strange_reagent") //RELOAD THE BEES (1 bee per 1 unit, max 15 bees)
if(bees_left < 15)
bees_left = min(15, round((bees_left + A.volume), 1)) //No partial bees, max 15 bees in case at any given time
to_chat(user, "<span class='warning'>The buzzing inside the briefcase intensifies as new bees form inside.</span>")
else
to_chat(user, "<span class='warning'>The buzzing inside the briefcase swells momentarily, then returns to normal. Guess it was too cramped...</span>")
S.reagents.clear_reagents()
S.update_icon()
else if(istype(I, /obj/item/weapon/plantspray))
var/obj/item/weapon/plantspray/PS = I
user.drop_item(PS)
bees_left = max(0, (bees_left - PS.pest_kill_str))
to_chat(user, "You spray [PS] into \the [src].")
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
qdel(PS)
/obj/item/weapon/bee_briefcase/attack_self(mob/user as mob)
if(!bees_left)
to_chat(user, "<span class='danger'>The lack of all and any bees at this event has been somewhat of a let-down...</span>")
return
else
if(world.time >= next_sound) //This cooldown doesn't prevent us from releasing bees, just stops the sound
next_sound = world.time + 90
//Play sound through the station intercomms, so everyone knows the doom you have wrought.
for(var/O in global_intercoms)
var/obj/item/device/radio/intercom/I = O
if(I.z != ZLEVEL_STATION) //Only broadcast to the station intercoms
continue
if(!I.on) //Only broadcast to active intercoms (powered, switched on)
continue
playsound(I, sound_file, 35)
//Release up to 5 bees per use. Without using strange reagent, that means two uses. WITH strange reagent, you can get more if you don't release the last bee
for(var/bee = min(5, bees_left), bee > 0, bee--)
var/mob/living/simple_animal/hostile/poison/bees/syndi/B = new /mob/living/simple_animal/hostile/poison/bees/syndi(null)
B.master_and_friends = blood_list //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood
B.forceMove(get_turf(user)) //RELEASE THE BEES!
bees_left -= 5
@@ -39,6 +39,12 @@
//So this is a workaround. This also makes more sense from an IC standpoint. ~Carn
if(user.client && (target in user.client.screen))
to_chat(user, "<span class='notice'>You need to take that [target.name] off before cleaning it.</span>")
else if(target == user && user.a_intent == I_GRAB && ishuman(target))
var/mob/living/carbon/human/muncher = user
if(muncher && muncher.get_species() == "Drask")
to_chat(user, "You take a bite of the [src.name]. Delicious!")
playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0)
user.nutrition += 2
else if(istype(target,/obj/effect/decal/cleanable))
user.visible_message("<span class='warning'>[user] begins to scrub \the [target.name] out with [src].</span>")
if(do_after(user, src.cleanspeed, target = target) && target)
+9 -9
View File
@@ -91,16 +91,16 @@
/obj/item/weapon/razor/attack(mob/living/carbon/M as mob, mob/user as mob)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/C = H.organs_by_name["head"]
var/obj/item/organ/external/head/C = H.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[C.model]
if(user.zone_sel.selecting == "mouth")
if(!get_location_accessible(H, "mouth"))
to_chat(user, "<span class='warning'>The mask is in the way.</span>")
return
if((H.species && H.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
if((C.species && C.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
to_chat(user, "<span class='warning'>You find yourself disappointed at the appalling lack of facial hair.</span>")
return
if(H.f_style == "Shaved")
if(C.f_style == "Shaved")
to_chat(user, "<span class='notice'>Already clean-shaven.</span>")
return
if(H == user) //shaving yourself
@@ -109,7 +109,7 @@
if(do_after(user, 50, target = H))
user.visible_message("<span class='notice'>[user] shaves his facial hair clean with the [src].</span>", \
"<span class='notice'>You finish shaving with the [src]. Fast and clean!</span>")
H.f_style = "Shaved"
C.f_style = "Shaved"
H.update_fhair()
playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
else
@@ -121,17 +121,17 @@
if(user_loc == user.loc && H_loc == H.loc)
user.visible_message("<span class='danger'>[user] shaves off [H]'s facial hair with \the [src].</span>", \
"<span class='notice'>You shave [H]'s facial hair clean off.</span>")
H.f_style = "Shaved"
C.f_style = "Shaved"
H.update_fhair()
playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
if(user.zone_sel.selecting == "head")
if(!get_location_accessible(H, "head"))
to_chat(user, "<span class='warning'>The headgear is in the way.</span>")
return
if((H.species && H.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
if((C.species && C.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
to_chat(user, "<span class='warning'>You find yourself disappointed at the appalling lack of hair.</span>")
return
if(H.h_style == "Bald" || H.h_style == "Balding Hair" || H.h_style == "Skinhead")
if(C.h_style == "Bald" || C.h_style == "Balding Hair" || C.h_style == "Skinhead")
to_chat(user, "<span class='notice'>There is not enough hair left to shave...</span>")
return
if(H == user) //shaving yourself
@@ -140,7 +140,7 @@
if(do_after(user, 50, target = H))
user.visible_message("<span class='notice'>[user] shaves his head with the [src].</span>", \
"<span class='notice'>You finish shaving with the [src].</span>")
H.h_style = "Skinhead"
C.h_style = "Skinhead"
H.update_hair()
playsound(src.loc, 'sound/items/Welder2.ogg', 40, 1)
else
@@ -152,7 +152,7 @@
if(user_loc == user.loc && H_loc == H.loc)
user.visible_message("<span class='danger'>[user] shaves [H]'s head bald with \the [src]!</span>", \
"<span class='warning'>You shave [H]'s head bald.</span>")
H.h_style = "Skinhead"
C.h_style = "Skinhead"
H.update_hair()
playsound(src.loc, 'sound/items/Welder2.ogg', 40, 1)
else
@@ -458,11 +458,11 @@
New()
..()
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
B1.reagents.add_reagent("fluorosurfactant", 40)
B2.reagents.add_reagent("water", 40)
B2.reagents.add_reagent("cleaner", 60)
B2.reagents.add_reagent("cleaner", 10)
B2.reagents.add_reagent("water", 40) //when you make pre-designed foam reactions that carry the reagents, always add water last
beakers += B1
beakers += B2
+12 -11
View File
@@ -30,21 +30,21 @@
//this is largely copypasted from there.
//handle facial hair (if necessary)
var/list/species_facial_hair = list()
var/obj/item/organ/external/head/C = H.organs_by_name["head"]
var/obj/item/organ/external/head/C = H.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[C.model]
if(H.gender == MALE || H.get_species() == "Vulpkanin")
if(H.species)
if(C.species)
for(var/i in facial_hair_styles_list)
var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i]
if(H.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
if(H.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(C.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
if(C.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(robohead.is_monitor)
to_chat(user, "<span class='warning'>You are unable to find anything on [H]'s face worth cutting. How disappointing.</span>")
return
continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_facial_hair += i
else
if(H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(C.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(!robohead.is_monitor)
if("Human" in tmp_facial.species_allowed)
species_facial_hair += i
@@ -56,18 +56,18 @@
var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair
//handle normal hair
var/list/species_hair = list()
if(H.species)
if(C.species)
for(var/i in hair_styles_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i]
if(H.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
if(H.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(C.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
if(C.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(robohead.is_monitor)
to_chat(user, "<span class='warning'>You are unable to find anything on [H]'s head worth cutting. How disappointing.</span>")
return
continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_hair += i
else
if(H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(C.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(!robohead.is_monitor)
if("Human" in tmp_hair.species_allowed)
species_hair += i
@@ -84,11 +84,12 @@
user.visible_message("<span class='notice'>[user] stops cutting [M]'s hair.</span>", "<span class='notice'>You stop cutting [M]'s hair.</span>")
return
if(f_new_style)
H.f_style = f_new_style
C.f_style = f_new_style
if(h_new_style)
H.h_style = h_new_style
C.h_style = h_new_style
H.update_hair()
H.update_fhair()
user.visible_message("<span class='notice'>[user] finishes cutting [M]'s hair!</span>")
/obj/item/weapon/scissors/safety //Totally safe, I assure you.
@@ -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, "<i><b><font face = Tempus Sans ITC>His Grace accepts thee, spread His will! All who look close to the Enlightened may share His gifts.</font></b></i>")
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, "<span class='warning'>You can't seem to find the latch to open this.</span>")
return
if(!ishuman(G.affecting) || issmall(G.affecting))
to_chat(user, "<span class='warning'>His Grace will not accept such a meager offering!</span>")
return
if(!mindless_override)
if(G.affecting.mind == null && G.affecting.ckey == null)
to_chat(user, "<span class='warning'>His Grace will not accept a soulless shell for an offering!</span>")
return
if(!G.affecting.stat && !G.affecting.restrained() && !G.affecting.weakened)
to_chat(user, "<span class='warning'>They're moving too much to feed to His Grace!</span>")
return
user.visible_message("<span class='userdanger'>[user] is trying to feed [G.affecting] to [src]!</span>")
if(!do_mob(user, G.affecting, 30))
return
G.affecting.forceMove(src)
user.visible_message("<span class='userdanger'>[user] has fed [G.affecting] to [src]!</span>")
consume(G.affecting)
qdel(G)
to_chat(user, "<i><b><font face = Tempus Sans ITC>You have done well...</font></b></i>")
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("<span class='warning'>[H] bursts out of [src]!</span>")
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("<span class='userdanger'>[src] screams!</span>")
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, "<i><b><font face = Tempus Sans ITC>Feed Me the unclean ones...They will be purified...</font></b></i>")
if(61 to 120)
if(progenitor.hunger_message_level < 2)
progenitor.hunger_message_level = 2
to_chat(affected_mob, "<i><b><font face = Tempus Sans ITC>I hunger for the flesh of the impure...</font></b></i>")
if(121 to 210)
if(prob(10) && progenitor.hunger_message_level < 3)
progenitor.hunger_message_level = 3
to_chat(affected_mob, "<i><b><font face = Tempus Sans ITC>The hunger of your Master grows with every passing moment. Feed Me at once.</font></b></i>")
if(211 to 399)
if(progenitor.hunger_message_level < 4)
progenitor.hunger_message_level = 4
to_chat(affected_mob, "<i><b><font face = Tempus Sans ITC>His Grace starves in your hands. Feed Me the unclean or suffer.</font></b></i>")
if(400 to INFINITY)
affected_mob.visible_message("<span class='userdanger'>[progenitor] consumes [affected_mob] whole!</span>")
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, "<span class='danger'>You are too far from His Grace...</span>")
affected_mob.adjustToxLoss(5)
else if(prob(6))
to_chat(affected_mob, "<span class='danger'>You feel weak.</span>")
affected_mob.adjustBruteLoss(5)
if(ismob(progenitor.loc))
progenitor.hunger++
@@ -15,6 +15,11 @@
materials = list(MAT_METAL=4000)
flags = CONDUCT
attack_verb = list("slammed", "bashed", "battered", "bludgeoned", "thrashed", "whacked")
var/upgradable = 1
var/result = /obj/structure/table
var/parts = list(
/obj/item/stack/sheet/metal,
/obj/item/stack/sheet/metal)
/obj/item/weapon/table_parts/reinforced
name = "reinforced table parts"
@@ -23,18 +28,33 @@
icon_state = "reinf_tableparts"
materials = list(MAT_METAL=8000)
flags = CONDUCT
upgradable = 0
result = /obj/structure/table/reinforced
parts = list(
/obj/item/stack/sheet/metal,
/obj/item/stack/rods)
/obj/item/weapon/table_parts/wood
name = "wooden table parts"
desc = "Keep away from fire."
icon_state = "wood_tableparts"
flags = null
upgradable = 0
result = /obj/structure/table/woodentable
parts = list(
/obj/item/stack/sheet/wood,
/obj/item/stack/sheet/wood)
/obj/item/weapon/table_parts/glass
name = "glass table parts"
desc = "fragile!"
icon_state = "glass_tableparts"
flags = null
upgradable = 0
result = /obj/structure/glasstable_frame
parts = list(
/obj/item/stack/sheet/metal,
/obj/item/stack/sheet/metal)
/obj/item/weapon/rack_parts
name = "rack parts"
@@ -49,71 +69,27 @@
*/
/obj/item/weapon/table_parts/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/metal( user.loc )
new /obj/item/stack/sheet/metal( user.loc )
//SN src = null
if(istype(W, /obj/item/weapon/wrench))
for(var/p in parts)
new p(user.loc)
qdel(src)
if (istype(W, /obj/item/stack/rods))
if (W:amount >= 4)
new /obj/item/weapon/table_parts/reinforced( user.loc )
to_chat(user, "\blue You reinforce the [name].")
W:use(4)
else if(upgradable && istype(W, /obj/item/stack/rods))
var/obj/item/stack/rods/R = W
if(R.amount >= 4)
new /obj/item/weapon/table_parts/reinforced(user.loc)
to_chat(user, "<span class=notice>You reinforce the [name].</span>")
R.use(4)
qdel(src)
else if (W:amount < 4)
to_chat(user, "\red You need at least four rods to do this.")
else
to_chat(user, "<span class=warning>You need at least four rods to do this.</span>")
/obj/item/weapon/table_parts/attack_self(mob/user as mob)
new /obj/structure/table( user.loc )
for(var/obj/structure/table/T in user.loc)
to_chat(user, "<span class=warning>You can't build tables on top of tables!</span>")
return
new result(user.loc)
user.drop_item()
qdel(src)
return
/*
* Reinforced Table Parts
*/
/obj/item/weapon/table_parts/reinforced/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/metal( user.loc )
new /obj/item/stack/rods( user.loc )
qdel(src)
/obj/item/weapon/table_parts/reinforced/attack_self(mob/user as mob)
new /obj/structure/table/reinforced( user.loc )
user.drop_item()
qdel(src)
return
/*
* Wooden Table Parts
*/
/obj/item/weapon/table_parts/wood/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
qdel(src)
/obj/item/weapon/table_parts/wood/attack_self(mob/user as mob)
new /obj/structure/table/woodentable( user.loc )
user.drop_item()
qdel(src)
return
/*
* Glass Table Parts
*/
/obj/item/weapon/table_parts/glass/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/metal( user.loc )
new /obj/item/stack/sheet/metal( user.loc )
qdel(src)
/obj/item/weapon/table_parts/glass/attack_self(mob/user as mob)
new /obj/structure/glasstable_frame( user.loc )
user.drop_item()
qdel(src)
return
/*
* Rack Parts
@@ -121,14 +97,11 @@
/obj/item/weapon/rack_parts/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/metal( user.loc )
new /obj/item/stack/sheet/metal(user.loc)
qdel(src)
return
return
/obj/item/weapon/rack_parts/attack_self(mob/user as mob)
var/obj/structure/rack/R = new /obj/structure/rack( user.loc )
var/obj/structure/rack/R = new /obj/structure/rack(user.loc)
R.add_fingerprint(user)
user.drop_item()
qdel(src)
return
qdel(src)
+30 -1
View File
@@ -12,6 +12,35 @@
update_icon()
/obj/item/stack/tape_roll/attack(mob/living/carbon/human/M as mob, mob/living/user as mob)
if(M.wear_mask)
to_chat(user, "Remove their mask first!")
else if(amount < 2)
to_chat(user, "You'll need more tape for this!")
else if(!M.check_has_mouth())
to_chat(user, "They have no mouth to tape over!")
else
if(M == user)
to_chat(user, "You try to tape your own mouth shut.")
else
to_chat(user, "You try to tape [M]'s mouth shut.")
M.visible_message("<span class='warning'>[user] tries to tape [M]'s mouth closed!</span>")
if(do_after(user, 50, target = M))
if(M == user)
to_chat(user, "You cover your own mouth with a piece of duct tape.")
else
to_chat(user, "You cover [M]'s mouth with a piece of duct tape. That will shut them up!")
M.visible_message("<span class='warning'>[user] tapes [M]'s mouth shut!</span>")
var/obj/item/clothing/mask/muzzle/G = new /obj/item/clothing/mask/muzzle/tapegag
M.equip_to_slot(G, slot_wear_mask)
G.add_fingerprint(user)
amount = amount - 2
if(amount <= 0)
user.unEquip(src, 1)
qdel(src)
/* -- Disabled for now until it has a use --
/obj/item/stack/tape_roll/attack_self(mob/user as mob)
to_chat(user, "You remove a length of tape from [src].")
@@ -110,4 +139,4 @@
if(dir_offset & NORTH)
pixel_y += 32
else if(dir_offset & SOUTH)
pixel_y -= 32
pixel_y -= 32