Merge branch 'master' into FERMICHEMCurTweaks
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
@@ -80885,15 +80897,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
|
||||
@@ -118790,7 +118793,7 @@ aBu
|
||||
aCB
|
||||
aDU
|
||||
aFg
|
||||
dhD
|
||||
aab
|
||||
axC
|
||||
axC
|
||||
axC
|
||||
|
||||
@@ -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" = (
|
||||
@@ -82334,7 +82334,7 @@ awQ
|
||||
axK
|
||||
ayC
|
||||
awQ
|
||||
aAJ
|
||||
abn
|
||||
aBT
|
||||
awQ
|
||||
aDI
|
||||
|
||||
@@ -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,
|
||||
@@ -60878,6 +60880,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{
|
||||
@@ -79874,7 +79880,7 @@ ckT
|
||||
xhj
|
||||
xhj
|
||||
cwK
|
||||
xhj
|
||||
vkd
|
||||
xhj
|
||||
cxn
|
||||
xhj
|
||||
@@ -100839,7 +100845,7 @@ aiT
|
||||
aiS
|
||||
apX
|
||||
cod
|
||||
asg
|
||||
aab
|
||||
atj
|
||||
apX
|
||||
avi
|
||||
@@ -102398,7 +102404,7 @@ aFH
|
||||
aGG
|
||||
aHo
|
||||
aIk
|
||||
aJo
|
||||
aac
|
||||
aGF
|
||||
aEd
|
||||
aMr
|
||||
|
||||
@@ -230,6 +230,8 @@
|
||||
//Mood
|
||||
#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code.
|
||||
#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code.
|
||||
#define COMSIG_INCREASE_SANITY "decrease_sanity" //Called when you want to increase sanity from anywhere in the code.
|
||||
#define COMSIG_DECREASE_SANITY "increase_sanity" //Same as above but to decrease sanity instead.
|
||||
|
||||
//NTnet
|
||||
#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#define JOB_UNAVAILABLE_PLAYTIME 3
|
||||
#define JOB_UNAVAILABLE_ACCOUNTAGE 4
|
||||
#define JOB_UNAVAILABLE_SLOTFULL 5
|
||||
#define JOB_UNAVAILABLE_SPECIESLOCK 6
|
||||
|
||||
#define DEFAULT_RELIGION "Christianity"
|
||||
#define DEFAULT_DEITY "Space Jesus"
|
||||
|
||||
@@ -314,7 +314,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
|
||||
#define MAP_MAXZ 6
|
||||
|
||||
// Defib stats
|
||||
#define DEFIB_TIME_LIMIT 960
|
||||
#define DEFIB_TIME_LIMIT 1500
|
||||
#define DEFIB_TIME_LOSS 60
|
||||
|
||||
// Diagonal movement
|
||||
@@ -499,3 +499,6 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
|
||||
|
||||
#define VOMIT_TOXIC 1
|
||||
#define VOMIT_PURPLE 2
|
||||
|
||||
//Misc text define. Does 4 spaces. Used as a makeshift tabulator.
|
||||
#define FOURSPACES " "
|
||||
|
||||
@@ -47,4 +47,4 @@
|
||||
#define ORGAN_FAILING (1<<2) //Failing organs perform damaging effects until replaced or fixed
|
||||
#define ORGAN_EXTERNAL (1<<3) //Was this organ implanted/inserted/etc, if true will not be removed during species change.
|
||||
#define ORGAN_VITAL (1<<4) //Currently only the brain
|
||||
#define ORGAN_NO_SPOIL (1<<5) //Currently only the brain
|
||||
#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances
|
||||
|
||||
@@ -83,7 +83,9 @@
|
||||
#define INIT_ORDER_SHUTTLE -21
|
||||
#define INIT_ORDER_MINOR_MAPPING -40
|
||||
#define INIT_ORDER_PATH -50
|
||||
#define INIT_ORDER_PERSISTENCE -100
|
||||
#define INIT_ORDER_PERSISTENCE -95
|
||||
#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init.
|
||||
|
||||
|
||||
// Subsystem fire priority, from lowest to highest priority
|
||||
// If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child)
|
||||
@@ -114,6 +116,7 @@
|
||||
#define FIRE_PRIORITY_MOBS 100
|
||||
#define FIRE_PRIORITY_TGUI 110
|
||||
#define FIRE_PRIORITY_TICKER 200
|
||||
#define FIRE_PRIORITY_CHAT 400
|
||||
#define FIRE_PRIORITY_OVERLAYS 500
|
||||
#define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost.
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_wings, GLOB.insect_wings_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_fluff, GLOB.insect_fluffs_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/deco_wings, GLOB.deco_wings_list)
|
||||
|
||||
//CIT CHANGES START HERE, ADDS SNOWFLAKE BODYPARTS AND MORE
|
||||
//mammal bodyparts (fucking furries)
|
||||
|
||||
@@ -70,6 +70,8 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
|
||||
if(!GLOB.wings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list)
|
||||
if(!GLOB.deco_wings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/deco_wings, GLOB.deco_wings_list)
|
||||
if(!GLOB.insect_wings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_wings, GLOB.insect_wings_list)
|
||||
if(!GLOB.insect_fluffs_list.len)
|
||||
@@ -138,6 +140,7 @@
|
||||
"tail_lizard" = pick(GLOB.tails_list_lizard),
|
||||
"tail_human" = "None",
|
||||
"wings" = "None",
|
||||
"deco_wings" = "None",
|
||||
"snout" = pick(GLOB.snouts_list),
|
||||
"horns" = pick(GLOB.horns_list),
|
||||
"ears" = "None",
|
||||
|
||||
+15
-15
@@ -280,41 +280,41 @@
|
||||
if(GLOB.round_id)
|
||||
var/statspage = CONFIG_GET(string/roundstatsurl)
|
||||
var/info = statspage ? "<a href='?action=openLink&link=[url_encode(statspage)][GLOB.round_id]'>[GLOB.round_id]</a>" : GLOB.round_id
|
||||
parts += "[GLOB.TAB]Round ID: <b>[info]</b>"
|
||||
parts += "[FOURSPACES]Round ID: <b>[info]</b>"
|
||||
|
||||
var/list/voting_results = SSvote.stored_gamemode_votes
|
||||
|
||||
if(length(voting_results))
|
||||
parts += "[GLOB.TAB]Voting: "
|
||||
parts += "[FOURSPACES]Voting: "
|
||||
var/total_score = 0
|
||||
for(var/choice in voting_results)
|
||||
var/score = voting_results[choice]
|
||||
total_score += score
|
||||
parts += "[GLOB.TAB][GLOB.TAB][choice]: [score]"
|
||||
parts += "[FOURSPACES][FOURSPACES][choice]: [score]"
|
||||
|
||||
parts += "[GLOB.TAB]Shift Duration: <B>[DisplayTimeText(world.time - SSticker.round_start_time)]</B>"
|
||||
parts += "[GLOB.TAB]Station Integrity: <B>[mode.station_was_nuked ? "<span class='redtext'>Destroyed</span>" : "[popcount["station_integrity"]]%"]</B>"
|
||||
parts += "[FOURSPACES]Shift Duration: <B>[DisplayTimeText(world.time - SSticker.round_start_time)]</B>"
|
||||
parts += "[FOURSPACES]Station Integrity: <B>[mode.station_was_nuked ? "<span class='redtext'>Destroyed</span>" : "[popcount["station_integrity"]]%"]</B>"
|
||||
var/total_players = GLOB.joined_player_list.len
|
||||
if(total_players)
|
||||
parts+= "[GLOB.TAB]Total Population: <B>[total_players]</B>"
|
||||
parts+= "[FOURSPACES]Total Population: <B>[total_players]</B>"
|
||||
if(station_evacuated)
|
||||
parts += "<BR>[GLOB.TAB]Evacuation Rate: <B>[popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)</B>"
|
||||
parts += "[GLOB.TAB](on emergency shuttle): <B>[popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)</B>"
|
||||
parts += "[GLOB.TAB]Survival Rate: <B>[popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)</B>"
|
||||
parts += "<BR>[FOURSPACES]Evacuation Rate: <B>[popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)</B>"
|
||||
parts += "[FOURSPACES](on emergency shuttle): <B>[popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)</B>"
|
||||
parts += "[FOURSPACES]Survival Rate: <B>[popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)</B>"
|
||||
if(SSblackbox.first_death)
|
||||
var/list/ded = SSblackbox.first_death
|
||||
if(ded.len)
|
||||
parts += "[GLOB.TAB]First Death: <b>[ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]</b>"
|
||||
parts += "[FOURSPACES]First Death: <b>[ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]</b>"
|
||||
//ignore this comment, it fixes the broken sytax parsing caused by the " above
|
||||
else
|
||||
parts += "[GLOB.TAB]<i>Nobody died this shift!</i>"
|
||||
parts += "[FOURSPACES]<i>Nobody died this shift!</i>"
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
parts += "[GLOB.TAB]Threat level: [mode.threat_level]"
|
||||
parts += "[GLOB.TAB]Threat left: [mode.threat]"
|
||||
parts += "[GLOB.TAB]Executed rules:"
|
||||
parts += "[FOURSPACES]Threat level: [mode.threat_level]"
|
||||
parts += "[FOURSPACES]Threat left: [mode.threat]"
|
||||
parts += "[FOURSPACES]Executed rules:"
|
||||
for(var/datum/dynamic_ruleset/rule in mode.executed_rules)
|
||||
parts += "[GLOB.TAB][GLOB.TAB][rule.ruletype] - <b>[rule.name]</b>: -[rule.cost] threat"
|
||||
parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - <b>[rule.name]</b>: -[rule.cost] threat"
|
||||
return parts.Join("<br>")
|
||||
|
||||
/client/proc/roundend_report_file()
|
||||
|
||||
@@ -33,6 +33,7 @@ GLOBAL_LIST_EMPTY(animated_tails_list_human)
|
||||
GLOBAL_LIST_EMPTY(ears_list)
|
||||
GLOBAL_LIST_EMPTY(wings_list)
|
||||
GLOBAL_LIST_EMPTY(wings_open_list)
|
||||
GLOBAL_LIST_EMPTY(deco_wings_list)
|
||||
GLOBAL_LIST_EMPTY(r_wings_list)
|
||||
GLOBAL_LIST_EMPTY(insect_wings_list)
|
||||
GLOBAL_LIST_EMPTY(insect_fluffs_list)
|
||||
|
||||
@@ -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())
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@ GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the hos
|
||||
// However it'd be ok to use for accessing attack logs and such too, which are even laggier.
|
||||
GLOBAL_VAR_INIT(fileaccess_timer, 0)
|
||||
|
||||
GLOBAL_VAR_INIT(TAB, " ")
|
||||
|
||||
GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
|
||||
|
||||
GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
SUBSYSTEM_DEF(chat)
|
||||
name = "Chat"
|
||||
flags = SS_TICKER|SS_NO_INIT
|
||||
wait = 1
|
||||
priority = FIRE_PRIORITY_CHAT
|
||||
init_order = INIT_ORDER_CHAT
|
||||
var/list/payload = list()
|
||||
|
||||
|
||||
/datum/controller/subsystem/chat/fire()
|
||||
for(var/i in payload)
|
||||
var/client/C = i
|
||||
C << output(payload[C], "browseroutput:output")
|
||||
payload -= C
|
||||
|
||||
if(MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
|
||||
/datum/controller/subsystem/chat/proc/queue(target, message, handle_whitespace = TRUE)
|
||||
if(!target || !message)
|
||||
return
|
||||
|
||||
if(!istext(message))
|
||||
stack_trace("to_chat called with invalid input type")
|
||||
return
|
||||
|
||||
if(target == world)
|
||||
target = GLOB.clients
|
||||
|
||||
//Some macros remain in the string even after parsing and fuck up the eventual output
|
||||
message = replacetext(message, "\improper", "")
|
||||
message = replacetext(message, "\proper", "")
|
||||
if(handle_whitespace)
|
||||
message = replacetext(message, "\n", "<br>")
|
||||
message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]")
|
||||
message += "<br>"
|
||||
|
||||
|
||||
//url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
|
||||
//Do the double-encoding here to save nanoseconds
|
||||
var/twiceEncoded = url_encode(url_encode(message))
|
||||
|
||||
if(islist(target))
|
||||
for(var/I in target)
|
||||
var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible
|
||||
|
||||
if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
|
||||
continue
|
||||
|
||||
if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue
|
||||
C.chatOutput.messageQueue += message
|
||||
continue
|
||||
|
||||
payload[C] += twiceEncoded
|
||||
|
||||
else
|
||||
var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible
|
||||
|
||||
if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
|
||||
return
|
||||
|
||||
if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue
|
||||
C.chatOutput.messageQueue += message
|
||||
return
|
||||
|
||||
payload[C] += twiceEncoded
|
||||
@@ -21,6 +21,8 @@
|
||||
|
||||
RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event)
|
||||
RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event)
|
||||
RegisterSignal(parent, COMSIG_INCREASE_SANITY, .proc/IncreaseSanity)
|
||||
RegisterSignal(parent, COMSIG_DECREASE_SANITY, .proc/DecreaseSanity)
|
||||
|
||||
RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud)
|
||||
var/mob/living/owner = parent
|
||||
@@ -129,23 +131,23 @@
|
||||
|
||||
switch(mood_level)
|
||||
if(1)
|
||||
DecreaseSanity(0.2)
|
||||
DecreaseSanity(src, 0.2)
|
||||
if(2)
|
||||
DecreaseSanity(0.125, SANITY_CRAZY)
|
||||
DecreaseSanity(src, 0.125, SANITY_CRAZY)
|
||||
if(3)
|
||||
DecreaseSanity(0.075, SANITY_UNSTABLE)
|
||||
DecreaseSanity(src, 0.075, SANITY_UNSTABLE)
|
||||
if(4)
|
||||
DecreaseSanity(0.025, SANITY_DISTURBED)
|
||||
DecreaseSanity(src, 0.025, SANITY_DISTURBED)
|
||||
if(5)
|
||||
IncreaseSanity(0.1)
|
||||
IncreaseSanity(src, 0.1)
|
||||
if(6)
|
||||
IncreaseSanity(0.15)
|
||||
IncreaseSanity(src, 0.15)
|
||||
if(7)
|
||||
IncreaseSanity(0.20)
|
||||
IncreaseSanity(src, 0.20)
|
||||
if(8)
|
||||
IncreaseSanity(0.25, SANITY_GREAT)
|
||||
IncreaseSanity(src, 0.25, SANITY_GREAT)
|
||||
if(9)
|
||||
IncreaseSanity(0.4, SANITY_GREAT)
|
||||
IncreaseSanity(src, 0.4, SANITY_GREAT)
|
||||
|
||||
if(insanity_effect != holdmyinsanityeffect)
|
||||
if(insanity_effect > holdmyinsanityeffect)
|
||||
@@ -218,9 +220,9 @@
|
||||
master.crit_threshold = (master.crit_threshold - insanity_effect) + newval
|
||||
insanity_effect = newval
|
||||
|
||||
/datum/component/mood/proc/DecreaseSanity(amount, minimum = SANITY_INSANE)
|
||||
/datum/component/mood/proc/DecreaseSanity(datum/source, amount, minimum = SANITY_INSANE)
|
||||
if(sanity < minimum) //This might make KevinZ stop fucking pinging me.
|
||||
IncreaseSanity(0.5)
|
||||
IncreaseSanity(src, 0.5)
|
||||
else
|
||||
sanity = max(minimum, sanity - amount)
|
||||
if(sanity < SANITY_UNSTABLE)
|
||||
@@ -229,13 +231,13 @@
|
||||
else
|
||||
insanity_effect = (MINOR_INSANITY_PEN)
|
||||
|
||||
/datum/component/mood/proc/IncreaseSanity(amount, maximum = SANITY_NEUTRAL)
|
||||
/datum/component/mood/proc/IncreaseSanity(datum/source, amount, maximum = SANITY_NEUTRAL)
|
||||
// Disturbed stops you from getting any more sane - I'm just gonna bung this in here
|
||||
var/mob/living/owner = parent
|
||||
if(HAS_TRAIT(owner, TRAIT_UNSTABLE))
|
||||
return
|
||||
if(sanity > maximum)
|
||||
DecreaseSanity(0.5) //Removes some sanity to go back to our current limit.
|
||||
DecreaseSanity(src, 0.5) //Removes some sanity to go back to our current limit.
|
||||
else
|
||||
sanity = min(maximum, sanity + amount)
|
||||
if(sanity > SANITY_CRAZY)
|
||||
@@ -262,6 +264,8 @@
|
||||
if(the_event.timeout)
|
||||
addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE)
|
||||
|
||||
return the_event
|
||||
|
||||
/datum/component/mood/proc/clear_event(datum/source, category)
|
||||
var/datum/mood_event/event = mood_events[category]
|
||||
if(!event)
|
||||
|
||||
@@ -169,3 +169,10 @@
|
||||
|
||||
/datum/mood_event/sad_empath/add_effects(mob/sadtarget)
|
||||
description = "<span class='warning'>[sadtarget.name] seems upset...</span>\n"
|
||||
|
||||
/datum/mood_event/revenant_blight
|
||||
description = "<span class='umbra'>Just give up, honk...</span>\n"
|
||||
mood_change = -5
|
||||
|
||||
/datum/mood_event/revenant_blight/add_effects()
|
||||
description = "<span class='umbra'>Just give up, [pick("no one will miss you", "there is nothing you can do to help", "even a clown would be more useful than you", "does it even matter in the end?")]...</span>\n"
|
||||
|
||||
@@ -358,19 +358,20 @@
|
||||
else
|
||||
new /obj/effect/temp_visual/bleed(get_turf(owner))
|
||||
|
||||
/mob/living/proc/apply_necropolis_curse(set_curse)
|
||||
/mob/living/proc/apply_necropolis_curse(set_curse, duration = 10 MINUTES)
|
||||
var/datum/status_effect/necropolis_curse/C = has_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE)
|
||||
if(!set_curse)
|
||||
set_curse = pick(CURSE_BLINDING, CURSE_SPAWNING, CURSE_WASTING, CURSE_GRASPING)
|
||||
if(QDELETED(C))
|
||||
apply_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE, set_curse)
|
||||
apply_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE, set_curse, duration)
|
||||
|
||||
else
|
||||
C.apply_curse(set_curse)
|
||||
C.duration += 3000 //additional curses add 5 minutes
|
||||
C.duration += duration * 0.5 //additional curses add half their duration
|
||||
|
||||
/datum/status_effect/necropolis_curse
|
||||
id = "necrocurse"
|
||||
duration = 6000 //you're cursed for 10 minutes have fun
|
||||
duration = 10 MINUTES //you're cursed for 10 minutes have fun
|
||||
tick_interval = 50
|
||||
alert_type = null
|
||||
var/curse_flags = NONE
|
||||
@@ -378,7 +379,9 @@
|
||||
var/effect_cooldown = 100
|
||||
var/obj/effect/temp_visual/curse/wasting_effect = new
|
||||
|
||||
/datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse)
|
||||
/datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse, _duration)
|
||||
if(_duration)
|
||||
duration = _duration
|
||||
. = ..()
|
||||
if(.)
|
||||
apply_curse(set_curse)
|
||||
|
||||
@@ -339,6 +339,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/heads/captain
|
||||
name = "Captain's Office"
|
||||
icon_state = "captain"
|
||||
clockwork_warp_allowed = FALSE
|
||||
|
||||
/area/crew_quarters/heads/captain/private
|
||||
name = "Captain's Quarters"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
GLOBAL_VAR_INIT(singularity_counter, 0)
|
||||
|
||||
#define METEOR_DISASTER_MODIFIER 0.5
|
||||
|
||||
////////////////////////////////////////
|
||||
//Singularity beacon
|
||||
////////////////////////////////////////
|
||||
@@ -13,39 +17,57 @@
|
||||
stat = 0
|
||||
verb_say = "states"
|
||||
var/cooldown = 0
|
||||
|
||||
var/active = 0
|
||||
var/active = FALSE
|
||||
var/meteor_buff = FALSE
|
||||
var/icontype = "beacon"
|
||||
|
||||
|
||||
/obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null)
|
||||
if(active)
|
||||
return FALSE
|
||||
if(surplus() < 1500)
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>The connected wire doesn't have enough current.</span>")
|
||||
return
|
||||
return FALSE
|
||||
if(is_station_level(z))
|
||||
increment_meteor_waves()
|
||||
for(var/obj/singularity/singulo in GLOB.singularities)
|
||||
if(singulo.z == z)
|
||||
singulo.target = src
|
||||
icon_state = "[icontype]1"
|
||||
active = 1
|
||||
active = TRUE
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>You activate the beacon.</span>")
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null)
|
||||
/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user)
|
||||
if(!active)
|
||||
return FALSE
|
||||
for(var/obj/singularity/singulo in GLOB.singularities)
|
||||
if(singulo.target == src)
|
||||
singulo.target = null
|
||||
icon_state = "[icontype]0"
|
||||
active = 0
|
||||
active = FALSE
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>You deactivate the beacon.</span>")
|
||||
if(meteor_buff)
|
||||
decrement_meteor_waves()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/power/singularity_beacon/proc/increment_meteor_waves()
|
||||
meteor_buff = TRUE
|
||||
GLOB.singularity_counter++
|
||||
for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
|
||||
W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER)
|
||||
|
||||
/obj/machinery/power/singularity_beacon/proc/decrement_meteor_waves()
|
||||
meteor_buff = FALSE
|
||||
GLOB.singularity_counter--
|
||||
for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
|
||||
W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER)
|
||||
|
||||
/obj/machinery/power/singularity_beacon/attack_ai(mob/user)
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/power/singularity_beacon/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
@@ -86,6 +108,12 @@
|
||||
if(!active)
|
||||
return
|
||||
|
||||
var/is_on_station = is_station_level(z)
|
||||
if(meteor_buff && !is_on_station)
|
||||
decrement_meteor_waves()
|
||||
else if(!meteor_buff && is_on_station)
|
||||
increment_meteor_waves()
|
||||
|
||||
if(surplus() >= 1500)
|
||||
add_load(1500)
|
||||
if(cooldown <= world.time)
|
||||
@@ -133,3 +161,5 @@
|
||||
/obj/item/sbeacondrop/clownbomb
|
||||
desc = "A label on it reads: <i>Warning: Activating this device will send a silly explosive to your location</i>."
|
||||
droptype = /obj/machinery/syndicatebomb/badmin/clown
|
||||
|
||||
#undef METEOR_DISASTER_MODIFIER
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -302,7 +302,7 @@
|
||||
spellname = "charge"
|
||||
icon_state ="bookcharge"
|
||||
desc = "This book is made of 100% postconsumer wizard."
|
||||
remarks = list("I feel ALIVE!", "I CAN TASTE THE MANA!", "What a RUSH!", "I'm FLYING through these pages!", "THIS GENIUS IS MAKING IT!", "This book is ACTION PAcKED!", "HE'S DONE IT", "LETS GOOOOOOOOOOOO")
|
||||
remarks = list("I feel ALIVE!", "I CAN TASTE THE MANA!", "What a RUSH!", "I'm FLYING through these pages!", "THIS GENIUS IS MAKING IT!", "This book is ACTION PAcKED!", "HE'S DONE IT", "LETS GOOOOOOOOOOOO", "Just wait faster is all...")
|
||||
|
||||
/obj/item/book/granter/spell/charge/recoil(mob/user)
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
@@ -99,6 +99,25 @@
|
||||
name = "freezer"
|
||||
icon_state = "freezer"
|
||||
|
||||
//Snowflake organ freezer code
|
||||
//Order is important, since we check source, we need to do the check whenever we have all the organs in the crate
|
||||
|
||||
/obj/structure/closet/crate/freezer/open()
|
||||
recursive_organ_check(src)
|
||||
..()
|
||||
|
||||
/obj/structure/closet/crate/freezer/close()
|
||||
..()
|
||||
recursive_organ_check(src)
|
||||
|
||||
/obj/structure/closet/crate/freezer/Destroy()
|
||||
recursive_organ_check(src)
|
||||
..()
|
||||
|
||||
/obj/structure/closet/crate/freezer/Initialize()
|
||||
. = ..()
|
||||
recursive_organ_check(src)
|
||||
|
||||
/obj/structure/closet/crate/freezer/blood
|
||||
name = "blood freezer"
|
||||
desc = "A freezer containing packs of blood."
|
||||
|
||||
@@ -35,8 +35,9 @@
|
||||
H.dna.features["spines"] = pick(GLOB.spines_list)
|
||||
H.dna.features["body_markings"] = pick(GLOB.body_markings_list)
|
||||
H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list)
|
||||
H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list)
|
||||
H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list)
|
||||
|
||||
H.update_body()
|
||||
H.update_hair()
|
||||
H.update_body_parts()
|
||||
H.update_body_parts()
|
||||
|
||||
@@ -413,9 +413,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
dat += "CLOSED"
|
||||
else
|
||||
dat += "UNKNOWN"
|
||||
dat += "</b>[GLOB.TAB][TicketHref("Refresh", ref_src)][GLOB.TAB][TicketHref("Re-Title", ref_src, "retitle")]"
|
||||
dat += "</b>[FOURSPACES][TicketHref("Refresh", ref_src)][FOURSPACES][TicketHref("Re-Title", ref_src, "retitle")]"
|
||||
if(state != AHELP_ACTIVE)
|
||||
dat += "[GLOB.TAB][TicketHref("Reopen", ref_src, "reopen")]"
|
||||
dat += "[FOURSPACES][TicketHref("Reopen", ref_src, "reopen")]"
|
||||
dat += "<br><br>Opened at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)"
|
||||
if(closed_at)
|
||||
dat += "<br>Closed at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)"
|
||||
@@ -423,7 +423,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
if(initiator)
|
||||
dat += "<b>Actions:</b> [FullMonty(ref_src)]<br>"
|
||||
else
|
||||
dat += "<b>DISCONNECTED</b>[GLOB.TAB][ClosureLinks(ref_src)]<br>"
|
||||
dat += "<b>DISCONNECTED</b>[FOURSPACES][ClosureLinks(ref_src)]<br>"
|
||||
dat += "<br><b>Log:</b><br><br>"
|
||||
for(var/I in _interactions)
|
||||
dat += "[I]<br>"
|
||||
|
||||
@@ -539,10 +539,10 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
|
||||
var/list/parts = list()
|
||||
parts += "The devil's true name is: [truename]"
|
||||
parts += "The devil's bans were:"
|
||||
parts += "[GLOB.TAB][GLOB.lawlorify[LORE][ban]]"
|
||||
parts += "[GLOB.TAB][GLOB.lawlorify[LORE][bane]]"
|
||||
parts += "[GLOB.TAB][GLOB.lawlorify[LORE][obligation]]"
|
||||
parts += "[GLOB.TAB][GLOB.lawlorify[LORE][banish]]"
|
||||
parts += "[FOURSPACES][GLOB.lawlorify[LORE][ban]]"
|
||||
parts += "[FOURSPACES][GLOB.lawlorify[LORE][bane]]"
|
||||
parts += "[FOURSPACES][GLOB.lawlorify[LORE][obligation]]"
|
||||
parts += "[FOURSPACES][GLOB.lawlorify[LORE][banish]]"
|
||||
return parts.Join("<br>")
|
||||
|
||||
/datum/antagonist/devil/roundend_report()
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
disease_flags = CURABLE
|
||||
permeability_mod = 1
|
||||
severity = DISEASE_SEVERITY_HARMFUL
|
||||
var/stagedamage = 0 //Highest stage reached.
|
||||
severity = DISEASE_SEVERITY_DANGEROUS
|
||||
var/finalstage = 0 //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects.
|
||||
var/datum/mood_event/revenant_blight/depression
|
||||
|
||||
/datum/disease/revblight/cure()
|
||||
if(affected_mob)
|
||||
@@ -21,12 +21,13 @@
|
||||
if(affected_mob.dna && affected_mob.dna.species)
|
||||
affected_mob.dna.species.handle_mutant_bodyparts(affected_mob)
|
||||
affected_mob.dna.species.handle_hair(affected_mob)
|
||||
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
|
||||
SEND_SIGNAL(affected_mob, COMSIG_CLEAR_MOOD_EVENT, "rev_blight")
|
||||
..()
|
||||
|
||||
/datum/disease/revblight/stage_act()
|
||||
if(!finalstage)
|
||||
if(affected_mob.lying && prob(stage*6))
|
||||
if(affected_mob.lying && prob(stage*4))
|
||||
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
|
||||
cure()
|
||||
return
|
||||
if(prob(stage*3))
|
||||
@@ -34,10 +35,6 @@
|
||||
affected_mob.confused += 8
|
||||
affected_mob.adjustStaminaLoss(8)
|
||||
new /obj/effect/temp_visual/revenant(affected_mob.loc)
|
||||
if(stagedamage < stage)
|
||||
stagedamage++
|
||||
affected_mob.adjustToxLoss(stage*2) //should, normally, do about 30 toxin damage.
|
||||
new /obj/effect/temp_visual/revenant(affected_mob.loc)
|
||||
if(prob(45))
|
||||
affected_mob.adjustStaminaLoss(stage)
|
||||
..() //So we don't increase a stage before applying the stage damage.
|
||||
@@ -46,9 +43,13 @@
|
||||
if(prob(5))
|
||||
affected_mob.emote("pale")
|
||||
if(3)
|
||||
if(!depression)
|
||||
depression = SEND_SIGNAL(affected_mob, COMSIG_ADD_MOOD_EVENT, "rev_blight", /datum/mood_event/revenant_blight)
|
||||
SEND_SIGNAL(affected_mob, COMSIG_DECREASE_SANITY, 0.12, SANITY_CRAZY)
|
||||
if(prob(10))
|
||||
affected_mob.emote(pick("pale","shiver"))
|
||||
if(4)
|
||||
SEND_SIGNAL(affected_mob, COMSIG_DECREASE_SANITY, 0.18, SANITY_CRAZY)
|
||||
if(prob(15))
|
||||
affected_mob.emote(pick("pale","shiver","cries"))
|
||||
if(5)
|
||||
@@ -56,12 +57,18 @@
|
||||
finalstage = TRUE
|
||||
to_chat(affected_mob, "<span class='revenbignotice'>You feel like [pick("nothing's worth it anymore", "nobody ever needed your help", "nothing you did mattered", "everything you tried to do was worthless")].</span>")
|
||||
affected_mob.adjustStaminaLoss(45)
|
||||
new /obj/effect/temp_visual/revenant(affected_mob.loc)
|
||||
if(affected_mob.dna && affected_mob.dna.species)
|
||||
if(affected_mob.dna?.species)
|
||||
affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953")
|
||||
affected_mob.dna.species.handle_hair(affected_mob,"#1d2953")
|
||||
affected_mob.visible_message("<span class='warning'>[affected_mob] looks terrifyingly gaunt...</span>", "<span class='revennotice'>You suddenly feel like your skin is <i>wrong</i>...</span>")
|
||||
affected_mob.add_atom_colour("#1d2953", TEMPORARY_COLOUR_PRIORITY)
|
||||
addtimer(CALLBACK(src, .proc/cure), 100)
|
||||
else
|
||||
return
|
||||
new /obj/effect/temp_visual/revenant(affected_mob.loc)
|
||||
addtimer(CALLBACK(src, .proc/curses), 150)
|
||||
|
||||
/datum/disease/revblight/proc/curses()
|
||||
if(QDELETED(affected_mob))
|
||||
return
|
||||
affected_mob.playsound_local(affected_mob, 'sound/effects/curse5.ogg', 40, 1, -1)
|
||||
to_chat(affected_mob, "<span class='revendanger'>You sense the terrific curse of a vengeful ghost befall upon you...</span>")
|
||||
affected_mob.apply_necropolis_curse(null, 7 MINUTES) //Once the blight has done its course without being cured beforehand, it will cast a necrocurse to compensate how underpowered it's.
|
||||
cure()
|
||||
|
||||
@@ -95,6 +95,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
"ears" = "None",
|
||||
"wings" = "None",
|
||||
"frills" = "None",
|
||||
"deco_wings" = "None",
|
||||
"spines" = "None",
|
||||
"body_markings" = "None",
|
||||
"legs" = "Plantigrade",
|
||||
@@ -583,6 +584,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
mutant_category = 0
|
||||
if("deco_wings" in pref_species.default_features)
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
|
||||
dat += "<h3>Decorative wings</h3>"
|
||||
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=deco_wings;task=input'>[features["deco_wings"]]</a>"
|
||||
if("insect_wings" in pref_species.default_features)
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
@@ -1722,7 +1730,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
new_insect_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_wings_list
|
||||
if(new_insect_wings)
|
||||
features["insect_wings"] = new_insect_wings
|
||||
|
||||
|
||||
if("deco_wings")
|
||||
var/new_deco_wings
|
||||
new_deco_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.deco_wings_list
|
||||
if(new_deco_wings)
|
||||
features["deco_wings"] = new_deco_wings
|
||||
|
||||
if("insect_fluffs")
|
||||
var/new_insect_fluff
|
||||
new_insect_fluff = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_fluffs_list
|
||||
|
||||
@@ -352,6 +352,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feature_human_tail"] >> features["tail_human"]
|
||||
S["feature_human_ears"] >> features["ears"]
|
||||
S["feature_insect_wings"] >> features["insect_wings"]
|
||||
S["feature_deco_wings"] >> features["deco_wings"]
|
||||
S["feature_insect_fluff"] >> features["insect_fluff"]
|
||||
|
||||
//Custom names
|
||||
@@ -484,6 +485,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
|
||||
features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list)
|
||||
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
|
||||
features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list)
|
||||
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
|
||||
|
||||
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
|
||||
@@ -553,6 +555,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"])
|
||||
WRITE_FILE(S["feature_lizard_legs"] , features["legs"])
|
||||
WRITE_FILE(S["feature_insect_wings"] , features["insect_wings"])
|
||||
WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"])
|
||||
WRITE_FILE(S["feature_insect_fluff"] , features["insect_fluff"])
|
||||
WRITE_FILE(S["feature_meat"] , features["meat_type"])
|
||||
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -355,6 +355,14 @@
|
||||
above_suit = TRUE
|
||||
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25)
|
||||
|
||||
/obj/item/clothing/accessory/skullcodpiece/fake
|
||||
name = "false codpiece"
|
||||
desc = "A plastic ornament, intended to protect the important things in life. It's not very good at it."
|
||||
icon_state = "skull"
|
||||
item_color = "skull"
|
||||
above_suit = TRUE
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
/////////////////////
|
||||
//Synda Accessories//
|
||||
/////////////////////
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
// Normal strength
|
||||
|
||||
#define SINGULO_BEACON_DISTURBANCE 0.2 //singularity beacon also improve the odds of meteor waves and speed them up a little.
|
||||
#define SINGULO_BEACON_MAX_DISTURBANCE 0.6 //maximum cap due to how meteor waves can be potentially round ending.
|
||||
|
||||
/datum/round_event_control/meteor_wave
|
||||
name = "Meteor Wave: Normal"
|
||||
typepath = /datum/round_event/meteor_wave
|
||||
@@ -18,6 +21,8 @@
|
||||
/datum/round_event/meteor_wave/setup()
|
||||
announceWhen = 1
|
||||
startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
|
||||
if(GLOB.singularity_counter)
|
||||
startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE)
|
||||
endWhen = startWhen + 60
|
||||
|
||||
|
||||
@@ -52,7 +57,7 @@
|
||||
kill()
|
||||
|
||||
/datum/round_event/meteor_wave/announce(fake)
|
||||
priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.", "Meteor Alert", 'sound/ai/meteors.ogg')
|
||||
priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.[GLOB.singularity_counter ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]", "Meteor Alert", 'sound/ai/meteors.ogg')
|
||||
|
||||
/datum/round_event/meteor_wave/tick()
|
||||
if(ISMULTIPLE(activeFor, 3))
|
||||
@@ -79,3 +84,6 @@
|
||||
|
||||
/datum/round_event/meteor_wave/catastrophic
|
||||
wave_name = "catastrophic"
|
||||
|
||||
#undef SINGULO_BEACON_DISTURBANCE
|
||||
#undef SINGULO_BEACON_MAX_DISTURBANCE
|
||||
|
||||
@@ -183,8 +183,8 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
|
||||
log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]")
|
||||
|
||||
//Global chat procs
|
||||
/proc/to_chat(target, message, handle_whitespace=TRUE)
|
||||
if(!target)
|
||||
/proc/to_chat_immediate(target, message, handle_whitespace=TRUE)
|
||||
if(!target || !message)
|
||||
return
|
||||
|
||||
//Ok so I did my best but I accept that some calls to this will be for shit like sound and images
|
||||
@@ -206,7 +206,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
|
||||
message = replacetext(message, "\proper", "")
|
||||
if(handle_whitespace)
|
||||
message = replacetext(message, "\n", "<br>")
|
||||
message = replacetext(message, "\t", "[GLOB.TAB][GLOB.TAB]")
|
||||
message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]")
|
||||
|
||||
if(islist(target))
|
||||
// Do the double-encoding outside the loop to save nanoseconds
|
||||
@@ -248,3 +248,15 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
|
||||
|
||||
// url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
|
||||
C << output(url_encode(url_encode(message)), "browseroutput:output")
|
||||
|
||||
/proc/to_chat(target, message, handle_whitespace = TRUE)
|
||||
if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized)
|
||||
to_chat_immediate(target, message, handle_whitespace)
|
||||
return
|
||||
SSchat.queue(target, message, handle_whitespace)
|
||||
|
||||
/datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation)
|
||||
owner.force_white_theme()
|
||||
|
||||
/datum/chatOutput/proc/swaptodarkmode()
|
||||
owner.force_dark_theme()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -256,6 +264,7 @@
|
||||
desc = "A standard miniature energy crossbow that uses a hard-light projector to transform bolts into candy corn. Happy Halloween!"
|
||||
category = "Holiday"
|
||||
item = /obj/item/gun/energy/kinetic_accelerator/crossbow/halloween
|
||||
cost = 12
|
||||
surplus = 0
|
||||
|
||||
/datum/uplink_item/device_tools/emag/hack_o_lantern
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -315,6 +321,8 @@
|
||||
return "Your account is not old enough for [jobtitle]."
|
||||
if(JOB_UNAVAILABLE_SLOTFULL)
|
||||
return "[jobtitle] is already filled to capacity."
|
||||
if(JOB_UNAVAILABLE_SPECIESLOCK)
|
||||
return "Your species cannot play as a [jobtitle]."
|
||||
return "Error: Unknown job availability."
|
||||
|
||||
/mob/dead/new_player/proc/IsJobUnavailable(rank, latejoin = FALSE)
|
||||
@@ -340,6 +348,8 @@
|
||||
return JOB_UNAVAILABLE_PLAYTIME
|
||||
if(latejoin && !job.special_check_latejoin(client))
|
||||
return JOB_UNAVAILABLE_GENERIC
|
||||
if(!client.prefs.pref_species.qualifies_for_rank(rank, client.prefs.features))
|
||||
return JOB_UNAVAILABLE_SPECIESLOCK
|
||||
return JOB_AVAILABLE
|
||||
|
||||
/mob/dead/new_player/proc/AttemptLateSpawn(rank)
|
||||
|
||||
@@ -27,6 +27,88 @@
|
||||
dimension_y = 34
|
||||
locked = TRUE
|
||||
|
||||
// Decorative wings
|
||||
/datum/sprite_accessory/deco_wings
|
||||
icon = 'icons/mob/wings.dmi'
|
||||
|
||||
/datum/sprite_accessory/deco_wings/plain
|
||||
name = "Plain"
|
||||
icon_state = "plain"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/monarch
|
||||
name = "Monarch"
|
||||
icon_state = "monarch"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/luna
|
||||
name = "Luna"
|
||||
icon_state = "luna"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/atlas
|
||||
name = "Atlas"
|
||||
icon_state = "atlas"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/reddish
|
||||
name = "Reddish"
|
||||
icon_state = "redish"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/royal
|
||||
name = "Royal"
|
||||
icon_state = "royal"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/gothic
|
||||
name = "Gothic"
|
||||
icon_state = "gothic"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/lovers
|
||||
name = "Lovers"
|
||||
icon_state = "lovers"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/whitefly
|
||||
name = "White Fly"
|
||||
icon_state = "whitefly"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/punished
|
||||
name = "Burnt Off"
|
||||
icon_state = "punished"
|
||||
locked = TRUE
|
||||
|
||||
/datum/sprite_accessory/deco_wings/firewatch
|
||||
name = "Firewatch"
|
||||
icon_state = "firewatch"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/deathhead
|
||||
name = "Deathshead"
|
||||
icon_state = "deathhead"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/poison
|
||||
name = "Poison"
|
||||
icon_state = "poison"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/ragged
|
||||
name = "Ragged"
|
||||
icon_state = "ragged"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/moonfly
|
||||
name = "Moon Fly"
|
||||
icon_state = "moonfly"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/snow
|
||||
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"
|
||||
icon_state = "none"
|
||||
|
||||
|
||||
//INSECT WINGS
|
||||
|
||||
/datum/sprite_accessory/insect_wings
|
||||
@@ -76,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"
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
attack_verb = list("attacked", "slapped", "whacked")
|
||||
///The brain's organ variables are significantly more different than the other organs, with half the decay rate for balance reasons, and twice the maxHealth
|
||||
decay_factor = STANDARD_ORGAN_DECAY / 4 //30 minutes of decaying to result in a fully damaged brain, since a fast decay rate would be unfun gameplay-wise
|
||||
healing_factor = STANDARD_ORGAN_HEALING / 2
|
||||
|
||||
maxHealth = BRAIN_DAMAGE_DEATH
|
||||
low_threshold = 45
|
||||
@@ -247,11 +248,13 @@
|
||||
to_chat(owner, "<span class='userdanger'>The last spark of life in your brain fizzles out...</span>")
|
||||
owner.death()
|
||||
brain_death = TRUE
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/organ/brain/on_death()
|
||||
if(damage <= BRAIN_DAMAGE_DEATH) //rip
|
||||
brain_death = FALSE
|
||||
applyOrganDamage(maxHealth * decay_factor)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/organ/brain/applyOrganDamage(var/d, var/maximum = maxHealth)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/item/organ/alien
|
||||
icon_state = "xgibmid2"
|
||||
var/list/alien_powers = list()
|
||||
organ_flags = ORGAN_NO_SPOIL
|
||||
|
||||
/obj/item/organ/alien/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -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),
|
||||
@@ -422,8 +422,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
|
||||
|
||||
@@ -761,6 +761,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
S = GLOB.wings_list[H.dna.features["wings"]]
|
||||
if("wingsopen")
|
||||
S = GLOB.wings_open_list[H.dna.features["wings"]]
|
||||
if("deco_wings")
|
||||
S = GLOB.deco_wings_list[H.dna.features["deco_wings"]]
|
||||
if("legs")
|
||||
S = GLOB.legs_list[H.dna.features["legs"]]
|
||||
if("insect_wings")
|
||||
@@ -812,6 +814,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]"
|
||||
@@ -883,7 +887,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
|
||||
@@ -899,7 +903,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
|
||||
@@ -942,11 +946,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
|
||||
@@ -983,7 +987,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"
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
should_draw_citadel = TRUE
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR)
|
||||
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
||||
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "horns", "legs")
|
||||
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky",
|
||||
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "deco_wings", "taur", "horns", "legs")
|
||||
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None",
|
||||
"mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian")
|
||||
attack_verb = "claw"
|
||||
attack_sound = 'sound/weapons/slash.ogg'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -52,13 +52,11 @@
|
||||
switch(from.pH)
|
||||
if(11.5 to INFINITY)
|
||||
to_chat(src, "<span class='warning'>You taste a strong alkaline flavour!</span>")
|
||||
T.applyOrganDamage(1)
|
||||
if(8.5 to 11.5)
|
||||
to_chat(src, "<span class='notice'>You taste a sort of soapy tone in the mixture.</span>")
|
||||
if(2.5 to 5.5)
|
||||
to_chat(src, "<span class='notice'>You taste a sort of acid tone in the mixture.</span>")
|
||||
if(-INFINITY to 2.5)
|
||||
to_chat(src, "<span class='warning'>You taste a strong acidic flavour!</span>")
|
||||
T.applyOrganDamage(1)
|
||||
|
||||
#undef DEFAULT_TASTE_SENSITIVITY
|
||||
|
||||
@@ -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,8 +101,10 @@
|
||||
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
|
||||
St.name = "[initial(St.name)] [round(St.data["grown_volume"], 0.1)]u colony"
|
||||
|
||||
/datum/chemical_reaction/styptic_powder
|
||||
name = "Styptic Powder"
|
||||
|
||||
@@ -404,3 +404,25 @@
|
||||
/obj/item/reagent_containers/glass/bottle/bromine
|
||||
name = "bromine bottle"
|
||||
list_reagents = list("bromine" = 30)
|
||||
|
||||
//Lewd Stuff
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/crocin
|
||||
name = "Crocin bottle"
|
||||
desc = "A bottle of mild aphrodisiac. Increases libido."
|
||||
list_reagents = list("aphro" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/hexacrocin
|
||||
name = "Hexacrocin bottle"
|
||||
desc = "A bottle of strong aphrodisiac. Increases libido."
|
||||
list_reagents = list("aphro+" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/camphor
|
||||
name = "Camphor bottle"
|
||||
desc = "A bottle of mild anaphrodisiac. Reduces libido."
|
||||
list_reagents = list("anaphro" = 30)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/hexacamphor
|
||||
name = "Hexacamphor bottle"
|
||||
desc = "A bottle of strong anaphrodisiac. Reduces libido."
|
||||
list_reagents = list("anaphro+" = 30)
|
||||
@@ -72,8 +72,10 @@
|
||||
/datum/nanite_program/brain_heal/check_conditions()
|
||||
if(iscarbon(host_mob))
|
||||
var/mob/living/carbon/C = host_mob
|
||||
if(length(C.get_traumas()))
|
||||
return ..()
|
||||
for(var/X in C.get_traumas())
|
||||
var/datum/brain_trauma/BT = X
|
||||
if(BT.resilience <= TRAUMA_RESILIENCE_BASIC)
|
||||
return ..()
|
||||
if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN))
|
||||
return ..()
|
||||
return FALSE
|
||||
@@ -193,8 +195,10 @@
|
||||
/datum/nanite_program/brain_heal_advanced/check_conditions()
|
||||
if(iscarbon(host_mob))
|
||||
var/mob/living/carbon/C = host_mob
|
||||
if(length(C.get_traumas()))
|
||||
return ..()
|
||||
for(var/X in C.get_traumas())
|
||||
var/datum/brain_trauma/BT = X
|
||||
if(BT.resilience <= TRAUMA_RESILIENCE_LOBOTOMY)
|
||||
return ..()
|
||||
if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN))
|
||||
return ..()
|
||||
return FALSE
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
//an incision but with greater bleed, and a 90% base success chance
|
||||
/datum/surgery_step/incise_heart
|
||||
name = "incise heart"
|
||||
implements = list(/obj/item/scalpel = 90, /obj/item/melee/transforming/energy/sword = 45, /obj/item/kitchen/knife = 45,
|
||||
implements = list(TOOL_SCALPEL = 90, /obj/item/melee/transforming/energy/sword = 45, /obj/item/kitchen/knife = 45,
|
||||
/obj/item/shard = 25)
|
||||
time = 16
|
||||
|
||||
@@ -74,4 +74,4 @@
|
||||
"<span class='warning'>[user] screws up, causing blood to spurt out of [H]'s chest profusely!</span>")
|
||||
H.adjustOrganLoss(ORGAN_SLOT_HEART, 20)
|
||||
H.bleed_rate += 30
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
|
||||
/datum/surgery_step/embalming
|
||||
name = "embalming body"
|
||||
implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15)
|
||||
implements = list(/obj/item/reagent_containers/syringe = 100, /obj/item/pen = 30)
|
||||
implements = list(/obj/item/reagent_containers/syringe = 100, /obj/item/pen = 30)
|
||||
time = 10
|
||||
chems_needed = list("drying_agent", "sterilizine")
|
||||
require_all_chems = FALSE
|
||||
@@ -28,4 +27,4 @@
|
||||
/datum/surgery_step/embalming/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] screws up!", "<span class='warning'>You screwed up!</span>")
|
||||
ADD_TRAIT(target, TRAIT_NOCLONE, MAGIC_TRAIT) //That body is ruined, but still gives miasma
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
//repair organs
|
||||
/datum/surgery_step/graft_synthtissue
|
||||
name = "graft synthtissue"
|
||||
implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15)
|
||||
implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15)
|
||||
repeatable = TRUE
|
||||
time = 75
|
||||
chems_needed = list("synthtissue")
|
||||
@@ -61,8 +61,9 @@
|
||||
target.reagents.remove_reagent("synthtissue", 10)
|
||||
|
||||
/datum/surgery_step/graft_synthtissue/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] successfully repairs part of [chosen_organ].", "<span class='notice'>You succeed in repairing parts of [chosen_organ].</span>")
|
||||
chosen_organ.applyOrganDamage(health_restored)
|
||||
user.visible_message("[user] successfully grafts synthtissue to [chosen_organ].", "<span class='notice'>You succeed in grafting 10u of the synthflesh to the [chosen_organ].</span>")
|
||||
chosen_organ.applyOrganDamage(-health_restored)
|
||||
return TRUE
|
||||
|
||||
/datum/surgery_step/graft_synthtissue/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("<span class='warning'>[user] accidentally damages part of [chosen_organ]!</span>", "<span class='warning'>You damage [chosen_organ]! Apply more synthtissue if it's run out.</span>")
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
//remove fat
|
||||
/datum/surgery_step/remove_fat
|
||||
name = "remove loose fat"
|
||||
implements = list(/obj/item/retractor = 100, TOOL_SCREWDRIVER = 45, TOOL_WIRECUTTER = 35)
|
||||
implements = list(TOOL_RETRACTOR = 100, TOOL_SCREWDRIVER = 45, TOOL_WIRECUTTER = 35)
|
||||
time = 32
|
||||
|
||||
/datum/surgery_step/remove_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
|
||||
@@ -17,9 +17,10 @@
|
||||
if(starting_organ)
|
||||
insert_organ(new starting_organ(src))
|
||||
|
||||
/obj/item/autosurgeon/proc/insert_organ(var/obj/item/I)
|
||||
/obj/item/autosurgeon/proc/insert_organ(var/obj/item/organ/I)
|
||||
storedorgan = I
|
||||
I.forceMove(src)
|
||||
I.organ_flags |= ORGAN_FROZEN //Stops decay
|
||||
name = "[initial(name)] ([storedorgan.name])"
|
||||
|
||||
/obj/item/autosurgeon/attack_self(mob/user)//when the object it used...
|
||||
@@ -125,4 +126,4 @@
|
||||
/obj/item/autosurgeon/womb
|
||||
desc = "A single use autosurgeon that contains a womb. A screwdriver can be used to remove it, but implants can't be placed back in."
|
||||
uses = 1
|
||||
starting_organ = /obj/item/organ/genital/womb
|
||||
starting_organ = /obj/item/organ/genital/womb
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
slot = ORGAN_SLOT_HEART
|
||||
|
||||
healing_factor = STANDARD_ORGAN_HEALING
|
||||
decay_factor = 4 * STANDARD_ORGAN_DECAY //designed to fail about 5 minutes after death
|
||||
decay_factor = 3 * STANDARD_ORGAN_DECAY //designed to fail about 5 minutes after death
|
||||
|
||||
low_threshold_passed = "<span class='info'>Prickles of pain appear then die out from within your chest...</span>"
|
||||
high_threshold_passed = "<span class='warning'>Something inside your chest hurts, and the pain isn't subsiding. You notice yourself breathing far faster than before.</span>"
|
||||
@@ -61,6 +61,7 @@
|
||||
return S
|
||||
|
||||
/obj/item/organ/heart/on_life()
|
||||
..()
|
||||
if(owner.client && beating)
|
||||
failed = FALSE
|
||||
var/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE)
|
||||
|
||||
@@ -12,10 +12,12 @@
|
||||
var/operated = FALSE //whether we can still have our damages fixed through surgery
|
||||
|
||||
//health
|
||||
maxHealth = LUNGS_MAX_HEALTH
|
||||
maxHealth = 3 * STANDARD_ORGAN_THRESHOLD
|
||||
|
||||
healing_factor = STANDARD_ORGAN_HEALING
|
||||
decay_factor = STANDARD_ORGAN_DECAY
|
||||
high_threshold = 0.6 * LUNGS_MAX_HEALTH //threshold at 180
|
||||
low_threshold = 0.3 * LUNGS_MAX_HEALTH //threshold at 90
|
||||
|
||||
high_threshold_passed = "<span class='warning'>You feel some sort of constriction around your chest as your breathing becomes shallow and rapid.</span>"
|
||||
now_fixed = "<span class='warning'>Your lungs seem to once again be able to hold air.</span>"
|
||||
|
||||
@@ -41,6 +41,9 @@
|
||||
else
|
||||
qdel(replaced)
|
||||
|
||||
//Hopefully this doesn't cause problems
|
||||
organ_flags &= ~ORGAN_FROZEN
|
||||
|
||||
owner = M
|
||||
M.internal_organs |= src
|
||||
M.internal_organs_slot[slot] = src
|
||||
@@ -64,30 +67,88 @@
|
||||
A.Remove(M)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
|
||||
/obj/item/organ/proc/on_find(mob/living/finder)
|
||||
return
|
||||
|
||||
/obj/item/organ/process()
|
||||
/obj/item/organ/process() //runs decay when outside of a person AND ONLY WHEN OUTSIDE (i.e. long obj).
|
||||
on_death() //Kinda hate doing it like this, but I really don't want to call process directly.
|
||||
|
||||
/obj/item/organ/proc/on_death() //runs decay when outside of a person
|
||||
if(organ_flags & (ORGAN_SYNTHETIC | ORGAN_FROZEN | ORGAN_NO_SPOIL))
|
||||
//Sources; life.dm process_organs
|
||||
/obj/item/organ/proc/on_death() //Runs when outside AND inside.
|
||||
decay()
|
||||
|
||||
//Applys the slow damage over time decay
|
||||
/obj/item/organ/proc/decay()
|
||||
if(!can_decay())
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return
|
||||
is_cold()
|
||||
if(organ_flags & ORGAN_FROZEN)
|
||||
return
|
||||
applyOrganDamage(maxHealth * decay_factor)
|
||||
|
||||
/obj/item/organ/proc/can_decay()
|
||||
if(CHECK_BITFIELD(organ_flags, ORGAN_NO_SPOIL | ORGAN_SYNTHETIC | ORGAN_FAILING))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
//Checks to see if the organ is frozen from temperature
|
||||
/obj/item/organ/proc/is_cold()
|
||||
var/freezing_objects = list(/obj/structure/closet/crate/freezer, /obj/structure/closet/secure_closet/freezer, /obj/structure/bodycontainer, /obj/item/autosurgeon)
|
||||
if(istype(loc, /obj/))//Freezer of some kind, I hope.
|
||||
if(is_type_in_list(loc, freezing_objects))
|
||||
if(!(organ_flags & ORGAN_FROZEN))//Incase someone puts them in when cold, but they warm up inside of the thing. (i.e. they have the flag, the thing turns it off, this rights it.)
|
||||
organ_flags |= ORGAN_FROZEN
|
||||
return TRUE
|
||||
return
|
||||
|
||||
var/local_temp
|
||||
if(istype(loc, /turf/))//Only concern is adding an organ to a freezer when the area around it is cold.
|
||||
var/turf/T = loc
|
||||
var/datum/gas_mixture/enviro = T.return_air()
|
||||
local_temp = enviro.temperature
|
||||
|
||||
else if(istype(loc, /mob/) && !owner)
|
||||
var/mob/M = loc
|
||||
if(is_type_in_list(M.loc, freezing_objects))
|
||||
if(!(organ_flags & ORGAN_FROZEN))
|
||||
organ_flags |= ORGAN_FROZEN
|
||||
return TRUE
|
||||
var/turf/T = M.loc
|
||||
var/datum/gas_mixture/enviro = T.return_air()
|
||||
local_temp = enviro.temperature
|
||||
|
||||
if(owner)
|
||||
//Don't interfere with bodies frozen by structures.
|
||||
if(is_type_in_list(owner.loc, freezing_objects))
|
||||
if(!(organ_flags & ORGAN_FROZEN))
|
||||
organ_flags |= ORGAN_FROZEN
|
||||
return TRUE
|
||||
local_temp = owner.bodytemperature
|
||||
|
||||
if(!local_temp)//Shouldn't happen but in case
|
||||
return
|
||||
if(local_temp < 154)//I have a pretty shaky citation that states -120 allows indefinite cyrostorage
|
||||
organ_flags |= ORGAN_FROZEN
|
||||
return TRUE
|
||||
organ_flags &= ~ORGAN_FROZEN
|
||||
return FALSE
|
||||
|
||||
/obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing
|
||||
if(!(organ_flags & ORGAN_FAILING))
|
||||
///Damage decrements by a percent of its maxhealth
|
||||
var/healing_amount = -(maxHealth * healing_factor)
|
||||
///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's health
|
||||
healing_amount -= owner.satiety > 0 ? 4 * healing_factor * owner.satiety / MAX_SATIETY : 0
|
||||
applyOrganDamage(healing_amount) //to FERMI_TWEAK
|
||||
//Make it so each threshold is stuck.
|
||||
if(organ_flags & ORGAN_FAILING)
|
||||
return
|
||||
if(is_cold())
|
||||
return
|
||||
///Damage decrements by a percent of its maxhealth
|
||||
var/healing_amount = -(maxHealth * healing_factor)
|
||||
///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's health
|
||||
healing_amount -= owner.satiety > 0 ? 4 * healing_factor * owner.satiety / MAX_SATIETY : 0
|
||||
applyOrganDamage(healing_amount) //to FERMI_TWEAK
|
||||
//Make it so each threshold is stuck.
|
||||
|
||||
/obj/item/organ/examine(mob/user)
|
||||
. = ..()
|
||||
if(!organ_flags & ORGAN_FAILING)
|
||||
if(organ_flags & ORGAN_FAILING)
|
||||
if(status == ORGAN_ROBOTIC)
|
||||
. += "<span class='warning'>[src] seems to be broken!</span>"
|
||||
return
|
||||
@@ -177,6 +238,8 @@
|
||||
return low_threshold_passed
|
||||
else
|
||||
organ_flags &= ~ORGAN_FAILING
|
||||
if(!owner)//Processing is stopped when the organ is dead and outside of someone. This hopefully should restart it if a removed organ is repaired outside of a body.
|
||||
START_PROCESSING(SSobj, src)
|
||||
if(prev_damage > low_threshold && damage <= low_threshold)
|
||||
return low_threshold_cleared
|
||||
if(prev_damage > high_threshold && damage <= high_threshold)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
low_threshold_cleared = "<span class='info'>The last bouts of pain in your stomach have died out.</span>"
|
||||
|
||||
/obj/item/organ/stomach/on_life()
|
||||
..()
|
||||
var/datum/reagent/consumable/nutriment/Nutri
|
||||
if(ishuman(owner))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
/datum/language/aphasia,
|
||||
/datum/language/slime,
|
||||
))
|
||||
healing_factor = STANDARD_ORGAN_HEALING*5 //Fast!!
|
||||
decay_factor = STANDARD_ORGAN_DECAY/2
|
||||
|
||||
/obj/item/organ/tongue/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -209,6 +211,8 @@
|
||||
phomeme_type = pick(phomeme_types)
|
||||
|
||||
/obj/item/organ/tongue/bone/applyOrganDamage(var/d, var/maximum = maxHealth)
|
||||
if(d < 0)
|
||||
return
|
||||
if(!owner)
|
||||
return
|
||||
var/target = owner.get_bodypart(BODY_ZONE_HEAD)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1490,9 +1490,10 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
|
||||
/datum/uplink_item/device_tools/singularity_beacon
|
||||
name = "Power Beacon"
|
||||
desc = "When screwed to wiring attached to an electric grid and activated, this large device pulls any \
|
||||
active gravitational singularities or tesla balls towards it. This will not work when the engine is still \
|
||||
in containment. Because of its size, it cannot be carried. Ordering this \
|
||||
sends you a small beacon that will teleport the larger beacon to your location upon activation."
|
||||
active gravitational singularities or tesla balls towards it (provided they are not safely \
|
||||
contained), as well as increasing the odds of incoming meteor waves. \
|
||||
Because of its size, it cannot be carried. Ordering this sends you a small beacon \
|
||||
that will teleport the larger beacon to your location upon activation."
|
||||
item = /obj/item/sbeacondrop
|
||||
cost = 14
|
||||
|
||||
|
||||
+103
-101
@@ -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,
|
||||
|
||||
@@ -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,4 @@
|
||||
author: "Ghommie"
|
||||
delete-after: True
|
||||
changes:
|
||||
- balance: "Removes revenant blight's shabby toxin damage in favor of mood maluses, and a dangerous necropolis curse if not cured in time. Remember"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Ghommie"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Singularity beacons now also moderately increases the odds meteor waves, while lowering their estimeed arrival countdown."
|
||||
@@ -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,4 @@
|
||||
author: "r4d6"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Added decoratives angel wings for Mammalians only"
|
||||
@@ -0,0 +1,6 @@
|
||||
author: "Owai-Seek"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "false codpiece"
|
||||
- rscadd: "crocin/camphor bottles"
|
||||
- tweak: "updated kinkmate item list"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "JTGSZ"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "qualifies_for_rank now checks latejoin menu"
|
||||
@@ -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: "PersianXerxes"
|
||||
delete-after: True
|
||||
changes:
|
||||
- code_imp: "Adds the clockwork_warp_allowed flag to the Captain's Office area, set to FALSE the same way it is for the chapel and armory."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "Putnam3145"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "neural nanites only work/drain if you have brain damage or traumas the nanites can fix"
|
||||
@@ -0,0 +1,8 @@
|
||||
author: "Fermis"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "Heart, Tongue and stomach regen."
|
||||
- bugfix: "lung damage threshholds."
|
||||
- bugfix: "Graft synthtissue"
|
||||
- bugfix: "Skeleton's burning for no reason"
|
||||
- bugfix: "Organ freezing handling."
|
||||
@@ -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"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "izzyinbox"
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "*bark emote"
|
||||
@@ -0,0 +1,4 @@
|
||||
author: "kappa-sama"
|
||||
delete-after: True
|
||||
changes:
|
||||
- bugfix: "you can no longer have infinite ebows"
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 192 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user