mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2026-08-27 14:46:57 +01:00
Merge branch 'master' into pr/560
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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,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.
|
||||
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -21,3 +21,5 @@
|
||||
|
||||
#define TRAIT_INCUBUS "Incubus"
|
||||
#define TRAIT_SUCCUBUS "Succubus"
|
||||
|
||||
#define TRAIT_ARACHNID "Arachnid"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
@@ -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"
|
||||
@@ -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)
|
||||
|
||||
@@ -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 |
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user