Merge branch 'master' into mhelp-ticket-system

This commit is contained in:
farie82
2019-04-07 14:43:49 +02:00
committed by GitHub
499 changed files with 7450 additions and 3166 deletions
+6 -3
View File
@@ -321,7 +321,7 @@ var/global/nologevent = 0
if(CHANNEL.is_admin_channel)
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen'><A href='?src=[UID()];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A></FONT></B><BR>"
else
dat+="<B><A href='?src=[UID()];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR></B>"
dat+="<B><A href='?src=[UID()];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ""]<BR></B>"
dat+={"<BR><HR><A href='?src=[UID()];ac_refresh=1'>Refresh</A>
<BR><A href='?src=[UID()];ac_setScreen=[0]'>Back</A>
"}
@@ -405,7 +405,7 @@ var/global/nologevent = 0
dat+="<I>No feed channels found active...</I><BR>"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=[UID()];ac_pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<A href='?src=[UID()];ac_pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ""]<BR>"
dat+="<BR><A href='?src=[UID()];ac_setScreen=[0]'>Cancel</A>"
if(11)
dat+={"
@@ -418,7 +418,7 @@ var/global/nologevent = 0
dat+="<I>No feed channels found active...</I><BR>"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=[UID()];ac_pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<A href='?src=[UID()];ac_pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ""]<BR>"
dat+="<BR><A href='?src=[UID()];ac_setScreen=[0]'>Back</A>"
if(12)
@@ -676,6 +676,9 @@ var/global/nologevent = 0
alert("Unable to start the game as it is not set up.")
return
if(ticker.current_state == GAME_STATE_PREGAME)
if(config.start_now_confirmation)
if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes")
return
ticker.current_state = GAME_STATE_SETTING_UP
log_admin("[key_name(usr)] has started the game.")
message_admins("[key_name_admin(usr)] has started the game.")
+13
View File
@@ -477,6 +477,9 @@
else
dat += "<tr><td><i>Blob not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.blob_overminds.len)
dat += check_role_table("Blob Overminds", ticker.mode.blob_overminds)
if(ticker.mode.changelings.len)
dat += check_role_table("Changelings", ticker.mode.changelings)
@@ -545,6 +548,16 @@
if(spider_minds.len)
dat += check_role_table("Terror Spiders", spider_minds)
var/count_eggs = 0
var/count_spiderlings = 0
for(var/obj/structure/spider/eggcluster/terror_eggcluster/E in ts_egg_list)
if(is_station_level(E.z))
count_eggs += E.spiderling_number
for(var/obj/structure/spider/spiderling/terror_spiderling/L in ts_spiderling_list)
if(!L.stillborn && is_station_level(L.z))
count_spiderlings += 1
dat += "<table cellspacing=5><TR><TD>Growing TS on-station: [count_eggs] egg[count_eggs != 1 ? "s" : ""], [count_spiderlings] spiderling[count_spiderlings != 1 ? "s" : ""]. </TD></TR></TABLE>"
if(ticker.mode.ert.len)
dat += check_role_table("ERT", ticker.mode.ert)
+3 -1
View File
@@ -113,7 +113,9 @@
<A href='?src=[UID()];secretsfun=schoolgirl'>Japanese Animes Mode</A>&nbsp;&nbsp;
<A href='?src=[UID()];secretsfun=eagles'>Egalitarian Station Mode</A><BR>
<A href='?src=[UID()];secretsfun=guns'>Summon Guns</A>&nbsp;&nbsp;
<A href='?src=[UID()];secretsfun=magic'>Summon Magic</A>
<A href='?src=[UID()];secretsfun=magic'>Summon Magic</A>&nbsp;&nbsp;
<A href='?src=[UID()];secretsfun=revolver'>Summon Revolver Duel</A>&nbsp;&nbsp;
<A href='?src=[UID()];secretsfun=fakerevolver'>Summon Suicidal Revolver Duel</A>
<BR>
<A href='?src=[UID()];secretsfun=rolldice'>Roll the Dice</A><BR>
<BR>
+10 -2
View File
@@ -2840,11 +2840,19 @@
if("guns")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","SG")
usr.rightandwrong(0)
usr.rightandwrong(FALSE)
if("magic")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","SM")
usr.rightandwrong(1)
usr.rightandwrong(TRUE)
if("revolver")
feedback_inc("admin_secrets_fun_used", 1)
feedback_add_details("admin_secrets_fun_used", "SRD")
usr.rightandwrong(FALSE, revolver_fight = TRUE)
if("fakerevolver")
feedback_inc("admin_secrets_fun_used", 1)
feedback_add_details("admin_secrets_fun_used", "SFD")
usr.rightandwrong(FALSE, fake_revolver_fight = TRUE)
if("tdomereset")
var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel")
if(delete_mobs == "Cancel")
@@ -10,7 +10,6 @@
/obj/item/antag_spawner/proc/equip_antag(mob/target)
return
/obj/item/antag_spawner/borg_tele
name = "syndicate cyborg teleporter"
desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field."
@@ -149,7 +148,6 @@
to_chat(S, "<B>Objective #[1]</B>: [KillDaWiz.explanation_text]")
to_chat(S, "<B>Objective #[2]</B>: [KillDaCrew.explanation_text]")
/obj/item/antag_spawner/slaughter_demon/laughter
name = "vial of tickles"
desc = "A magically infused bottle of clown love, distilled from \
@@ -160,3 +158,59 @@
lurking just beyond the veil...</span>"
objective_verb = "Hug and Tickle"
demon_type = /mob/living/simple_animal/slaughter/laughter
/obj/item/antag_spawner/morph
name = "vial of ooze"
desc = "A magically infused bottle of ooze, distilled by methods rather not be spoken of. Used to awaken an all-consuming monstrosity."
icon = 'icons/obj/wizard.dmi'
icon_state = "vialooze"
var/shatter_msg = "<span class='notice'>You shatter the bottle, no \
turning back now!</span>"
var/veil_msg = "<span class='warning'>The sludge is awake and seeps \
away...</span>"
var/objective_verb = "Eat"
var/mob/living/morph_type = /mob/living/simple_animal/hostile/morph
/obj/item/antag_spawner/morph/attack_self(mob/user)
if(level_blocks_magic(user.z))//this is to make sure the wizard does NOT summon a morph from the Den..
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
return
if(used)
to_chat(user, "<span class='notice'>This bottle already has a broken seal.</span>")
return
used = TRUE
to_chat(user, "<span class='notice'>You break the seal on the bottle, calling upon the dire sludge to awaken...</span>")
var/list/candidates = pollCandidates("Do you want to play as a morph awakened by [user.real_name]?", ROLE_MORPH, 1, 100)
if(candidates.len > 0)
var/mob/C = pick(candidates)
spawn_antag(C, get_turf(src.loc), initial(morph_type.name), user)
to_chat(user, "[shatter_msg]")
to_chat(user, "[veil_msg]")
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
qdel(src)
else
used = FALSE
to_chat(user, "<span class='notice'>The sludge does not respond to your attempt to awake it. Perhaps you should try again later.</span>")
/obj/item/antag_spawner/morph/spawn_antag(client/C, turf/T, type = "", mob/user)
var/mob/living/simple_animal/hostile/morph/M = new /mob/living/simple_animal/hostile/morph(pick(xeno_spawn))
M.key = C.key
M.mind.assigned_role = SPECIAL_ROLE_MORPH
M.mind.special_role = SPECIAL_ROLE_MORPH
to_chat(M, M.playstyle_string)
ticker.mode.traitors += M.mind
var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate
KillDaWiz.owner = M.mind
KillDaWiz.target = user.mind
KillDaWiz.explanation_text = "[objective_verb] [user.real_name], the one who was foolish enough to awake you."
M.mind.objectives += KillDaWiz
var/datum/objective/KillDaCrew = new /datum/objective
KillDaCrew.owner = M.mind
KillDaCrew.explanation_text = "[objective_verb] everyone and everything else while you're at it."
M.mind.objectives += KillDaCrew
to_chat(M, "<B>Objective #[1]</B>: [KillDaWiz.explanation_text]")
to_chat(M, "<B>Objective #[2]</B>: [KillDaCrew.explanation_text]")
M << 'sound/magic/mutate.ogg'
+1 -1
View File
@@ -121,7 +121,7 @@
return
/obj/item/assembly_holder/pickup()
..()
. = ..()
process_movement()
/obj/item/assembly_holder/Bump()
+9 -9
View File
@@ -46,17 +46,17 @@
if(!M.id || M.id == "")
M.id = input(user, "Please select an ID for the button", "Buildmode", "")
if(!M.id || M.id == "")
goto(line_jump)
goto line_jump
if(P.id_tag == M.id && P.id_tag && P.id_tag != "")
P.id_tag = null
to_chat(user, "[P] unlinked.")
goto(line_jump)
goto line_jump
if(!M.normaldoorcontrol)
if(link_lines.len && alert(user, "Warning: This will disable links to connected pod doors. Continue?", "Buildmode", "Yes", "No") == "No")
goto(line_jump)
goto line_jump
M.normaldoorcontrol = 1
if(P.id_tag && alert(user, "Warning: This will unlink something else from the door. Continue?", "Buildmode", "Yes", "No") == "No")
goto(line_jump)
goto line_jump
P.id_tag = M.id
if(istype(link_obj, /obj/machinery/door_control) && istype(object, /obj/machinery/door/poddoor))
var/obj/machinery/door_control/M = link_obj
@@ -64,21 +64,21 @@
if(!M.id || M.id == "")
M.id = input(user, "Please select an ID for the button", "Buildmode", "")
if(!M.id || M.id == "")
goto(line_jump)
goto line_jump
if(P.id_tag == M.id && P.id_tag && P.id_tag != "")
P.id_tag = null
to_chat(user, "[P] unlinked.")
goto(line_jump)
goto line_jump
if(M.normaldoorcontrol)
if(link_lines.len && alert(user, "Warning: This will disable links to connected airlocks. Continue?", "Buildmode", "Yes", "No") == "No")
goto(line_jump)
goto line_jump
M.normaldoorcontrol = 0
if(!M.id || M.id == "")
M.id = input(user, "Please select an ID for the button", "Buildmode", "")
if(!M.id || M.id == "")
goto(line_jump)
goto line_jump
if(P.id_tag && P.id_tag != 1 && alert(user, "Warning: This will unlink something else from the door. Continue?", "Buildmode", "Yes", "No") == "No")
goto(line_jump)
goto line_jump
P.id_tag = M.id
line_jump // For the goto
+3 -1
View File
@@ -44,6 +44,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
if(client.cache.Find(asset_name) || client.sending.Find(asset_name))
return 0
log_asset("Sending asset [asset_name] to client [client]")
client << browse_rsc(SSassets.cache[asset_name], asset_name)
if(!verify) // Can't access the asset cache browser, rip.
client.cache += asset_name
@@ -92,6 +93,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
to_chat(client, "Sending Resources...")
for(var/asset in unreceived)
if(asset in SSassets.cache)
log_asset("Sending asset [asset] to client [client]")
client << browse_rsc(SSassets.cache[asset], asset)
if(!verify) // Can't access the asset cache browser, rip.
@@ -292,7 +294,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
/datum/asset/chem_master/register()
for(var/i = 1 to 20)
assets["pill[i].png"] = icon('icons/obj/chemical.dmi', "pill[i]")
for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle"))
for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle", "reagent_bottle"))
assets["[i].png"] = icon('icons/obj/chemical.dmi', "[i]")
for(var/asset_name in assets)
register_asset(asset_name, assets[asset_name])
+2
View File
@@ -19,6 +19,8 @@
var/area = null
var/time_died_as_mouse = null //when the client last died as a mouse
var/typing = FALSE // Prevents typing window stacking
var/adminhelped = 0
var/gc_destroyed //Time when this object was destroyed.
+7
View File
@@ -290,6 +290,10 @@
return null
if(byond_version < MIN_CLIENT_VERSION) // Too out of date to play at all. Unfortunately, we can't send them a message here.
return null
if(byond_build < config.minimum_client_build)
alert(src, "You are using a byond build which is not supported by this server. Please use a build version of atleast [config.minimum_client_build].", "Incorrect build", "OK")
del(src)
return
if(byond_version < SUGGESTED_CLIENT_VERSION) // Update is suggested, but not required.
to_chat(src,"<span class='userdanger'>Your BYOND client (v: [byond_version]) is out of date. This can cause glitches. We highly suggest you download the latest client from http://www.byond.com/ before playing. </span>")
@@ -383,6 +387,9 @@
if(prefs.toggles & DISABLE_KARMA) // activates if karma is disabled
if(establish_db_connection())
to_chat(src,"<span class='notice'>You have disabled karma gains.") // reminds those who have it disabled
else
if(establish_db_connection())
to_chat(src,"<span class='notice'>You have enabled karma gains.")
if(!void)
void = new()
+22 -24
View File
@@ -435,37 +435,35 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "</td></tr></table>"
if(TAB_GAME) // General Preferences
// LEFT SIDE OF THE PAGE
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
dat += "<h2>General Settings</h2>"
dat += "<b>Fancy NanoUI:</b> <a href='?_src_=prefs;preference=nanoui'>[(nanoui_fancy) ? "Yes" : "No"]</a><br>"
dat += "<b>Ghost-Item Attack Animation:</b> <a href='?_src_=prefs;preference=ghost_att_anim'>[(show_ghostitem_attack) ? "Yes" : "No"]</a><br>"
dat += "<b>Window Flashing:</b> <a href='?_src_=prefs;preference=winflash'>[(windowflashing) ? "Yes" : "No"]</a><br>"
dat += "<b>Custom UI settings:</b><br>"
dat += " - <b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
dat += " - <b>Color:</b> <a href='?_src_=prefs;preference=UIcolor'><b>[UI_style_color]</b></a> <table style='display:inline;' bgcolor='[UI_style_color]'<tr><td>__</td></tr></table><br>"
dat += " - <b>Alpha (transparency):</b> <a href='?_src_=prefs;preference=UIalpha'><b>[UI_style_alpha]</b></a><br>"
dat += "<br>"
dat += "<b>Play admin midis:</b> <a href='?_src_=prefs;preference=hear_midis'><b>[(sound & SOUND_MIDI) ? "Yes" : "No"]</b></a><br>"
dat += "<b>Play lobby music:</b> <a href='?_src_=prefs;preference=lobby_music'><b>[(sound & SOUND_LOBBY) ? "Yes" : "No"]</b></a><br>"
dat += "<b>Attack Animations:</b> <a href='?_src_=prefs;preference=ghost_att_anim'>[(show_ghostitem_attack) ? "Yes" : "No"]</a><br>"
if(user.client.holder)
dat += "<b>Adminhelp sound:</b> "
dat += "<a href='?_src_=prefs;preference=hear_adminhelps'><b>[(sound & SOUND_ADMINHELP)?"On":"Off"]</b></a><br>"
if(check_rights(R_ADMIN,0))
dat += "<b>OOC:</b> <span style='border: 1px solid #161616; background-color: [ooccolor ? ooccolor : normal_ooc_colour];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=ooccolor;task=input'><b>Change</b></a><br>"
if(config.allow_Metadata)
dat += "<b>OOC notes:</b> <a href='?_src_=prefs;preference=metadata;task=input'><b>Edit</b></a><br>"
dat += "<b>Adminhelp sound:</b> <a href='?_src_=prefs;preference=hear_adminhelps'><b>[(sound & SOUND_ADMINHELP)?"On":"Off"]</b></a><br>"
if(unlock_content)
dat += "<b>BYOND Membership Publicity:</b> <a href='?_src_=prefs;preference=publicity'><b>[(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]</b></a><br>"
dat += "<b>Custom UI settings:</b><br>"
dat += " - <b>Alpha (transparency):</b> <a href='?_src_=prefs;preference=UIalpha'><b>[UI_style_alpha]</b></a><br>"
dat += " - <b>Color:</b> <a href='?_src_=prefs;preference=UIcolor'><b>[UI_style_color]</b></a> <span style='border: 1px solid #161616; background-color: [UI_style_color];'>&nbsp;&nbsp;&nbsp;</span><br>"
dat += " - <b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
dat += "<b>Deadchat Anonymity:</b> <a href='?_src_=prefs;preference=ghost_anonsay'><b>[ghost_anonsay ? "Anonymous" : "Not Anonymous"]</b></a><br>"
if(user.client.donator_level >= DONATOR_LEVEL_ONE)
dat += "<b>Donator Publicity:</b> <a href='?_src_=prefs;preference=donor_public'><b>[(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"]</b></a><br>"
dat += "<b>Randomized character slot:</b> <a href='?_src_=prefs;preference=randomslot'><b>[randomslot ? "Yes" : "No"]</b></a><br>"
dat += "<b>Ghost ears:</b> <a href='?_src_=prefs;preference=ghost_ears'><b>[(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]</b></a><br>"
dat += "<b>Ghost sight:</b> <a href='?_src_=prefs;preference=ghost_sight'><b>[(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]</b></a><br>"
dat += "<b>Ghost radio:</b> <a href='?_src_=prefs;preference=ghost_radio'><b>[(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]</b></a><br>"
dat += "<b>Deadchat anonymity:</b> <a href='?_src_=prefs;preference=ghost_anonsay'><b>[ghost_anonsay ? "Anonymous" : "Not Anonymous"]</b></a><br>"
dat += "<b>Fancy NanoUI:</b> <a href='?_src_=prefs;preference=nanoui'>[(nanoui_fancy) ? "Yes" : "No"]</a><br>"
dat += "<b>FPS:</b> <a href='?_src_=prefs;preference=clientfps;task=input'>[clientfps]</a><br>"
dat += "<b>Ghost Ears:</b> <a href='?_src_=prefs;preference=ghost_ears'><b>[(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]</b></a><br>"
dat += "<b>Ghost Sight:</b> <a href='?_src_=prefs;preference=ghost_sight'><b>[(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]</b></a><br>"
dat += "<b>Ghost Radio:</b> <a href='?_src_=prefs;preference=ghost_radio'><b>[(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]</b></a><br>"
if(check_rights(R_ADMIN,0))
dat += "<b>OOC Color:</b> <span style='border: 1px solid #161616; background-color: [ooccolor ? ooccolor : normal_ooc_colour];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=ooccolor;task=input'><b>Change</b></a><br>"
if(config.allow_Metadata)
dat += "<b>OOC Notes:</b> <a href='?_src_=prefs;preference=metadata;task=input'><b>Edit</b></a><br>"
dat += "<b>Play Admin MIDIs:</b> <a href='?_src_=prefs;preference=hear_midis'><b>[(sound & SOUND_MIDI) ? "Yes" : "No"]</b></a><br>"
dat += "<b>Play Lobby Music:</b> <a href='?_src_=prefs;preference=lobby_music'><b>[(sound & SOUND_LOBBY) ? "Yes" : "No"]</b></a><br>"
dat += "<b>Randomized Character Slot:</b> <a href='?_src_=prefs;preference=randomslot'><b>[randomslot ? "Yes" : "No"]</b></a><br>"
dat += "<b>Window Flashing:</b> <a href='?_src_=prefs;preference=winflash'>[(windowflashing) ? "Yes" : "No"]</a><br>"
// RIGHT SIDE OF THE PAGE
dat += "</td><td width='300px' height='300px' valign='top'>"
dat += "<h2>Special Role Settings</h2>"
if(jobban_isbanned(user, "Syndicate"))
@@ -554,7 +552,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "<a href='?_src_=prefs;preference=reset_all'>Reset Setup</a>"
dat += "</center>"
var/datum/browser/popup = new(user, "preferences", "<div align='center'>Character Setup</div>", 820, 640)
var/datum/browser/popup = new(user, "preferences", "<div align='center'>Character Setup</div>", 820, 660)
popup.set_content(dat)
popup.open(0)
@@ -55,7 +55,7 @@
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style))
default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot))
toggles = sanitize_integer(toggles, 0, 1048575, initial(toggles))
toggles = sanitize_integer(toggles, 0, 2097151, initial(toggles))
sound = sanitize_integer(sound, 0, 65535, initial(sound))
UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color))
UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha))
@@ -224,10 +224,22 @@
set name = "Toggle Karma Gains"
set category = "Special Verbs"
set desc = "This button will allow you to stop other people giving you karma."
if (prefs.toggles & DISABLE_KARMA)
prefs.toggles ^= DISABLE_KARMA
prefs.save_preferences(src)
if(prefs.toggles & DISABLE_KARMA)
to_chat(usr, "<span class='notice'>You have disabled karma gains.")
else
to_chat(usr, "<span class='notice'>You have enabled karma gains.")
prefs.toggles ^= DISABLE_KARMA
prefs.save_preferences(src)
return
/client/verb/toggle_popup_limiter()
set name = "Toggle Text Popup Limiter"
set category = "Preferences"
set desc = "Will let you limit the text input popups to one at a time."
prefs.toggles ^= TYPING_ONCE
prefs.save_preferences(src)
if(prefs.toggles & TYPING_ONCE)
to_chat(usr, "<span class='notice'>You have enabled text popup limiting.")
else
to_chat(usr, "<span class='notice'>You have disabled text popup limiting.")
return
+4
View File
@@ -532,6 +532,10 @@
actions_types = list(/datum/action/item_action/toggle)
up = 0
tint = 0
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
/obj/item/clothing/glasses/tajblind/eng
name = "industrial veil"
+8
View File
@@ -165,6 +165,10 @@
flags_cover = GLASSESCOVERSEYES
actions_types = list(/datum/action/item_action/toggle)
up = 0
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
/obj/item/clothing/glasses/hud/security/tajblind/attack_self()
toggle_veil()
@@ -177,6 +181,10 @@
flags_cover = GLASSESCOVERSEYES
actions_types = list(/datum/action/item_action/toggle)
up = 0
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
/obj/item/clothing/glasses/hud/health/tajblind/attack_self()
toggle_veil()
+3 -1
View File
@@ -6,6 +6,7 @@
icon_state = "ironring"
item_state = ""
icon = 'icons/obj/clothing/rings.dmi'
var/fluff_material = FALSE //If true, will ignore the material when examining
var/material = "iron"
var/stud = 0
@@ -21,7 +22,8 @@
/obj/item/clothing/gloves/ring/examine(mob/user)
..(user)
to_chat(user, "This one is made of [material].")
if(!fluff_material)
to_chat(user, "This one is made of [material].")
if(stud)
to_chat(user, "It is adorned with a single gem.")
+1 -1
View File
@@ -430,7 +430,7 @@
/obj/item/clothing/head/griffin/proc/caw()
if(cooldown < world.time - 20) // A cooldown, to stop people being jerks
playsound(src.loc, 'sound/misc/caw.ogg', 50, 1)
playsound(src.loc, 'sound/creatures/caw.ogg', 50, 1)
cooldown = world.time
+1 -1
View File
@@ -188,7 +188,7 @@
/obj/item/clothing/mask/gas/owl_mask/proc/hoot()
if(cooldown < world.time - 35) // A cooldown, to stop people being jerks
playsound(src.loc, 'sound/misc/hoot.ogg', 50, 1)
playsound(src.loc, 'sound/creatures/hoot.ogg', 50, 1)
cooldown = world.time
// ********************************************************************
+3 -2
View File
@@ -491,5 +491,6 @@
/obj/item/clothing/mask/cursedclown/suicide_act(mob/user)
user.visible_message("<span class='danger'>[user] gazes into the eyes of [src]. [src] gazes back!</span>")
spawn(10)
user.gib()
return BRUTELOSS
if(user)
user.gib()
return OBLITERATION
+41 -2
View File
@@ -154,7 +154,7 @@
/obj/item/fluff/rsik_katana/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] tries to stab [src] into [user.p_their()] stomach! Except [src] shatters! [user.p_they(TRUE)] look[user.p_s()] as if [user.p_they()] might die from the shame.</span>")
return(BRUTELOSS)
return BRUTELOSS
/obj/item/crowbar/fluff/zelda_creedy_1 // Zomgponies: Griffin Rowley
name = "Zelda's Crowbar"
@@ -1156,9 +1156,19 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "shesicoat"
item_state = "shesicoat"
hoodtype = /obj/item/clothing/head/hood/fluff/shesi
body_parts_covered = UPPER_TORSO|LOWER_TORSO
cold_protection = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/head/hood/fluff/shesi //MrSynnester : Shesi Skaklas
name = "custom made winter hood"
desc = "A custom made winter coat hood. Looks comfy."
icon = 'icons/obj/custom_items.dmi'
icon_state = "shesicoat_hood2"
body_parts_covered = HEAD
flags = NODROP|BLOCKHAIR
flags_inv = HIDEEARS
/obj/item/clothing/suit/jacket/dtx //AffectedArc07: DTX
name = "telecommunications bomber jacket"
desc = "Looks like something only a nerd would buy. Has a tag inside reading <i>Property of DTX</i>."
@@ -1683,6 +1693,14 @@
item_color = "Xann_necklace"
slot_flags = SLOT_TIE
/obj/item/clothing/accessory/rbscarf //Rb303: Isthel Eisenwald
name = "Old purple scarf"
desc = "An old, striped purple scarf. It appears to be hand-knitted and has the name 'Isthel' written on it in bad handwriting."
icon = 'icons/obj/custom_items.dmi'
icon_state = "rbscarf"
item_state = "rbscarf"
item_color = "rbscarf"
/obj/item/instrument/accordion/fluff/asmer_accordion //Asmerath: Coloratura
name = "Rara's Somber Accordion"
desc = "A blue colored accordion with claw indentations on the keys made special for vulpkanins."
@@ -1734,4 +1752,25 @@
icon_state = "kiamask"
item_state = "kiamask"
item_color = "kiamask"
species_restricted = list("Vox")
species_restricted = list("Vox")
/obj/item/clothing/gloves/ring/fluff
name = "fluff ring"
desc = "Someone forgot to set this fluff item's description, notify a coder!"
icon = 'icons/obj/custom_items.dmi'
fluff_material = TRUE
/obj/item/clothing/gloves/ring/fluff/update_icon()
return
/obj/item/clothing/gloves/ring/fluff/attackby(obj/item/I as obj, mob/user as mob, params)
return
/obj/item/clothing/gloves/ring/fluff/benjaminfallout //Benjaminfallout: Pretzel Brassheart
name = "Pretzel's Ring"
desc = "A small platinum ring with a large light blue diamond. Engraved inside the band are the words: 'To my lovely Pristine Princess. Forever yours, Savinien.'"
icon_state = "benjaminfallout_ring"
+1 -1
View File
@@ -9,7 +9,7 @@
var/turf/T = pick(blobstart)
if(!T)
return kill()
var/list/candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
var/list/candidates = pollCandidates("Do you want to play as a blob infested mouse?", ROLE_BLOB, 1)
if(!candidates.len)
return kill()
var/list/vents = list()
+8 -2
View File
@@ -1,12 +1,18 @@
/datum/event/grid_check //NOTE: Times are measured in master controller ticks!
announceWhen = 5
/datum/event/grid_check/setup()
endWhen = rand(30,120)
/datum/event/grid_check/start()
power_failure(0)
var/sound/S = sound('sound/effects/powerloss.ogg')
for(var/mob/living/M in GLOB.player_list)
var/turf/T = get_turf(M)
if(!M.client || !is_station_level(T.z))
continue
SEND_SOUND(M, S)
/datum/event/grid_check/announce()
event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
+1
View File
@@ -33,6 +33,7 @@
SA.key = SG.key
SA.universal_speak = 1
SA.sentience_act()
SA.can_collar = 1
SA.maxHealth = max(SA.maxHealth + 200)
SA.melee_damage_lower = max(SA.melee_damage_lower + 15)
SA.melee_damage_upper = max(SA.melee_damage_upper + 15)
+1
View File
@@ -684,6 +684,7 @@
wither()
/obj/structure/spacevine/temperature_expose(null, temp, volume)
..()
var/override = 0
for(var/datum/spacevine_mutation/SM in mutations)
override += SM.process_temperature(src, temp, volume)
+1 -1
View File
@@ -29,7 +29,7 @@
R.add_reagent(pick(gunk), 50)
var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1)
smoke.set_up(R, vent, TRUE)
playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start(3)
qdel(R)
@@ -55,6 +55,11 @@
then click where you want to fire. After firing, you will need to pump the gun, by clicking on the gun in your hand. To reload, load more shotgun \
shells into the gun."
/obj/item/toy/russian_revolver/trick_revolver //oh no
description_info = "This is a ballistic weapon. To fire the weapon, have your gun mode set to 'fire', \
then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropriate ammo. The description \
will tell you what caliber you need."
//*******
//*Melee*
//*******
-9
View File
@@ -60,12 +60,3 @@
stat(null,"<font color='#298A08'><b>[description_holders["fluff"]]</b></font>") //Yellow, fluff-related text.
if(description_holders["antag"])
stat(null,"<font color='#8A0808'><b>[description_holders["antag"]]</b></font>") //Red, malicious antag-related text
//override examinate verb to update description holders when things are examined
/mob/examinate(atom/A as mob|obj|turf in view())
if(..())
return 1
var/is_antag = (isAntag(src) || isobserver(src)) //ghosts don't have minds
if(client)
client.update_description_holders(A, is_antag)
+6 -6
View File
@@ -25,9 +25,9 @@
throw_speed = 3
throw_range = 7
suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw
to_chat(viewers(user), "<span class='warning'>[user] places the [src.name] on top of [user.p_their()] head, [user.p_their()] fingers tangled in the netting! It looks like [user.p_theyre()] trying to commit suicide.</span>")
return(OXYLOSS)
/obj/item/fish_net/suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw
to_chat(viewers(user), "<span class='warning'>[user] places the [src.name] on top of [user.p_their()] head, [user.p_their()] fingers tangled in the netting! It looks like [user.p_theyre()] trying to commit suicide.</span>")
return OXYLOSS
/obj/item/fishfood
name = "fish food can"
@@ -51,9 +51,9 @@
throw_range = 7
attack_verb = list("scrubbed", "brushed", "scraped")
suicide_act(mob/user)
to_chat(viewers(user), "<span class='warning'>[user] is vigorously scrubbing [user.p_them()]self raw with the [name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
return(BRUTELOSS|FIRELOSS)
/obj/item/tank_brush/suicide_act(mob/user)
to_chat(viewers(user), "<span class='warning'>[user] is vigorously scrubbing [user.p_them()]self raw with the [name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
return BRUTELOSS|FIRELOSS
//////////////////////////////////////////////
// Fish Items //
+2 -3
View File
@@ -64,9 +64,8 @@ proc/Ellipsis(original_msg, chance = 50)
if(chance <= 0) return "..."
if(chance >= 100) return original_msg
var/list
words = splittext(original_msg," ")
new_words = list()
var/list/words = splittext(original_msg," ")
var/list/new_words = list()
var/new_msg = ""
+1 -11
View File
@@ -11,6 +11,7 @@
possible_transfer_amounts = list(5,10,15,20,25,30,50)
volume = 50
burn_state = FIRE_PROOF
antable = FALSE
/obj/item/reagent_containers/food/drinks/New()
..()
@@ -106,17 +107,6 @@
return FALSE
/obj/item/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird
return FALSE
if(is_hot(I))
if(reagents)
reagents.chem_temp += 15
to_chat(user, "<span class='notice'>You heat [src] with [I].</span>")
reagents.handle_reactions()
else
return ..()
/obj/item/reagent_containers/food/drinks/examine(mob/user)
if(!..(user, 1))
return
@@ -27,7 +27,7 @@
else
..()
/obj/item/reagent_containers/food/drinks/drinkingglass/fire_act()
/obj/item/reagent_containers/food/drinks/drinkingglass/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
if(!reagents.total_volume)
return
..()
@@ -51,7 +51,7 @@
if(A.volume >= 5 && A.alcohol_perc >= 0.35) //Only an approximation to if something's flammable but it will do
return TRUE
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/fire_act(global_overlay = FALSE)
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = FALSE)
if(!isShotFlammable() || burn_state == ON_FIRE) //You can't light a shot that's not flammable!
return
..()
+34 -2
View File
@@ -13,10 +13,42 @@
var/transfer_efficiency = 1.0
var/instant_application = 0 //if we want to bypass the forcedfeed delay
var/taste = TRUE//whether you can taste eating from this
var/antable = TRUE // Will ants come near it?
var/ant_location = null
var/ant_timer = null
burn_state = FLAMMABLE
container_type = INJECTABLE
/obj/item/reagent_containers/food/New()
..()
/obj/item/reagent_containers/food/Initialize(mapload)
. = ..()
pixel_x = rand(-5, 5) //Randomizes postion
pixel_y = rand(-5, 5)
if(antable)
ant_location = get_turf(src)
ant_timer = addtimer(CALLBACK(src, .proc/check_for_ants), 3000, TIMER_STOPPABLE)
/obj/item/reagent_containers/food/Destroy()
ant_location = null
if(ant_timer)
deltimer(ant_timer)
return ..()
/obj/item/reagent_containers/food/proc/check_for_ants()
if(!antable)
return
var/turf/T = get_turf(src)
if(isturf(loc) && !locate(/obj/structure/table) in T)
if(ant_location == T)
if(prob(15))
if(!locate(/obj/effect/decal/ants) in T)
new /obj/effect/decal/ants(T)
antable = FALSE
desc += " It appears to be infested with ants. Yuck!"
reagents.add_reagent("ants", 1) // Don't eat things with ants in i you weirdo.
if(ant_timer)
deltimer(ant_timer)
else
ant_location = T
if(ant_timer)
deltimer(ant_timer)
ant_timer = addtimer(CALLBACK(src, .proc/check_for_ants), 3000, TIMER_STOPPABLE)
@@ -131,7 +131,7 @@
user.name = newname
user.real_name = newname
desc = "Salt. From dead crew, presumably."
return (TOXLOSS)
return TOXLOSS
/obj/item/reagent_containers/food/condiment/peppermill
name = "pepper mill"
@@ -97,6 +97,24 @@
bitesize = 3
list_reagents = list("nutriment" = 2)
/obj/item/reagent_containers/food/snacks/shrimp_skewer
name = "shrimp skewer"
desc = "Four shrimp lightly grilled on a skewer. Yummy!"
trash = /obj/item/stack/rods
icon = 'icons/obj/food/seafood.dmi'
icon_state = "shrimpskewer"
bitesize = 3
list_reagents = list("nutriment" = 8)
/obj/item/reagent_containers/food/snacks/fish_skewer
name = "fish skewer"
desc = "A whole fish battered and grilled on a skewer. Hope you're hungry!"
trash = /obj/item/stack/rods
icon = 'icons/obj/food/seafood.dmi'
icon_state = "fishskewer"
bitesize = 3
list_reagents = list("protein" = 6, "vitamin" = 4)
/obj/item/reagent_containers/food/snacks/sliceable/Ebi_maki
name = "ebi makiroll"
desc = "A large unsliced roll of Ebi Sushi."
@@ -24,6 +24,18 @@
idle_power_usage = 2
active_power_usage = 500
/obj/machinery/gibber/suicide_act(mob/user)
if(occupant || locked)
return FALSE
user.visible_message("<span class='danger'>[user] climbs into [src] and turns it on!</b></span>")
user.Stun(10)
user.forceMove(src)
occupant = user
update_icon()
feedinTopanim()
addtimer(CALLBACK(src, .proc/startgibbing, user), 33)
return OBLITERATION
/obj/machinery/gibber/Destroy()
if(contents.len)
for(var/atom/movable/A in contents)
@@ -145,7 +157,7 @@
set name = "Empty Gibber"
set src in oview(1)
if(usr.stat != CONSCIOUS)
if(usr.incapacitated())
return
go_out()
@@ -1,3 +1,5 @@
GLOBAL_LIST_EMPTY(monkey_recyclers)
/obj/machinery/monkey_recycler
name = "Monkey Recycler"
desc = "A machine used for recycling dead monkeys into monkey cubes."
@@ -14,6 +16,7 @@
var/cube_production = 1
var/cycle_through = 0
var/obj/item/reagent_containers/food/snacks/monkeycube/cube_type = /obj/item/reagent_containers/food/snacks/monkeycube
var/list/connected = list()
/obj/machinery/monkey_recycler/New()
..()
@@ -21,8 +24,15 @@
component_parts += new /obj/item/circuitboard/monkey_recycler(null)
component_parts += new /obj/item/stock_parts/manipulator(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
GLOB.monkey_recyclers += src
RefreshParts()
/obj/machinery/monkey_recycler/Destroy()
GLOB.monkey_recyclers -= src
for(var/obj/machinery/computer/camera_advanced/xenobio/console in connected)
console.connected_recycler = null
return ..()
/obj/machinery/monkey_recycler/RefreshParts()
var/req_grind = 5
var/cubes_made = 1
@@ -47,21 +57,25 @@
default_deconstruction_crowbar(O)
if(istype(O, /obj/item/multitool))
cycle_through++
switch(cycle_through)
if(1)
cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/farwacube
if(2)
cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/wolpincube
if(3)
cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/stokcube
if(4)
cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/neaeracube
if(5)
cube_type = /obj/item/reagent_containers/food/snacks/monkeycube
cycle_through = 0
to_chat(user, "<span class='notice'>You change the monkeycube type to [initial(cube_type.name)].</span>")
if(!panel_open)
cycle_through++
switch(cycle_through)
if(1)
cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/farwacube
if(2)
cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/wolpincube
if(3)
cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/stokcube
if(4)
cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/neaeracube
if(5)
cube_type = /obj/item/reagent_containers/food/snacks/monkeycube
cycle_through = 0
to_chat(user, "<span class='notice'>You change the monkeycube type to [initial(cube_type.name)].</span>")
else
var/obj/item/multitool/M = O
M.buffer = src
to_chat(user, "<span class='notice'>You log [src] in the [M]'s buffer.</span>")
if(stat != 0) //NOPOWER etc
return
if(istype(O, /obj/item/grab))
@@ -226,3 +226,22 @@
/obj/item/reagent_containers/food/snacks/catfishmeat,
)
result = /obj/item/reagent_containers/food/snacks/sushi_Tai
/datum/recipe/grill/shrimp_skewer
items = list(
/obj/item/reagent_containers/food/snacks/shrimp,
/obj/item/reagent_containers/food/snacks/shrimp,
/obj/item/reagent_containers/food/snacks/shrimp,
/obj/item/reagent_containers/food/snacks/shrimp,
/obj/item/stack/rods,
)
result = /obj/item/reagent_containers/food/snacks/shrimp_skewer
/datum/recipe/grill/fish_skewer
reagents = list("flour" = 10)
items = list(
/obj/item/reagent_containers/food/snacks/salmonmeat,
/obj/item/reagent_containers/food/snacks/salmonmeat,
/obj/item/stack/rods,
)
result = /obj/item/reagent_containers/food/snacks/fish_skewer
@@ -133,6 +133,13 @@
)
result = /obj/item/reagent_containers/food/snacks/baseballburger
/datum/recipe/microwave/cheeseburger
items = list(
/obj/item/reagent_containers/food/snacks/monkeyburger,
/obj/item/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/reagent_containers/food/snacks/cheeseburger
/datum/recipe/microwave/hotdog
items = list(
/obj/item/reagent_containers/food/snacks/bun,
+1
View File
@@ -478,4 +478,5 @@
update_icon()
/obj/item/cardhand/pickup(mob/user as mob)
. = ..()
update_icon()
+45 -26
View File
@@ -8,35 +8,36 @@
/mob/proc/bee_friendly()
return 0
return FALSE
/mob/living/simple_animal/hostile/poison/bees/bee_friendly()
return 1
return TRUE
/mob/living/simple_animal/bot/bee_friendly()
if(paicard)
return 0
return 1
return FALSE
return TRUE
/mob/living/simple_animal/diona/bee_friendly()
return 1
return TRUE
/mob/living/carbon/human/bee_friendly()
if(isdiona(src)) //bees pollinate plants, duh.
return 1
return TRUE
if((wear_suit && (wear_suit.flags & THICKMATERIAL)) && (head && (head.flags & THICKMATERIAL)))
return 1
return 0
return TRUE
return FALSE
/obj/structure/beebox
name = "apiary"
desc = "Dr Miles Manners is just your average Wasp themed super hero by day, but by night he becomes DR BEES!"
desc = "Dr. Miles Manners is just your average wasp-themed super hero by day, but by night he becomes DR. BEES!"
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "beebox"
anchored = 1
density = 1
anchored = TRUE
density = TRUE
max_integrity = 300
var/mob/living/simple_animal/hostile/poison/bees/queen/queen_bee = null
var/list/bees = list() //bees owned by the box, not those inside it
var/list/honeycombs = list()
@@ -44,8 +45,8 @@
var/bee_resources = 0
/obj/structure/beebox/New()
..()
/obj/structure/beebox/Initialize(mapload)
. = ..()
processing_objects.Add(src)
@@ -66,12 +67,11 @@
var/random_reagent = FALSE
/obj/structure/beebox/premade/New()
..()
/obj/structure/beebox/premade/Initialize(mapload)
. = ..()
var/datum/reagent/R = null
if(random_reagent)
R = get_random_reagent_id()
R = GLOB.chemical_reagents_list[get_random_reagent_id()]
queen_bee = new(src)
queen_bee.beehome = src
@@ -83,7 +83,7 @@
honey_frames += HF
for(var/i in 1 to get_max_bees())
var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src)
var/mob/living/simple_animal/hostile/poison/bees/B = new(src)
bees += B
B.beehome = src
B.assign_reagent(R)
@@ -93,7 +93,7 @@
/obj/structure/beebox/process()
if(queen_bee && (!queen_bee.beegent || !queen_bee.beegent.can_synth))
if(queen_bee)
if(bee_resources >= BEE_RESOURCE_HONEYCOMB_COST)
if(honeycombs.len < get_max_honeycomb())
bee_resources = max(bee_resources-BEE_RESOURCE_HONEYCOMB_COST, 0)
@@ -109,7 +109,7 @@
if((bee_resources >= BEE_RESOURCE_NEW_BEE_COST && prob(BEE_PROB_NEW_BEE)) || freebee)
if(!freebee)
bee_resources = max(bee_resources - BEE_RESOURCE_NEW_BEE_COST, 0)
var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src)
var/mob/living/simple_animal/hostile/poison/bees/B = new(get_turf(src))
B.beehome = src
B.assign_reagent(queen_bee.beegent)
bees += B
@@ -152,14 +152,16 @@
if(istype(I, /obj/item/honey_frame))
var/obj/item/honey_frame/HF = I
if(honey_frames.len < BEEBOX_MAX_FRAMES)
if(!user.unEquip(HF))
return
visible_message("<span class='notice'>[user] adds a frame to the apiary.</span>")
user.unEquip(HF)
HF.forceMove(src)
honey_frames += HF
else
to_chat(user, "<span class='warning'>There's no room for anymore frames in the apiary!</span>")
return
if(istype(I, /obj/item/wrench))
if(iswrench(I))
if(default_unfasten_wrench(user, I, time = 20))
return
@@ -169,25 +171,27 @@
return
var/obj/item/queen_bee/qb = I
user.unEquip(qb)
if(!qb.queen.beegent || (qb.queen.beegent && qb.queen.beegent.can_synth))
if(!user.unEquip(qb))
return
qb.queen.forceMove(src)
bees += qb.queen
queen_bee = qb.queen
qb.queen = null
else
visible_message("<span class='notice'>The [qb] refuses to settle down. Maybe it's something to do with its reagent?</span>")
return
if(queen_bee)
visible_message("<span class='notice'>[user] sets [qb] down inside the apiary, making it [user.p_their()] new home.</span>")
var/relocated = 0
for(var/b in bees)
var/mob/living/simple_animal/hostile/poison/bees/worker/B = b
var/mob/living/simple_animal/hostile/poison/bees/B = b
if(B.reagent_incompatible(queen_bee))
bees -= B
B.beehome = null
if(B.loc == src)
B.forceMove(get_turf(src))
B.forceMove(drop_location())
relocated++
if(relocated)
to_chat(user, "<span class='warning'>This queen has a different reagent to some of the bees who live here, those bees will not return to this apiary!</span>")
@@ -196,6 +200,8 @@
to_chat(user, "<span class='warning'>The queen bee disappeared! bees disappearing has been in the news lately...</span>")
qdel(qb)
return
return ..()
/obj/structure/beebox/attack_hand(mob/user)
@@ -208,7 +214,7 @@
if(B.isqueen)
continue
if(B.loc == src)
B.forceMove(get_turf(src))
B.forceMove(drop_location())
B.target = user
bees = TRUE
if(bees)
@@ -254,3 +260,16 @@
QB.forceMove(get_turf(src))
visible_message("<span class='notice'>[user] removes the queen from the apiary.</span>")
queen_bee = null
/obj/structure/beebox/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/wood(loc, 20)
for(var/mob/living/simple_animal/hostile/poison/bees/B in bees)
if(B.loc == src)
B.forceMove(drop_location())
for(var/obj/item/honey_frame/HF in honey_frames)
HF.forceMove(drop_location())
honey_frames -= HF
qdel(src)
/obj/structure/beebox/unwrenched
anchored = FALSE
+4 -4
View File
@@ -30,13 +30,13 @@
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
sleep(25)
if(!user)
return (OXYLOSS)
return OXYLOSS
user.say("BANG!")
sleep(25)
if(!user)
return (OXYLOSS)
return OXYLOSS
user.visible_message("<B>[user]</B> laughs so hard [user.p_they()] begin[user.p_s()] to suffocate!")
return (OXYLOSS)
return OXYLOSS
/obj/item/grown/bananapeel
seed = /obj/item/seeds/banana
@@ -52,7 +52,7 @@
/obj/item/grown/bananapeel/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is deliberately slipping on the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
playsound(loc, 'sound/misc/slip.ogg', 50, 1, -1)
return (BRUTELOSS)
return BRUTELOSS
// Mimana - invisible sprites are totally a feature!
+1 -1
View File
@@ -199,7 +199,7 @@
qdel(src)
/obj/item/grown/novaflower/pickup(mob/living/carbon/human/user)
..()
. = ..()
if(!user.gloves)
to_chat(user, "<span class='danger'>The [name] burns your bare hand!</span>")
user.adjustFireLoss(rand(1, 5))
+1 -1
View File
@@ -24,7 +24,7 @@
/obj/item/seeds/kudzu/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] swallows the pack of kudzu seeds! It looks like [user.p_theyre()] trying to commit suicide..</span>")
plant(user)
return (BRUTELOSS)
return BRUTELOSS
/obj/item/seeds/kudzu/proc/plant(mob/user)
if(istype(user.loc, /turf/space))
+1 -2
View File
@@ -151,5 +151,4 @@
/obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime()
icon_state = "cherry_bomb_lit"
playsound(src, 'sound/goonstation/misc/fuse.ogg', seed.potency, 0)
reagents.chem_temp = 1000 //Sets off the black powder
reagents.handle_reactions()
reagents.set_reagent_temp(1000) //Sets off the black powder
+8 -6
View File
@@ -45,22 +45,22 @@
/obj/item/grown/nettle/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is eating some of the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
return (BRUTELOSS|TOXLOSS)
return BRUTELOSS|TOXLOSS
/obj/item/grown/nettle/pickup(mob/living/user)
..()
if(!ishuman(user))
return 0
return TRUE
var/mob/living/carbon/human/H = user
if(H.gloves)
return 0
return TRUE
var/organ = ((H.hand ? "l_":"r_") + "arm")
var/obj/item/organ/external/affecting = H.get_organ(organ)
if(affecting)
if(affecting.receive_damage(0, force))
H.UpdateDamageIcon()
to_chat(H, "<span class='userdanger'>The nettle burns your bare hand!</span>")
return 1
return TRUE
@@ -95,8 +95,10 @@
force = round((5 + seed.potency / 2.5), 1)
/obj/item/grown/nettle/death/pickup(mob/living/carbon/user)
if(..())
if(prob(50))
. = ..()
if(. && ishuman(user)) // If the pickup succeeded and is humanoid
var/mob/living/carbon/human/H = user
if(!H.gloves && prob(50))
user.Paralyse(5)
to_chat(user, "<span class='userdanger'>You are stunned by the Deathnettle when you try picking it up!</span>")
+2 -1
View File
@@ -153,7 +153,8 @@
Burn()
processing_objects.Add(src)
/obj/structure/bonfire/fire_act(exposed_temperature, exposed_volume)
/obj/structure/bonfire/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
StartBurning()
/obj/structure/bonfire/Crossed(atom/movable/AM)
+4 -4
View File
@@ -34,7 +34,7 @@
/obj/item/reagent_containers/spray/weedspray/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is huffing the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
return (TOXLOSS)
return TOXLOSS
/obj/item/reagent_containers/spray/pestspray // -- Skie
desc = "It's some pest eliminator spray! <I>Do not inhale!</I>"
@@ -56,7 +56,7 @@
/obj/item/reagent_containers/spray/pestspray/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is huffing the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
return (TOXLOSS)
return TOXLOSS
/obj/item/cultivator
name = "cultivator"
@@ -91,7 +91,7 @@
/obj/item/hatchet/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is chopping at [user.p_them()]self with the [name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return (BRUTELOSS)
return BRUTELOSS
/obj/item/hatchet/unathiknife
name = "duelling knife"
@@ -126,7 +126,7 @@
if(affecting)
affecting.droplimb(1, DROPLIMB_SHARP)
playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1)
return (BRUTELOSS)
return BRUTELOSS
/obj/item/scythe/pre_attackby(atom/A, mob/living/user, params)
if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user))
+1 -4
View File
@@ -409,11 +409,8 @@
var/datum/effect_system/smoke_spread/chem/S = new
var/splat_location = get_turf(target)
var/smoke_amount = round(sqrt(G.seed.potency * 0.1), 1)
S.attach(splat_location)
S.set_up(G.reagents, 2, 0, splat_location)
S.set_up(G.reagents, splat_location)
S.start(smoke_amount)
if(G && G.reagents)
G.reagents.clear_reagents()
/datum/plant_gene/trait/plant_type // Parent type
name = "you shouldn't see this"
+4 -4
View File
@@ -132,13 +132,13 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi
if(D.hand)
if(istype(D.l_hand, /obj/item))
var/obj/item/I = D.l_hand
D.drop_item()
A.put_in_hands(I)
if(D.drop_item())
A.put_in_hands(I)
else
if(istype(D.r_hand, /obj/item))
var/obj/item/I = D.r_hand
D.drop_item()
A.put_in_hands(I)
if(D.drop_item())
A.put_in_hands(I)
D.visible_message("<span class='danger'>[A] has disarmed [D]!</span>", \
"<span class='userdanger'>[A] has disarmed [D]!</span>")
playsound(D, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+1 -1
View File
@@ -267,7 +267,7 @@
H.Weaken(4)
if(H.staminaloss && !H.sleeping)
var/total_health = (H.health - H.staminaloss)
if(total_health <= config.health_threshold_crit && !H.stat)
if(total_health <= HEALTH_THRESHOLD_CRIT && !H.stat)
H.visible_message("<span class='warning'>[user] delivers a heavy hit to [H]'s head, knocking [H.p_them()] out cold!</span>", \
"<span class='userdanger'>[user] knocks you unconscious!</span>")
H.SetSleeping(30)
+1 -1
View File
@@ -52,7 +52,7 @@
F.attackby(OB, AM)
return ..()
/obj/item/stack/ore/fire_act()
/obj/item/stack/ore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
if(isnull(refined_type))
return
+25 -13
View File
@@ -49,7 +49,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
T = get_turf(body) //Where is the body located?
attack_log = body.attack_log //preserve our attack logs by copying them to our ghost
var/mutable_appearance/MA = copy_appearance(body)
var/mutable_appearance/MA = copy_appearance(body)
if(body.mind && body.mind.name)
MA.name = body.mind.name
else if(body.real_name)
@@ -148,6 +148,8 @@ Works together with spawning an observer, noted above.
/mob/proc/ghostize(var/flags = GHOST_CAN_REENTER)
if(key)
if(player_logged) //if they have disconnected we want to remove their SSD overlay
overlays -= image('icons/effects/effects.dmi', icon_state = "zzz_glow")
if(GLOB.non_respawnable_keys[ckey])
flags &= ~GHOST_CAN_REENTER
var/mob/dead/observer/ghost = new(src, flags) //Transfer safety to observer spawning proc.
@@ -177,30 +179,44 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(P)
if(TOO_EARLY_TO_GHOST)
warningmsg = "It's too early in the shift to enter cryo"
// If it's not too early, we'll skip straight to ghosting out without penalty
else if(suiciding && TOO_EARLY_TO_GHOST)
warningmsg = "You have committed suicide too early in the round"
else if(stat != DEAD)
warningmsg = "You are alive"
if(isAI(src))
warningmsg = "You are a living AI! You should probably use OOC -> Wipe Core instead."
else if(GLOB.non_respawnable_keys[ckey])
warningmsg = "You have lost your right to respawn"
if(!warningmsg)
ghostize(1)
else
if(warningmsg)
var/response
var/alertmsg = "Are you -sure- you want to ghost?\n([warningmsg]. If you ghost now, you probably won't be able to rejoin the round! You can't change your mind, so choose wisely!)"
response = alert(src, alertmsg,"Are you sure you want to ghost?","Stay in body","Ghost")
if(response != "Ghost")
return //didn't want to ghost after-all
StartResting()
var/mob/dead/observer/ghost = ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
return
if(stat == CONSCIOUS)
if(!is_admin_level(z))
player_ghosted = 1
if(mind && mind.special_role)
message_admins("[key_name_admin(src)] has ghosted while alive, with special_role: [mind.special_role]")
if(warningmsg)
// Not respawnable
var/mob/dead/observer/ghost = ghostize(0) // 0 parameter stops them re-entering their body
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
else
// Respawnable
ghostize(1)
// If mob in morgue tray, update tray
var/obj/structure/morgue/Morgue = locate() in M.loc
if(istype(M.loc, /obj/structure/morgue))
Morgue = M.loc
if(Morgue)
Morgue.update()
// If mob in cryopod, despawn mob
if(P)
if(!P.control_computer)
P.find_control_computer(urgent=1)
@@ -208,7 +224,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
P.despawn_occupant()
return
/mob/dead/observer/Move(NewLoc, direct)
following = null
dir = direct
@@ -235,9 +250,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
..()
/mob/dead/observer/experience_pressure_difference()
return 0
/mob/dead/observer/can_use_hands() return 0
/mob/dead/observer/Stat()
+2 -2
View File
@@ -35,7 +35,7 @@
/mob/proc/put_in_l_hand(var/obj/item/W)
if(!put_in_hand_check(W))
return 0
if(!l_hand)
if(!l_hand && has_left_hand())
W.forceMove(src) //TODO: move to equipped?
l_hand = W
W.layer = 20 //TODO: move to equipped?
@@ -51,7 +51,7 @@
/mob/proc/put_in_r_hand(var/obj/item/W)
if(!put_in_hand_check(W))
return 0
if(!r_hand)
if(!r_hand && has_right_hand())
W.forceMove(src)
r_hand = W
W.layer = 20
+2 -2
View File
@@ -246,8 +246,8 @@
syllables = list("hs","zt","kr","st","sh")
/datum/language/diona/get_random_name()
var/new_name = "[pick(list("To Sleep Beneath", "Wind Over", "Embrace of", "Dreams of", "Witnessing", "To Walk Beneath", "Approaching the", "Glimmer of", "The Ripple of", "Colors of", "The Still of", "Silence of", "Gentle Breeze of", "Glistening Waters under", "Child of", "Blessed Plant-ling of", "Grass-Walker of", "Element of", "Spawn of"))]"
new_name += " [pick(list("the Void", "the Sky", "Encroaching Night", "Planetsong", "Starsong", "the Wandering Star", "the Empty Day", "Daybreak", "Nightfall", "the Rain", "the Stars", "the Waves", "Dusk", "Night", "the Wind", "the Summer Wind", "the Blazing Sun", "the Scorching Sun", "Eternal Fields", "the Soothing Plains", "the Undying Fiona", "Mother Nature's Bousum"))]"
var/new_name = "[pick(list("To Sleep Beneath", "Wind Over", "Embrace Of", "Dreams Of", "Witnessing", "To Walk Beneath", "Approaching The", "Glimmer Of", "The Ripple Of", "Colors Of", "The Still Of", "Silence Of", "Gentle Breeze Of", "Glistening Waters Under", "Child Of", "Blessed Plant-Ling Of", "Grass-Walker Of", "Element Of", "Spawn Of"))]"
new_name += " [pick(list("The Void", "The Sky", "Encroaching Night", "Planetsong", "Starsong", "The Wandering Star", "The Empty Day", "Daybreak", "Nightfall", "The Rain", "The Stars", "The Waves", "Dusk", "Night", "The Wind", "The Summer Wind", "The Blazing Sun", "The Scorching Sun", "Eternal Fields", "The Soothing Plains", "The Undying Fiona", "Mother Nature's Bousum"))]"
return new_name
/datum/language/trinary
+3 -4
View File
@@ -1,10 +1,9 @@
//NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick!
#define HUMAN_MAX_OXYLOSS 3 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it.
#define HUMAN_CRIT_MAX_OXYLOSS ( (tickerProcess.getLastTickerTimeDuration()) / 3) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 100HP to get through, so (1/3)*last_tick_duration per second. Breaths however only happen every 4 ticks.
//NOTE: Breathing happens once EVERY OTHER TICK.
#define HUMAN_MAX_OXYLOSS 5 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it.
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
#define HEAT_DAMAGE_LEVEL_3 10 //Amount of damage applied when your body temperature passes the 1000K point
#define HEAT_DAMAGE_LEVEL_3 5 //Amount of damage applied when your body temperature passes the 1000K point
#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point
#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point
@@ -46,13 +46,13 @@
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
SetSilence(0)
else //ALIVE. LIGHTS ARE ON
if(health < config.health_threshold_dead || !get_int_organ(/obj/item/organ/internal/brain))
if(health < HEALTH_THRESHOLD_DEAD && check_death_method() || !get_int_organ(/obj/item/organ/internal/brain))
death()
SetSilence(0)
return 1
//UNCONSCIOUS. NO-ONE IS HOME
if((getOxyLoss() > 50) || (config.health_threshold_crit >= health))
if((getOxyLoss() > 50) || (HEALTH_THRESHOLD_CRIT >= health && check_death_method()))
if(health <= 20 && prob(1))
emote("gasp")
if(!reagents.has_reagent("epinephrine"))
@@ -18,7 +18,7 @@
if(stat == DEAD)
//If we mostly took damage from fire
if(fireloss > 125)
if(getFireLoss() > 125)
icon_state = "alien[caste]_husked"
pixel_y = 0
else
@@ -93,6 +93,9 @@
/mob/living/carbon/alien/larva/show_inv(mob/user as mob)
return
/mob/living/carbon/alien/larva/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
return FALSE
/* Commented out because it's duplicated in life.dm
/mob/living/carbon/alien/larva/proc/grow() // Larvae can grow into full fledged Xenos if they survive long enough -- TLE
if(icon_state == "larva_l" && !canmove) // This is a shit death check. It is made of shit and death. Fix later.
@@ -19,7 +19,7 @@
return 1
//UNCONSCIOUS. NO-ONE IS HOME
if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) )
if((getOxyLoss() > 25) || (HEALTH_THRESHOLD_CRIT >= health && check_death_method()))
//if( health <= 20 && prob(1) )
// spawn(0)
// emote("gasp")
@@ -65,9 +65,9 @@ var/const/MAX_ACTIVE_TIME = 400
return
/obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
if(exposed_temperature > 300)
Die()
return
/obj/item/clothing/mask/facehugger/equipped(mob/M)
Attach(M)
+1 -1
View File
@@ -32,7 +32,7 @@
. = ..()
if(.)
if(!container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life)))
if(!container && (health < HEALTH_THRESHOLD_DEAD && check_death_method() || ((world.time - timeofhostdeath) > config.revival_brain_life)))
death()
return 0
@@ -161,7 +161,7 @@
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
to_chat(O, "<span class='warning'>You are job banned from this role.</span>")
return
to_chat(O., "<span class='notice'>You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.</span>")
to_chat(O, "<span class='notice'>You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.</span>")
ghost_volunteers.Add(O)
@@ -3,12 +3,12 @@
return
// if(health <= min_health)
if(stat == DEAD)
if(container && health > config.health_threshold_dead)
if(container && health > HEALTH_THRESHOLD_DEAD)
update_revive()
create_debug_log("revived, trigger reason: [reason]")
return
else
if(!container || health <= config.health_threshold_dead)
if(!container || health <= HEALTH_THRESHOLD_DEAD && check_death_method())
// Considered "dead" without any external apparatus
death()
create_debug_log("died, trigger reason: [reason]")
+5 -1
View File
@@ -209,7 +209,7 @@
/mob/living/carbon/proc/help_shake_act(mob/living/carbon/M)
add_attack_logs(M, src, "Shaked", ATKLOG_ALL)
if(health >= config.health_threshold_crit)
if(health >= HEALTH_THRESHOLD_CRIT)
if(src == M && ishuman(src))
var/mob/living/carbon/human/H = src
visible_message( \
@@ -442,6 +442,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(!do_after(src, 45, target = src))
return
if(buckled)
to_chat(src, "<span class='warning'>You cannot crawl into a vent while buckled to something!</span>")
return
if(!client)
return
@@ -22,9 +22,8 @@
var/wetlevel = 0 //how wet the mob is
var/failed_last_breath = FALSE //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/co2overloadtime = null
var/dreaming = 0 //How many dream images we have left to send
var/nightmare = 0
blood_volume = BLOOD_VOLUME_NORMAL
blood_volume = BLOOD_VOLUME_NORMAL
+18 -30
View File
@@ -4,22 +4,15 @@
if(!iscarbon(target)) //something is bypassing the give arguments, no clue what, adding a sanity check JIC
to_chat(usr, "<span class='danger'>Wait a second... \the [target] HAS NO HANDS! AHH!</span>")//cheesy messages ftw
return
if(target.incapacitated() || usr.incapacitated() || target.client == null)
return
if(target.stat == 2 || usr.stat == 2|| target.client == null)
return
var/obj/item/I
if(!usr.hand && usr.r_hand == null)
to_chat(usr, "<span class='warning'> You don't have anything in your right hand to give to [target.name]</span>")
return
if(usr.hand && usr.l_hand == null)
to_chat(usr, "<span class='warning'> You don't have anything in your left hand to give to [target.name]</span>")
return
if(usr.hand)
I = usr.l_hand
else if(!usr.hand)
I = usr.r_hand
var/obj/item/I = get_active_hand()
if(!I)
to_chat(usr, "<span class='warning'> You don't have anything in your hand to give to [target.name]</span>")
return
if((I.flags & NODROP) || (I.flags & ABSTRACT))
to_chat(usr, "<span class='notice'>That's not exactly something you can give.</span>")
@@ -29,35 +22,30 @@
if("Yes")
if(!I)
return
if(target.incapacitated() || usr.incapacitated())
return
if(!Adjacent(target))
to_chat(usr, "<span class='warning'> You need to stay in reaching distance while giving an object.</span>")
to_chat(target, "<span class='warning'> [usr.name] moved too far away.</span>")
return
if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I))
if((I.flags & NODROP) || (I.flags & ABSTRACT))
to_chat(usr, "<span class='warning'>[I] stays stuck to your hand when you try to give it!</span>")
to_chat(target, "<span class='warning'>[I] stays stuck to [usr.name]'s hand when you try to take it!</span>")
return
if(I != get_active_hand())
to_chat(usr, "<span class='warning'> You need to keep the item in your active hand.</span>")
to_chat(target, "<span class='warning'> [usr.name] seem to have given up on giving \the [I.name] to you.</span>")
to_chat(target, "<span class='warning'> [usr.name] seem to have given up on giving [I] to you.</span>")
return
if(target.r_hand != null && target.l_hand != null)
to_chat(target, "<span class='warning'> Your hands are full.</span>")
to_chat(usr, "<span class='warning'> Their hands are full.</span>")
return
else
usr.drop_item()
if(target.r_hand == null)
target.r_hand = I
else
target.l_hand = I
I.loc = target
I.layer = 20
I.plane = HUD_PLANE
usr.unEquip(I)
target.put_in_hands(I)
I.add_fingerprint(target)
src.update_inv_l_hand()
src.update_inv_r_hand()
target.update_inv_l_hand()
target.update_inv_r_hand()
target.visible_message("<span class='notice'> [usr.name] handed \the [I.name] to [target.name].</span>")
target.visible_message("<span class='notice'> [usr.name] handed [I] to [target.name].</span>")
I.on_give(usr, target)
if("No")
target.visible_message("<span class='warning'> [usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.</span>")
target.visible_message("<span class='warning'> [usr.name] tried to hand [I] to [target.name] but [target.name] didn't want it.</span>")
else
to_chat(usr, "<span class='warning'> [target.name]'s hands are full.</span>")
@@ -680,6 +680,14 @@
message = "<B>[src]</B> trembles."
m_type = 1
if("shudder", "shudders")
message = "<B>[src]</B> shudders."
m_type = 1
if("bshake", "bshakes")
message = "<B>[src]</B> shakes."
m_type = 1
if("sneeze", "sneezes")
if(miming)
message = "<B>[src]</B> sneezes."
@@ -363,7 +363,7 @@
for(var/datum/data/record/R in data_core.security)
if(R.fields["id"] == E.fields["id"])
criminal = R.fields["criminal"]
var/criminal_status = hasHUD(user, "read_only_security") ? "\[[criminal]\]" : "<a href='?src=[UID()];criminal=[glasses]'>\[[criminal]\]</a>"
var/criminal_status = hasHUD(user, "read_only_security") ? "\[[criminal]\]" : "<a href='?src=[UID()];criminal=1'>\[[criminal]\]</a>"
msg += "<span class = 'deptradio'>Criminal status:</span> [criminal_status]\n"
msg += "<span class = 'deptradio'>Security records:</span> <a href='?src=[UID()];secrecord=`'>\[View\]</a> <a href='?src=[UID()];secrecordadd=`'>\[Add comment\]</a>\n"
+20 -13
View File
@@ -1651,6 +1651,9 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
..()
/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/human/H)
if(H == src)
to_chat(src, "<span class='warning'>You cannot perform CPR on yourself!</span>")
return
if(H.stat == DEAD || (H.status_flags & FAKEDEATH))
to_chat(src, "<span class='warning'>[H.name] is dead!</span>")
return
@@ -1662,25 +1665,29 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
return
if((head && (head.flags_cover & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && !wear_mask.mask_adjusted))
to_chat(src, "<span class='warning'>Remove your mask first!</span>")
return 0
return
if((H.head && (H.head.flags_cover & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags_cover & MASKCOVERSMOUTH) && !H.wear_mask.mask_adjusted))
to_chat(src, "<span class='warning'>Remove [H.p_their()] mask first!</span>")
return 0
visible_message("<span class='danger'>[src] is trying to perform CPR on [H.name]!</span>", \
"<span class='danger'>You try to perform CPR on [H.name]!</span>")
return
if(H.receiving_cpr) // To prevent spam stacking
to_chat(src, "<span class='warning'>They are already receiving CPR!</span>")
return
visible_message("<span class='danger'>[src] is trying to perform CPR on [H.name]!</span>", "<span class='danger'>You try to perform CPR on [H.name]!</span>")
H.receiving_cpr = TRUE
if(do_mob(src, H, 40))
if(H.health > config.health_threshold_dead && H.health <= config.health_threshold_crit)
var/suff = min(H.getOxyLoss(), 7)
H.adjustOxyLoss(-suff)
if(H.health <= HEALTH_THRESHOLD_CRIT)
H.adjustOxyLoss(-15)
H.SetLoseBreath(0)
H.AdjustParalysis(-1)
H.updatehealth("cpr")
visible_message("<span class='danger'>[src] performs CPR on [H.name]!</span>", \
"<span class='notice'>You perform CPR on [H.name].</span>")
visible_message("<span class='danger'>[src] performs CPR on [H.name]!</span>", "<span class='notice'>You perform CPR on [H.name].</span>")
to_chat(H, "<span class='notice'>You feel a breath of fresh air enter your lungs. It feels good.</span>")
to_chat(src, "<span class='alert'>Repeat at least every 7 seconds.")
H.receiving_cpr = FALSE
add_attack_logs(src, H, "CPRed", ATKLOG_ALL)
return 1
return TRUE
else
H.receiving_cpr = FALSE
to_chat(src, "<span class='danger'>You need to stay still while performing CPR!</span>")
/mob/living/carbon/human/canBeHandcuffed()
@@ -1696,7 +1703,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
return FALSE
/mob/living/carbon/human/InCritical()
return (health <= config.health_threshold_crit && stat == UNCONSCIOUS)
return (health <= HEALTH_THRESHOLD_CRIT && stat == UNCONSCIOUS)
/mob/living/carbon/human/IsAdvancedToolUser()
@@ -2000,4 +2007,4 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
var/obj/item/organ/internal/lantern/O = get_int_organ(/obj/item/organ/internal/lantern)
if(O && O.glowing)
O.toggle_biolum(TRUE)
visible_message("<span class='danger'>[src] is engulfed in shadows and fades into the darkness.</span>", "<span class='danger'>A sense of dread washes over you as you suddenly dim dark.</span>")
visible_message("<span class='danger'>[src] is engulfed in shadows and fades into the darkness.</span>", "<span class='danger'>A sense of dread washes over you as you suddenly dim dark.</span>")
@@ -15,7 +15,7 @@
health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
//TODO: fix husking
if(((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD)
if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD)
ChangeToHusk()
update_stat("updatehealth([reason])")
med_hud_set_health()
@@ -171,11 +171,17 @@
// Defined here solely to take species flags into account without having to recast at mob/living level.
/mob/living/carbon/human/adjustOxyLoss(amount)
if(NO_BREATHE in dna.species.species_traits)
oxyloss = 0
return FALSE
if(dna.species && amount > 0)
amount = amount * dna.species.oxy_mod
. = ..()
/mob/living/carbon/human/setOxyLoss(amount)
if(NO_BREATHE in dna.species.species_traits)
oxyloss = 0
return FALSE
if(dna.species && amount > 0)
amount = amount * dna.species.oxy_mod
. = ..()
@@ -513,3 +513,12 @@ emp_act
return TRUE
if(check_mask && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH))
return TRUE
/mob/living/carbon/human/proc/reagent_safety_check(hot = TRUE)
if(wear_mask)
to_chat(src, "<span class='danger'>Your [wear_mask.name] protects you from the [hot ? "hot" : "cold"] liquid!</span>")
return FALSE
if(head)
to_chat(src, "<span class='danger'>Your [head.name] protects you from the [hot ? "hot" : "cold"] liquid!</span>")
return FALSE
return TRUE
@@ -64,6 +64,7 @@ var/global/default_martial_art = new/datum/martial_art
var/check_mutations=0 // Check mutations on next life tick
var/heartbeat = 0
var/receiving_cpr = FALSE
var/fire_dmi = 'icons/mob/OnFire.dmi'
var/fire_sprite = "Standing"
@@ -434,11 +434,11 @@
if(slot_l_hand)
if(l_hand)
return 0
return 1
return !incapacitated()
if(slot_r_hand)
if(r_hand)
return 0
return 1
return !incapacitated()
if(slot_wear_mask)
if(wear_mask)
return 0
+90 -25
View File
@@ -10,10 +10,8 @@
update_mutations()
check_mutations=0
handle_shock()
handle_pain()
handle_heartbeat()
handle_heartattack()
handle_drunk()
dna.species.handle_life(src)
@@ -39,6 +37,17 @@
if(life_tick == 1)
regenerate_icons() // Make sure the inventory updates
handle_ghosted()
/mob/living/carbon/human/proc/handle_ghosted()
if(player_ghosted > 0 && stat == CONSCIOUS && job && !restrained())
if(key)
player_ghosted = 0
else
player_ghosted++
if(player_ghosted % 150 == 0)
force_cryo_human(src)
/mob/living/carbon/human/calculate_affecting_pressure(var/pressure)
..()
var/pressure_difference = abs( pressure - ONE_ATMOSPHERE )
@@ -141,15 +150,6 @@
if(3)
emote("drool")
if(getBrainLoss() >= 100 && stat != DEAD) //you lapse into a coma and die without immediate aid; RIP. -Fox
Weaken(20)
AdjustLoseBreath(10)
AdjustSilence(2)
if(getBrainLoss() >= 120 && stat != DEAD) //they died from stupidity--literally. -Fox
visible_message("<span class='alert'><B>[src]</B> goes limp, [p_their()] facial expression utterly blank.</span>")
death()
/mob/living/carbon/human/handle_mutations_and_radiation()
for(var/datum/dna/gene/gene in dna_genes)
if(!gene.block)
@@ -242,12 +242,10 @@
var/obj/item/organ/internal/L = get_organ_slot("lungs")
if(!L || L && (L.status & ORGAN_DEAD))
if(health >= config.health_threshold_crit)
if(health >= HEALTH_THRESHOLD_CRIT)
adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1)
else if(!(NOCRITDAMAGE in dna.species.species_traits))
adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
failed_last_breath = TRUE
adjustOxyLoss(HUMAN_MAX_OXYLOSS)
if(dna.species)
var/datum/species/S = dna.species
@@ -270,7 +268,7 @@
// USED IN DEATHWHISPERS
/mob/living/carbon/human/proc/isInCrit()
// Health is in deep shit and we're not already dead
return health <= 0 && stat != 2
return health <= HEALTH_THRESHOLD_CRIT && stat != DEAD
/mob/living/carbon/human/get_breath_from_internal(volume_needed) //making this call the parent would be far too complicated
@@ -791,6 +789,70 @@
handle_organs()
if(getBrainLoss() >= 120 || (health + (getOxyLoss() / 2)) <= -500)
visible_message("<span class='alert'><B>[src]</B> goes limp, their facial expression utterly blank.</span>")
death()
return
if(getBrainLoss() >= 100) // braindeath
AdjustLoseBreath(10, bound_lower = 0, bound_upper = 25)
Weaken(30)
if(!check_death_method())
if(health <= HEALTH_THRESHOLD_DEAD)
var/deathchance = min(99, ((getBrainLoss() * -5) + (health + (getOxyLoss() / 2))) * -0.01)
if(prob(deathchance))
death()
return
if(health <= HEALTH_THRESHOLD_CRIT)
if(prob(5))
emote(pick("faint", "collapse", "cry", "moan", "gasp", "shudder", "shiver"))
AdjustStuttering(5, bound_lower = 0, bound_upper = 5)
EyeBlurry(5)
if(prob(7))
AdjustConfused(2)
if(prob(5))
Paralyse(2)
switch(health)
if(-INFINITY to -100)
adjustOxyLoss(1)
if(prob(health * -0.1))
if(ishuman(src))
var/mob/living/carbon/human/H = src
H.set_heartattack(TRUE)
if(prob(health * -0.2))
var/datum/disease/D = new /datum/disease/critical/heart_failure
ForceContractDisease(D)
Paralyse(5)
if(-99 to -80)
adjustOxyLoss(1)
if(prob(4))
to_chat(src, "<span class='userdanger'>Your chest hurts...</span>")
Paralyse(2)
var/datum/disease/D = new /datum/disease/critical/heart_failure
ForceContractDisease(D)
if(-79 to -50)
adjustOxyLoss(1)
if(prob(10))
var/datum/disease/D = new /datum/disease/critical/shock
ForceContractDisease(D)
if(prob(health * -0.08))
var/datum/disease/D = new /datum/disease/critical/heart_failure
ForceContractDisease(D)
if(prob(6))
to_chat(src, "<span class='userdanger'>You feel [pick("horrible pain", "awful", "like shit", "absolutely awful", "like death", "like you are dying", "nothing", "warm", "sweaty", "tingly", "really, really bad", "horrible")]!</span>")
Weaken(3)
if(prob(3))
Paralyse(2)
if(-49 to 0)
adjustOxyLoss(1)
if(prob(3))
var/datum/disease/D = new /datum/disease/critical/shock
ForceContractDisease(D)
if(prob(5))
to_chat(src, "<span class='userdanger'>You feel [pick("terrible", "awful", "like shit", "sick", "numb", "cold", "sweaty", "tingly", "horrible")]!</span>")
Weaken(3)
else //dead
SetSilence(0)
@@ -962,7 +1024,7 @@
return
if(H.is_robotic()) //Handle robotic hearts specially with a wuuuubb. This also applies to machine-people.
if(shock_stage >= 10 || istype(get_turf(src), /turf/space))
if(isinspace())
//PULSE_THREADY - maximum value for pulse, currently it 5.
//High pulse value corresponds to a fast rate of heartbeat.
//Divided by 2, otherwise it is too slow.
@@ -980,7 +1042,7 @@
if(pulse == PULSE_NONE)
return
if(pulse >= PULSE_2FAST || shock_stage >= 10 || istype(get_turf(src), /turf/space))
if(pulse >= PULSE_2FAST || isinspace())
//PULSE_THREADY - maximum value for pulse, currently it 5.
//High pulse value corresponds to a fast rate of heartbeat.
//Divided by 2, otherwise it is too slow.
@@ -999,7 +1061,7 @@
*/
/mob/living/carbon/human/proc/can_heartattack()
if(NO_BLOOD in dna.species.species_traits)
if((NO_BLOOD in dna.species.species_traits) && !dna.species.forced_heartattack)
return FALSE
if(NO_INTORGANS in dna.species.species_traits)
return FALSE
@@ -1026,16 +1088,19 @@
heart.beating = !status
/mob/living/carbon/human/proc/handle_heartattack()
/mob/living/carbon/human/handle_heartattack()
if(!can_heartattack() || !undergoing_cardiac_arrest() || reagents.has_reagent("corazone"))
return
AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
adjustOxyLoss(5)
Paralyse(4)
adjustBruteLoss(2)
if(getOxyLoss())
adjustBrainLoss(3)
else if(prob(10))
adjustBrainLoss(1)
Weaken(5)
AdjustLoseBreath(20, bound_lower = 0, bound_upper = 25)
adjustOxyLoss(20)
// Need this in species.
//#undef HUMAN_MAX_OXYLOSS
//#undef HUMAN_CRIT_MAX_OXYLOSS
//#undef HUMAN_CRIT_MAX_OXYLOSS
@@ -1,4 +1,6 @@
/mob/living/carbon/human/Login()
if(player_logged)
overlays -= image('icons/effects/effects.dmi', icon_state = "zzz_glow")
..()
if(dna.species && dna.species.ventcrawler)
@@ -0,0 +1,4 @@
/mob/living/carbon/human/Logout()
..()
if(mind && mind.active && stat != DEAD)
overlays += image('icons/effects/effects.dmi', icon_state = "zzz_glow")
+1 -1
View File
@@ -91,7 +91,7 @@
var/obj/item/organ/internal/L = get_organ_slot("lungs")
if((breathes && !L) || breathes && L && (L.status & ORGAN_DEAD))
return FALSE
if(oxyloss > 10 || losebreath >= 4)
if(getOxyLoss() > 10 || losebreath >= 4)
emote("gasp")
return FALSE
if(mind)
@@ -1,75 +0,0 @@
/mob/living/carbon/human/var/traumatic_shock = 0
/mob/living/carbon/human/var/shock_stage = 0
// proc to find out in how much pain the mob is at the moment
/mob/living/carbon/human/proc/updateshock()
traumatic_shock = getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()
// broken or ripped off organs will add quite a bit of pain
for(var/thing in bodyparts)
var/obj/item/organ/external/BP = thing
if(BP.status & ORGAN_BROKEN && !(BP.status & ORGAN_SPLINTED) || BP.open)
traumatic_shock += 15
if(reagents)
for(var/datum/reagent/R in reagents.reagent_list)
if(R.shock_reduction)
traumatic_shock = max(0, traumatic_shock - R.shock_reduction) // now you too can varedit cyanide to reduce shock by 1000 - Iamgoofball
if(drunk)
traumatic_shock = max(0, traumatic_shock - 10)
return traumatic_shock
/mob/living/carbon/human/proc/handle_shock()
if(status_flags & GODMODE) //godmode
return
if(NO_PAIN in dna.species.species_traits)
return
updateshock()
if(health <= config.health_threshold_softcrit)// health 0 makes you immediately collapse
shock_stage = max(shock_stage, 61)
if(traumatic_shock >= 100)
shock_stage += 1
else
shock_stage = min(shock_stage, 160)
shock_stage = max(shock_stage-1, 0)
return
if(shock_stage == 10)
to_chat(src, "<font color='red'><b>"+pick("It hurts so much!", "You really need some painkillers..", "Dear god, the pain!"))
if(shock_stage >= 30)
if(shock_stage == 30)
custom_emote(1,"is having trouble keeping [p_their()] eyes open.")
EyeBlurry(2)
Stuttering(5)
if(shock_stage == 40)
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
if(shock_stage >=60)
if(shock_stage == 60)
custom_emote(1,"falls limp.")
if(prob(2))
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
Weaken(20)
if(shock_stage >= 80)
if(prob(5))
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
Weaken(20)
if(shock_stage >= 120)
if(prob(2))
to_chat(src, "<font color='red'><b>"+pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness."))
Paralyse(5)
if(shock_stage == 150)
custom_emote(1,"can no longer stand, collapsing!")
Weaken(20)
if(shock_stage >= 150)
Weaken(20)
@@ -91,6 +91,8 @@
var/is_small
var/show_ssd = 1
var/forced_heartattack = FALSE //Some species have blood, but we still want them to have heart attacks
var/dies_at_threshold = FALSE // Do they die or get knocked out at specific thresholds, or do they go through complex crit?
var/can_revive_by_healing // Determines whether or not this species can be revived by simply healing them
var/has_gender = TRUE
var/blacklisted = FALSE
@@ -255,8 +257,6 @@
. += (health_deficiency / 75)
else
. += (health_deficiency / 25)
if(H.shock_stage >= 10)
. += 3
. += 2 * H.stance_damage //damaged/missing feet or legs is slow
if((hungry >= 70) && !flight)
@@ -298,11 +298,8 @@
// (Slime People changing color based on the reagents they consume)
/datum/species/proc/handle_life(mob/living/carbon/human/H)
if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations))
H.setOxyLoss(0)
H.SetLoseBreath(0)
var/takes_crit_damage = (!(NOCRITDAMAGE in species_traits))
if((H.health <= config.health_threshold_crit) && takes_crit_damage)
if((H.health <= HEALTH_THRESHOLD_CRIT) && takes_crit_damage)
H.adjustBruteLoss(1)
return
@@ -315,7 +312,7 @@
/datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(attacker_style && attacker_style.help_act(user, target))//adminfu only...
return TRUE
if(target.health >= config.health_threshold_crit && !(target.status_flags & FAKEDEATH))
if(target.health >= HEALTH_THRESHOLD_CRIT && !(target.status_flags & FAKEDEATH))
target.help_shake_act(user)
return TRUE
else
@@ -539,7 +536,7 @@
return FALSE
/datum/species/proc/get_perceived_trauma(mob/living/carbon/human/H)
return 100 - ((NO_PAIN in species_traits) ? 0 : H.traumatic_shock) - H.getStaminaLoss()
return H.health - H.getStaminaLoss()
/datum/species/proc/handle_hud_icons(mob/living/carbon/human/H)
if(!H.client)
@@ -16,8 +16,7 @@
)
species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS, NO_EXAMINE)
oxy_mod = 0
dies_at_threshold = TRUE
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
dietflags = DIET_OMNI
@@ -32,6 +32,7 @@
water and other radiation."
species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN)
dies_at_threshold = TRUE
clothing_flags = HAS_SOCKS
default_hair_colour = "#000000"
has_gender = FALSE
@@ -39,8 +40,6 @@
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
skinned_type = /obj/item/stack/sheet/wood
oxy_mod = 0
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
blood_color = "#004400"
flesh_color = "#907E4A"
@@ -6,10 +6,10 @@
deform = 'icons/mob/human_races/r_golem.dmi'
species_traits = list(NO_BREATHE, NO_BLOOD, NO_PAIN, RADIMMUNE, VIRUSIMMUNE, NOGUNS)
dies_at_threshold = TRUE
brute_mod = 0.45 //55% damage reduction
burn_mod = 0.45
tox_mod = 0.45
oxy_mod = 0
dietflags = DIET_OMNI //golems can eat anything because they are magic or something
reagent_tag = PROCESS_ORG
@@ -163,6 +163,8 @@
if(H.bodytemperature > 850 && H.on_fire && prob(25))
explosion(get_turf(H), 1, 2, 4, flame_range = 5)
msg_admin_attack("Plasma Golem ([H.name]) exploded with radius 1, 2, 4 (flame_range: 5) at ([H.x],[H.y],[H.z]). User Ckey: [key_name_admin(H)]", ATKLOG_FEW)
log_game("Plasma Golem ([H.name]) exploded with radius 1, 2, 4 (flame_range: 5) at ([H.x],[H.y],[H.z]). User Ckey: [key_name_admin(H)]", ATKLOG_FEW)
if(H)
H.gib()
if(H.fire_stacks < 2) //flammable
@@ -533,23 +535,26 @@
check_flags = AB_CHECK_CONSCIOUS
button_icon_state = "blink"
icon_icon = 'icons/mob/actions/actions.dmi'
var/activated = FALSE // To prevent spamming
var/cooldown = 150
var/last_teleport = 0
var/tele_range = 6
/datum/action/innate/unstable_teleport/IsAvailable()
if(..())
if(world.time > last_teleport + cooldown)
if(world.time > last_teleport + cooldown && !activated)
return 1
return 0
/datum/action/innate/unstable_teleport/Activate()
activated = TRUE
var/mob/living/carbon/human/H = owner
H.visible_message("<span class='warning'>[H] starts vibrating!</span>", "<span class='danger'>You start charging your bluespace core...</span>")
playsound(get_turf(H), 'sound/weapons/flash.ogg', 25, 1)
addtimer(CALLBACK(src, .proc/teleport, H), 15)
/datum/action/innate/unstable_teleport/proc/teleport(mob/living/carbon/human/H)
activated = FALSE
H.visible_message("<span class='warning'>[H] teleports!</span>", "<span class='danger'>You teleport!</span>")
var/list/turfs = new/list()
for(var/turf/T in orange(tele_range, H))
@@ -8,10 +8,10 @@
butt_sprite = "grey"
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"heart" = /obj/item/organ/internal/heart/grey,
"lungs" = /obj/item/organ/internal/lungs/grey,
"liver" = /obj/item/organ/internal/liver/grey,
"kidneys" = /obj/item/organ/internal/kidneys,
"kidneys" = /obj/item/organ/internal/kidneys/grey,
"brain" = /obj/item/organ/internal/brain/grey,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes/grey //5 darksight.
@@ -20,13 +20,13 @@
butt_sprite = "kidan"
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"heart" = /obj/item/organ/internal/heart/kidan,
"lungs" = /obj/item/organ/internal/lungs/kidan,
"liver" = /obj/item/organ/internal/liver/kidan,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"kidneys" = /obj/item/organ/internal/kidneys/kidan,
"brain" = /obj/item/organ/internal/brain/kidan,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
"eyes" = /obj/item/organ/internal/eyes/kidan, //Default darksight of 2.
"lantern" = /obj/item/organ/internal/lantern
)
@@ -19,7 +19,6 @@
burn_mod = 2.28 // So they take 50% extra damage from brute/burn overall
tox_mod = 0
clone_mod = 0
oxy_mod = 0
death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..."
species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_INTORGANS, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING)
@@ -36,6 +35,7 @@
//Default styles for created mobs.
default_hair = "Blue IPC Screen"
dies_at_threshold = TRUE
can_revive_by_healing = 1
has_gender = FALSE
reagent_tag = PROCESS_SYN
@@ -108,11 +108,11 @@
tail = "farwatail"
reagent_tag = PROCESS_ORG
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"heart" = /obj/item/organ/internal/heart/tajaran,
"lungs" = /obj/item/organ/internal/lungs/tajaran,
"liver" = /obj/item/organ/internal/liver/tajaran,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"kidneys" = /obj/item/organ/internal/kidneys/tajaran,
"brain" = /obj/item/organ/internal/brain/tajaran,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes/tajaran/farwa //Tajara monkey-forms are uniquely colourblind and have excellent darksight, which is why they need a subtype of their greater-form's organ..
)
@@ -132,11 +132,11 @@
tail = "wolpintail"
reagent_tag = PROCESS_ORG
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"heart" = /obj/item/organ/internal/heart/vulpkanin,
"lungs" = /obj/item/organ/internal/lungs/vulpkanin,
"liver" = /obj/item/organ/internal/liver/vulpkanin,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"kidneys" = /obj/item/organ/internal/kidneys/vulpkanin,
"brain" = /obj/item/organ/internal/brain/vulpkanin,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes/vulpkanin/wolpin //Vulpkanin monkey-forms are uniquely colourblind and have excellent darksight, which is why they need a subtype of their greater-form's organ..
)
@@ -156,6 +156,16 @@
reagent_tag = PROCESS_ORG
tail = null
has_organ = list(
"heart" = /obj/item/organ/internal/heart/skrell,
"lungs" = /obj/item/organ/internal/lungs/skrell,
"liver" = /obj/item/organ/internal/liver/skrell,
"kidneys" = /obj/item/organ/internal/kidneys/skrell,
"brain" = /obj/item/organ/internal/brain/skrell,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes/skrell //Tajara monkey-forms are uniquely colourblind and have excellent darksight, which is why they need a subtype of their greater-form's organ..
)
/datum/species/monkey/unathi
name = "Stok"
name_plural = "Stok"
@@ -171,3 +181,13 @@
reagent_tag = PROCESS_ORG
bodyflags = HAS_TAIL
has_organ = list(
"heart" = /obj/item/organ/internal/heart/unathi,
"lungs" = /obj/item/organ/internal/lungs/unathi,
"liver" = /obj/item/organ/internal/liver/unathi,
"kidneys" = /obj/item/organ/internal/kidneys/unathi,
"brain" = /obj/item/organ/internal/brain/unathi,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes/unathi
)
@@ -13,8 +13,8 @@
language = "Sol Common"
burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores
brute_mod = 2 // damn, double wham, double dam
oxy_mod = 0
species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_BLOOD, NO_PAIN, NO_SCAN, RADIMMUNE)
dies_at_threshold = TRUE
dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet
//Default styles for created mobs.
@@ -7,6 +7,7 @@
//language = "Clatter"
species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING)
forced_heartattack = TRUE // Plasmamen have no blood, but they should still get heart-attacks
skinned_type = /obj/item/stack/sheet/mineral/plasma // We're low on plasma, R&D! *eyes plasmaman co-worker intently*
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
@@ -30,13 +31,13 @@
"shows their true colors, which happens to be the color of plasma!")
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"heart" = /obj/item/organ/internal/heart/plasmaman,
"lungs" = /obj/item/organ/internal/lungs/plasmaman,
"liver" = /obj/item/organ/internal/liver,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"liver" = /obj/item/organ/internal/liver/plasmaman,
"kidneys" = /obj/item/organ/internal/kidneys/plasmaman,
"brain" = /obj/item/organ/internal/brain/plasmaman,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes
"eyes" = /obj/item/organ/internal/eyes/plasmaman
)
speciesbox = /obj/item/storage/box/survival_plasmaman
@@ -18,8 +18,7 @@
)
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE)
oxy_mod = 0
dies_at_threshold = TRUE
dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race
reagent_tag = PROCESS_ORG
@@ -11,7 +11,6 @@
species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS, NO_EXAMINE) //Can't use guns due to muzzle flash
burn_mod = 1.5 //1.5x burn damage, 2x is excessive
oxy_mod = 0
heatmod = 1.5
silent_steps = 1
@@ -63,7 +62,6 @@
species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NO_EXAMINE)
burn_mod = 1.1
oxy_mod = 0
heatmod = 1.1
/datum/species/shadow/ling/lesser/handle_life(mob/living/carbon/human/H)
@@ -11,10 +11,9 @@
flesh_color = "#E6E6C6"
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE)
dies_at_threshold = TRUE
skinned_type = /obj/item/stack/sheet/bone
oxy_mod = 0
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
@@ -28,13 +28,13 @@
butt_sprite = "skrell"
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"heart" = /obj/item/organ/internal/heart/skrell,
"lungs" = /obj/item/organ/internal/lungs/skrell,
"liver" = /obj/item/organ/internal/liver/skrell,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"kidneys" = /obj/item/organ/internal/kidneys/skrell,
"brain" = /obj/item/organ/internal/brain/skrell,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
"eyes" = /obj/item/organ/internal/eyes/skrell, //Default darksight of 2.
"headpocket" = /obj/item/organ/internal/headpocket
)
@@ -20,13 +20,13 @@
cold_level_3 = 200
coldmod = 3
oxy_mod = 0
brain_mod = 2.5
male_cough_sounds = list('sound/effects/slime_squish.ogg')
female_cough_sounds = list('sound/effects/slime_squish.ogg')
species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_INTORGANS, NO_SCAN)
dies_at_threshold = TRUE
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | NO_EYES
dietflags = DIET_CARN
@@ -83,7 +83,7 @@
H.update_body()
..()
/datum/species/slime/can_hear() // fucking snowflakes
/datum/species/slime/can_hear() // fucking snowflakes
. = TRUE
/datum/action/innate/slimecolor
@@ -30,16 +30,17 @@
dietflags = DIET_OMNI
taste_sensitivity = TASTE_SENSITIVITY_SHARP
reagent_tag = PROCESS_ORG
flesh_color = "#AFA59E"
base_color = "#424242"
butt_sprite = "tajaran"
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"heart" = /obj/item/organ/internal/heart/tajaran,
"lungs" = /obj/item/organ/internal/lungs/tajaran,
"liver" = /obj/item/organ/internal/liver/tajaran,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"kidneys" = /obj/item/organ/internal/kidneys/tajaran,
"brain" = /obj/item/organ/internal/brain/tajaran,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes/tajaran /*Most Tajara see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
@@ -38,11 +38,11 @@
brute_mod = 1.05
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"heart" = /obj/item/organ/internal/heart/unathi,
"lungs" = /obj/item/organ/internal/lungs/unathi,
"liver" = /obj/item/organ/internal/liver/unathi,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"kidneys" = /obj/item/organ/internal/kidneys/unathi,
"brain" = /obj/item/organ/internal/brain/unathi,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes/unathi //3 darksight.
)
@@ -62,13 +62,13 @@
)
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"heart" = /obj/item/organ/internal/heart/vox,
"lungs" = /obj/item/organ/internal/lungs/vox,
"liver" = /obj/item/organ/internal/liver/vox,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"kidneys" = /obj/item/organ/internal/kidneys/vox,
"brain" = /obj/item/organ/internal/brain/vox,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
"eyes" = /obj/item/organ/internal/eyes/vox, //Default darksight of 2.
"stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ.
@@ -173,6 +173,7 @@
eyes = "blank_eyes"
species_traits = list(NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED)
dies_at_threshold = TRUE
bodyflags = HAS_TAIL
dietflags = DIET_OMNI //should inherit this from vox, this is here just in case
@@ -22,6 +22,7 @@
hunger_drain = 0.11
taste_sensitivity = TASTE_SENSITIVITY_SHARP
reagent_tag = PROCESS_ORG
flesh_color = "#966464"
base_color = "#CF4D2F"
butt_sprite = "vulp"
@@ -29,11 +30,11 @@
scream_verb = "yelps"
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"heart" = /obj/item/organ/internal/heart/vulpkanin,
"lungs" = /obj/item/organ/internal/lungs/vulpkanin,
"liver" = /obj/item/organ/internal/liver/vulpkanin,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"kidneys" = /obj/item/organ/internal/kidneys/vulpkanin,
"brain" = /obj/item/organ/internal/brain/vulpkanin,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes/vulpkanin /*Most Vulpkanin see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
@@ -39,7 +39,7 @@
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too
oxy_mod = 0
dies_at_threshold = TRUE
reagent_tag = PROCESS_ORG
base_color = "#704300"
@@ -1,3 +1,9 @@
/mob/living/carbon/human/SetLoseBreath(amount)
if(NO_BREATHE in dna.species.species_traits)
losebreath = 0
return FALSE
. = ..()
/mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0)
if(dna.species)
amount = amount * dna.species.stun_mod

Some files were not shown because too many files have changed in this diff Show More