diff --git a/code/datums/action.dm b/code/datums/action.dm index f941a00a54..ede0fa75a2 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -344,6 +344,19 @@ /datum/action/item_action/change name = "Change" +/datum/action/item_action/nano_picket_sign + name = "Retext Nano Picket Sign" + var/obj/item/picket_sign/S + +/datum/action/item_action/nano_picket_sign/New(Target) + ..() + if(istype(Target, /obj/item/picket_sign)) + S = Target + +/datum/action/item_action/nano_picket_sign/Trigger() + if(istype(S)) + S.retext(owner) + /datum/action/item_action/adjust /datum/action/item_action/adjust/New(Target) diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index a3ad685406..0277ec5371 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -8,7 +8,6 @@ var/colour = "red" var/open = FALSE - /obj/item/lipstick/purple name = "purple lipstick" colour = "purple" @@ -22,7 +21,6 @@ name = "black lipstick" colour = "black" - /obj/item/lipstick/random name = "lipstick" icon_state = "random_lipstick" @@ -33,8 +31,6 @@ colour = pick("red","purple","lime","black","green","blue","white") name = "[colour] lipstick" - - /obj/item/lipstick/attack_self(mob/user) cut_overlays() to_chat(user, "You twist \the [src] [open ? "closed" : "open"].") @@ -103,7 +99,6 @@ else ..() - /obj/item/razor name = "electric razor" desc = "The latest and greatest power razor born from the science of shaving." @@ -112,7 +107,6 @@ flags_1 = CONDUCT_1 w_class = WEIGHT_CLASS_TINY - /obj/item/razor/proc/shave(mob/living/carbon/human/H, location = "mouth") if(location == "mouth") H.facial_hair_style = "Shaved" diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 8baeee3550..2b3f8f42a0 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -125,14 +125,14 @@ loadedWeightClass += I.w_class return TRUE -/obj/item/pneumatic_cannon/afterattack(atom/target, mob/living/carbon/human/user, flag, params) +/obj/item/pneumatic_cannon/afterattack(atom/target, mob/living/user, flag, params) if(flag && user.a_intent == INTENT_HARM) //melee attack return if(!istype(user)) return Fire(user, target) -/obj/item/pneumatic_cannon/proc/Fire(mob/living/carbon/human/user, var/atom/target) +/obj/item/pneumatic_cannon/proc/Fire(mob/living/user, var/atom/target) if(!istype(user) && !target) return var/discharge = 0 @@ -147,9 +147,16 @@ if(tank && !tank.air_contents.remove(gasPerThrow * pressureSetting)) to_chat(user, "\The [src] lets out a weak hiss and doesn't react!") return +<<<<<<< HEAD if(user.disabilities & CLUMSY && prob(75) && clumsyCheck) user.visible_message("[user] loses their grip on [src], causing it to go off!", "[src] slips out of your hands and goes off!") user.dropItemToGround(src, TRUE) +======= + if(user.has_disability(CLUMSY) && prob(75) && clumsyCheck && iscarbon(user)) + var/mob/living/carbon/C = user + C.visible_message("[C] loses their grip on [src], causing it to go off!", "[src] slips out of your hands and goes off!") + C.dropItemToGround(src, TRUE) +>>>>>>> 6ce550d... Clownborgs (#33590) if(prob(10)) target = get_turf(user) else @@ -163,9 +170,10 @@ var/turf/T = get_target(target, get_turf(src)) playsound(src.loc, 'sound/weapons/sonic_jackhammer.ogg', 50, 1) fire_items(T, user) - if(pressureSetting >= 3 && user) - user.visible_message("[user] is thrown down by the force of the cannon!", "[src] slams into your shoulder, knocking you down!") - user.Knockdown(60) + if(pressureSetting >= 3 && iscarbon(user)) + var/mob/living/carbon/C = user + C.visible_message("[C] is thrown down by the force of the cannon!", "[src] slams into your shoulder, knocking you down!") + C.Knockdown(60) /obj/item/pneumatic_cannon/proc/fire_items(turf/target, mob/user) if(fire_mode == PCANNON_FIREALL) @@ -271,3 +279,10 @@ selfcharge = TRUE charge_type = /obj/item/reagent_containers/food/snacks/pie/cream maxWeightClass = 60 //20 pies. + +/obj/item/pneumatic_cannon/pie/selfcharge/cyborg + name = "low velocity pie cannon" + automatic = FALSE + charge_type = /obj/item/reagent_containers/food/snacks/pie/cream/nostun + maxWeightClass = 6 //2 pies + charge_ticks = 2 //4 second/pie diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index d2f1d2a31b..6c1cf93295 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -355,6 +355,9 @@ var/hitdamage = 0 var/emaggedhitdamage = 3 +/obj/item/borg/lollipop/clown + emaggedhitdamage = 0 + /obj/item/borg/lollipop/equipped() check_amount() diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm index 350daa0fc3..65716f2f30 100644 --- a/code/game/objects/items/signs.dm +++ b/code/game/objects/items/signs.dm @@ -10,13 +10,23 @@ var/label = "" var/last_wave = 0 +/obj/item/picket_sign/cyborg + name = "metallic nano-sign" + desc = "A high tech picket sign used by silicons that can reprogram its surface at will. Probably hurts to get hit by, too." + force = 13 + resistance_flags = NONE + actions_types = list(/datum/action/item_action/nano_picket_sign) + +/obj/item/picket_sign/proc/retext(mob/user) + var/txt = stripped_input(user, "What would you like to write on the sign?", "Sign Label", null , 30) + if(txt && Adjacent(user)) + label = txt + name = "[label] sign" + desc = "It reads: [label]" + /obj/item/picket_sign/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pen) || istype(W, /obj/item/toy/crayon)) - var/txt = stripped_input(user, "What would you like to write on the sign?", "Sign Label", null , 30) - if(txt) - label = txt - src.name = "[label] sign" - desc = "It reads: [label]" + retext(user) else return ..() diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 977bd60da1..1ec5bb3499 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -27,6 +27,7 @@ list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2) tastes = list("pie" = 1) foodtype = GRAIN | DAIRY | SUGAR + var/stunning = TRUE /obj/item/reagent_containers/food/snacks/pie/cream/throw_impact(atom/hit_atom) . = ..() @@ -46,15 +47,18 @@ creamoverlay.icon_state = "creampie_lizard" else creamoverlay.icon_state = "creampie_human" - H.Knockdown(20) //splat! + if(stunning) + H.Knockdown(20) //splat! H.adjust_blurriness(1) H.visible_message("[H] is creamed by [src]!", "You've been creamed by [src]!") playsound(H, "desceration", 50, TRUE) - if (!H.creamed) // one layer at a time + if(!H.creamed) // one layer at a time H.add_overlay(creamoverlay) H.creamed = TRUE qdel(src) +/obj/item/reagent_containers/food/snacks/pie/cream/nostun + stunning = FALSE /obj/item/reagent_containers/food/snacks/pie/berryclafoutis name = "berry clafoutis" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index db10f4a81c..4f4c364fe8 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -827,6 +827,9 @@ /mob/living/silicon/robot/modules/security set_module = /obj/item/robot_module/security +/mob/living/silicon/robot/modules/clown + set_module = /obj/item/robot_module/clown + /mob/living/silicon/robot/modules/peacekeeper set_module = /obj/item/robot_module/peacekeeper diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 26e455106b..2f1eb7d378 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -513,6 +513,37 @@ if(CL) CL.reagents.add_reagent("lube", 2 * coeff) +/obj/item/robot_module/clown + name = "Clown" + basic_modules = list( + /obj/item/device/assembly/flash/cyborg, + /obj/item/toy/crayon/rainbow, + /obj/item/device/instrument/bikehorn, + /obj/item/stamp/clown, + /obj/item/bikehorn, + /obj/item/bikehorn/airhorn, + /obj/item/paint/anycolor, + /obj/item/soap/nanotrasen, + /obj/item/pneumatic_cannon/pie/selfcharge/cyborg, + /obj/item/razor, //killbait material + /obj/item/lipstick/purple, + /obj/item/reagent_containers/spray/waterflower/cyborg, + /obj/item/borg/cyborghug/peacekeeper, + /obj/item/borg/lollipop/clown, + /obj/item/picket_sign/cyborg, + /obj/item/reagent_containers/borghypo/clown, + /obj/item/extinguisher/mini) + emag_modules = list( + /obj/item/reagent_containers/borghypo/clown/hacked, + /obj/item/reagent_containers/spray/waterflower/cyborg/hacked) + ratvar_modules = list( + /obj/item/clockwork/slab/cyborg, + /obj/item/clockwork/weapon/ratvarian_spear, + /obj/item/clockwork/replica_fabricator/cyborg) + moduleselect_icon = "service" + cyborg_base_icon = "clown" + hat_offset = -2 + /obj/item/robot_module/butler name = "Service" basic_modules = list( diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index b62afb80c0..e3de96e0b4 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -172,6 +172,22 @@ M.emote("laugh") ..() +/datum/reagent/consumable/superlaughter + name = "Super Laughter" + id = "superlaughter" + description = "Funny until you're the one laughing." + metabolization_rate = 1.5 * REAGENTS_METABOLISM + color = "#FF4DD2" + taste_description = "laughter" + +/datum/reagent/consumable/superlaughter/on_mob_life(mob/living/carbon/M) + if(!iscarbon(M)) + return + if(prob(30)) + M.visible_message("[M] bursts out into a fit of uncontrollable laughter!", "You burst out in a fit of uncontrollable laughter!") + M.Stun(5) + ..() + /datum/reagent/consumable/potato_juice name = "Potato Juice" id = "potato" diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 0a99d9da6e..e736c344db 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -130,6 +130,18 @@ Borg Hypospray reagent_ids = list ("facid", "mutetoxin", "cyanide", "sodium_thiopental", "heparin", "lexorin") accepts_reagent_upgrades = FALSE +/obj/item/reagent_containers/borghypo/clown + name = "laughter injector" + desc = "Keeps the crew happy and productive!" + reagent_ids = list("laughter") + accepts_reagent_upgrades = FALSE + +/obj/item/reagent_containers/borghypo/clown/hacked + name = "laughter injector" + desc = "Keeps the crew so happy they don't work!" + reagent_ids = list("superlaughter") + accepts_reagent_upgrades = FALSE + /obj/item/reagent_containers/borghypo/syndicate name = "syndicate cyborg hypospray" desc = "An experimental piece of Syndicate technology used to produce powerful restorative nanites used to very quickly restore injuries of all types. Also metabolizes potassium iodide, for radiation poisoning, and morphine, for offense." diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 2e34e39f8f..f79418eee5 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -18,16 +18,16 @@ var/spray_range = 3 //the range of tiles the sprayer will reach when in spray mode. var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode. var/stream_amount = 10 //the amount of reagents transfered when in stream mode. + var/can_fill_from_container = TRUE amount_per_transfer_from_this = 5 volume = 250 possible_transfer_amounts = list(5,10,15,20,25,30,50,100) - /obj/item/reagent_containers/spray/afterattack(atom/A, mob/user) if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics)) return - if((A.is_drainable() && !A.is_refillable()) && get_dist(src,A) <= 1) + if((A.is_drainable() && !A.is_refillable()) && get_dist(src,A) <= 1 && can_fill_from_container) if(!A.reagents.total_volume) to_chat(user, "[A] is empty.") return @@ -205,6 +205,46 @@ /obj/item/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays return +/obj/item/reagent_containers/spray/waterflower/cyborg + container_type = NONE + volume = 100 + list_reagents = list("water" = 100) + var/generate_amount = 5 + var/generate_type = "water" + var/last_generate = 0 + var/generate_delay = 10 //deciseconds + can_fill_from_container = FALSE + +/obj/item/reagent_containers/spray/waterflower/cyborg/hacked + name = "nova flower" + desc = "This doesn't look safe at all..." + list_reagents = list("clf3" = 3) + volume = 3 + generate_type = "clf3" + generate_amount = 1 + generate_delay = 40 //deciseconds + +/obj/item/reagent_containers/spray/waterflower/cyborg/Initialize() + . = ..() + START_PROCESSING(SSfastprocess, src) + +/obj/item/reagent_containers/spray/waterflower/cyborg/Destroy() + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/obj/item/reagent_containers/spray/waterflower/cyborg/process() + if(world.time > last_generate + generate_delay) + return + last_generate = world.time + generate_reagents() + +/obj/item/reagent_containers/spray/waterflower/cyborg/empty() + to_chat(usr, "You can not empty this!") + return + +/obj/item/reagent_containers/spray/waterflower/cyborg/proc/generate_reagents() + reagents.add_reagent(generate_type, generate_amount) + //chemsprayer /obj/item/reagent_containers/spray/chemsprayer name = "chem sprayer" diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 5d8bfa629b..fd145092a7 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ