Merge remote-tracking branch 'refs/remotes/Citadel-Station-13/master' into syntheticbloods

This commit is contained in:
Poojawa
2019-10-16 01:51:51 -05:00
61 changed files with 1059 additions and 273 deletions
+15 -9
View File
@@ -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
+37 -31
View File
@@ -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
+13 -10
View File
@@ -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
+15 -15
View File
@@ -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
+34 -28
View File
@@ -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
+2
View File
@@ -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())
+1 -1
View File
@@ -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)
@@ -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)
@@ -544,4 +544,26 @@
user.visible_message("<span class='warning'>[hound.name]'s garbage processor groans lightly as [trashman] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [trashman] slips inside.</span>")
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, "<span class='warning'>[target] registers an error code to your [src]</span>")
return
if(patient)
to_chat(user,"<span class='warning'>Your [src] is already occupied.</span>")
return
if(trashbot.buckled)
to_chat(user,"<span class='warning'>[trashbot] is buckled and can not be put into your [src].</span>")
return
user.visible_message("<span class='warning'>[hound.name] is ingesting [trashbot] into their [src].</span>", "<span class='notice'>You start ingesting [trashbot] into your [src.name]...</span>")
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("<span class='warning'>[hound.name]'s garbage processor groans lightly as [trashbot] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [trashbot] slips inside.</span>")
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1)
return
return
+22 -11
View File
@@ -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, "<span class='warning'>\The [I] is stuck to your hand, you cannot place it into the bin!</span>")
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, "<span class='notice'>[hidden] falls out of [B]!</span>")
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, "<span class='notice'>You telekinetically remove [B] from [src].</span>")
@@ -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)
@@ -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
*/
+1
View File
@@ -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")
@@ -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; }
@@ -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, "<span class='notice'>You add the [I.name] to the pot and watch as it melts into the mixture, a candy crystalising in it's wake.</span>")
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
@@ -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()
+442
View File
@@ -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("<b>[src]</b> cackles, <span class='spooky'>\"You'll nae get rid a me that easily!\"</span>")
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("<b>[src]</b> cackles, <span class='spooky'>\"You'll nae get rid a me that easily!\"</span>")
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("<b>[src]</b> 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("<b>[src]</b> smiles ominously at [C], <span class='spooky'>\"Well halo there [gender]! Ah'm Jacqueline, tae great Pumpqueen, great tae meet ye.\"</span>")
sleep(20)
visible_message("<b>[src]</b> continues, says, <span class='spooky'>\"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.</span>\" 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("<b>[src]</b> raises an eyebrow, <span class='spooky'>\"You've nae got any candies Ah want! They're the orange round ones, now bugger off an go get em first.\"</span>")
return
if("How do I get candies?")
visible_message("<b>[src]</b> says, <span class='spooky'>\"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.\"</span>")
return
/mob/living/simple_animal/jacq/proc/treat(mob/living/carbon/C, gender)
visible_message("<b>[src]</b> gives off a glowing smile, <span class='spooky'>\"What ken Ah offer ye? I can magic up an object, a potion or a plushie fer ye.\"</span>")
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("<b>[src]</b> raises an eyebrown, <span class='spooky'>\"It's 3 candies per trinket [gender]! Thems the rules!\"</span>")
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("<b>[src]</b> waves her hands, magicing up a [reward] from thin air, <span class='spooky'>\"There ye are [gender], enjoy! \"</span>")
sleep(20)
poof()
return
if("Potion - 2 candies")
if(!take_candies(C, 2))
visible_message("<b>[src]</b> raises an eyebrow, <span class='spooky'>\"It's 2 candies per potion [gender]! Thems the rules!\"</span>")
return
var/reward = new /obj/item/reagent_containers/potion_container(C.loc)
C.put_in_hands(reward)
visible_message("<b>[src]</b> waves her hands, magicing up a [reward] from thin air, <span class='spooky'>\"There ye are [gender], enjoy! \"</span>")
sleep(20)
poof()
return
if("Plushie - 1 candy")
if(!take_candies(C, 1))
visible_message("<b>[src]</b> raises an eyebrow, <span class='spooky'>\"It's 1 candy per plushie [gender]! Thems the rules!\"</span>")
return
new /obj/item/toy/plush/random(C.loc)
visible_message("<b>[src]</b> waves her hands, magicing up a plushie from thin air, <span class='spooky'>\"There ye are [gender], enjoy! \"</span>")
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("<b>[src]</b> sighs, <span class='spooky'>\"Ah'm all questioned oot fer noo, [gender].\"</span>")
return
//Otherwise, lets go!
visible_message("<b>[src]</b> says, <span class='spooky'>\"A question? Sure, it'll cost you a candy though!\"</span>")
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("<b>[src]</b> raises an eyebrow, <span class='spooky'>\"It's a candy per question [gender]! Thems the rules!\"</span>")
return
//Talking
switch(choice)
if("Why do you want the candies?")
visible_message("<b>[src]</b> says, <span class='spooky'>\"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.\"</span>")
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_CANDIES
sleep(30)
poof()
if("You really came all this way for candy?")
visible_message("<b>[src]</b> looks tae the side sheepishly, <span class='spooky'>\"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!\"</span> <b>[src]</b> scowls, <span class='spooky'>\"She's tae black sheep o' the family too, so we dunnae see eye tae eye sometimes on alchemy. Ah mean, she puts <i> moles </i> in her brews! Ye dunnae put moles in yer brews! Yae threw your brews at tae wee bastards an blew em up!\"</span> <b>[src]</b> sighs, <span class='spooky'>\"But she's a heart o gold so.. Ah wanted tae see her an check up oon her, make sure she's okay.\"</span>")
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_FAR
sleep(30)
poof()
if("What is that on your head?")
visible_message("<b>[src]</b> pats the pumpkin atop her head, <span class='spooky'>\"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.\"</span>")
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_HEAD
sleep(30)
poof()
if("Are you a witch?")
visible_message("<b>[src]</b> grumbles, <span class='spooky'>\"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.\"</span>")
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_WITCH
sleep(30)
poof()
if("So you got ex-spell-ed?")
visible_message("<b>[src]</b> Gives you a blank look at the pun, before continuing, <span class='spooky'>\"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!\"</span> 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, <span class='spooky'>\"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.\"</span>")
sleep(30)
visible_message("<b>[src]</b> says, <span class='spooky'>\"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.\"</span>")
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_EXPELL
sleep(30)
poof()
if("Can I take you out on a date?")
visible_message("<b>[src]</b> blushes, <span class='spooky'>\"...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.\"</span>")
progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_DATE
visible_message("<b>[src]</b> looks to the side, deep in thought.</span>")
dating_start(C, gender)
if("Nevermind")
visible_message("<b>[src]</b> shrugs, <span class='spooky'>\"Suit yerself then, here's your candy back.\"</span>")
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("<b>[src]</b> waves their arms around, <span class='spooky'>\"Hocus pocus, making friends is now your focus!\"</span>")
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("<b>[src]</b> waves their arms around, <span class='spooky'>\"Off comes your head, a pumpkin taking it's stead!\"</span>")
C.reagents.add_reagent("pumpkinmutationtoxin", 5)
if(3)
visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"If only you had a better upbringing, your ears are now full of my singing!\"</span>")
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("<b>[src]</b> waves their arms around, <span class='spooky'>\"You're cute little bumpkin, On your head is a pumpkin!\"</span>")
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("<b>[src]</b> waves their arms around, <span class='spooky'>\"In your body there's something amiss, you'll find it's a chem made by my sis!\"</span>")
C.reagents.add_reagent("eigenstate", 30)
if(6)
visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"A new familiar for me, and you'll see it's thee!\"</span>")
C.reagents.add_reagent("secretcatchem", 30)
if(7)
visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"While you may not be a ghost, for this sheet you'll always be it's host.\"</span>")
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, "<span class='big spooky'>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. <i> Please be good so I can do events like this in the future. </i> </span>")
return
else
candies =- C2
visible_message("<b>[src]</b> looks to the side, <span class='spooky'>\"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.\"</span>")
sleep(20)
visible_message("<b>[src]</b> 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("<b>[src]</b> waves their arms around, <span class='spooky'>\"There, that aught tae be worth a candy.\"</span>")
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, "<span class='spooky'><i>Boooooo~!</i></span>")
return
else
..()
/obj/item/clothing/suit/ghost_sheet/sticky/attack_hand(mob/user)
if(iscarbon(user))
to_chat(user, "<span class='spooky'><i>Boooooo~!</i></span>")
return
else
..()
/datum/reagent/mutationtoxin/pumpkinhead
name = "Pumpkin head mutation toxin"
id = "pumpkinmutationtoxin"
race = /datum/species/dullahan/pumpkin
mutationtext = "<span class='spooky'>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)
+10
View File
@@ -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
+5
View File
@@ -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()
@@ -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, "<span class='danger'>The round is either not ready, or has already finished...</span>")
return
if(!GLOB.enter_allowed)
to_chat(usr, "<span class='notice'>There is an administrative lock on entering the game!</span>")
return
@@ -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"
+23 -21
View File
@@ -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
@@ -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"
@@ -581,7 +581,7 @@
limbs_id = "cultgolem"
sexes = FALSE
info_text = "As a <span class='danger'>Runic Golem</span>, 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 = "<span class='bold alloy'>As a </span><span class='bold brass'>Clockwork Golem</span><span class='bold alloy'>, you are faster than other types of golems. On death, you will break down into scrap.</span>"
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 <span class='danger'>Cloth Golem</span>, 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
@@ -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)
@@ -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
@@ -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
+10 -12
View File
@@ -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)))
@@ -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
@@ -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
+4
View File
@@ -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.
+4 -1
View File
@@ -29,7 +29,8 @@
icon_state = "retractor_a"
/obj/item/retractor/advanced/examine(mob/living/user)
to_chat(user, "<span class = 'notice> It resembles a retractor[tool_behaviour == TOOL_RETRACTOR ? "retractor" : "hemostat"]. </span>")
. = ..()
to_chat(user, "<span class = 'notice> It resembles a [tool_behaviour == TOOL_RETRACTOR ? "retractor" : "hemostat"]. </span>")
/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, "<span class = 'notice> It's set to [tool_behaviour == TOOL_DRILL ? "drilling" : "mending"] mode.</span>")
/obj/item/surgicaldrill/augment
@@ -203,6 +205,7 @@
icon_state = "scalpel_a"
/obj/item/scalpel/advanced/examine(mob/living/user)
. = ..()
to_chat(user, "<span class = 'notice> It's set to [tool_behaviour == TOOL_SCALPEL ? "scalpel" : "saw"] mode. </span>")
/obj/item/scalpel/augment
+103 -101
View File
@@ -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,
+1
View File
@@ -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; }
@@ -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."
@@ -0,0 +1,5 @@
author: "Fermis"
delete-after: True
changes:
- bugfix: "fixes food reactions and explosion runtimes,"
- bugfix: "fixes the too much yes problem"
@@ -0,0 +1,4 @@
author: "Putnam3145"
delete-after: True
changes:
- tweak: "Pod people can no longer get fat from standing in the light"
@@ -0,0 +1,4 @@
author: "lolman360"
delete-after: True
changes:
- bugfix: "fixes bug with new surgerytools examine"
@@ -0,0 +1,4 @@
author: "ZeroNetAlpha"
delete-after: True
changes:
- tweak: "Silicons are now consumable by scrub pups."
@@ -0,0 +1,4 @@
author: "Ghommie"
delete-after: True
changes:
- bugfix: "Adds some missing species_traits for cloth, clockwork and cult golems."
@@ -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."
@@ -0,0 +1,4 @@
author: "Poojawa"
delete-after: True
changes:
- bugfix: "fixed missing deco wing states"
@@ -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"
@@ -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."
@@ -0,0 +1,4 @@
author: "r4d6"
delete-after: True
changes:
- rscadd: "Added blindfolds to the Loadout list"
@@ -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"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 347 KiB

After

Width:  |  Height:  |  Size: 349 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 843 B

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 37 KiB

+1
View File
@@ -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; }
@@ -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")
@@ -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
@@ -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)
@@ -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, "<span class='warning'>The cells reach a critical micelle concentration, nucleating rapidly within your body!</span>")
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)
@@ -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)
Binary file not shown.
+3
View File
@@ -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"