Merge branch 'master' into pr/560

This commit is contained in:
BongaTheProto
2022-10-30 14:13:50 -05:00
51 changed files with 19992 additions and 101 deletions
+1 -1
View File
@@ -45,7 +45,7 @@ jobs:
tools/bootstrap/python -m mapmerge2.dmm_test
~/dreamchecker > ${GITHUB_WORKSPACE}/output-annotations.txt 2>&1
- name: Annotate Lints
uses: yogstation13/DreamAnnotate@v1
uses: yogstation13/DreamAnnotate@v2
if: always()
with:
outputFile: output-annotations.txt
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+32 -17
View File
@@ -30653,7 +30653,6 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"brK" = (
/obj/structure/window/reinforced/spawner/east,
/obj/machinery/chem_dispenser,
/obj/machinery/airalarm{
pixel_y = 24
@@ -31153,18 +31152,10 @@
/turf/open/floor/grass,
/area/service/hydroponics)
"bsL" = (
/obj/structure/table,
/obj/effect/turf_decal/stripes/line{
dir = 10
},
/obj/machinery/reagentgrinder{
pixel_y = 8
},
/obj/item/storage/box/syringes,
/obj/item/storage/box/beakers{
pixel_x = -2;
pixel_y = -2
},
/obj/machinery/chem_heater,
/turf/open/floor/plasteel,
/area/medical/chemistry)
"bsM" = (
@@ -31186,6 +31177,11 @@
pixel_y = 6
},
/obj/structure/disposalpipe/segment,
/obj/item/storage/box/beakers{
pixel_x = -2;
pixel_y = -2
},
/obj/item/storage/box/syringes,
/turf/open/floor/plasteel,
/area/medical/chemistry)
"bsO" = (
@@ -37092,7 +37088,10 @@
/turf/closed/wall/mineral/lead,
/area/engineering/atmos)
"bFZ" = (
/obj/machinery/chem_heater,
/obj/structure/table,
/obj/machinery/reagentgrinder{
pixel_y = 8
},
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bGa" = (
@@ -47523,6 +47522,10 @@
name = "Robotics Desk";
req_access_txt = "29"
},
/obj/machinery/door/window/eastright{
name = "Medbay Desk";
req_access_txt = "5"
},
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
"ccC" = (
@@ -52784,6 +52787,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
/obj/machinery/chem_heater,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"com" = (
@@ -54536,7 +54540,6 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone2)
"crw" = (
/obj/machinery/computer/med_data,
/obj/effect/turf_decal/tile/red{
dir = 4
},
@@ -54547,6 +54550,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/red,
/obj/machinery/limbgrower,
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone2)
"crx" = (
@@ -55943,7 +55947,9 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"cuf" = (
/obj/machinery/computer/operating,
/obj/machinery/computer/operating{
dir = 8
},
/obj/effect/turf_decal/bot,
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/turf/open/floor/plasteel,
@@ -55966,7 +55972,6 @@
/obj/item/paper/guides/cogstation/letter_med{
pixel_y = 4
},
/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone2)
"cui" = (
@@ -56140,6 +56145,8 @@
"cux" = (
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/obj/effect/landmark/event_spawn,
/obj/structure/table,
/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/plasteel,
/area/medical/medbay/zone2)
"cuC" = (
@@ -56655,6 +56662,8 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
/obj/structure/table,
/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/plasteel,
/area/medical/medbay/zone2)
"cvG" = (
@@ -59394,7 +59403,7 @@
/area/hallway/primary/aft)
"cAU" = (
/obj/machinery/computer/operating{
dir = 1
dir = 8
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
@@ -59477,7 +59486,6 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone2)
"cBe" = (
@@ -70156,6 +70164,13 @@
},
/turf/open/floor/plating,
/area/cargo/storage)
"rCm" = (
/obj/machinery/conveyor/auto{
id = "pq";
dir = 4
},
/turf/open/floor/plating/airless,
/area/router/aux)
"rCL" = (
/obj/effect/landmark/start/assistant,
/obj/structure/chair{
@@ -96633,7 +96648,7 @@ cPo
cPo
cPo
cPo
cPo
rCm
abp
aaa
aaa
+2 -1
View File
@@ -122,11 +122,12 @@
#define STYLE_SNEK_TAURIC (1<<2) //taur-friendly suits
#define STYLE_PAW_TAURIC (1<<3)
#define STYLE_HOOF_TAURIC (1<<4)
#define STYLE_ALL_TAURIC (STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC|STYLE_HOOF_TAURIC)
#define STYLE_ALL_TAURIC (STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC|STYLE_HOOF_TAURIC|STYLE_ARACHNID_TAURIC)
#define STYLE_NO_ANTHRO_ICON (1<<5) //When digis fit the default sprite fine and need no copypasted states. This is the case of skirts and winter coats, for example.
#define USE_SNEK_CLIP_MASK (1<<6)
#define USE_QUADRUPED_CLIP_MASK (1<<7)
#define USE_TAUR_CLIP_MASK (USE_SNEK_CLIP_MASK|USE_QUADRUPED_CLIP_MASK)
#define STYLE_ARACHNID_TAURIC (1<<8)
//digitigrade legs settings.
#define NOT_DIGITIGRADE 0
+1 -1
View File
@@ -88,7 +88,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isinsect(A) (is_species(A, /datum/species/insect))
#define isxenoperson(A) (is_species(A, /datum/species/xeno))
#define isstartjelly(A) (is_species(A, /datum/species/jelly/roundstartslime))
#define isarachnid(A) (is_species(A, /datum/species/arachnid))
#define isarachnid(A) (is_species(A, /datum/species/arachnid) || HAS_TRAIT(A, TRAIT_ARACHNID)) // SPLURT Edit: for the Arachnid trait
//more carbon mobs
#define ismonkey(A) (istype(A, /mob/living/carbon/monkey))
+1
View File
@@ -56,6 +56,7 @@
#define span_icon(str) ("<span class='icon'>" + str + "</span>")
#define span_info(str) ("<span class='info'>" + str + "</span>")
#define span_interface(str) ("<span class='interface'>" + str + "</span>")
#define span_linkify(str) ("<span class='linkify'>" + str + "</span>")
#define span_looc(str) ("<span class='looc'>" + str + "</span>")
#define span_medal(str) ("<span class='medal'>" + str + "</span>")
#define span_medradio(str) ("<span class='medradio'>" + str + "</span>")
+1 -1
View File
@@ -1,6 +1,6 @@
// tgstation-server DMAPI
#define TGS_DMAPI_VERSION "6.0.5"
#define TGS_DMAPI_VERSION "6.0.6"
// All functions and datums outside this document are subject to change with any version and should not be relied on.
+4 -6
View File
@@ -570,14 +570,12 @@
return A.loc
/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank)
///Send a message in common radio when a player arrives
/proc/announce_arrival(mob/living/carbon/human/character, rank)
if(!SSticker.IsRoundInProgress() || QDELETED(character))
return
var/area/A = get_area(character)
var/message = "<span class='game deadsay'><span class='name'>\
[character.real_name]</span> ([rank]) has arrived at the station at \
<span class='name'>[A.name]</span>.</span>"
deadchat_broadcast(message, follow_target = character, message_type=DEADCHAT_ARRIVALRATTLE)
var/area/player_area = get_area(character)
deadchat_broadcast("<span class='game'> has arrived at the station at <span class='name'>[player_area.name]</span>.</span>", "<span class='game'><span class='name'>[character.real_name]</span> ([rank])</span>", follow_target = character, message_type=DEADCHAT_ARRIVALRATTLE)
if((!GLOB.announcement_systems.len) || (!character.mind))
return
if((character.mind.assigned_role == "Cyborg") || (character.mind.assigned_role == character.mind.special_role))
+24 -14
View File
@@ -412,17 +412,27 @@ GLOBAL_LIST_EMPTY(species_datums)
for(var/i in 1 to step_count)
step(X, pick(NORTH, SOUTH, EAST, WEST))
/proc/deadchat_broadcast(message, mob/follow_target=null, turf/turf_target=null, speaker_key=null, message_type=DEADCHAT_REGULAR)
message = "<span class='linkify'>[message]</span>"
for(var/mob/M in GLOB.player_list)
var/datum/preferences/prefs
if(M.client && M.client.prefs)
prefs = M.client.prefs
else
prefs = new
// Displays a message in deadchat, sent by source. source is not linkified, message is, to avoid stuff like character names to be linkified.
// Automatically gives the class deadsay to the whole message (message + source)
/proc/deadchat_broadcast(message, source=null, mob/follow_target=null, turf/turf_target=null, speaker_key=null, message_type=DEADCHAT_REGULAR, admin_only=FALSE)
message = span_deadsay("[source][span_linkify(message)]")
for(var/mob/M in GLOB.player_list)
var/chat_toggles = TOGGLES_DEFAULT_CHAT
var/toggles = TOGGLES_DEFAULT
var/list/ignoring
if(M.client?.prefs)
var/datum/preferences/prefs = M.client?.prefs
chat_toggles = prefs.chat_toggles
toggles = prefs.toggles
ignoring = prefs.ignoring
if(admin_only)
if (!M.client?.holder)
return
else
message += span_deadsay(" (This is viewable to admins only).")
var/override = FALSE
if(M.client && M.client.holder && (prefs.chat_toggles & CHAT_DEAD))
if(M.client?.holder && (chat_toggles & CHAT_DEAD))
override = TRUE
if(HAS_TRAIT(M, TRAIT_SIXTHSENSE))
override = TRUE
@@ -433,15 +443,15 @@ GLOBAL_LIST_EMPTY(species_datums)
continue
if(M.stat != DEAD && !override)
continue
if(speaker_key && (speaker_key in prefs.ignoring))
if(speaker_key && (speaker_key in ignoring))
continue
switch(message_type)
if(DEADCHAT_DEATHRATTLE)
if(prefs.toggles & DISABLE_DEATHRATTLE)
if(toggles & DISABLE_DEATHRATTLE)
continue
if(DEADCHAT_ARRIVALRATTLE)
if(prefs.toggles & DISABLE_ARRIVALRATTLE)
if(toggles & DISABLE_ARRIVALRATTLE)
continue
if(isobserver(M))
@@ -458,9 +468,9 @@ GLOBAL_LIST_EMPTY(species_datums)
var/turf_link = TURF_LINK(M, turf_target)
rendered_message = "[turf_link] [message]"
to_chat(M, rendered_message)
to_chat(M, rendered_message, avoid_highlighting = speaker_key == M.key)
else
to_chat(M, message)
to_chat(M, message, avoid_highlighting = speaker_key == M.key)
//Used in chemical_mob_spawn. Generates a random mob based on a given gold_core_spawnable value.
/proc/create_random_mob(spawn_location, mob_class = HOSTILE_SPAWN)
+2
View File
@@ -21,3 +21,5 @@
#define TRAIT_INCUBUS "Incubus"
#define TRAIT_SUCCUBUS "Succubus"
#define TRAIT_ARACHNID "Arachnid"
+2
View File
@@ -489,6 +489,8 @@ SUBSYSTEM_DEF(job)
job.after_spawn(H, M.client, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not.
equip_loadout(N, H, TRUE)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works
handle_roundstart_items(H, M.ckey, H.mind.assigned_role, H.mind.special_role)
var/list/tcg_cards
if(ishuman(H))
if(length(H.client?.prefs?.tcg_cards))
+2 -2
View File
@@ -268,7 +268,7 @@ SUBSYSTEM_DEF(shuttle)
var/area/A = get_area(user)
log_shuttle("[key_name(user)] has called the emergency shuttle.")
deadchat_broadcast(" has called the shuttle at <span class='name'>[A.name]</span>.", "<span class='name'>[user.real_name]</span>", user) //, message_type=DEADCHAT_ANNOUNCEMENT)
deadchat_broadcast(" has called the shuttle at [span_name("[A.name]")].", span_name("[user.real_name]"), user, message_type=DEADCHAT_ANNOUNCEMENT)
if(call_reason)
SSblackbox.record_feedback("text", "shuttle_reason", 1, "[call_reason]")
log_shuttle("Shuttle call reason: [call_reason]")
@@ -307,7 +307,7 @@ SUBSYSTEM_DEF(shuttle)
emergency.cancel(get_area(user))
log_shuttle("[key_name(user)] has recalled the shuttle.")
message_admins("[ADMIN_LOOKUPFLW(user)] has recalled the shuttle.")
deadchat_broadcast(" has recalled the shuttle from <span class='name'>[get_area_name(user, TRUE)]</span>.", "<span class='name'>[user.real_name]</span>", user) //, message_type=DEADCHAT_ANNOUNCEMENT)
deadchat_broadcast(" has recalled the shuttle from [span_name("[get_area_name(user, TRUE)]")].", span_name("[user.real_name]"), user, message_type=DEADCHAT_ANNOUNCEMENT)
return 1
/datum/controller/subsystem/shuttle/proc/canRecall()
@@ -159,7 +159,7 @@
// Only notify people if an actual change happened
log_game("[key_name(usr)] has changed the security level to [params["newSecurityLevel"]] with [src] at [AREACOORD(usr)].")
message_admins("[ADMIN_LOOKUPFLW(usr)] has changed the security level to [params["newSecurityLevel"]] with [src] at [AREACOORD(usr)].")
deadchat_broadcast(" has changed the security level to [params["newSecurityLevel"]] with [src] at [span_name("[get_area_name(usr, TRUE)]")].", usr, src.loc, message_type=DEADCHAT_ANNOUNCEMENT)
deadchat_broadcast(" has changed the security level to [params["newSecurityLevel"]] with [src] at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type=DEADCHAT_ANNOUNCEMENT)
alert_level_tick += 1
if ("deleteMessage")
@@ -198,7 +198,7 @@
var/associates = emagged ? "the Syndicate": "CentCom"
usr.log_talk(message, LOG_SAY, tag = "message to [associates]")
deadchat_broadcast(" has messaged [associates], \"[message]\" at [span_name("[get_area_name(usr, TRUE)]")].", usr, src.loc, message_type = DEADCHAT_ANNOUNCEMENT)
deadchat_broadcast(" has messaged [associates], \"[message]\" at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT)
COOLDOWN_START(src, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN)
if ("purchaseShuttle")
var/can_buy_shuttles_or_fail_reason = can_buy_shuttles(usr)
@@ -281,7 +281,7 @@
minor_announce(message, title = "Outgoing message to allied station")
usr.log_talk(message, LOG_SAY, tag = "message to the other server")
message_admins("[ADMIN_LOOKUPFLW(usr)] has sent a message to the other server\[s].")
deadchat_broadcast(" has sent an outgoing message to the other station(s).</span>", usr, src.loc, message_type = DEADCHAT_ANNOUNCEMENT)
deadchat_broadcast(" has sent an outgoing message to the other station(s).</span>", "<span class='bold'>[usr.real_name]", usr, message_type = DEADCHAT_ANNOUNCEMENT)
COOLDOWN_START(src, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN)
if ("setState")
@@ -345,13 +345,12 @@
revoke_maint_all_access()
log_game("[key_name(usr)] disabled emergency maintenance access.")
message_admins("[ADMIN_LOOKUPFLW(usr)] disabled emergency maintenance access.")
deadchat_broadcast(" disabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", usr, src.loc, message_type = DEADCHAT_ANNOUNCEMENT)
deadchat_broadcast(" disabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT)
else
make_maint_all_access()
log_game("[key_name(usr)] enabled emergency maintenance access.")
message_admins("[ADMIN_LOOKUPFLW(usr)] enabled emergency maintenance access.")
deadchat_broadcast(" enabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", usr, src.loc, message_type = DEADCHAT_ANNOUNCEMENT)
if("toggleBought")
deadchat_broadcast(" enabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT)
var/boughtID = params["id"]
for(var/tracked_slave in GLOB.tracked_slaves)
@@ -614,7 +613,7 @@
else
input = user.treat_message(input) //Adds slurs and so on. Someone should make this use languages too.
SScommunications.make_announcement(user, is_ai, input)
deadchat_broadcast(" made a priority announcement from [span_name("[get_area_name(usr, TRUE)]")].", user, src.loc, message_type=DEADCHAT_ANNOUNCEMENT)
deadchat_broadcast(" made a priority announcement from [span_name("[get_area_name(usr, TRUE)]")].", span_name("[user.real_name]"), user, message_type=DEADCHAT_ANNOUNCEMENT)
/obj/machinery/computer/communications/proc/post_status(command, data1, data2)
+1 -1
View File
@@ -440,7 +440,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
GLOB.data_core.manifest_inject(new_character)
if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes")
AnnounceArrival(new_character, new_character.mind.assigned_role)
announce_arrival(new_character, new_character.mind.assigned_role)
var/msg = "<span class='adminnotice'>[admin] has respawned [player_key] as [new_character.real_name].</span>"
message_admins(msg)
@@ -48,9 +48,11 @@
//These are exactly the same as the default scriptures, but cyborgs don't need a second person to create them
/datum/clockwork_scripture/create_object/mania_motor/cyborg
invokers_required = 1
tier = SCRIPTURE_PERIPHERAL
multiple_invokers_used = FALSE
/datum/clockwork_scripture/create_object/clockwork_obelisk/cyborg
invokers_required = 1
tier = SCRIPTURE_PERIPHERAL
multiple_invokers_used = FALSE
+1 -1
View File
@@ -596,7 +596,7 @@
else
return //if target is null and we don't have a specific target, cancel
if (effectAnnounce)
deadchat_broadcast("A special package is being launched at the station!", turf_target = target)
deadchat_broadcast("A special package is being launched at the station!", turf_target = target, message_type=DEADCHAT_ANNOUNCEMENT)
var/list/bouttaDie = list()
for (var/mob/living/target_mob in target)
bouttaDie.Add(target_mob)
+1 -1
View File
@@ -118,7 +118,7 @@
if(random)
log_game("Random Event triggering: [name] ([typepath])")
if (alert_observers)
deadchat_broadcast("<span class='deadsay'><b>[name]</b> has just been[random ? " randomly" : ""] triggered!</span>") //STOP ASSUMING IT'S BADMINS!
deadchat_broadcast(" has just been[random ? " randomly" : ""] triggered!", "<b>[name]</b>", message_type=DEADCHAT_ANNOUNCEMENT) //STOP ASSUMING IT'S BADMINS!
return E
//Special admins setup
+13 -3
View File
@@ -409,10 +409,12 @@
/mob/living/simple_animal/jacq/proc/trick(mob/living/carbon/C, gender)
var/option
if(ishuman(C))
option = rand(1,6)
if(ishuman(C) && (C.gender == MALE || C.gender == FEMALE))
option = rand(1,8)
else if (ishuman(C))
option = rand(1,7)
else
option = rand(1,5)
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>")
@@ -442,6 +444,10 @@
jacqrunes("A new familiar for me, and you'll see it's thee!", C)
C.reagents.add_reagent(/datum/reagent/fermi/secretcatchem, 30)
if(6)
visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"There will be some fun on this night, go on and find someone you like!\"</span>")
jacqrunes("There will be some fun on this night, go on and find someone you like!", C)
C.reagents.add_reagent(/datum/reagent/drug/aphrodisiacplus, 15)
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>")
jacqrunes("While you may not be a ghost, for this sheet you'll always be it's host.", C)
var/mob/living/carbon/human/H = C
@@ -450,6 +456,10 @@
H.dropItemToGround(W, TRUE)
var/ghost = new /obj/item/clothing/suit/ghost_sheet/sticky
H.equip_to_slot(ghost, ITEM_SLOT_OCLOTHING, 1, 1)
if(8)
visible_message("<b>[src]</b> waves their arms around, <span class='spooky'>\"Who cares, it's lad or lass? You'll take a new life glanсe!\"</span>")
jacqrunes("Who cares, it's lad or lass? You'll take a new life glanсe!", C)
C.set_gender(C.gender == MALE ? FEMALE : MALE)
poof()
//Blame Fel
@@ -501,7 +501,7 @@
if(SSshuttle.arrivals)
SSshuttle.arrivals.QueueAnnounce(humanc, rank)
else
AnnounceArrival(humanc, rank)
announce_arrival(humanc, rank)
AddEmploymentContract(humanc)
if(GLOB.highlander)
to_chat(humanc, "<span class='userdanger'><i>THERE CAN BE ONLY ONE!!!</i></span>")
@@ -411,3 +411,85 @@
name = "Wolf"
icon_state = "wolf"
matrixed_sections = MATRIX_RED_BLUE
/******************************************
*************** Tall Ears *****************
*******************************************/
/datum/sprite_accessory/ears/human/bnnuy
name = "Bnnuy (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "bnnuy"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/mam_ears/bnnuy
name = "Bnnuy (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "bnnuy"
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/human/bnnuy2
name = "Bnnuy (Alt) (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "bnnuy2"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/mam_ears/bnnuy2
name = "Bnnuy (Alt) (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "bnnuy2"
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/human/bunnytall
name = "Bunny (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "bunnytall"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/mam_ears/bunnytall
name = "Bunny (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "bunnytall"
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/human/sandfox
name = "Sandfox (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "sandfox"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/mam_ears/sandfox
name = "Sandfox (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "sandfox"
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/human/shadekinround
name = "Shadekin (Round) (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "shadekinround"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/mam_ears/shadekinround
name = "Shadekin (Round) (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "shadekinround"
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/human/jackalope
name = "Jackalope (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "jackalope"
color_src = MATRIXED
matrixed_sections = MATRIX_RED
/datum/sprite_accessory/ears/mam_ears/jackalope
name = "Jackalope (Tall)"
icon = 'modular_citadel/icons/mob/32x64_mam_ears.dmi'
icon_state = "jackalope"
matrixed_sections = MATRIX_RED
@@ -40,3 +40,13 @@
/datum/sprite_accessory/horns/short
name = "Short"
icon_state = "short"
/datum/sprite_accessory/horns/teppy
name = "Teppy (Tall)"
icon = 'icons/mob/32x64_mutant_bodyparts.dmi'
icon_state = "teppy"
/datum/sprite_accessory/horns/stag
name = "Stag (Tall)"
icon = 'icons/mob/32x64_mutant_bodyparts.dmi'
icon_state = "stag"
@@ -97,6 +97,7 @@
icon_state = "drider"
color_src = MUTCOLORS
extra = TRUE
taur_mode = STYLE_ARACHNID_TAURIC
/datum/sprite_accessory/taur/eevee
name = "Eevee"
@@ -168,6 +168,10 @@
H.dna.features["mam_tail"] = new_tail
if(new_tail != "None")
H.dna.features["taur"] = "None"
var/datum/action/innate/spin_web/SW = locate(/datum/action/innate/spin_web) in H.actions
var/datum/action/innate/spin_cocoon/SC = locate(/datum/action/innate/spin_cocoon) in H.actions
SC?.Remove(H)
SW?.Remove(H)
H.update_body()
else if (select_alteration == "Taur body")
@@ -183,7 +187,16 @@
var/new_taur
new_taur = input(owner, "Choose your character's tauric body:", "Tauric Alteration") as null|anything in snowflake_taur_list
if(new_taur)
var/datum/action/innate/spin_web/SW = locate(/datum/action/innate/spin_web) in H.actions
var/datum/action/innate/spin_cocoon/SC = locate(/datum/action/innate/spin_cocoon) in H.actions
SC?.Remove(H)
SW?.Remove(H)
H.dna.features["taur"] = new_taur
if(new_taur == "Drider")
SW = new
SC = new
SC.Grant(H)
SW.Grant(H)
if(new_taur != "None")
H.dna.features["mam_tail"] = "None"
H.update_body()
@@ -533,6 +533,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.physiology.footstep_type = FOOTSTEP_MOB_CLAW
if(STYLE_SNEK_TAURIC)
H.physiology.footstep_type = FOOTSTEP_MOB_CRAWL
if(STYLE_ARACHNID_TAURIC)
if(!istype(H.dna.species,/datum/species/arachnid))
var/datum/action/innate/spin_web/SW = new
var/datum/action/innate/spin_cocoon/SC = new
SC.Grant(H)
SW.Grant(H)
else
H.physiology.footstep_type = null
else
@@ -611,6 +617,17 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
for(var/obj/item/bodypart/B in C.bodyparts)
B.change_bodypart_status(initial(B.status), FALSE, TRUE)
if((TRAIT_ROBOTIC_ORGANISM in inherent_traits) && C.hud_used)
C.hud_used.coolant_display.clear()
if(ishuman(C))
var/mob/living/carbon/human/H = C
var/datum/action/innate/spin_web/SW = locate(/datum/action/innate/spin_web) in H.actions
var/datum/action/innate/spin_cocoon/SC = locate(/datum/action/innate/spin_cocoon) in H.actions
SC?.Remove(H)
SW?.Remove(H)
SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src)
// shamelessly inspired by antag_datum.remove_blacklisted_quirks()
/datum/species/proc/remove_blacklisted_quirks(mob/living/carbon/C)
@@ -54,10 +54,6 @@
/datum/species/arachnid/on_species_loss(mob/living/carbon/human/H)
. = ..()
var/datum/action/innate/spin_web/SW = locate(/datum/action/innate/spin_web) in H.actions
var/datum/action/innate/spin_cocoon/SC = locate(/datum/action/innate/spin_cocoon) in H.actions
SC?.Remove(H)
SW?.Remove(H)
/datum/action/innate/spin_web
name = "Spin Web"
@@ -34,10 +34,8 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
H.AddElement(/datum/element/dwarfism, COMSIG_SPECIES_LOSS, src)
RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech) //We register handle_speech is being used.
/datum/species/dwarf/on_species_loss(mob/living/carbon/C, datum/species/new_species)
/datum/species/dwarf/on_species_loss(mob/living/carbon/H, datum/species/new_species)
. = ..()
var/mob/living/carbon/human/H = C
H.RemoveElement(/datum/element/dwarfism, COMSIG_SPECIES_LOSS, src)
UnregisterSignal(H, COMSIG_MOB_SAY) //We register handle_speech is not being used.
//Dwarf Name stuff
+1 -2
View File
@@ -93,8 +93,7 @@
var/turf/T = get_turf(src)
if(mind && mind.name && mind.active && !istype(T.loc, /area/ctf) && !(signal & COMPONENT_BLOCK_DEATH_BROADCAST))
var/rendered = "<span class='deadsay'><b>[mind.name]</b> has died at <b>[get_area_name(T)]</b>.</span>"
deadchat_broadcast(rendered, follow_target = src, turf_target = T, message_type=DEADCHAT_DEATHRATTLE)
deadchat_broadcast(" has died at <b>[get_area_name(T)]</b>.", "<b>[mind.name]</b>", follow_target = src, turf_target = T, message_type=DEADCHAT_DEATHRATTLE)
if (client && client.prefs && client.prefs.auto_ooc)
if (!(client.prefs.chat_toggles & CHAT_OOC))
client.prefs.chat_toggles ^= CHAT_OOC
+7 -3
View File
@@ -54,7 +54,7 @@
to_chat(usr, "<span class='danger'>^^^----- The preceeding message has been DISCARDED for being over the maximum length of [MAX_MESSAGE_LEN]. It has NOT been sent! -----^^^</span>")
return
message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN))
message = trim(html_encode(message), MAX_MESSAGE_LEN)
clear_typing_indicator() // clear it immediately!
client?.last_activity = world.time
@@ -139,10 +139,14 @@
var/spanned = say_quote(say_emphasis(message))
message = emoji_parse(message)
var/rendered = "<span class='game deadsay'><span class='prefix'>DEAD:</span> <span class='name'>[name]</span>[alt_name] <span class='message'>[emoji_parse(spanned)]</span></span>"
var/source = "<span class='game'><span class='prefix'>DEAD:</span> <span class='name'>[name]</span>[alt_name]"
var/rendered = " <span class='message'>[emoji_parse(spanned)]</span></span>"
log_talk(message, LOG_SAY, tag="DEAD")
client?.last_activity = world.time
deadchat_broadcast(rendered, follow_target = src, speaker_key = key)
var/displayed_key = key
if(client?.holder?.fakekey)
displayed_key = null
deadchat_broadcast(rendered, source, follow_target = src, speaker_key = displayed_key)
/mob/proc/check_emote(message)
if(message[1] == "*")
@@ -116,10 +116,10 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new)
message_admins("[ADMIN_LOOKUPFLW(triggerer)] triggered and [ADMIN_LOOKUPFLW(confirmer)] confirmed event [event]")
var/area/A1 = get_area(triggerer)
deadchat_broadcast(" triggered [event] at <span class='name'>[A1.name]</span>.", "<span class='name'>[triggerer]</span>", triggerer)
deadchat_broadcast(" triggered [event] at [span_name("[A1.name]")].", span_name("[triggerer]"), triggerer, message_type=DEADCHAT_ANNOUNCEMENT)
var/area/A2 = get_area(confirmer)
deadchat_broadcast(" confirmed [event] at <span class='name'>[A2.name]</span>.", "<span class='name'>[confirmer]</span>", confirmer)
deadchat_broadcast(" confirmed [event] at [span_name("[A2.name]")].", span_name("[confirmer]"), confirmer, message_type=DEADCHAT_ANNOUNCEMENT)
switch(event)
if(KEYCARD_RED_ALERT)
set_security_level(SEC_LEVEL_RED)
+2 -2
View File
@@ -195,9 +195,9 @@
/obj/docking_port/mobile/arrivals/proc/QueueAnnounce(mob, rank)
if(mode != SHUTTLE_CALL)
AnnounceArrival(mob, rank)
announce_arrival(mob, rank)
else
LAZYADD(queued_announces, CALLBACK(GLOBAL_PROC, .proc/AnnounceArrival, mob, rank))
LAZYADD(queued_announces, CALLBACK(GLOBAL_PROC, .proc/announce_arrival, mob, rank))
/obj/docking_port/mobile/arrivals/vv_edit_var(var_name, var_value)
switch(var_name)
+1 -1
View File
@@ -8,7 +8,7 @@ GLOBAL_VAR_INIT(curse_of_madness_triggered, FALSE)
GLOB.curse_of_madness_triggered = message // So latejoiners are also afflicted.
deadchat_broadcast("<span class='deadsay'>A <span class='name'>Curse of Madness</span> has stricken the station, shattering their minds with the awful secret: \"<span class='big hypnophrase'>[message]</span>\"</span>")
deadchat_broadcast("A [span_name("Curse of Madness")] has stricken the station, shattering their minds with the awful secret: \"<span class='big hypnophrase'>[message]</span>\"", message_type=DEADCHAT_ANNOUNCEMENT)
for(var/mob/living/carbon/human/H in GLOB.player_list)
if(H.stat == DEAD)
+4
View File
@@ -99,7 +99,11 @@
if(skip_compat_check && !fexists(SERVICE_INTERFACE_DLL))
TGS_ERROR_LOG("Service parameter present but no interface DLL detected. This is symptomatic of running a service less than version 3.1! Please upgrade.")
return
#if DM_VERSION >= 515
call_ext(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval
#else
call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval
#endif
return TRUE
/datum/tgs_api/v3210/OnTopic(T)
+8 -6
View File
@@ -485,15 +485,17 @@ DYNAMIC_CONFIG_ENABLED
## Choose which Engine to start the round with. Weight is after the comma. Setting the weight to 0 removes the engine from rotation.
BOX_RANDOM_ENGINE Box SM,3
BOX_RANDOM_ENGINE Box Tesla,3
BOX_RANDOM_ENGINE Box Singulo,3
BOX_RANDOM_ENGINE Box SM 1x3,1
BOX_RANDOM_ENGINE Box SM 5x5,1
BOX_RANDOM_ENGINE Box Singulo,2
BOX_RANDOM_ENGINE Box SM 1x3,0
BOX_RANDOM_ENGINE Box SM 5x5,0
BOX_RANDOM_ENGINE Box SM 3x,0
BOX_RANDOM_ENGINE Box TEG,3
BOX_RANDOM_ENGINE Box TEG,2
BOX_RANDOM_ENGINE Box Empty,0
BOX_RANDOM_ENGINE Box Antimatter,1
BOX_RANDOM_ENGINE Box P.A.C.M.A.N,1
BOX_RANDOM_ENGINE Box Antimatter,0
BOX_RANDOM_ENGINE Box P.A.C.M.A.N,0
BOX_RANDOM_ENGINE Box RBMK,0
BOX_RANDOM_ENGINE Box DIY,2
BOX_RANDOM_ENGINE Box DIY_SM,1
## Whether the suicide verb is allowed.
+29
View File
@@ -139,3 +139,32 @@
2022-10-23:
Nukechickenu64:
- rscadd: Added werewolf quirk
2022-10-28:
JerryWester:
- rscadd: Arachnid quirk, grants the abilities of arachnids to non-arachnids for
the cost of a point
- tweak: Bloodsucker fledgelings can drink from cocooned victims
KathrinBailey:
- bugfix: Savannah Ivanov chassis sprite is no longer invisible.
SandPoot:
- bugfix: Fixed custom_roundstart_items, go reward your favorite players.
zeroisthebiggay:
- tweak: hypothetically allows you to leash cowbells and maid collars for erotic
purposes
2022-10-29:
Ldip999:
- rscadd: Limbgrower added to Cog surgery.
- rscdel: Removed medical records console from Cog surgery.
- rscadd: Medical windoor added to shared table between robotics and medical storage
on Cog.
- bugfix: One conveyor's rotation fixed on Cog.
SandPoot:
- bugfix: 'Fixed dwarves (again) thanks for the bug supporters: None.'
2022-10-30:
KathrinBailey:
- rscdel: PACMAN Boxstation Engine
- rscadd: DIY Boxstation Engine
- rscadd: DIY Supermatter Boxstation Engine
Satile1:
- tweak: A chain of space hotels has been bought out by Nanotrasen and will begin
servicing nearby stations!
Binary file not shown.

After

Width:  |  Height:  |  Size: 708 B

@@ -54,7 +54,7 @@
var/obj/item/loaded = loaded_atom
var/obj/item/storage/S = H.get_item_by_slot(ITEM_SLOT_BACK)
if(istype(S))
SEND_SIGNAL(S, COMSIG_TRY_STORAGE_INSERT,loaded, TRUE, H) //Force it into their backpack
SEND_SIGNAL(S, COMSIG_TRY_STORAGE_INSERT, loaded, null, TRUE, TRUE) //Force it into their backpack
continue
if(!H.put_in_hands(loaded)) //They don't have one/somehow that failed, put it in their hands
loaded.forceMove(T) //Guess we're just dumping it on the floor!
@@ -163,7 +163,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
if(-INFINITY to 30)
to_chat(M, "<span class='warning'>Your body disperses from existence, as you become one with the universe.</b></span>")
to_chat(M, "<span class='userdanger'>As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag, you do not remember the afterlife IC)</span>")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only.
deadchat_broadcast("<span class='warning'>[M] has become one with the universe, meaning that their IC conciousness is continuous in a new life. If they find a way back to life, they are allowed to remember their previous life. Be careful what you say. If they abuse this, bwoink the FUCK outta them.</span>")
deadchat_broadcast(" has become one with the universe, meaning that their IC conciousness is continuous in a new life. If they find a way back to life, they are allowed to remember their previous life. Be careful what you say. If they abuse this, bwoink the FUCK outta them.</span>", "<span class='warning'>[M]", M, message_type=DEADCHAT_ANNOUNCEMENT)
M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.")
message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout their lives should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role).")
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral obliterations")
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

File diff suppressed because it is too large Load Diff
+25
View File
@@ -0,0 +1,25 @@
//Main code edits
/datum/map_template/ruin/space/spacehotel
unpickable = TRUE
//Own stuff
/datum/map_template/ruin/space/radiostation
prefix = "modular_splurt/_maps/RandomRuins/SpaceRuins/"
id = "radiostation"
suffix = "radiostation.dmm"
name = "NT Radio Station"
description = "A mobile NT Radio Station ship."
/datum/map_template/ruin/space/syndielistenspace
prefix = "modular_splurt/_maps/RandomRuins/SpaceRuins/"
id = "syndielistenspace"
suffix = "syndielistenspace.dmm"
name = "Syndicate Listening Outpost"
description = "A syndicate listening outpost cleverly disguised as an asteroid"
/datum/map_template/ruin/space/spacehotelsplurt
prefix = "modular_splurt/_maps/RandomRuins/SpaceRuins/"
id = "spacehotelsplurt"
suffix = "spacehotelsplurt.dmm"
name = "Twin Spires Hotel and Club"
description = "A Nanotrasen-partnered interstellar hotel and stripclub"
@@ -0,0 +1,12 @@
// Boxstation
// Engine
/datum/map_template/ruin/station/box/engine/diy
id = "engine_diy"
suffix = "Box/Engine/splurt/diy.dmm"
name = "Box DIY"
/datum/map_template/ruin/station/box/engine/diy_sm
id = "engine_diysm"
suffix = "Box/Engine/splurt/diy_sm.dmm"
name = "Box DIY_SM"
+31
View File
@@ -106,3 +106,34 @@
if(.)
TIMER_COOLDOWN_START(quirk_holder, COOLDOWN_DOMINANT_SNAP, DOMINANT_SNAP_COOLDOWN)
/datum/quirk/arachnid
name = "Arachnid"
desc = "Your bodily anatomy allows you to spin webs and cocoons, even if you aren't an arachnid! (Note that this quirk does nothing for members of the arachnid species)"
value = 1
medical_record_text = "Patient has attempted to cover the room in webs, claiming to be \"making a nest\"."
mob_trait = TRAIT_ARACHNID
gain_text = "<span class='notice'>You feel a strange sensation near your anus...</span>"
lose_text = "<span class='notice'>You feel like you can't spin webs anymore...</span>"
processing_quirk = TRUE
/datum/quirk/arachnid/add()
. = ..()
var/mob/living/carbon/human/H = quirk_holder
if(is_species(H,/datum/species/arachnid))
to_chat(H, "<span class='warning'>As an arachnid, this quirk does nothing for you, as these abilities are innate to your species.</span>")
return
var/datum/action/innate/spin_web/SW = new
var/datum/action/innate/spin_cocoon/SC = new
SC.Grant(H)
SW.Grant(H)
/datum/quirk/arachnid/remove()
. = ..()
var/mob/living/carbon/human/H = quirk_holder
if(is_species(H,/datum/species/arachnid))
return
var/datum/action/innate/spin_web/SW = locate(/datum/action/innate/spin_web) in H.actions
var/datum/action/innate/spin_cocoon/SC = locate(/datum/action/innate/spin_cocoon) in H.actions
SC?.Remove(H)
SW?.Remove(H)
+6 -2
View File
@@ -557,8 +557,12 @@
H.adjustStaminaLoss(-20)
H.adjust_nutrition(-20)
H.resting = TRUE
if(H.pulling && iscarbon(H.pulling))
var/mob/living/carbon/victim = H.pulling
if(H.pulling && (iscarbon(H.pulling) || (istype(H.pulling,/obj/structure/arachnid/cocoon) && locate(/mob/living/carbon) in H.pulling.contents)))
var/mob/living/carbon/victim
if(iscarbon(H.pulling))
victim = H.pulling
else if(istype(H.pulling,/obj/structure/arachnid/cocoon))
victim = locate(/mob/living/carbon) in H.pulling.contents
drain_cooldown = world.time + 25
if(victim.anti_magic_check(FALSE, TRUE, FALSE, 0))
to_chat(victim, "<span class='warning'>[H] tries to bite you, but stops before touching you!</span>")
@@ -37,27 +37,11 @@
icon_state = "dorms"
has_gravity = STANDARD_GRAVITY
/datum/map_template/ruin/space/radiostation
prefix = "modular_splurt/_maps/RandomRuins/SpaceRuins/"
id = "radiostation"
suffix = "radiostation.dmm"
name = "NT Radio Station"
description = "A mobile NT Radio Station ship."
/area/ruin/space/syndielistenspace
name = "Syndicate Listening Post"
icon_state = "yellow"
has_gravity = STANDARD_GRAVITY
/datum/map_template/ruin/space/syndielistenspace
prefix = "modular_splurt/_maps/RandomRuins/SpaceRuins/"
id = "syndielistenspace"
suffix = "syndielistenspace.dmm"
name = "Syndicate Listening Outpost"
description = "A syndicate listening outpost cleverly disguised as an asteroid"
/obj/effect/mob_spawn/human/space/syndicate/special(mob/living/new_spawn)
new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND)
@@ -91,3 +75,12 @@
/datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.faction |= ROLE_SYNDICATE
/area/ruin/space/ruinsolars
name = "Solar Array"
dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT
requires_power = FALSE
has_gravity = FALSE
area_flags = UNIQUE_AREA
flags_1 = NONE
sound_environment = SOUND_AREA_SPACE
@@ -11,3 +11,19 @@
name = "Vampire ID"
desc = "An ID made to easily recognize vampires without needing to do tests"
icon_state = "vampire"
/obj/item/card/id/away/hotel/splurt
name = "Staff ID"
assignment = "Hotel Staff"
desc = "A staff ID used to access the hotel's doors."
access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_MAINT, ACCESS_AWAY_ENGINE)
/obj/item/card/id/away/hotel/splurt/security
name = "Officer ID"
assignment = "Hotel Security"
access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_MAINT, ACCESS_AWAY_SEC, ACCESS_AWAY_ENGINE)
/obj/item/card/id/away/hotel/manager
name = "Manager ID"
assignment = "Hotel Manager"
access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_MAINT, ACCESS_AWAY_ENGINE, ACCESS_AWAY_SEC, ACCESS_AWAY_GENERIC1)
@@ -92,7 +92,7 @@ Icons, maybe?
if(C.has_status_effect(/datum/status_effect/leash_pet)) //If the pet is already leashed, do not leash them. For the love of god.
to_chat(user, "<span class='notice'>[C] has already been leashed.</span>")
return
if(istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/petcollar) || istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/electropack/shockcollar))
if(istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/petcollar) || istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/electropack/shockcollar) || istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/necklace/cowbell) || istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/maid))
var/leashtime = 50
if(C.handcuffed)
leashtime = 5
@@ -53,3 +53,61 @@
new_spawn.language_holder.understood_languages += /datum/language/draconic
new_spawn.language_holder.spoken_languages += /datum/language/draconic
//Splurt-Specific Space Hotel Staff
/obj/effect/mob_spawn/human/hotel_staff/splurt //not free antag u little shits
name = "staff sleeper"
desc = "A sleeper designed for long-term stasis between guest visits."
mob_name = "hotel staff member"
job_description = "Hotel Staff"
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper_s"
objectives = "Cater to visiting guests with your fellow staff. Don't abandon the hotel - you can advertise and link up with potential guests, but always remember who signs your cheques! The customer is always right!"
short_desc = "You are a staff member of a top-of-the-line space hotel!"
flavour_text = "You are a staff member of a top-of-the-line space hotel! Cater to guests and make sure the manager doesn't fire you."
important_info = "DON'T abandon the hotel"
assignedrole = "Hotel Staff"
death = FALSE
roundstart = FALSE
random = TRUE
canloadappearance = TRUE
id_job = "Hotel Staff"
id = /obj/item/card/id/away/hotel/splurt
uniform = /obj/item/clothing/under/suit/red
shoes = /obj/item/clothing/shoes/laceup
head = /obj/item/clothing/head/hotel
r_pocket = /obj/item/pda
back = /obj/item/storage/backpack/satchel
ears = /obj/item/radio/headset
/obj/effect/mob_spawn/human/hotel_staff/splurt/security
name = "hotel security sleeper"
mob_name = "hotel security member"
job_description = "Hotel Security"
short_desc = "You are a peacekeeper."
flavour_text = "You have been assigned to this hotel to protect the interests of the company while keeping the peace between \
guests and the staff."
important_info = "Do NOT abandon the hotel, as that is grounds for contract termination."
objectives = "Do not abandon your assigned hotel. Try and keep the peace between staff and guests, non-lethal force heavily advised if possible."
id_job = "Hotel Security"
uniform = /obj/item/clothing/under/rank/security/officer/blueshirt
shoes = /obj/item/clothing/shoes/jackboots
suit = /obj/item/clothing/suit/armor/vest/blueshirt
head = /obj/item/clothing/head/helmet/blueshirt
back = /obj/item/storage/backpack/satchel/sec
belt = /obj/item/storage/belt/security/full
id = /obj/item/card/id/away/hotel/splurt/security
/obj/effect/mob_spawn/human/hotel_staff/splurt/manager
name = "hotel manager sleeper"
mob_name = "hotel manager"
job_description = "Hotel Manager"
short_desc = "You are the manager of a space hotel"
flavour_text = "You manage one site of a successful chain of space hotels. Your parent company has recently been bought out by Nanotrasen and tasked with servicing some of their stations; you have recieved a selection of fancy tech as a result! Protect the interests of your parent company, ensure your staff are performing to standard and make sure to keep your guests happy!"
important_info = "Staff, including you, are NOT to abandon the hotel."
objectives = "Don't abandon your assigned hotel. Cater to visiting guests. Maintain good corporate relations and remember: The customer is always right!"
id_job = "Hotel Manager"
uniform = /obj/item/clothing/under/suit/black
suit = /obj/item/clothing/suit/toggle/lawyer/black
head = /obj/item/clothing/head/beret/black
id = /obj/item/card/id/away/hotel/manager
@@ -0,0 +1,102 @@
/datum/action/innate/spin_web
var/web_cooldown = 200
var/web_ready = TRUE
var/spinner_rate = 25
/datum/action/innate/spin_cocoon
var/web_cooldown = 200
var/web_ready = TRUE
var/spinner_rate = 25
/datum/action/innate/spin_web/Activate()
var/mob/living/carbon/human/H = owner
if(H.stat == "DEAD")
return
if(web_ready == FALSE)
to_chat(H, "<span class='warning'>You need to wait a while to regenerate web fluid.</span>")
return
var/turf/T = get_turf(H)
if(!T)
to_chat(H, "<span class='warning'>There's no room to spin your web here!</span>")
return
var/obj/structure/spider/stickyweb/W = locate() in T
var/obj/structure/arachnid/W2 = locate() in T
if(W || W2)
to_chat(H, "<span class='warning'>There's already a web here!</span>")
return
// Should have some minimum amount of food before trying to activate
var/nutrition_threshold = NUTRITION_LEVEL_FED
if (H.nutrition >= nutrition_threshold)
to_chat(H, "<i>You begin spinning some web...</i>")
if(!do_after(H, 10 SECONDS, 1, T))
to_chat(H, "<span class='warning'>Your web spinning was interrupted!</span>")
return
H.adjust_nutrition(-spinner_rate)
addtimer(VARSET_CALLBACK(src, web_ready, TRUE), web_cooldown)
to_chat(H, "<i>You use up a fair amount of energy weaving a web on the ground with your spinneret!</i>")
new /obj/structure/arachnid(T, owner)
else
to_chat(H, "<span class='warning'>You're too hungry to spin web right now, eat something first!</span>")
return
/datum/action/innate/spin_cocoon/Activate()
var/mob/living/carbon/human/H = owner
if(H.stat == "DEAD")
return
if(web_ready == FALSE)
to_chat(H, "<span class='warning'>You need to wait awhile to regenerate web fluid.</span>")
return
var/nutrition_threshold = NUTRITION_LEVEL_FED
if (H.nutrition >= nutrition_threshold)
to_chat(H, "<span class='warning'>You pull out a strand from your spinneret, ready to wrap a target. (Press ALT+CLICK on the target to start wrapping.)</span>")
H.adjust_nutrition(spinner_rate * -0.5)
addtimer(VARSET_CALLBACK(src, web_ready, TRUE), web_cooldown)
RegisterSignal(H, list(COMSIG_MOB_ALTCLICKON), .proc/cocoonAtom)
return
else
to_chat(H, "<span class='warning'>You're too hungry to spin web right now, eat something first!</span>")
return
/datum/action/innate/spin_cocoon/cocoonAtom(mob/living/carbon/human/H, atom/movable/A)
UnregisterSignal(H, list(COMSIG_MOB_ALTCLICKON))
if (!H || !isarachnid(H))
return COMSIG_MOB_CANCEL_CLICKON
else
if(web_ready == FALSE)
to_chat(H, "<span class='warning'>You need to wait awhile to regenerate web fluid.</span>")
return
if(!H.Adjacent(A)) //No.
return
if(!isliving(A) && A.anchored)
to_chat(H, "<span class='warning'>[A] is bolted to the floor!</span>")
return
if(istype(A, /obj/structure/arachnid))
to_chat(H, "<span class='warning'>No double wrapping.</span>")
return
if(istype(A, /obj/effect))
to_chat(H, "<span class='warning'>You cannot wrap this.</span>")
return
if(isliving(A))
var/mob/living/L = A
if(L.key)
to_chat(H, "<span class='warning'>You prepare to wrap [L] in a cocoon...</span>")
var/response = alert(L, "Do you wish to be wrapped in a cocoon?", "Cocooning", "No", "Yes")
if(response == "No")
to_chat(H, "<span class='warning'>[L] resists your attempts to wrap [L.p_them()]!</span>")
return
H.visible_message("<span class='danger'>[H] starts to wrap [A] into a cocoon!</span>","<span class='warning'>You start to wrap [A] into a cocoon.</span>")
if(!do_after(H, 10 SECONDS, 1, A))
to_chat(H, "<span class='warning'>Your web spinning was interrupted!</span>")
return
H.adjust_nutrition(spinner_rate * -3)
var/obj/structure/arachnid/cocoon/C = new(A.loc)
if(isliving(A))
C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
A.forceMove(C)
H.visible_message("<span class='danger'>[H] wraps [A] into a large cocoon!</span>")
return
else
A.forceMove(C)
H.visible_message("<span class='danger'>[H] wraps [A] into a cocoon!</span>")
return
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

+2
View File
@@ -4324,6 +4324,7 @@
#include "modular_splurt\code\datums\mood_events\preg_events.dm"
#include "modular_splurt\code\datums\mutations\telekenisis.dm"
#include "modular_splurt\code\datums\ruins\lavaland.dm"
#include "modular_splurt\code\datums\ruins\space.dm"
#include "modular_splurt\code\datums\status_effects\pregnancy.dm"
#include "modular_splurt\code\datums\traits\defines.dm"
#include "modular_splurt\code\datums\traits\good.dm"
@@ -4650,6 +4651,7 @@
#include "modular_splurt\code\modules\mob\living\carbon\human\species.dm"
#include "modular_splurt\code\modules\mob\living\carbon\human\simple_animal\hostile\deathclaw\deathclaw.dm"
#include "modular_splurt\code\modules\mob\living\carbon\human\simple_animal\hostile\deathclaw\funclaw.dm"
#include "modular_splurt\code\modules\mob\living\carbon\human\species_types\arachnid.dm"
#include "modular_splurt\code\modules\mob\living\carbon\human\species_types\ashwalker.dm"
#include "modular_splurt\code\modules\mob\living\carbon\human\species_types\ipc.dm"
#include "modular_splurt\code\modules\mob\living\carbon\human\species_types\podpeople.dm"