diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 2e0a96691f..125da46b81 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -5898,6 +5898,15 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"alN" = ( +/obj/machinery/camera{ + c_tag = "Dormitory Toilets"; + dir = 1 + }, +/obj/structure/table, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) "alO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -15668,13 +15677,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aJz" = ( -/obj/machinery/camera{ - c_tag = "Dormitory Toilets"; - dir = 1 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) "aJA" = ( /obj/machinery/door/airlock/maintenance{ name = "Kitchen Maintenance"; @@ -57422,6 +57424,10 @@ /obj/machinery/vending/wardrobe/bar_wardrobe, /turf/open/floor/wood, /area/crew_quarters/bar) +"moD" = ( +/obj/effect/landmark/barthpot, +/turf/open/floor/wood, +/area/library) "mpI" = ( /obj/structure/table/wood, /turf/open/floor/wood{ @@ -90144,7 +90150,7 @@ aDL aFf aGk aHU -aJz +alN aAh aLQ aJq @@ -102489,7 +102495,7 @@ aQq aRP aIt aIt -aIt +moD aWd aXV aIt diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index f0619b689a..327250ba1d 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -124,6 +124,36 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"aaq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/plasteel, +/area/crew_quarters/toilet/restrooms) +"aar" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/bedsheetbin/color, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/crew_quarters/dorms) "aas" = ( /obj/docking_port/stationary/random{ id = "pod_lavaland1"; @@ -80845,21 +80875,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/toilet/restrooms) -"cFc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/toilet/restrooms) "cFd" = ( /obj/machinery/shower{ dir = 8; @@ -84352,19 +84367,6 @@ /obj/item/reagent_containers/dropper, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cKT" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/crew_quarters/dorms) "cKU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -127152,6 +127154,10 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"kZu" = ( +/obj/effect/landmark/barthpot, +/turf/open/floor/wood, +/area/library) "lak" = ( /turf/open/floor/plasteel/white/side{ dir = 10 @@ -160651,7 +160657,7 @@ caG chU cjt ckR -cmt +kZu cnR cpv cqQ @@ -172742,7 +172748,7 @@ bsE cAm cBI cDo -cFc +aaq cAm cHW cIW @@ -177115,7 +177121,7 @@ cFr cGP cqd cJe -cKT +aar cMq cAw cPM diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 945afc6104..522d9801ca 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2,6 +2,17 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aab" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/structure/sign/poster/official/random{ + pixel_y = -32 + }, +/obj/structure/table, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "aac" = ( /obj/effect/landmark/carpspawn, /turf/open/space, @@ -43777,6 +43788,7 @@ /turf/open/floor/wood, /area/library) "bGt" = ( +/obj/effect/landmark/barthpot, /turf/open/floor/wood{ icon_state = "wood-broken7" }, @@ -80881,15 +80893,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) -"dhD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/sign/poster/official/random{ - pixel_y = -32 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "dhE" = ( /obj/structure/sign/poster/contraband/random{ pixel_x = 32 @@ -118786,7 +118789,7 @@ aBu aCB aDU aFg -dhD +aab axC axC axC diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 6e3ae63616..a87c17836c 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -955,6 +955,19 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"abn" = ( +/obj/structure/table, +/obj/machinery/camera{ + c_tag = "Locker Room East"; + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/bedsheetbin/color, +/turf/open/floor/plasteel/white/corner, +/area/crew_quarters/dorms) "abo" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -15282,19 +15295,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"aAJ" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/machinery/camera{ - c_tag = "Locker Room East"; - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner, -/area/crew_quarters/dorms) "aAK" = ( /obj/structure/sign/poster/random, /turf/closed/wall, @@ -26273,7 +26273,7 @@ /turf/open/floor/wood, /area/library) "aUZ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/landmark/barthpot, /turf/open/floor/wood, /area/library) "aVa" = ( @@ -82332,7 +82332,7 @@ awQ axK ayC awQ -aAJ +abn aBT awQ aDI diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 7f7cfd3124..19d518d20a 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2,6 +2,33 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aab" = ( +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/bedsheetbin/color, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/dorms) +"aac" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/table, +/obj/structure/bedsheetbin/towel, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "aad" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating{ @@ -7254,22 +7281,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/dorms) -"asg" = ( -/obj/structure/bedsheetbin, -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/dorms) "ash" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -14880,15 +14891,6 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) -"aJo" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) "aJp" = ( /obj/item/chair, /turf/open/floor/plating, @@ -60875,6 +60877,10 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"vkd" = ( +/obj/effect/landmark/barthpot, +/turf/open/floor/carpet, +/area/library/lounge) "vlF" = ( /obj/item/coin/silver, /obj/effect/decal/cleanable/oil{ @@ -79871,7 +79877,7 @@ ckT xhj xhj cwK -xhj +vkd xhj cxn xhj @@ -100836,7 +100842,7 @@ aiT aiS apX cod -asg +aab atj apX avi @@ -102395,7 +102401,7 @@ aFH aGG aHo aIk -aJo +aac aGF aEd aMr diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index 94723cae38..626bba9fc3 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -13,6 +13,7 @@ #define POLL_IGNORE_GOLEM "golem" #define POLL_IGNORE_SWARMER "swarmer" #define POLL_IGNORE_DRONE "drone" +#define POLL_IGNORE_CLONE "clone" GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_SENTIENCE_POTION = "Sentience potion", @@ -28,6 +29,7 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_GOLEM = "Golems", POLL_IGNORE_SWARMER = "Swarmer shells", POLL_IGNORE_DRONE = "Drone shells", + POLL_IGNORE_CLONE = "Defective/SDGF clones" )) GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore()) diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm index 4116e18f59..b594991a7d 100644 --- a/code/game/machinery/exp_cloner.dm +++ b/code/game/machinery/exp_cloner.dm @@ -49,7 +49,7 @@ ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, "cloning") H.Unconscious(80) - var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H) + var/list/candidates = pollCandidatesForMob("Do you want and agree to play as a [clonename]'s defective clone, respect their character and not engage in ERP without permission from the original?", null, null, null, 100, H, POLL_IGNORE_CLONE) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) C.transfer_ckey(H) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 79deac475b..028110170a 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -288,7 +288,7 @@ contained = "\[[contained]\]" var/where = "[AREACOORD(location)]" - if(carry.my_atom.fingerprintslast) + if(carry.my_atom && carry.my_atom.fingerprintslast) var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) var/more = "" if(M) diff --git a/code/game/objects/items/devices/dogborg_sleeper.dm b/code/game/objects/items/devices/dogborg_sleeper.dm index ca1648bb07..c1a9136f76 100644 --- a/code/game/objects/items/devices/dogborg_sleeper.dm +++ b/code/game/objects/items/devices/dogborg_sleeper.dm @@ -544,4 +544,26 @@ user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) return + else if(issilicon(target)) + var/mob/living/silicon/trashbot = target + if (!trashbot.devourable) + to_chat(user, "[target] registers an error code to your [src]") + return + if(patient) + to_chat(user,"Your [src] is already occupied.") + return + if(trashbot.buckled) + to_chat(user,"[trashbot] is buckled and can not be put into your [src].") + return + user.visible_message("[hound.name] is ingesting [trashbot] into their [src].", "You start ingesting [trashbot] into your [src.name]...") + if(do_after(user, 30, target = trashbot) && !patient && !trashbot.buckled && length(contents) < max_item_count) + if(!in_range(src, trashbot)) //Proximity is probably old news by now, do a new check. + return //If they moved away, you can't eat them. + trashbot.forceMove(src) + trashbot.reset_perspective(src) + update_gut() + user.visible_message("[hound.name]'s garbage processor groans lightly as [trashbot] slips inside.", "Your garbage compactor groans lightly as [trashbot] slips inside.") + playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) + return + return diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index b493f84240..1f7f0ab391 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -288,17 +288,19 @@ LINEN BINS resistance_flags = FLAMMABLE max_integrity = 70 var/amount = 10 + var/list/sheet_types = list(/obj/item/bedsheet) + var/static/allowed_sheets = list(/obj/item/bedsheet, /obj/item/reagent_containers/rag/towel) var/list/sheets = list() var/obj/item/hidden = null /obj/structure/bedsheetbin/examine(mob/user) ..() if(amount < 1) - to_chat(user, "There are no bed sheets in the bin.") + to_chat(user, "There are no sheets in the bin.") else if(amount == 1) - to_chat(user, "There is one bed sheet in the bin.") + to_chat(user, "There is one sheet in the bin.") else - to_chat(user, "There are [amount] bed sheets in the bin.") + to_chat(user, "There are [amount] sheets in the bin.") /obj/structure/bedsheetbin/update_icon() @@ -317,8 +319,9 @@ LINEN BINS ..() /obj/structure/bedsheetbin/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/bedsheet)) + if(is_type_in_list(I, allowed_sheets)) if(!user.transferItemToLoc(I, src)) + to_chat(user, "\The [I] is stuck to your hand, you cannot place it into the bin!") return sheets.Add(I) amount++ @@ -339,18 +342,19 @@ LINEN BINS . = ..() if(.) return - if(user.lying) + if(user.incapacitated()) return if(amount >= 1) amount-- - var/obj/item/bedsheet/B + var/obj/item/B if(sheets.len > 0) B = sheets[sheets.len] sheets.Remove(B) else - B = new /obj/item/bedsheet(loc) + var/chosen = pick(sheet_types) + B = new chosen B.forceMove(drop_location()) user.put_in_hands(B) @@ -362,19 +366,20 @@ LINEN BINS to_chat(user, "[hidden] falls out of [B]!") hidden = null - add_fingerprint(user) + /obj/structure/bedsheetbin/attack_tk(mob/user) if(amount >= 1) amount-- - var/obj/item/bedsheet/B + var/obj/item/B if(sheets.len > 0) B = sheets[sheets.len] sheets.Remove(B) else - B = new /obj/item/bedsheet(loc) + var/chosen = pick(sheet_types) + B = new chosen B.forceMove(drop_location()) to_chat(user, "You telekinetically remove [B] from [src].") @@ -384,5 +389,11 @@ LINEN BINS hidden.forceMove(drop_location()) hidden = null +/obj/structure/bedsheetbin/towel + desc = "It looks rather cosy. This one is designed to hold towels." + sheet_types = list(/obj/item/reagent_containers/rag/towel) - add_fingerprint(user) +/obj/structure/bedsheetbin/color + sheet_types = list(/obj/item/bedsheet, /obj/item/bedsheet/blue, /obj/item/bedsheet/green, /obj/item/bedsheet/orange, \ + /obj/item/bedsheet/purple, /obj/item/bedsheet/red, /obj/item/bedsheet/yellow, /obj/item/bedsheet/brown, \ + /obj/item/bedsheet/black) \ No newline at end of file diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 942fdaed73..bc885868c5 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -324,6 +324,23 @@ item_state = "officertanjacket" body_parts_covered = CHEST|ARMS +/obj/item/clothing/suit/ran + name = "Shikigami costume" + desc = "A costume that looks like a certain shikigami, is super fluffy." + icon_state = "ran_suit" + item_state = "ran_suit" + body_parts_covered = CHEST|GROIN|LEGS + flags_inv = HIDEJUMPSUIT|HIDETAUR + heat_protection = CHEST|GROIN|LEGS //fluffy tails! +//2061 + +/obj/item/clothing/head/ran + name = "Shikigami hat" + desc = "A hat that looks like it keeps any fluffy ears contained super warm, has little charms over it." + icon_state = "ran_hat" + item_state = "ran_hat" + flags_inv = HIDEEARS + /* * Misc */ diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 9b72020047..66495d833d 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -19,6 +19,7 @@ new /mob/living/simple_animal/parrot/Poly/ghost(Poly.loc) qdel(Poly) + /datum/round_event/spooky/announce(fake) priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 164d0d65c6..796d630693 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -401,6 +401,7 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 24px;} .clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.spooky {color: #FF6100;} .velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} @keyframes velvet { 0% { color: #400020; } diff --git a/code/modules/holiday/halloween/bartholomew.dm b/code/modules/holiday/halloween/bartholomew.dm new file mode 100644 index 0000000000..129f4e29b6 --- /dev/null +++ b/code/modules/holiday/halloween/bartholomew.dm @@ -0,0 +1,148 @@ +/obj/effect/landmark/barthpot + name = "barthpot" + +/obj/item/barthpot + name = "Bartholomew" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "barthpot" + anchored = TRUE + var/items_list = list() + speech_span = "spooky" + var/active = TRUE + +/obj/item/barthpot/Destroy() + var/obj/item/barthpot/n = new src(loc) + n.items_list = items_list + ..() + + +/obj/item/barthpot/attackby(obj/item/I, mob/user, params) + if(!active) + say("Meow!") + return + for(var/I2 in items_list) + if(istype(I, I2)) + qdel(I) + new /obj/item/reagent_containers/food/snacks/special_candy(loc) + to_chat(user, "You add the [I.name] to the pot and watch as it melts into the mixture, a candy crystalising in it's wake.") + say("Hooray! Thank you!") + items_list -= I2 + return + say("It doesn't seem like that's magical enough!") + +/obj/item/barthpot/attack_hand(mob/user) + if(!active) + say("Meow!") + return + say("Hello there, I'm Bartholomew, Jacqueline's Familiar.") + sleep(20) + say("I'm currently seeking items to put into my pot, if we get the right items, it should crystalise into a magic candy!") + if(!iscarbon(user)) + say("Though... I'm not sure you can help me.") + + var/message = "From what I can tell, " + if(LAZYLEN(items_list) < 5) + generate_items() + for(var/I2 in items_list) + if(!I2) + items_list -= I2 + continue + var/obj/item/I3 = new I2 + message += "a [I3.name], " + message += "currently seem to have the most magic potential." + sleep(15) + say("[message]") + +/obj/item/barthpot/proc/generate_items() + var/length = LAZYLEN(items_list) + var/rand_items = list(/obj/item/bodybag = 1, + /obj/item/clothing/glasses/meson = 2, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/clothing/gloves/color/fyellow = 1, + /obj/item/clothing/head/hardhat = 1, + /obj/item/clothing/head/hardhat/red = 1, + /obj/item/clothing/head/that = 1, + /obj/item/clothing/head/ushanka = 1, + /obj/item/clothing/head/welding = 1, + /obj/item/clothing/mask/gas = 15, + /obj/item/clothing/suit/hazardvest = 1, + /obj/item/clothing/under/rank/vice = 1, + /obj/item/clothing/suit/hooded/flashsuit = 2, + /obj/item/clothing/accessory/medal/greytide = 1, + /obj/item/assembly/prox_sensor = 4, + /obj/item/assembly/timer = 3, + /obj/item/flashlight = 4, + /obj/item/flashlight/pen = 1, + /obj/effect/spawner/lootdrop/glowstick = 4, + /obj/effect/spawner/lootdrop/mre = 3, + /obj/item/multitool = 2, + /obj/item/radio/off = 2, + /obj/item/t_scanner = 5, + /obj/item/airlock_painter = 1, + /obj/item/stack/cable_coil/ = 4, + /obj/item/stack/medical/bruise_pack = 1, + /obj/item/stack/rods = 3, + /obj/item/stack/sheet/cardboard = 2, + /obj/item/stack/sheet/metal = 1, + /obj/item/stack/sheet/mineral/plasma = 1, + /obj/item/stack/sheet/rglass = 1, + /obj/item/book/manual/wiki/engineering_construction = 1, + /obj/item/book/manual/wiki/engineering_hacking = 1, + /obj/item/clothing/head/cone = 1, + /obj/item/coin/silver = 1, + /obj/item/coin/twoheaded = 1, + /obj/item/poster/random_contraband = 1, + /obj/item/poster/random_official = 1, + /obj/item/crowbar = 1, + /obj/item/crowbar/red = 1, + /obj/item/extinguisher = 11, + /obj/item/hand_labeler = 1, + /obj/item/paper/crumpled = 1, + /obj/item/pen = 1, + /obj/item/reagent_containers/spray/pestspray = 1, + /obj/item/reagent_containers/rag = 3, + /obj/item/stock_parts/cell = 3, + /obj/item/storage/belt/utility = 2, + /obj/item/storage/box = 2, + /obj/item/storage/box/cups = 1, + /obj/item/storage/box/donkpockets = 1, + /obj/item/storage/box/lights/mixed = 3, + /obj/item/storage/box/hug/medical = 1, + /obj/item/storage/fancy/cigarettes/dromedaryco = 1, + /obj/item/storage/toolbox/mechanical = 1, + /obj/item/screwdriver = 3, + /obj/item/tank/internals/emergency_oxygen = 2, + /obj/item/vending_refill/cola = 1, + /obj/item/weldingtool = 3, + /obj/item/wirecutters = 1, + /obj/item/wrench = 4, + /obj/item/relic = 3, + /obj/item/weaponcrafting/receiver = 2, + /obj/item/clothing/head/cone = 2, + /obj/item/grenade/smokebomb = 2, + /obj/item/geiger_counter = 3, + /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 1, + /obj/item/radio/headset = 1, + /obj/item/assembly/infra = 1, + /obj/item/assembly/igniter = 2, + /obj/item/assembly/signaler = 2, + /obj/item/assembly/mousetrap = 2, + /obj/item/reagent_containers/syringe = 2, + /obj/item/clothing/gloves = 8, + /obj/item/clothing/shoes/laceup = 1, + /obj/item/storage/secure/briefcase = 3, + /obj/item/storage/toolbox/artistic = 2, + /obj/item/toy/eightball = 1, + /obj/item/reagent_containers/pill/floorpill = 1, + /obj/item/reagent_containers/food/snacks/cannedpeaches/maint = 2, + /obj/item/clothing/shoes = 2) + if(length == 5) + return TRUE + //var/metalist = pickweight(GLOB.maintenance_loot) + for(var/i = length, i <= 5, i+=1) + var/obj/item = pickweight(rand_items) + if(!item) + i-=1 + continue + items_list += item + return TRUE diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween/halloween.dm similarity index 92% rename from code/modules/holiday/halloween.dm rename to code/modules/holiday/halloween/halloween.dm index a27db8dd38..2cb80e3e17 100644 --- a/code/modules/holiday/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -5,19 +5,27 @@ //spooky recipes -/datum/recipe/sugarcookie/spookyskull - reagents = list("flour" = 5, "sugar" = 5, "milk" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg, +/datum/crafting_recipe/food/sugarcookie/spookyskull + time = 15 + name = "Sugar cookie" + reqs = list( + /datum/reagent/consumable/sugar = 5, + /obj/item/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull + subcategory = CAT_PASTRY -/datum/recipe/sugarcookie/spookycoffin - reagents = list("flour" = 5, "sugar" = 5, "coffee" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg, +/datum/crafting_recipe/food/sugarcookie/spookycoffin + time = 15 + name = "Sugar cookie" + reqs = list( + /datum/reagent/consumable/sugar = 5, + /datum/reagent/consumable/coffee = 5, + /obj/item/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin + subcategory = CAT_PASTRY + ////////////////////////////// //Spookoween trapped closets// @@ -34,12 +42,12 @@ var/trapped = 0 var/mob/trapped_mob -/obj/structure/closet/initialize() +/obj/structure/closet/Initialize() ..() if(prob(30)) set_spooky_trap() -/obj/structure/closet/dump_contents() +/obj/structure/closet/dump_contents(var/override = TRUE) ..() trigger_spooky_trap() diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm new file mode 100644 index 0000000000..b2f69df2e4 --- /dev/null +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -0,0 +1,442 @@ +//Conversation +#define JACQ_HELLO (1<<0) +#define JACQ_CANDIES (1<<1) +#define JACQ_HEAD (1<<2) +#define JACQ_FAR (1<<3) +#define JACQ_WITCH (1<<4) +#define JACQ_EXPELL (1<<5) +#define JACQ_DATE (1<<6) + +/////// EVENT +/datum/round_event_control/jacqueen + name = "Jacqueline's visit" + holidayID = "jacqueen" + typepath = /datum/round_event/jacqueen + weight = -1 //forces it to be called, regardless of weight + max_occurrences = 1 + earliest_start = 0 MINUTES + +/datum/round_event/jacqueen/start() + ..() + + for(var/mob/living/carbon/human/H in GLOB.carbon_list) + playsound(H, 'sound/spookoween/ahaha.ogg', 100, 0.25) + + for(var/obj/effect/landmark/barthpot/bp in GLOB.landmarks_list) + new /obj/item/barthpot(bp.loc) + new /mob/living/simple_animal/jacq(bp.loc) + +/////// MOBS + +//Whacha doing in here like? Yae wan tae ruin ta magicks? +/mob/living/simple_animal/jacq + name = "Jacqueline the Pumpqueen" + real_name = "Jacqueline" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "jacqueline" + maxHealth = 25 + health = 25 + density = FALSE + speech_span = "spooky" + friendly = "pets" + response_help = "chats with" + var/last_poof + var/progression = list() //Keep track of where people are in the story. + var/active = TRUE //Turn this to false to keep normal mob behavour + +/mob/living/simple_animal/jacq/Initialize() + ..() + poof() + +/mob/living/simple_animal/jacq/Life() + ..() + if(!ckey) + if((last_poof+4 MINUTES) < world.realtime) + poof() + +/mob/living/simple_animal/jacq/Destroy() //I.e invincible + visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") + playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25) + var/mob/living/simple_animal/jacq/Jacq = new src.type(loc) + Jacq.progression = progression + ..() + +/mob/living/simple_animal/jacq/death() //What is alive may never die + visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") + playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 0.25) + health = 20 + poof() + +/mob/living/simple_animal/jacq/attack_hand(mob/living/carbon/human/M) + if(!active) + say("Hello there [gender_check(M)]!") + return ..() + if(!ckey) + canmove = FALSE + chit_chat(M) + canmove = TRUE + ..() + +/mob/living/simple_animal/jacq/attack_paw(mob/living/carbon/monkey/M) + if(!active) + say("Hello there [gender_check(M)]!") + return ..() + if(!ckey) + canmove = FALSE + chit_chat(M) + canmove = TRUE + ..() + +/mob/living/simple_animal/jacq/proc/poof() + last_poof = world.realtime + var/datum/reagents/R = new/datum/reagents(100)//Hey, just in case. + var/datum/effect_system/smoke_spread/chem/s = new() + R.add_reagent("secretcatchem", (10)) + s.set_up(R, 0, loc) + s.start() + visible_message("[src] disappears in a puff of smoke!") + canmove = TRUE + + var/hp_list = list() + for(var/obj/machinery/holopad/hp in world) + hp_list += hp + + var/obj/machinery/holopad/hp = pick(hp_list) + if(forceMove(pick(hp.loc))) + return TRUE + + return FALSE + +/mob/living/simple_animal/jacq/proc/gender_check(mob/living/carbon/C) + var/gender = "lamb" + if(C) + if(C.gender == MALE) + gender = "laddie" + if(C.gender == FEMALE) + gender = "lassie" + return gender + +//Ye wee bugger, gerrout of it. Ye've nae tae enjoy reading the code fer mae secrets like. +/mob/living/simple_animal/jacq/proc/chit_chat(mob/living/carbon/C) + //Very important + var/gender = gender_check(C) + if(C) + if(C.gender == MALE) + gender = "laddie" + if(C.gender == FEMALE) + gender = "lassie" + + if(!progression["[C.real_name]"] || !(progression["[C.real_name]"] & JACQ_HELLO)) + visible_message("[src] smiles ominously at [C], \"Well halo there [gender]! Ah'm Jacqueline, tae great Pumpqueen, great tae meet ye.\"") + sleep(20) + visible_message("[src] continues, says, \"Ah'm sure yae well stunned, but ah've got nae taem fer that. Ah'm after the candies around this station. If yae get mae enoof o the wee buggers, Ah'll give ye a treat, or if yae feeling bold, Ah ken trick ye instead.\" giving [C] a wide grin.") + if(!progression["[C.real_name]"]) + progression["[C.real_name]"] = NONE //TO MAKE SURE THAT THE LIST ENTRY EXISTS. + + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_HELLO + + var/choices = list("Trick", "Treat", "How do I get candies?") + var/choice = input(C, "Trick or Treat?", "Trick or Treat?") in choices + switch(choice) + if("Trick") + trick(C) + return + if("Treat") + if(check_candies(C)) + treat(C, gender) + else + visible_message("[src] raises an eyebrow, \"You've nae got any candies Ah want! They're the orange round ones, now bugger off an go get em first.\"") + return + if("How do I get candies?") + visible_message("[src] says, \"Gae find my familiar; Bartholomew. Ee's tendin the cauldron which ken bring oot t' magic energy in items scattered aroond. Knowing him, ee's probably gone tae somewhere with books.\"") + return + +/mob/living/simple_animal/jacq/proc/treat(mob/living/carbon/C, gender) + visible_message("[src] gives off a glowing smile, \"What ken Ah offer ye? I can magic up an object, a potion or a plushie fer ye.\"") + var/choices_reward = list("Object - 3 candies", "Potion - 2 candies", "Plushie - 1 candy", "Can I ask you a question instead?") + var/choice_reward = input(usr, "Trick or Treat?", "Trick or Treat?") in choices_reward + + //rewards + switch(choice_reward) + if("Object - 3 candies") + if(!take_candies(C, 3)) + visible_message("[src] raises an eyebrown, \"It's 3 candies per trinket [gender]! Thems the rules!\"") + return + + var/new_obj = pick(subtypesof(/obj)) + //for(var/item in blacklist) + // if(new_obj == item) + // panic() + var/reward = new new_obj(C.loc) + C.put_in_hands(reward) + visible_message("[src] waves her hands, magicing up a [reward] from thin air, \"There ye are [gender], enjoy! \"") + sleep(20) + poof() + return + if("Potion - 2 candies") + if(!take_candies(C, 2)) + visible_message("[src] raises an eyebrow, \"It's 2 candies per potion [gender]! Thems the rules!\"") + return + + var/reward = new /obj/item/reagent_containers/potion_container(C.loc) + C.put_in_hands(reward) + visible_message("[src] waves her hands, magicing up a [reward] from thin air, \"There ye are [gender], enjoy! \"") + sleep(20) + poof() + return + if("Plushie - 1 candy") + if(!take_candies(C, 1)) + visible_message("[src] raises an eyebrow, \"It's 1 candy per plushie [gender]! Thems the rules!\"") + return + + new /obj/item/toy/plush/random(C.loc) + visible_message("[src] waves her hands, magicing up a plushie from thin air, \"There ye are [gender], enjoy! \"") + sleep(20) + poof() + return + + //chitchats! + if("Can I ask you a question instead?") + var/choices = list() + //Figure out where the C is in the story + if(!progression["[C.real_name]"]) //I really don't want to get here withoot a hello, but just to be safe + progression["[C.real_name]"] = NONE + if(!(progression["[C.real_name]"] & JACQ_FAR)) + if(progression["[C.real_name]"] & JACQ_CANDIES) + choices += "You really came all this way for candy?" + else + choices += "Why do you want the candies?" + if(!(progression["[C.real_name]"] & JACQ_HEAD)) + choices += "What is that on your head?" + if(!(progression["[C.real_name]"] & JACQ_EXPELL)) + if(progression["[C.real_name]"] & JACQ_WITCH) + choices += "So you got ex-spell-ed?" + else + choices += "Are you a witch?" + + //for Kepler, delete this, or just delete the whole story aspect if you want. + //If fully completed + /* + if(progression["[C.real_name]"] & JACQ_FAR)//Damnit this is a pain + if(progression["[C.real_name]"] & JACQ_EXPELL) //I give up + if(progression["[C.real_name]"] & JACQ_HEAD) //This is only an event thing + choices += "Can I take you out on a date?" + */ + if(progression["[C.real_name]"] == 63)//Damnit this is a pain + choices += "Can I take you out on a date?" + + //If you've nothing to ask + if(!LAZYLEN(choices)) + visible_message("[src] sighs, \"Ah'm all questioned oot fer noo, [gender].\"") + return + //Otherwise, lets go! + visible_message("[src] says, \"A question? Sure, it'll cost you a candy though!\"") + choices += "Nevermind" + //Candies for chitchats + var/choice = input(C, "What do you want to ask?", "What do you want to ask?") in choices + if(!take_candies(C, 1)) + visible_message("[src] raises an eyebrow, \"It's a candy per question [gender]! Thems the rules!\"") + return + //Talking + switch(choice) + if("Why do you want the candies?") + visible_message("[src] says, \"Ave ye tried them? They're full of all sorts of reagents. Ah'm after them so ah ken magic em up an hopefully find rare stuff fer me brews. Honestly it's a lot easier magicking up tatt fer ye lot than runnin aroond on me own like. I'd ask me familiars but most a my familiars are funny fellows 'n constantly bugger off on adventures when given simple objectives like; Go grab me a tea cake or watch over me cauldron. Ah mean, ye might run into Bartholomew my cat. Ee's supposed tae be tending my cauldron, but I've nae idea where ee's got tae.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_CANDIES + sleep(30) + poof() + + if("You really came all this way for candy?") + visible_message("[src] looks tae the side sheepishly, \"Aye, well, tae be honest, Ah'm here tae see me sis, but dunnae let her knew that. She's an alchemist too like, but she dunnae use a caldron like mae, she buggered off like tae her posh ivory tower tae learn bloody chemistry instead!\" [src] scowls, \"She's tae black sheep o' the family too, so we dunnae see eye tae eye sometimes on alchemy. Ah mean, she puts moles in her brews! Ye dunnae put moles in yer brews! Yae threw your brews at tae wee bastards an blew em up!\" [src] sighs, \"But she's a heart o gold so.. Ah wanted tae see her an check up oon her, make sure she's okay.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_FAR + sleep(30) + poof() + + if("What is that on your head?") + visible_message("[src] pats the pumpkin atop her head, \"This thing? This ain't nae ordinary pumpkin! Me Ma grew this monster ooer a year o love, dedication an hard work. Honestly it felt like she loved this thing more than any of us, which Ah knew ain't true an it's not like she was hartless or anything but.. well, we had a falling oot when Ah got back home with all me stuff in tow. An all she had done is sent me owl after owl over t' last year aboot this bloody pumpkin and ah had enough. So ah took it, an put it on me head. You know, as ye do. Ah am the great Pumpqueen after all, Ah deserve this.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_HEAD + sleep(30) + poof() + + if("Are you a witch?") + visible_message("[src] grumbles, \"If ye must know, Ah got kicked oot of the witch academy fer being too much of a \"loose cannon\". A bloody loose cannon? Nae they were just pissed off Ah had the brass tae proclaim myself as the Pumpqueen! And also maybe the time Ah went and blew up one of the towers by trying tae make a huge batch of astrogen might've had something tae do with it. Ah mean it would've worked fine if the cauldrons weren't so shite and were actually upgraded by the faculty. So technically no, I'm not a witch.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_WITCH + sleep(30) + poof() + + if("So you got ex-spell-ed?") + visible_message("[src] Gives you a blank look at the pun, before continuing, \"Not quite, Ah know Ah ken get back into the academy, it's only an explosion, they happen all the time, but, tae be fair it's my fault that things came tae their explosive climax. You don't know what it's like when you're after a witch doctorate, everyone else is doing well, everyone's making new spells and the like, and I'm just good at making explosions really, or fireworks. So, Ah did something Ah knew was dangerous, because Ah had tae do something tae stand oot, but Ah know this life ain't fer me, Ah don't want tae be locked up in dusty towers, grinding reagent after reagent together, trying tae find new reactions, some of the wizards in there haven't left fer years. Ah want tae live, Ah want tae fly around on a broom, turn people into cats fer a day and disappear cackling! That's what got me into witchcraft!\" she throws her arms up in the arm, spinning the pumpkin upon her head slightly. She carefully spins it back to face you, giving oot a soft sigh, \"Ah know my mother's obsession with this dumb thing on my head is just her trying tae fill the void of me and my sis moving oot, and it really shouldn't be on my head. And Ah know that I'm really here tae get help from my sis.. She's the sensible one, and she gives good hugs.\"") + sleep(30) + visible_message("[src] says, \"Thanks [C], Ah guess Ah didn't realise Ah needed someone tae talk tae but, I'm glad ye spent all your candies talking tae me. Funny how things seem much worse in yer head.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_EXPELL + sleep(30) + poof() + + if("Can I take you out on a date?") + visible_message("[src] blushes, \"...You want tae ask me oot on a date? Me? After all that nonsense Ah just said? It seems a waste of a candy honestly.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_DATE + visible_message("[src] looks to the side, deep in thought.") + dating_start(C, gender) + + if("Nevermind") + visible_message("[src] shrugs, \"Suit yerself then, here's your candy back.\"") + new /obj/item/reagent_containers/food/snacks/special_candy(loc) + + +/mob/living/simple_animal/jacq/proc/trick(mob/living/carbon/C, gender) + var/option + if(ishuman(C)) + option = rand(1,7) + else + option = rand(1,6) + switch(option) + if(1) + visible_message("[src] waves their arms around, \"Hocus pocus, making friends is now your focus!\"") + var/datum/objective/brainwashing/objective = pick("Make a tasty sandwich for", "Compose a poem for", "Aquire a nice outfit to give to", "Strike up a conversation about pumpkins with", "Write a letter and deliver it to", "Give a nice hat to") + var/mob/living/L2 = pick(GLOB.player_list) + objective += " [L2.name]." + brainwash(C, objective) + if(2) + visible_message("[src] waves their arms around, \"Off comes your head, a pumpkin taking it's stead!\"") + C.reagents.add_reagent("pumpkinmutationtoxin", 5) + if(3) + visible_message("[src] waves their arms around, \"If only you had a better upbringing, your ears are now full of my singing!\"") + var/client/C2 = C.client + C2.chatOutput.sendMusic("https://a.uguu.se/rQ8FxxUQ1Xzc_SpOwOkyOwOkyPumpkinSong-PFrPrIxluWk.mp4", 1)//I hope this works! + if(4) + visible_message("[src] waves their arms around, \"You're cute little bumpkin, On your head is a pumpkin!\"") + if(C.head) + var/obj/item/W = C.head + C.dropItemToGround(W, TRUE) + var/jaqc_latern = new /obj/item/clothing/head/hardhat/pumpkinhead/jaqc + C.equip_to_slot(jaqc_latern, SLOT_HEAD, 1, 1) + if(5) + visible_message("[src] waves their arms around, \"In your body there's something amiss, you'll find it's a chem made by my sis!\"") + C.reagents.add_reagent("eigenstate", 30) + if(6) + visible_message("[src] waves their arms around, \"A new familiar for me, and you'll see it's thee!\"") + C.reagents.add_reagent("secretcatchem", 30) + if(7) + visible_message("[src] waves their arms around, \"While you may not be a ghost, for this sheet you'll always be it's host.\"") + var/mob/living/carbon/human/H = C + if(H.wear_suit) + var/obj/item/W = H.wear_suit + H.dropItemToGround(W, TRUE) + var/ghost = new /obj/item/clothing/suit/ghost_sheet/sticky + H.equip_to_slot(ghost, SLOT_WEAR_SUIT, 1, 1) + poof() + +//Blame Fel +/mob/living/simple_animal/jacq/proc/dating_start(mob/living/carbon/C, gender) + var/candies = pollGhostCandidates("Do you want to go on a date with [C] as Jacqueline the great pumpqueen?") + //sleep(30) //If the poll doesn't autopause. + if(candies) + candies = shuffle(candies)//Shake those ghosts up! + for(var/mob/dead/observer/C2 in candies) + if(C2.key && C2) + key = C2.key + message_admins("[C2]/[C2.key] has agreed to go on a date with [C] as Jacqueline.") + log_game("HALLOWEEN: [C2]/[C2.key] has agreed to go on a date with [C] as Jacqueline") + to_chat(src, "You are Jacqueline the great pumpqueen, witch Extraordinaire! You're a very Scottish lass with a kind heart, but also a little crazy. You also blew up the wizarding school and you're suspended for a while, so you visited the station before heading home. On your head lies the prize pumpkin of your Mother's pumpkin patch. You're currently on a date with [C] and well, I didn't think anyone would get this far. Please be good so I can do events like this in the future. ") + return + else + candies =- C2 + visible_message("[src] looks to the side, \"Look, Ah like ye but, Ah don't think Ah can right now. If ye can't tell, the stations covered in volatile candies, I've a few other laddies and lassies running after me treats, and tae top it all off, I've the gods breathing down me neck, watching every treat Ah make fer the lot of yous.\" she sighs, \"But that's not a no, right? That's.. just a nae right noo.\"") + sleep(20) + visible_message("[src] takes off the pumpkin on her head, a rich blush on her cheeks. She leans over planting a kiss upon your forehead quickly befere popping the pumpkin back on her head.") + sleep(10) + visible_message("[src] waves their arms around, \"There, that aught tae be worth a candy.\"") + sleep(20) + poof() + +/obj/item/clothing/head/hardhat/pumpkinhead/jaqc + name = "Jacq o' latern" + desc = "A jacqueline o' lantern! You can't seem to get rid of it." + icon_state = "hardhat0_pumpkin_j" + item_state = "hardhat0_pumpkin_j" + item_color = "pumpkin_j" + brightness_on = 4 + +/obj/item/clothing/head/hardhat/pumpkinhead/jaqc/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, GLUED_ITEM_TRAIT) + +/obj/item/clothing/suit/ghost_sheet/sticky + +/obj/item/clothing/suit/ghost_sheet/sticky/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, GLUED_ITEM_TRAIT) + +/obj/item/clothing/suit/ghost_sheet/sticky/attack_hand(mob/user) + if(iscarbon(user)) + to_chat(user, "Boooooo~!") + return + else + ..() + +/obj/item/clothing/suit/ghost_sheet/sticky/attack_hand(mob/user) + if(iscarbon(user)) + to_chat(user, "Boooooo~!") + return + else + ..() + +/datum/reagent/mutationtoxin/pumpkinhead + name = "Pumpkin head mutation toxin" + id = "pumpkinmutationtoxin" + race = /datum/species/dullahan/pumpkin + mutationtext = "The pain subsides. You feel your head roll off your shoulders... and you smell pumpkin." + //I couldn't get the replace head sprite with a pumpkin to work so, it is what it is. + +/mob/living/simple_animal/jacq/proc/check_candies(mob/living/carbon/C) + var/invs = C.get_contents() + var/candy_count = 0 + for(var/item in invs) + if(istype(item, /obj/item/reagent_containers/food/snacks/special_candy)) + candy_count++ + return candy_count + +/mob/living/simple_animal/jacq/proc/take_candies(mob/living/carbon/C, candy_amount = 1) + var/inv = C.get_contents() + var/candies = list() + for(var/item in inv) + if(istype(item, /obj/item/reagent_containers/food/snacks/special_candy)) + candies += item + if(LAZYLEN(candies) == candy_amount) + break + if(LAZYLEN(candies) == candy_amount) //I know it's a double check but eh, to be safe. + for(var/candy in candies) + qdel(candy) + return TRUE + return FALSE + +//Potions +/obj/item/reagent_containers/potion_container + name = "potion" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "jacq_potion" + desc = "A potion with a strange concoction within. Be careful, as if it's thrown it explodes in a puff of smoke like Jacqueline." + +/obj/item/reagent_containers/potion_container/Initialize() + .=..() + var/R = get_random_reagent_id() + reagents.add_reagent(R, 30) + name = "[R] Potion" + +/obj/item/reagent_containers/potion_container/throw_impact(atom/target) + ..() + sleep(20) + var/datum/effect_system/smoke_spread/chem/s = new() + s.set_up(src.reagents, 3, src.loc) + s.start() + qdel(src) + +//Candies +/obj/item/reagent_containers/food/snacks/special_candy + name = "Magic candy" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "jacq_candy" + desc = "A candy with strange magic within. Be careful, as the magic isn't always helpful." + +/obj/item/reagent_containers/food/snacks/special_candy/Initialize() + .=..() + reagents.add_reagent(get_random_reagent_id(), 5) diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 7d1e25235d..9d075857a7 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -333,6 +333,16 @@ /datum/holiday/halloween/getStationPrefix() return pick("Bone-Rattling","Mr. Bones' Own","2SPOOKY","Spooky","Scary","Skeletons") +/datum/holiday/jacqueen //Subset of halloween + name = "jacqueen" + begin_day = 27 + begin_month = OCTOBER + end_day = 2 + end_month = NOVEMBER + +/datum/holiday/jacqueen/greet() + return "Jacqueline the great Pumpqueen has come to visit!" + /datum/holiday/vegan name = "Vegan Day" begin_day = 1 diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 6cc11afdf5..889706744a 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -111,6 +111,11 @@ if(A) load_program(A) if("safety") + if(!issilicon(usr) && !IsAdminGhost(usr)) + var/msg = "[key_name(usr)] attempted to emag the holodeck using a href they shouldn't have!" + message_admins(msg) + log_admin(msg) + return obj_flags ^= EMAGGED if((obj_flags & EMAGGED) && program && emag_programs[program.name]) emergency_shutdown() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 8cfe2c31c3..591fc650b4 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -145,7 +145,13 @@ ViewManifest() if(href_list["SelectedJob"]) - + if(!SSticker || !SSticker.IsRoundInProgress()) + var/msg = "[key_name(usr)] attempted to join the round using a href that shouldn't be available at this moment!" + log_admin(msg) + message_admins(msg) + to_chat(usr, "The round is either not ready, or has already finished...") + return + if(!GLOB.enter_allowed) to_chat(usr, "There is an administrative lock on entering the game!") return diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm index aaffc0389d..554b7edfdb 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -30,7 +30,7 @@ // Decorative wings /datum/sprite_accessory/deco_wings icon = 'icons/mob/wings.dmi' - + /datum/sprite_accessory/deco_wings/plain name = "Plain" icon_state = "plain" @@ -96,10 +96,13 @@ name = "Snow" icon_state = "snow" - /datum/sprite_accessory/deco_wings/angel name = "Angel" icon_state = "angel" + color_src = 0 + dimension_x = 46 + center = TRUE + dimension_y = 34 /datum/sprite_accessory/deco_wings/none name = "None" @@ -155,7 +158,6 @@ /datum/sprite_accessory/insect_wings/punished name = "Burnt Off" icon_state = "punished" - locked = TRUE /datum/sprite_accessory/insect_wings/firewatch name = "Firewatch" diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 06f839525a..732022daf4 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -13,19 +13,19 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //Species Icon Drawing Offsets - Pixel X, Pixel Y, Aka X = Horizontal and Y = Vertical, from bottom left corner var/list/offset_features = list( - OFFSET_UNIFORM = list(0,0), - OFFSET_ID = list(0,0), - OFFSET_GLOVES = list(0,0), - OFFSET_GLASSES = list(0,0), - OFFSET_EARS = list(0,0), - OFFSET_SHOES = list(0,0), - OFFSET_S_STORE = list(0,0), - OFFSET_FACEMASK = list(0,0), - OFFSET_HEAD = list(0,0), - OFFSET_EYES = list(0,0), - OFFSET_LIPS = list(0,0), - OFFSET_BELT = list(0,0), - OFFSET_BACK = list(0,0), + OFFSET_UNIFORM = list(0,0), + OFFSET_ID = list(0,0), + OFFSET_GLOVES = list(0,0), + OFFSET_GLASSES = list(0,0), + OFFSET_EARS = list(0,0), + OFFSET_SHOES = list(0,0), + OFFSET_S_STORE = list(0,0), + OFFSET_FACEMASK = list(0,0), + OFFSET_HEAD = list(0,0), + OFFSET_EYES = list(0,0), + OFFSET_LIPS = list(0,0), + OFFSET_BELT = list(0,0), + OFFSET_BACK = list(0,0), OFFSET_HAIR = list(0,0), OFFSET_FHAIR = list(0,0), OFFSET_SUIT = list(0,0), @@ -425,8 +425,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) facial_overlay.alpha = hair_alpha if(OFFSET_FHAIR in H.dna.species.offset_features) - facial_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FHAIR][1] - facial_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FHAIR][2] + facial_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FHAIR][1] + facial_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FHAIR][2] standing += facial_overlay @@ -817,6 +817,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) bodypart = "snout" if(bodypart == "xenohead") bodypart = "xhead" + if(bodypart == "insect_wings" || bodypart == "deco_wings") + bodypart = "insect_wings" if(S.gender_specific) accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]" @@ -888,7 +890,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) accessory_overlay.color = husklist if(OFFSET_MUTPARTS in H.dna.species.offset_features) - accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] + accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] accessory_overlay.pixel_y += H.dna.species.offset_features[OFFSET_MUTPARTS][2] standing += accessory_overlay @@ -904,7 +906,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) inner_accessory_overlay = center_image(inner_accessory_overlay, S.dimension_x, S.dimension_y) if(OFFSET_MUTPARTS in H.dna.species.offset_features) - inner_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] + inner_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] inner_accessory_overlay.pixel_y += H.dna.species.offset_features[OFFSET_MUTPARTS][2] standing += inner_accessory_overlay @@ -947,11 +949,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(HORNCOLOR) extra_accessory_overlay.color = "#[H.horn_color]" - + if(OFFSET_MUTPARTS in H.dna.species.offset_features) - extra_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] + extra_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] extra_accessory_overlay.pixel_y += H.dna.species.offset_features[OFFSET_MUTPARTS][2] - + standing += extra_accessory_overlay if(S.extra2) //apply the extra overlay, if there is one @@ -988,7 +990,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) extra2_accessory_overlay.color = "#[H.horn_color]" if(OFFSET_MUTPARTS in H.dna.species.offset_features) - extra2_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] + extra2_accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] extra2_accessory_overlay.pixel_y += H.dna.species.offset_features[OFFSET_MUTPARTS][2] standing += extra2_accessory_overlay diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index b7d5130cd8..eba4ff6d2f 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -13,9 +13,12 @@ blacklisted = TRUE limbs_id = "human" skinned_type = /obj/item/stack/sheet/animalhide/human + var/pumpkin = FALSE var/obj/item/dullahan_relay/myhead +/datum/species/dullahan/pumpkin + pumpkin = TRUE /datum/species/dullahan/check_roundstart_eligible() if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) @@ -27,11 +30,19 @@ H.flags_1 &= ~HEAR_1 var/obj/item/bodypart/head/head = H.get_bodypart(BODY_ZONE_HEAD) if(head) + if(pumpkin)//Pumpkinhead! + head.animal_origin = 100 + head.icon = 'icons/obj/clothing/hats.dmi' + head.icon_state = "hardhat1_pumpkin_j" + head.custom_head = TRUE head.drop_limb() head.flags_1 = HEAR_1 head.throwforce = 25 myhead = new /obj/item/dullahan_relay (head, H) H.put_in_hands(head) + var/obj/item/organ/eyes/E = H.getorganslot(ORGAN_SLOT_EYES) + for(var/datum/action/item_action/organ_action/OA in E.actions) + OA.Trigger() /datum/species/dullahan/on_species_loss(mob/living/carbon/human/H) H.flags_1 |= ~HEAR_1 @@ -64,7 +75,7 @@ /obj/item/organ/brain/dullahan decoy_override = TRUE - organ_flags = 0 + organ_flags = ORGAN_NO_SPOIL//Do not decay /obj/item/organ/tongue/dullahan zone = "abstract" diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 84c44ea81c..8f84590ff4 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -581,7 +581,7 @@ limbs_id = "cultgolem" sexes = FALSE info_text = "As a Runic Golem, you possess eldritch powers granted by the Elder Goddess Nar'Sie." - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES) //no mutcolors + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES,NOGENITALS,NOAROUSAL) //no mutcolors prefix = "Runic" special_names = null @@ -635,7 +635,7 @@ say_mod = "clicks" limbs_id = "clockgolem" info_text = "As a Clockwork Golem, you are faster than other types of golems. On death, you will break down into scrap." - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES) + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES,NOGENITALS,NOAROUSAL) inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) armor = 20 //Reinforced, but much less so to allow for fast movement attack_verb = "smash" @@ -691,7 +691,7 @@ sexes = FALSE info_text = "As a Cloth Golem, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable. \ Being made of cloth, your body is magic resistant and faster than that of other golems, but weaker and less resilient." - species_traits = list(NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn + species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL) //no mutcolors, and can burn inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOGUNS) inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID) armor = 15 //feels no pain, but not too resistant diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 46207e5e60..f0dd48c6c1 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -36,8 +36,8 @@ var/turf/T = H.loc light_amount = min(1,T.get_lumcount()) - 0.5 H.nutrition += light_amount * light_nutrition_gain_factor - if(H.nutrition > NUTRITION_LEVEL_FULL) - H.nutrition = NUTRITION_LEVEL_FULL + if(H.nutrition >= NUTRITION_LEVEL_FULL) + H.nutrition = NUTRITION_LEVEL_FULL - 1 if(light_amount > 0.2) //if there's enough light, heal H.heal_overall_damage(light_bruteheal, light_burnheal) H.adjustToxLoss(-light_toxheal) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index d99900187b..a5943aa0e6 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -808,11 +808,18 @@ Pass a positive integer as an argument to override a bot's default speed. switch(href_list["operation"]) if("patrol") + if(!issilicon(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) + return TRUE auto_patrol = !auto_patrol bot_reset() if("remote") remote_disabled = !remote_disabled if("hack") + if(!issilicon(usr) && !IsAdminGhost(usr)) + var/msg = "[key_name(usr)] attempted to hack a bot with a href that shouldn't be available!" + message_admins(msg) + log_admin(msg) + return TRUE if(emagged != 2) emagged = 2 hacked = TRUE diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 9572b4dafc..f22139ac22 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -131,7 +131,8 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/Topic(href, href_list) if(..()) return 1 - + if(!issilicon(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) + return TRUE switch(href_list["operation"]) if("idcheck") idcheck = !idcheck diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 957a2a1a52..fb064b6146 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -128,14 +128,12 @@ /datum/reagents/proc/remove_all(amount = 1) var/list/cached_reagents = reagent_list - if((total_volume - amount) <= 0)//Because this can result in 0, I don't want it to crash. - pH = 7 if(total_volume > 0) var/part = amount / total_volume for(var/reagent in cached_reagents) var/datum/reagent/R = reagent remove_reagent(R.id, R.volume * part, ignore_pH = TRUE) - + pH = REAGENT_NORMAL_PH update_total() handle_reactions() return amount @@ -404,7 +402,7 @@ for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B]*CHEMICAL_QUANTISATION_LEVEL))//Allows vols at less than 1 to react. + if(!has_reagent(B, cached_required_reagents[B]))//Allows vols at less than 1 to react. break total_matching_reagents++ for(var/B in cached_required_catalysts) @@ -504,6 +502,7 @@ for(var/B in cached_required_reagents) // multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), CHEMICAL_QUANTISATION_LEVEL)) + for(var/B in cached_required_reagents) remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1, ignore_pH = TRUE) @@ -546,17 +545,17 @@ var/list/cached_required_reagents = C.required_reagents//update reagents list var/list/cached_results = C.results//resultant chemical list var/multiplier = INFINITY - for(var/B in cached_required_reagents) // multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.0001)) - if (multiplier == 0)//clarity + if (multiplier <= 0)//clarity fermiEnd() return - for(var/P in C.required_catalysts) - if(!has_reagent(P)) - fermiEnd() - return + if(C.required_catalysts) + for(var/P in C.required_catalysts) + if(!has_reagent(P)) + fermiEnd() + return if (!fermiIsReacting) CRASH("Fermi has refused to stop reacting even though we asked her nicely.") @@ -869,7 +868,6 @@ var/new_total = cached_total + amount var/cached_temp = chem_temp var/list/cached_reagents = reagent_list - var/cached_pH = pH @@ -963,7 +961,7 @@ var/datum/reagent/R = A if (R.id == reagent) if((total_volume - amount) <= 0)//Because this can result in 0, I don't want it to crash. - pH = 7 + pH = REAGENT_NORMAL_PH //In practice this is really confusing and players feel like it randomly melts their beakers, but I'm not sure how else to handle it. We'll see how it goes and I can remove this if it confuses people. else if (!ignore_pH) //if (((pH > R.pH) && (pH <= 7)) || ((pH < R.pH) && (pH >= 7))) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 7071810967..05fa4d382a 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -244,9 +244,9 @@ /obj/machinery/computer/pandemic/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) if(beaker) - beaker.forceMove(drop_location()) if(user && Adjacent(user) && !issiliconoradminghost(user)) - user.put_in_hands(beaker) + if(!user.put_in_hands(beaker)) + beaker.forceMove(drop_location()) if(new_beaker) beaker = new_beaker else diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index c5e110faea..5036fa4e23 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -101,7 +101,8 @@ if(St.purity < 1) St.volume *= St.purity St.purity = 1 - N.volume -= 0.002 + var/amount = CLAMP(0.002, 0, N.volume) + N.volume -= amount St.data["grown_volume"] = St.data["grown_volume"] + added_volume /datum/chemical_reaction/styptic_powder diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 46ee10a3fd..23d49e98bb 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -32,6 +32,8 @@ var/lip_style = null var/lip_color = "white" + //If the head is a special sprite + var/custom_head /obj/item/bodypart/head/can_dismember(obj/item/I) if(!((owner.stat == DEAD) || owner.InFullCritical())) @@ -128,6 +130,8 @@ add_overlay(standing) /obj/item/bodypart/head/get_limb_icon(dropped) + if(custom_head) + return cut_overlays() . = ..() if(dropped) //certain overlays only appear when the limb is being detached from its owner. diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index d9aa0d8bd0..001ef8d0e6 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -29,7 +29,8 @@ icon_state = "retractor_a" /obj/item/retractor/advanced/examine(mob/living/user) - to_chat(user, " It resembles a [tool_behaviour == TOOL_RETRACTOR ? "retractor" : "hemostat"]. ") /obj/item/retractor/augment name = "retractor" @@ -131,6 +132,7 @@ icon_state = "surgicaldrill_a" /obj/item/surgicaldrill/advanced/examine(mob/living/user) + . = ..() to_chat(user, "") /obj/item/surgicaldrill/augment @@ -203,6 +205,7 @@ icon_state = "scalpel_a" /obj/item/scalpel/advanced/examine(mob/living/user) + . = ..() to_chat(user, "") /obj/item/scalpel/augment diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index c577643df3..3879fc70cb 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -7,107 +7,109 @@ product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use AutoDrobe!" vend_reply = "Thank you for using AutoDrobe!" products = list(/obj/item/clothing/suit/chickensuit = 1, - /obj/item/clothing/head/chicken = 1, - /obj/item/clothing/under/gladiator = 1, - /obj/item/clothing/head/helmet/gladiator = 1, - /obj/item/clothing/under/gimmick/rank/captain/suit = 1, - /obj/item/clothing/head/flatcap = 1, - /obj/item/clothing/suit/toggle/labcoat/mad = 1, - /obj/item/clothing/shoes/jackboots = 1, - /obj/item/clothing/under/schoolgirl = 1, - /obj/item/clothing/under/schoolgirl/red = 1, - /obj/item/clothing/under/schoolgirl/green = 1, - /obj/item/clothing/under/schoolgirl/orange = 1, - /obj/item/clothing/head/kitty = 1, - /obj/item/clothing/under/skirt/black = 1, - /obj/item/clothing/head/beret = 1, - /obj/item/clothing/accessory/waistcoat = 1, - /obj/item/clothing/under/suit_jacket = 1, - /obj/item/clothing/head/that = 1, - /obj/item/clothing/under/kilt = 1, - /obj/item/clothing/head/beret = 1, - /obj/item/clothing/accessory/waistcoat = 1, - /obj/item/clothing/glasses/monocle =1, - /obj/item/clothing/head/bowler = 1, - /obj/item/cane = 1, - /obj/item/clothing/under/sl_suit = 1, - /obj/item/clothing/mask/fakemoustache = 1, - /obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1, - /obj/item/clothing/head/plaguedoctorhat = 1, - /obj/item/clothing/mask/gas/plaguedoctor = 1, - /obj/item/clothing/suit/toggle/owlwings = 1, - /obj/item/clothing/under/owl = 1, - /obj/item/clothing/mask/gas/owl_mask = 1, - /obj/item/clothing/suit/toggle/owlwings/griffinwings = 1, - /obj/item/clothing/under/griffin = 1, - /obj/item/clothing/shoes/griffin = 1, - /obj/item/clothing/head/griffin = 1, - /obj/item/clothing/suit/apron = 1, - /obj/item/clothing/under/waiter = 1, - /obj/item/clothing/suit/jacket/miljacket = 1, - /obj/item/clothing/under/pirate = 1, - /obj/item/clothing/suit/pirate = 1, - /obj/item/clothing/head/pirate = 1, - /obj/item/clothing/head/bandana = 1, - /obj/item/clothing/head/bandana = 1, - /obj/item/clothing/under/soviet = 1, - /obj/item/clothing/head/ushanka = 1, - /obj/item/clothing/suit/imperium_monk = 1, - /obj/item/clothing/mask/gas/cyborg = 1, - /obj/item/clothing/suit/chaplain/holidaypriest = 1, - /obj/item/clothing/head/wizard/marisa/fake = 1, - /obj/item/clothing/suit/wizrobe/marisa/fake = 1, - /obj/item/clothing/under/sundress = 1, - /obj/item/clothing/head/witchwig = 1, - /obj/item/staff/broom = 1, - /obj/item/clothing/suit/wizrobe/fake = 1, - /obj/item/clothing/head/wizard/fake = 1, - /obj/item/staff = 3, - /obj/item/clothing/under/rank/mime/skirt = 1, - /obj/item/clothing/under/gimmick/rank/captain/suit/skirt = 1, - /obj/item/clothing/mask/gas/sexyclown = 1, - /obj/item/clothing/under/rank/clown/sexy = 1, - /obj/item/clothing/mask/gas/sexymime = 1, - /obj/item/clothing/under/sexymime = 1, - /obj/item/clothing/mask/rat/bat = 1, - /obj/item/clothing/mask/rat/bee = 1, - /obj/item/clothing/mask/rat/bear = 1, - /obj/item/clothing/mask/rat/raven = 1, - /obj/item/clothing/mask/rat/jackal = 1, - /obj/item/clothing/mask/rat/fox = 1, - /obj/item/clothing/mask/frog = 1, - /obj/item/clothing/mask/rat/tribal = 1, - /obj/item/clothing/mask/rat = 1, - /obj/item/clothing/suit/apron/overalls = 1, - /obj/item/clothing/head/rabbitears =1, - /obj/item/clothing/head/sombrero = 1, - /obj/item/clothing/head/sombrero/green = 1, - /obj/item/clothing/suit/poncho = 1, - /obj/item/clothing/suit/poncho/green = 1, - /obj/item/clothing/suit/poncho/red = 1, - /obj/item/clothing/under/maid = 1, - /obj/item/clothing/under/janimaid = 1, - /obj/item/clothing/glasses/cold=1, - /obj/item/clothing/glasses/heat=1, - /obj/item/clothing/suit/whitedress = 1, - /obj/item/clothing/under/jester = 1, - /obj/item/clothing/head/jester = 1, - /obj/item/clothing/under/villain = 1, - /obj/item/clothing/shoes/singery = 1, - /obj/item/clothing/under/singery = 1, - /obj/item/clothing/shoes/singerb = 1, - /obj/item/clothing/under/singerb = 1, - /obj/item/clothing/suit/hooded/carp_costume = 1, - /obj/item/clothing/suit/hooded/ian_costume = 1, - /obj/item/clothing/suit/hooded/bee_costume = 1, - /obj/item/clothing/suit/snowman = 1, - /obj/item/clothing/head/snowman = 1, - /obj/item/clothing/mask/joy = 1, - /obj/item/clothing/head/cueball = 1, - /obj/item/clothing/under/scratch = 1, - /obj/item/clothing/under/sailor = 1, - /obj/item/clothing/ears/headphones = 2, - /obj/item/clothing/head/wig/random = 3) + /obj/item/clothing/head/chicken = 1, + /obj/item/clothing/under/gladiator = 1, + /obj/item/clothing/head/helmet/gladiator = 1, + /obj/item/clothing/under/gimmick/rank/captain/suit = 1, + /obj/item/clothing/head/flatcap = 1, + /obj/item/clothing/suit/toggle/labcoat/mad = 1, + /obj/item/clothing/shoes/jackboots = 1, + /obj/item/clothing/under/schoolgirl = 1, + /obj/item/clothing/under/schoolgirl/red = 1, + /obj/item/clothing/under/schoolgirl/green = 1, + /obj/item/clothing/under/schoolgirl/orange = 1, + /obj/item/clothing/head/kitty = 1, + /obj/item/clothing/under/skirt/black = 1, + /obj/item/clothing/head/beret = 1, + /obj/item/clothing/accessory/waistcoat = 1, + /obj/item/clothing/under/suit_jacket = 1, + /obj/item/clothing/head/that = 1, + /obj/item/clothing/under/kilt = 1, + /obj/item/clothing/head/beret = 1, + /obj/item/clothing/accessory/waistcoat = 1, + /obj/item/clothing/glasses/monocle =1, + /obj/item/clothing/head/bowler = 1, + /obj/item/cane = 1, + /obj/item/clothing/under/sl_suit = 1, + /obj/item/clothing/mask/fakemoustache = 1, + /obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1, + /obj/item/clothing/head/plaguedoctorhat = 1, + /obj/item/clothing/mask/gas/plaguedoctor = 1, + /obj/item/clothing/suit/toggle/owlwings = 1, + /obj/item/clothing/under/owl = 1, + /obj/item/clothing/mask/gas/owl_mask = 1, + /obj/item/clothing/suit/toggle/owlwings/griffinwings = 1, + /obj/item/clothing/under/griffin = 1, + /obj/item/clothing/shoes/griffin = 1, + /obj/item/clothing/head/griffin = 1, + /obj/item/clothing/suit/apron = 1, + /obj/item/clothing/under/waiter = 1, + /obj/item/clothing/suit/jacket/miljacket = 1, + /obj/item/clothing/under/pirate = 1, + /obj/item/clothing/suit/pirate = 1, + /obj/item/clothing/head/pirate = 1, + /obj/item/clothing/head/bandana = 1, + /obj/item/clothing/head/bandana = 1, + /obj/item/clothing/under/soviet = 1, + /obj/item/clothing/head/ushanka = 1, + /obj/item/clothing/suit/imperium_monk = 1, + /obj/item/clothing/mask/gas/cyborg = 1, + /obj/item/clothing/suit/chaplain/holidaypriest = 1, + /obj/item/clothing/head/wizard/marisa/fake = 1, + /obj/item/clothing/suit/wizrobe/marisa/fake = 1, + /obj/item/clothing/under/sundress = 1, + /obj/item/clothing/head/witchwig = 1, + /obj/item/staff/broom = 1, + /obj/item/clothing/suit/wizrobe/fake = 1, + /obj/item/clothing/head/wizard/fake = 1, + /obj/item/staff = 3, + /obj/item/clothing/under/rank/mime/skirt = 1, + /obj/item/clothing/under/gimmick/rank/captain/suit/skirt = 1, + /obj/item/clothing/mask/gas/sexyclown = 1, + /obj/item/clothing/under/rank/clown/sexy = 1, + /obj/item/clothing/mask/gas/sexymime = 1, + /obj/item/clothing/under/sexymime = 1, + /obj/item/clothing/mask/rat/bat = 1, + /obj/item/clothing/mask/rat/bee = 1, + /obj/item/clothing/mask/rat/bear = 1, + /obj/item/clothing/mask/rat/raven = 1, + /obj/item/clothing/mask/rat/jackal = 1, + /obj/item/clothing/mask/rat/fox = 1, + /obj/item/clothing/mask/frog = 1, + /obj/item/clothing/mask/rat/tribal = 1, + /obj/item/clothing/mask/rat = 1, + /obj/item/clothing/suit/apron/overalls = 1, + /obj/item/clothing/head/rabbitears =1, + /obj/item/clothing/head/sombrero = 1, + /obj/item/clothing/head/sombrero/green = 1, + /obj/item/clothing/suit/poncho = 1, + /obj/item/clothing/suit/poncho/green = 1, + /obj/item/clothing/suit/poncho/red = 1, + /obj/item/clothing/under/maid = 1, + /obj/item/clothing/under/janimaid = 1, + /obj/item/clothing/glasses/cold=1, + /obj/item/clothing/glasses/heat=1, + /obj/item/clothing/suit/whitedress = 1, + /obj/item/clothing/under/jester = 1, + /obj/item/clothing/head/jester = 1, + /obj/item/clothing/under/villain = 1, + /obj/item/clothing/shoes/singery = 1, + /obj/item/clothing/under/singery = 1, + /obj/item/clothing/shoes/singerb = 1, + /obj/item/clothing/under/singerb = 1, + /obj/item/clothing/suit/hooded/carp_costume = 1, + /obj/item/clothing/suit/hooded/ian_costume = 1, + /obj/item/clothing/suit/hooded/bee_costume = 1, + /obj/item/clothing/suit/snowman = 1, + /obj/item/clothing/head/snowman = 1, + /obj/item/clothing/mask/joy = 1, + /obj/item/clothing/head/cueball = 1, + /obj/item/clothing/under/scratch = 1, + /obj/item/clothing/under/sailor = 1, + /obj/item/clothing/ears/headphones = 2, + /obj/item/clothing/head/wig/random = 3, + /obj/item/clothing/suit/ran = 2, + /obj/item/clothing/head/ran = 2) contraband = list(/obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, /obj/item/gun/magic/wand = 2, diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 58129ac1cb..174aa8a22f 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -393,6 +393,7 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 24px;} .clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.spooky {color: #FF6100;} .velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} @keyframes velvet { 0% { color: #400020; } diff --git a/html/changelogs/AutoChangeLog-pr-9456.yml b/html/changelogs/AutoChangeLog-pr-9456.yml new file mode 100644 index 0000000000..e4392394b8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9456.yml @@ -0,0 +1,7 @@ +author: "Fermis" +delete-after: True +changes: + - rscadd: "Adds Jacqueline the Pumpqueen and her familiar Bartholomew for the spooky season" + - soundadd: "Adds a giggle" + - imageadd: "Adds cauldron, Jacq and Jacq o lanterns, and a costume for halloween! +mapedit: adds a new landmark so Bartholomew can spawn somewhere sensible." diff --git a/html/changelogs/AutoChangeLog-pr-9472.yml b/html/changelogs/AutoChangeLog-pr-9472.yml new file mode 100644 index 0000000000..dd0aac8954 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9472.yml @@ -0,0 +1,5 @@ +author: "Fermis" +delete-after: True +changes: + - bugfix: "fixes food reactions and explosion runtimes," + - bugfix: "fixes the too much yes problem" diff --git a/html/changelogs/AutoChangeLog-pr-9478.yml b/html/changelogs/AutoChangeLog-pr-9478.yml new file mode 100644 index 0000000000..d2c80d08fb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9478.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - tweak: "Pod people can no longer get fat from standing in the light" diff --git a/html/changelogs/AutoChangeLog-pr-9479.yml b/html/changelogs/AutoChangeLog-pr-9479.yml new file mode 100644 index 0000000000..cea218193e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9479.yml @@ -0,0 +1,4 @@ +author: "lolman360" +delete-after: True +changes: + - bugfix: "fixes bug with new surgerytools examine" diff --git a/html/changelogs/AutoChangeLog-pr-9486.yml b/html/changelogs/AutoChangeLog-pr-9486.yml new file mode 100644 index 0000000000..c624e6472c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9486.yml @@ -0,0 +1,4 @@ +author: "ZeroNetAlpha" +delete-after: True +changes: + - tweak: "Silicons are now consumable by scrub pups." diff --git a/html/changelogs/AutoChangeLog-pr-9488.yml b/html/changelogs/AutoChangeLog-pr-9488.yml new file mode 100644 index 0000000000..dd5ac89610 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9488.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Adds some missing species_traits for cloth, clockwork and cult golems." diff --git a/html/changelogs/AutoChangeLog-pr-9489.yml b/html/changelogs/AutoChangeLog-pr-9489.yml new file mode 100644 index 0000000000..a395af0749 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9489.yml @@ -0,0 +1,4 @@ +author: "Ghommie (original PR by nemvar)" +delete-after: True +changes: + - imageadd: "Some drinks have new icons or slightly altered icons. In particular Wizz Fizz, Bug Spray, Jack Rose, Champagne and Applejack." diff --git a/html/changelogs/AutoChangeLog-pr-9491.yml b/html/changelogs/AutoChangeLog-pr-9491.yml new file mode 100644 index 0000000000..0bfd6b6ee2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9491.yml @@ -0,0 +1,4 @@ +author: "Poojawa" +delete-after: True +changes: + - bugfix: "fixed missing deco wing states" diff --git a/html/changelogs/AutoChangeLog-pr-9492.yml b/html/changelogs/AutoChangeLog-pr-9492.yml new file mode 100644 index 0000000000..5481265898 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9492.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Added towel linen bins, found in dormitory restrooms. Also enhanced the bedsheet bins found in some stations' dormitories" + - imageadd: "Resprited bedsheet bins in 3/4 perspective" diff --git a/html/changelogs/AutoChangeLog-pr-9493.yml b/html/changelogs/AutoChangeLog-pr-9493.yml new file mode 100644 index 0000000000..69aef9dbec --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9493.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "Made SDGF ghost poll message less verbose, made the experimental cloner's complaint with the former, and added ghost poll ignore options for both." diff --git a/html/changelogs/AutoChangeLog-pr-9499.yml b/html/changelogs/AutoChangeLog-pr-9499.yml new file mode 100644 index 0000000000..a4d41485cd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9499.yml @@ -0,0 +1,4 @@ +author: "r4d6" +delete-after: True +changes: + - rscadd: "Added blindfolds to the Loadout list" diff --git a/html/changelogs/AutoChangeLog-pr-9502.yml b/html/changelogs/AutoChangeLog-pr-9502.yml new file mode 100644 index 0000000000..71939adfd8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9502.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - tweak: "PanD.E.M.I.C 2200 now ejects onto itself instead of onto user if user's hands are full" diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 0197507b9d..842562b007 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 740ad43d42..38ac61f318 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 06b2eee2eb..c8a007041b 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index dc5fa1399d..fb406fb65e 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index f9c1a197e7..e8b3d434f5 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/halloween_items.dmi b/icons/obj/halloween_items.dmi index c08ea71148..b4f11165dc 100644 Binary files a/icons/obj/halloween_items.dmi and b/icons/obj/halloween_items.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 7bbfdfd11d..cad28e12fe 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 0dd6039e75..bdfbae3d75 100755 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 2ecd9f9004..c51778bbdb 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -153,6 +153,7 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 3;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.spooky {color: #FF9100;} .velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} @keyframes velvet { 0% { color: #400020; } diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 136aefb8f5..7e7038cb31 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -450,5 +450,5 @@ datum/gear/darksabresheath /datum/gear/donorgoggles name = "Flight Goggles" category = SLOT_HEAD - path = /obj/item/clothing/glasses/flight + path = /obj/item/clothing/head/flight ckeywhitelist = list("maxlynchy") diff --git a/modular_citadel/code/modules/client/loadout/glasses.dm b/modular_citadel/code/modules/client/loadout/glasses.dm index 9e7b68bf0d..57270d8e57 100644 --- a/modular_citadel/code/modules/client/loadout/glasses.dm +++ b/modular_citadel/code/modules/client/loadout/glasses.dm @@ -1,3 +1,8 @@ +/datum/gear/blindfold + name = "Blindfold" + category = SLOT_GLASSES + path = /obj/item/clothing/glasses/sunglasses/blindfold + /datum/gear/cold name = "Cold goggles" category = SLOT_GLASSES diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index 0cabdca6ee..32c73cc40a 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -494,11 +494,10 @@ icon = 'icons/obj/custom.dmi' alternate_worn_icon = 'icons/mob/custom_w.dmi' -/obj/item/clothing/glasses/flight +/obj/item/clothing/head/flight name = "flight goggles" desc = "Old style flight goggles with a leather cap attached." icon_state = "flight-g" item_state = "flight-g" icon = 'icons/obj/custom.dmi' alternate_worn_icon = 'icons/mob/custom_w.dmi' - actions_types = list(/datum/action/item_action/toggle) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index a7e1ac8e92..e5844f204a 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -68,11 +68,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING startHunger = M.nutrition if(pollStarted == FALSE) pollStarted = TRUE - candies = pollGhostCandidates("Do you want to play as a clone of [M], and do you agree to respect their character and act in a similar manner to them? Do not engage in ERP as them unless you have LOOC permission from them, and ensure it is permission from the original, not a clone.") + candies = pollGhostCandidates("Do you want and agree to play as a clone of [M], respect their character and not engage in ERP without permission from the original?", ignore_category = POLL_IGNORE_CLONE) log_game("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.") if(20 to INFINITY) if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there! - log_game("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [candies]") to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!") var/typepath = M.type var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc) @@ -91,7 +90,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING log_game("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [C2]") break else - candies =- C2 + candies -= C2 if(!SM.mind) //Something went wrong, use alt mechanics return ..() SM.mind.enslave_mind_to_creator(M) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index f63fbf1baf..7fcae0eb13 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -28,7 +28,7 @@ return //Called when temperature is above a certain threshold, or if purity is too low. -/datum/chemical_reaction/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) +/datum/chemical_reaction/proc/FermiExplode(datum/reagents/R0, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) if (Exploding == TRUE) return @@ -76,7 +76,7 @@ var/datum/effect_system/smoke_spread/chem/s = new() R.my_atom = my_atom //Give the gas a fingerprint - for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents, has to be done this way, otherwise it never stops Exploding + for (var/datum/reagent/reagent in R0.reagent_list) //make gas for reagents, has to be done this way, otherwise it never stops Exploding R.add_reagent(reagent.id, reagent.volume/3) //Seems fine? I think I fixed the infinite explosion bug. if (reagent.purity < 0.6) diff --git a/sound/spookoween/ahaha.ogg b/sound/spookoween/ahaha.ogg new file mode 100644 index 0000000000..2e830ad6c7 Binary files /dev/null and b/sound/spookoween/ahaha.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 2037726c14..2dab8bee0f 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1706,6 +1706,9 @@ #include "code\modules\goonchat\jsErrorHandler.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\holidays.dm" +#include "code\modules\holiday\halloween\bartholomew.dm" +#include "code\modules\holiday\halloween\halloween.dm" +#include "code\modules\holiday\halloween\jacqueen.dm" #include "code\modules\holodeck\area_copy.dm" #include "code\modules\holodeck\computer.dm" #include "code\modules\holodeck\holo_effect.dm"