mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-18 02:24:11 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into turfs
# Conflicts: # code/game/objects/items.dm # icons/turf/floors/plating.dmi # paradise.dme
This commit is contained in:
@@ -28,6 +28,11 @@ var/global/nologevent = 0
|
||||
if(C.prefs && !(C.prefs.toggles & CHAT_NO_TICKETLOGS))
|
||||
to_chat(C, msg)
|
||||
|
||||
/proc/message_mentorTicket(var/msg)
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(check_rights(R_ADMIN | R_MENTOR | R_MOD, 0, C.mob))
|
||||
if(C.prefs && !(C.prefs.toggles & CHAT_NO_MENTORTICKETLOGS))
|
||||
to_chat(C, msg)
|
||||
|
||||
/proc/admin_ban_mobsearch(var/mob/M, var/ckey_to_find, var/mob/admin_to_notify)
|
||||
if(!M || !M.ckey)
|
||||
|
||||
@@ -205,6 +205,8 @@ var/list/admin_verbs_mentor = list(
|
||||
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
|
||||
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
|
||||
/client/proc/cmd_admin_pm_by_key_panel, /*admin-pm list by key*/
|
||||
/client/proc/openMentorTicketUI,
|
||||
/client/proc/toggleMentorTicketLogs,
|
||||
/client/proc/cmd_mentor_say /* mentor say*/
|
||||
// cmd_mentor_say is added/removed by the toggle_mentor_chat verb
|
||||
)
|
||||
@@ -219,10 +221,10 @@ var/list/admin_verbs_snpc = list(
|
||||
/client/proc/hide_snpc_verbs
|
||||
)
|
||||
var/list/admin_verbs_ticket = list(
|
||||
/client/proc/openTicketUI,
|
||||
/client/proc/openAdminTicketUI,
|
||||
/client/proc/toggleticketlogs,
|
||||
/client/proc/resolveAllTickets,
|
||||
/client/proc/openUserUI
|
||||
/client/proc/resolveAllAdminTickets,
|
||||
/client/proc/resolveAllMentorTickets
|
||||
)
|
||||
|
||||
/client/proc/on_holder_add()
|
||||
@@ -940,6 +942,20 @@ var/list/admin_verbs_ticket = list(
|
||||
else
|
||||
to_chat(usr, "You now will get admin log messages.")
|
||||
|
||||
/client/proc/toggleMentorTicketLogs()
|
||||
set name = "Toggle Mentor Ticket Messgaes"
|
||||
set category = "Preferences"
|
||||
|
||||
if(!check_rights(R_MENTOR))
|
||||
return
|
||||
|
||||
prefs.toggles ^= CHAT_NO_MENTORTICKETLOGS
|
||||
prefs.save_preferences(src)
|
||||
if(prefs.toggles & CHAT_NO_MENTORTICKETLOGS)
|
||||
to_chat(usr, "You now won't get mentor ticket messages.")
|
||||
else
|
||||
to_chat(usr, "You now will get mentor ticket messages.")
|
||||
|
||||
/client/proc/toggleticketlogs()
|
||||
set name = "Toggle Admin Ticket Messgaes"
|
||||
set category = "Preferences"
|
||||
|
||||
@@ -548,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)
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//Verbs
|
||||
|
||||
/client/proc/openTicketUI()
|
||||
/client/proc/openAdminTicketUI()
|
||||
|
||||
set name = "Open Ticket Interface"
|
||||
set name = "Open Admin Ticket Interface"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
@@ -10,8 +10,8 @@
|
||||
|
||||
SStickets.showUI(usr)
|
||||
|
||||
/client/proc/resolveAllTickets()
|
||||
set name = "Resolve All Open Tickets"
|
||||
/client/proc/resolveAllAdminTickets()
|
||||
set name = "Resolve All Open Admin Tickets"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
@@ -22,12 +22,7 @@
|
||||
|
||||
SStickets.resolveAllOpenTickets()
|
||||
|
||||
/client/proc/openUserUI()
|
||||
|
||||
set name = "My Tickets"
|
||||
/client/verb/openAdminUserUI()
|
||||
set name = "My Admin Tickets"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
SStickets.userDetailUI(usr)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
//Verbs
|
||||
|
||||
/client/proc/openMentorTicketUI()
|
||||
|
||||
set name = "Open Mentor Ticket Interface"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder || !check_rights(R_MENTOR))
|
||||
return
|
||||
|
||||
SSmentor_tickets.showUI(usr)
|
||||
|
||||
/client/proc/resolveAllMentorTickets()
|
||||
set name = "Resolve All Open Mentor Tickets"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes")
|
||||
return
|
||||
|
||||
SSmentor_tickets.resolveAllOpenTickets()
|
||||
|
||||
/client/verb/openMentorUserUI()
|
||||
set name = "My Mentor Tickets"
|
||||
set category = "Admin"
|
||||
SSmentor_tickets.userDetailUI(usr)
|
||||
+13
-16
@@ -32,6 +32,12 @@
|
||||
var/ticketID = text2num(href_list["openadminticket"])
|
||||
SStickets.showDetailUI(usr, ticketID)
|
||||
|
||||
if(href_list["openmentorticket"])
|
||||
if(!check_rights(R_MENTOR|R_MOD|R_ADMIN))
|
||||
return
|
||||
var/ticketID = text2num(href_list["openmentorticket"])
|
||||
SSmentor_tickets.showDetailUI(usr, ticketID)
|
||||
|
||||
if(href_list["stickyban"])
|
||||
stickyban(href_list["stickyban"],href_list)
|
||||
|
||||
@@ -1546,22 +1552,13 @@
|
||||
check_antagonists()
|
||||
|
||||
else if(href_list["take_question"])
|
||||
var/mob/M = locateUID(href_list["take_question"])
|
||||
var/is_mhelp = href_list["is_mhelp"]
|
||||
if(ismob(M))
|
||||
var/helptype = "ADMINHELP"
|
||||
if(is_mhelp)
|
||||
helptype = "MENTORHELP"
|
||||
var/take_msg = "<span class='notice'><b>[helptype]</b>: <b>[key_name_hidden(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> question.</span>"
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(check_rights(R_ADMIN, 0, X.mob))
|
||||
to_chat(X, take_msg)
|
||||
else if(is_mhelp && check_rights(R_MOD|R_MENTOR, 0, X.mob))
|
||||
to_chat(X, take_msg)
|
||||
to_chat(M, "<span class='notice'><b>Your question is being attended to by [key_name_hidden(usr.client, null, 0)]. Thanks for your patience!</b></span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Unable to locate mob.</span>")
|
||||
|
||||
var/index = text2num(href_list["take_question"])
|
||||
|
||||
if(href_list["is_mhelp"])
|
||||
SSmentor_tickets.takeTicket(index)
|
||||
else //Ahelp
|
||||
SStickets.takeTicket(index)
|
||||
|
||||
else if(href_list["cult_nextobj"])
|
||||
if(alert(usr, "Validate the current Cult objective and unlock the next one?", "Cult Cheat Code", "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
@@ -103,31 +103,46 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
if(check_rights(R_MENTOR, 0, X.mob))
|
||||
mentorholders += X
|
||||
continue
|
||||
var/ticketNum // Holder for the ticket number
|
||||
var/prunedmsg ="[src]: [msg]" // Message without links
|
||||
var/datum/ticket/T
|
||||
var/isMhelp = selected_type == "Mentorhelp"
|
||||
var/span
|
||||
if(isMhelp)
|
||||
span = "<span class='mentorhelp'>"
|
||||
if(SSmentor_tickets.checkForOpenTicket(src)) // If user already has an open ticket
|
||||
T = SSmentor_tickets.checkForOpenTicket(src)
|
||||
else
|
||||
ticketNum = SSmentor_tickets.getTicketCounter() // ticketNum is the ticket ready to be assigned.
|
||||
else //Ahelp
|
||||
span = "<span class='adminhelp'>"
|
||||
if(SStickets.checkForOpenTicket(src)) // If user already has an open ticket
|
||||
T = SStickets.checkForOpenTicket(src) // Make T equal to the ticket they have open
|
||||
else
|
||||
ticketNum = SStickets.getTicketCounter() // ticketNum is the ticket ready to be assigned.
|
||||
|
||||
if(T)
|
||||
ticketNum = T.ticketNum // ticketNum is the number of their ticket.
|
||||
T.addResponse(src, msg)
|
||||
|
||||
msg = "[span][selected_type]: </span><span class='boldnotice'>[key_name(src, TRUE, selected_type)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_SM(mob,"SM")]) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;[isMhelp ? "openmentorticket" : "openadminticket"]=[ticketNum]'>TICKET</A>) [ai_found ? "(<A HREF='?_src_=holder;adminchecklaws=[mob.UID()]'>CL</A>)" : ""] (<A HREF='?_src_=holder;take_question=[ticketNum][isMhelp ? ";is_mhelp=1" : ""]'>TAKE</A>) :</span> [span][msg]</span>"
|
||||
if(isMhelp)
|
||||
//Open a new adminticket and inform the user.
|
||||
SSmentor_tickets.newTicket(src, prunedmsg, msg)
|
||||
for(var/client/X in mentorholders + modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_MENTORHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
to_chat(X, msg)
|
||||
else //Ahelp
|
||||
//Open a new adminticket and inform the user.
|
||||
SStickets.newTicket(src, prunedmsg, msg)
|
||||
for(var/client/X in modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
window_flash(X)
|
||||
to_chat(X, msg)
|
||||
|
||||
switch(selected_type)
|
||||
if("Mentorhelp")
|
||||
msg = "<span class='mentorhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, TRUE, selected_type)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_SM(mob,"SM")]) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[UID()]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[mob.UID()]'>CL</A>)" : ""] (<A HREF='?_src_=holder;take_question=[mob.UID()];is_mhelp=1'>TAKE</A>) :</span> <span class='mentorhelp'>[msg]</span>"
|
||||
for(var/client/X in mentorholders + modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_MENTORHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
to_chat(X, msg)
|
||||
if("Adminhelp")
|
||||
var/ticketNum // Holder for the ticket number
|
||||
var/prunedmsg ="[usr.client]: [msg]" // Message without links
|
||||
if(SStickets.checkForOpenTicket(usr)) // If user already has an open ticket
|
||||
var/datum/admin_ticket/T = SStickets.checkForOpenTicket(usr) // Make T equal to the ticket they have open
|
||||
ticketNum = T.ticketNum // ticketNum is the number of their ticket.
|
||||
T.addResponse(usr.client, msg)
|
||||
else
|
||||
ticketNum = SStickets.getTicketCounter() // ticketNum is the ticket ready to be assigned.
|
||||
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, TRUE, selected_type)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_SM(mob,"SM")]) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;openadminticket=[ticketNum]'>TICKET</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[mob.UID()]'>CL</A>)" : ""](<A HREF='?_src_=holder;take_question=[mob.UID()]'>TAKE</A>) :</span> <span class='adminhelp'>[msg]</span>"
|
||||
//Open a new adminticket and inform the user.
|
||||
SStickets.newTicket(src, prunedmsg, msg)
|
||||
for(var/client/X in modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
window_flash(X)
|
||||
to_chat(X, msg)
|
||||
|
||||
|
||||
//show it to the person adminhelping too
|
||||
to_chat(src, "<span class='boldnotice'>[selected_type]</b>: [original_msg]</span>")
|
||||
|
||||
@@ -182,23 +182,28 @@
|
||||
else
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
|
||||
to_chat(X, "<span class='boldnotice'>[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]</span>")
|
||||
|
||||
if(type == "Mentorhelp")
|
||||
return
|
||||
|
||||
//Check if the mob being PM'd has any open admin tickets.
|
||||
var/tickets = list()
|
||||
tickets = SStickets.checkForTicket(C)
|
||||
if(type == "Mentorhelp")
|
||||
tickets = SSmentor_tickets.checkForTicket(C)
|
||||
else
|
||||
tickets = SStickets.checkForTicket(C)
|
||||
if(tickets)
|
||||
for(var/datum/admin_ticket/i in tickets)
|
||||
for(var/datum/ticket/i in tickets)
|
||||
i.addResponse(src, msg) // Add this response to their open tickets.
|
||||
return
|
||||
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
|
||||
tickets = SStickets.checkForTicket(src)
|
||||
if(tickets)
|
||||
for(var/datum/admin_ticket/i in tickets)
|
||||
i.addResponse(src, msg)
|
||||
return
|
||||
if(type == "Mentorhelp")
|
||||
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
|
||||
tickets = SSmentor_tickets.checkForTicket(src)
|
||||
else // Ahelp
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
|
||||
tickets = SStickets.checkForTicket(src)
|
||||
|
||||
if(tickets)
|
||||
for(var/datum/ticket/i in tickets)
|
||||
i.addResponse(src, msg)
|
||||
return
|
||||
|
||||
|
||||
/client/proc/cmd_admin_irc_pm()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/atom_hud/antag
|
||||
hud_icons = list(SPECIALROLE_HUD,NATIONS_HUD)
|
||||
hud_icons = list(SPECIALROLE_HUD)
|
||||
var/self_visible = TRUE
|
||||
|
||||
/datum/atom_hud/antag/hidden
|
||||
@@ -38,16 +38,6 @@
|
||||
if(M.mind || new_icon_state) //in mindless mobs, only null is acceptable, otherwise we're antagging a mindless mob, meaning we should runtime
|
||||
M.mind.antag_hud_icon_state = new_icon_state
|
||||
|
||||
//Nations Icons
|
||||
/proc/set_nations_hud(mob/M, new_icon_state)
|
||||
if(!istype(M))
|
||||
CRASH("set_antag_hud(): [M] ([M.type]) is not a mob!")
|
||||
var/image/holder = M.hud_list[NATIONS_HUD]
|
||||
if(holder)
|
||||
holder.icon_state = new_icon_state
|
||||
if(M.mind || new_icon_state) //in mindless mobs, only null is acceptable, otherwise we're antagging a mindless mob, meaning we should runtime
|
||||
M.mind.antag_hud_icon_state = new_icon_state
|
||||
|
||||
//MIND PROCS
|
||||
//these are called by mind.transfer_to()
|
||||
/datum/mind/proc/transfer_antag_huds(datum/atom_hud/antag/newhud)
|
||||
|
||||
@@ -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.
|
||||
@@ -65,25 +67,6 @@
|
||||
// Set on login.
|
||||
var/datum/media_manager/media = null
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
//adv. hotkey mode vars, code using them in /interface/interface.dm//
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
var/hotkeytype = "QWERTY" //what set of hotkeys is in use(defaulting to QWERTY because I can't be bothered to make this save on SQL)
|
||||
var/hotkeyon = 0 //is the hotkey on?
|
||||
|
||||
var/hotkeylist = list( //list defining hotkey types, look at lists in place for structure if adding any if the future
|
||||
"QWERTY" = list(
|
||||
"on" = "hotkeymode",
|
||||
"off" = "macro"),
|
||||
"AZERTY" = list(
|
||||
"on" = "AZERTYon",
|
||||
"off" = "AZERTYoff"),
|
||||
"Cyborg" = list(
|
||||
"on" = "borghotkeymode",
|
||||
"off" = "borgmacro")
|
||||
)
|
||||
|
||||
var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier
|
||||
|
||||
control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS
|
||||
|
||||
@@ -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, 524287, 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))
|
||||
|
||||
@@ -231,3 +231,15 @@
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You have enabled karma gains.")
|
||||
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
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
description_antag = "These are a pair of power gloves, and can be used to fire bolts of electricity while standing over powered power cables."
|
||||
var/old_mclick_override
|
||||
var/datum/middleClickOverride/power_gloves/mclick_override = new /datum/middleClickOverride/power_gloves
|
||||
var/last_shocked = 0
|
||||
var/shock_delay = 40
|
||||
var/unlimited_power = FALSE // Does this really need explanation?
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power/equipped(mob/user, slot)
|
||||
if(!ishuman(user))
|
||||
@@ -21,7 +24,10 @@
|
||||
if(H.middleClickOverride)
|
||||
old_mclick_override = H.middleClickOverride
|
||||
H.middleClickOverride = mclick_override
|
||||
to_chat(H, "<span class='notice'>You feel electricity begin to build up in [src].</span>")
|
||||
if(!unlimited_power)
|
||||
to_chat(H, "<span class='notice'>You feel electricity begin to build up in [src].</span>")
|
||||
else
|
||||
to_chat(H, "<span class='biggerdanger'>You feel like you have UNLIMITED POWER!!</span>")
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power/dropped(mob/user, slot)
|
||||
if(!ishuman(user))
|
||||
@@ -34,6 +40,12 @@
|
||||
else
|
||||
H.middleClickOverride = null
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power/unlimited
|
||||
name = "UNLIMITED POWER gloves"
|
||||
desc = "These gloves possess UNLIMITED POWER."
|
||||
shock_delay = 0
|
||||
unlimited_power = TRUE
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/fake
|
||||
desc = "These gloves will protect the wearer from electric shock. They don't feel like rubber..."
|
||||
siemens_coefficient = 1
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#define SLAM_COMBO "HG"
|
||||
#define SLAM_COMBO "GH"
|
||||
#define KICK_COMBO "HH"
|
||||
#define RESTRAIN_COMBO "GG"
|
||||
#define PRESSURE_COMBO "DG"
|
||||
@@ -8,15 +8,24 @@
|
||||
name = "CQC"
|
||||
help_verb = /mob/living/carbon/human/proc/CQC_help
|
||||
block_chance = 75
|
||||
var/just_a_cook = FALSE
|
||||
var/static/list/areas_under_siege = typecacheof(list(/area/crew_quarters/kitchen,
|
||||
/area/crew_quarters/cafeteria,
|
||||
/area/crew_quarters/bar))
|
||||
|
||||
/datum/martial_art/cqc/can_use(mob/living/carbon/human/H)
|
||||
if(istype(H.gloves, /obj/item/clothing/gloves/fingerless/rapid))
|
||||
return FALSE
|
||||
return ..()
|
||||
/datum/martial_art/cqc/under_siege
|
||||
name = "Close Quarters Cooking"
|
||||
just_a_cook = TRUE
|
||||
|
||||
/datum/martial_art/cqc/proc/drop_restraining()
|
||||
restraining = FALSE
|
||||
|
||||
/datum/martial_art/cqc/can_use(mob/living/carbon/human/H)
|
||||
var/area/A = get_area(H)
|
||||
if(just_a_cook && !(is_type_in_typecache(A, areas_under_siege)))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/martial_art/cqc/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
@@ -44,22 +53,23 @@
|
||||
/datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
if(!D.stat || !D.weakened)
|
||||
if(!D.weakened && !D.resting && !D.lying)
|
||||
D.visible_message("<span class='warning'>[A] slams [D] into the ground!</span>", \
|
||||
"<span class='userdanger'>[A] slams you into the ground!</span>")
|
||||
playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1)
|
||||
D.apply_damage(10, BRUTE)
|
||||
D.Weaken(6)
|
||||
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Slam", ATKLOG_ALL)
|
||||
else //if target can't be slammed, do a regular grab attack then clear the streak
|
||||
streak = ""
|
||||
grab_act(A, D)
|
||||
streak = ""
|
||||
return TRUE
|
||||
streak = ""
|
||||
harm_act(A, D)
|
||||
streak = ""
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
var/success = FALSE
|
||||
if(!D.stat || !D.weakened)
|
||||
D.visible_message("<span class='warning'>[A] kicks [D] back!</span>", \
|
||||
"<span class='userdanger'>[A] kicks you back!</span>")
|
||||
@@ -68,17 +78,20 @@
|
||||
D.throw_at(throw_target, 1, 14, A)
|
||||
D.apply_damage(10, BRUTE)
|
||||
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Kick", ATKLOG_ALL)
|
||||
if(D.weakened && !D.stat)
|
||||
D.visible_message("<span class='warning'>[A] kicks [D]'s head, knocking [D.p_them()] out!</span>", \
|
||||
"<span class='userdanger'>[A] kicks your head, knocking you out!</span>")
|
||||
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
|
||||
D.SetSleeping(15)
|
||||
D.adjustBrainLoss(15, 150)
|
||||
add_attack_logs(A, D, "Knocked out with martial-art [src] : Kick", ATKLOG_ALL)
|
||||
else //if target can't be kicked, do a regular harm attack then clear the streak
|
||||
streak = ""
|
||||
harm_act(A, D)
|
||||
streak = ""
|
||||
success = TRUE
|
||||
if(D.weakened && !D.stat)
|
||||
D.visible_message("<span class='warning'>[A] kicks [D]'s head, knocking [D.p_them()] out!</span>", \
|
||||
"<span class='userdanger'>[A] kicks your head, knocking you out!</span>")
|
||||
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
|
||||
D.SetSleeping(15)
|
||||
D.adjustBrainLoss(15)
|
||||
add_attack_logs(A, D, "Knocked out with martial-art [src] : Kick", ATKLOG_ALL)
|
||||
success = TRUE
|
||||
if(success)
|
||||
return TRUE
|
||||
streak = ""
|
||||
harm_act(A, D)
|
||||
streak = ""
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
@@ -103,6 +116,10 @@
|
||||
restraining = TRUE
|
||||
addtimer(CALLBACK(src, .proc/drop_restraining), 50, TIMER_UNIQUE)
|
||||
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Restrain", ATKLOG_ALL)
|
||||
return TRUE
|
||||
streak = ""
|
||||
harm_act(A, D)
|
||||
streak = ""
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
@@ -118,10 +135,10 @@
|
||||
D.adjustStaminaLoss(50)
|
||||
D.apply_damage(25, BRUTE)
|
||||
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Consecutive", ATKLOG_ALL)
|
||||
else //if target can't be hit, do a regular harm attack then clear the streak
|
||||
streak = ""
|
||||
harm_act(A, D)
|
||||
streak = ""
|
||||
return TRUE
|
||||
streak = ""
|
||||
harm_act(A, D)
|
||||
streak = ""
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
@@ -133,6 +150,8 @@
|
||||
var/obj/item/grab/G = D.grabbedby(A, 1)
|
||||
if(G)
|
||||
G.state = GRAB_AGGRESSIVE //Instant aggressive grab
|
||||
add_attack_logs(A, D, "Melee attacked with martial-art [src] : aggressively grabbed", ATKLOG_ALL)
|
||||
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
@@ -141,8 +160,9 @@
|
||||
add_to_streak("H", D)
|
||||
if(check_streak(A, D))
|
||||
return TRUE
|
||||
add_attack_logs(A, D, "Melee attacked with martial-art [src]", ATKLOG_ALL)
|
||||
A.do_attack_animation(D)
|
||||
var/picked_hit_type = pick("CQC'd", "neck chopped", "gut punched")
|
||||
var/picked_hit_type = pick("CQC'd", "neck chopped", "gut punched", "Big Bossed")
|
||||
var/bonus_damage = 13
|
||||
if(D.weakened || D.resting || D.lying)
|
||||
bonus_damage += 5
|
||||
@@ -154,7 +174,7 @@
|
||||
playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
|
||||
D.visible_message("<span class='danger'>[A] [picked_hit_type] [D]!</span>", \
|
||||
"<span class='userdanger'>[A] [picked_hit_type] you!</span>")
|
||||
add_attack_logs(A, D, "Melee attacked with martial-art [src]", ATKLOG_ALL)
|
||||
add_attack_logs(A, D, "Melee attacked with martial-art [src] : [picked_hit_type]", ATKLOG_ALL)
|
||||
if(A.resting && !D.stat && !D.weakened)
|
||||
D.visible_message("<span class='warning'>[A] leg sweeps [D]!", \
|
||||
"<span class='userdanger'>[A] leg sweeps you!</span>")
|
||||
@@ -168,24 +188,36 @@
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
add_to_streak("D", D)
|
||||
var/obj/item/I = null
|
||||
if(check_streak(A, D))
|
||||
return TRUE
|
||||
if(!restraining)
|
||||
D.visible_message("<span class='warning'>[A] strikes [D]'s jaw with their hand!</span>", \
|
||||
"<span class='userdanger'>[A] strikes your jaw, disorienting you!</span>")
|
||||
playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
|
||||
D.Jitter(2)
|
||||
D.apply_damage(5, BRUTE)
|
||||
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Disarm", ATKLOG_ALL)
|
||||
if(restraining)
|
||||
var/obj/item/grab/G = A.get_inactive_hand()
|
||||
if(restraining && istype(G) && G.affecting == D)
|
||||
D.visible_message("<span class='danger'>[A] puts [D] into a chokehold!</span>", \
|
||||
"<span class='userdanger'>[A] puts you into a chokehold!</span>")
|
||||
D.SetSleeping(20)
|
||||
restraining = FALSE
|
||||
add_attack_logs(A, D, "Knocked out with martial-art [src] : Choke hold", ATKLOG_ALL)
|
||||
if(G.state < GRAB_NECK)
|
||||
G.state = GRAB_NECK
|
||||
return TRUE
|
||||
else
|
||||
restraining = FALSE
|
||||
return FALSE
|
||||
|
||||
if(prob(65))
|
||||
if(!D.stat || !D.weakened || !restraining)
|
||||
I = D.get_active_hand()
|
||||
D.visible_message("<span class='warning'>[A] strikes [D]'s jaw with their hand!</span>", \
|
||||
"<span class='userdanger'>[A] strikes your jaw, disorienting you!</span>")
|
||||
playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
|
||||
if(I && D.drop_item())
|
||||
A.put_in_hands(I)
|
||||
D.Jitter(2)
|
||||
D.apply_damage(5, BRUTE)
|
||||
else
|
||||
D.visible_message("<span class='danger'>[A] attempted to disarm [D]!</span>", "<span class='userdanger'>[A] attempted to disarm [D]!</span>")
|
||||
playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
|
||||
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Disarmed [I ? " grabbing \the [I]" : ""]", ATKLOG_ALL)
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/proc/CQC_help()
|
||||
@@ -194,11 +226,10 @@
|
||||
set category = "CQC"
|
||||
to_chat(usr, "<b><i>You try to remember some of the basics of CQC.</i></b>")
|
||||
|
||||
to_chat(usr, "<span class='notice'>Slam</span>: Harm Grab. Slam opponent into the ground, knocking them down.")
|
||||
to_chat(usr, "<span class='notice'>Slam</span>: Grab, switch hands, Harm. Slam opponent into the ground, knocking them down.")
|
||||
to_chat(usr, "<span class='notice'>CQC Kick</span>: Harm Harm. Knocks opponent away. Knocks out stunned or knocked down opponents.")
|
||||
to_chat(usr, "<span class='notice'>Restrain</span>: Grab Switch Hand Grab. Locks opponent into a restraining position, stunning them.")
|
||||
to_chat(usr, "<span class='notice'>Choke Hold</span>: Restrain Disarm. Knocks out an opponent you have restrained.")
|
||||
to_chat(usr, "<span class='notice'>Restrain</span>: Grab, switch hands, Grab. Locks opponents into a restraining position, disarm to knock them out with a choke hold.")
|
||||
to_chat(usr, "<span class='notice'>Pressure</span>: Disarm Grab. Decent stamina damage.")
|
||||
to_chat(usr, "<span class='notice'>Consecutive CQC</span>: Disarm Disarm Harm. Mainly offensive move, huge damage and decent stamina damage.")
|
||||
|
||||
to_chat(usr, "<b><i>In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter melee attacks done to you.</i></b>")
|
||||
to_chat(usr, "<b><i>In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.</i></b>")
|
||||
@@ -14,7 +14,3 @@
|
||||
|
||||
/mob/camera/experience_pressure_difference()
|
||||
return
|
||||
|
||||
/mob/camera/Login()
|
||||
..()
|
||||
update_interface()
|
||||
|
||||
@@ -7,5 +7,3 @@
|
||||
if(GLOB.non_respawnable_keys[ckey])
|
||||
can_reenter_corpse = 0
|
||||
GLOB.respawnable_list -= src
|
||||
|
||||
update_interface()
|
||||
@@ -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)
|
||||
@@ -139,11 +139,8 @@ Works together with spawning an observer, noted above.
|
||||
var/client/C = U.client
|
||||
for(var/mob/living/carbon/human/target in target_list)
|
||||
C.images += target.hud_list[SPECIALROLE_HUD]
|
||||
//C.images += target.hud_list[NATIONS_HUD]
|
||||
for(var/mob/living/silicon/target in target_list)
|
||||
C.images += target.hud_list[SPECIALROLE_HUD]
|
||||
//C.images += target.hud_list[NATIONS_HUD]
|
||||
|
||||
return 1
|
||||
|
||||
/mob/proc/ghostize(var/flags = GHOST_CAN_REENTER)
|
||||
@@ -179,30 +176,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)
|
||||
@@ -210,7 +221,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
|
||||
|
||||
@@ -523,7 +523,9 @@
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
|
||||
/datum/language/shadowling/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
if(speaker.mind && speaker.mind.special_role)
|
||||
if(speaker.mind && speaker.mind.special_role == SPECIAL_ROLE_SHADOWLING)
|
||||
..(speaker,"<font size=3><b>[message]</b></font>", "<span class='shadowling'><font size=3>([speaker.mind.special_role]) [speaker]</font></span>")
|
||||
else if(speaker.mind && speaker.mind.special_role)
|
||||
..(speaker, message, "([speaker.mind.special_role]) [speaker]")
|
||||
else
|
||||
..(speaker, message)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/organ/internal/brain
|
||||
name = "brain"
|
||||
health = 400 //They need to live awhile longer than other organs.
|
||||
max_damage = 200
|
||||
max_damage = 120
|
||||
icon_state = "brain2"
|
||||
force = 1.0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
@@ -100,6 +100,19 @@
|
||||
log_debug("Multibrain shenanigans at ([target.x],[target.y],[target.z]), mob '[target]'")
|
||||
..(target, special = special)
|
||||
|
||||
/obj/item/organ/internal/brain/receive_damage(amount, silent = 0) //brains are special; if they receive damage by other means, we really just want the damage to be passed ot the owner and back onto the brain.
|
||||
if(owner)
|
||||
owner.adjustBrainLoss(amount)
|
||||
|
||||
/obj/item/organ/internal/brain/necrotize(update_sprite = TRUE) //Brain also has special handling for when it necrotizes
|
||||
damage = max_damage
|
||||
status |= ORGAN_DEAD
|
||||
processing_objects -= src
|
||||
if(dead_icon && !is_robotic())
|
||||
icon_state = dead_icon
|
||||
if(owner && vital)
|
||||
owner.setBrainLoss(120)
|
||||
|
||||
/obj/item/organ/internal/brain/prepare_eat()
|
||||
return // Too important to eat.
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -198,12 +198,6 @@
|
||||
stat("Total Blood", "[mind.vampire.bloodtotal]")
|
||||
stat("Usable Blood", "[mind.vampire.bloodusable]")
|
||||
|
||||
if(mind.nation)
|
||||
stat("Nation Name", "[mind.nation.current_name ? "[mind.nation.current_name]" : "[mind.nation.default_name]"]")
|
||||
stat("Nation Leader", "[mind.nation.current_leader ? "[mind.nation.current_leader]" : "None"]")
|
||||
stat("Nation Heir", "[mind.nation.heir ? "[mind.nation.heir]" : "None"]")
|
||||
|
||||
|
||||
if(istype(loc, /obj/spacepod)) // Spacdpods!
|
||||
var/obj/spacepod/S = loc
|
||||
stat("Spacepod Charge", "[istype(S.battery) ? "[(S.battery.charge / S.battery.maxcharge) * 100]" : "No cell detected"]")
|
||||
|
||||
@@ -31,7 +31,10 @@
|
||||
if(sponge)
|
||||
if(dna.species && amount > 0)
|
||||
amount = amount * dna.species.brain_mod
|
||||
sponge.receive_damage(amount, 1)
|
||||
sponge.damage = Clamp(sponge.damage + amount, 0, 120)
|
||||
if(sponge.damage >= 120)
|
||||
visible_message("<span class='alert'><B>[src]</B> goes limp, [p_their()] facial expression utterly blank.</span>")
|
||||
death()
|
||||
if(updating)
|
||||
update_stat("adjustBrainLoss")
|
||||
return STATUS_UPDATE_STAT
|
||||
@@ -45,7 +48,10 @@
|
||||
if(sponge)
|
||||
if(dna.species && amount > 0)
|
||||
amount = amount * dna.species.brain_mod
|
||||
sponge.damage = min(max(amount, 0), (maxHealth*2))
|
||||
sponge.damage = Clamp(amount, 0, 120)
|
||||
if(sponge.damage >= 120)
|
||||
visible_message("<span class='alert'><B>[src]</B> goes limp, [p_their()] facial expression utterly blank.</span>")
|
||||
death()
|
||||
if(updating)
|
||||
update_stat("setBrainLoss")
|
||||
return STATUS_UPDATE_STAT
|
||||
|
||||
@@ -157,7 +157,7 @@ emp_act
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/check_block()
|
||||
/mob/living/carbon/human/proc/check_block()
|
||||
if(martial_art && prob(martial_art.block_chance) && martial_art.can_use(src) && in_throw_mode && !incapacitated(FALSE, TRUE))
|
||||
return TRUE
|
||||
|
||||
@@ -220,6 +220,10 @@ emp_act
|
||||
if(check_shields(I.force, "the [I.name]", I, MELEE_ATTACK, I.armour_penetration))
|
||||
return 0
|
||||
|
||||
if(check_block())
|
||||
visible_message("<span class='warning'>[src] blocks [I]!</span>")
|
||||
return FALSE
|
||||
|
||||
if(istype(I,/obj/item/card/emag))
|
||||
emag_act(user, affecting)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
var/global/default_martial_art = new/datum/martial_art
|
||||
/mob/living/carbon/human
|
||||
|
||||
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD,GLAND_HUD)
|
||||
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPMINDSHIELD_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,GLAND_HUD)
|
||||
|
||||
//Marking colour and style
|
||||
var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000.
|
||||
|
||||
@@ -37,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 )
|
||||
@@ -779,7 +790,6 @@
|
||||
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
|
||||
|
||||
|
||||
@@ -319,7 +319,7 @@
|
||||
user.do_cpr(target)
|
||||
|
||||
/datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
if(target.check_block()) //cqc
|
||||
if(target.check_block())
|
||||
target.visible_message("<span class='warning'>[target] blocks [user]'s grab attempt!</span>")
|
||||
return FALSE
|
||||
if(attacker_style && attacker_style.grab_act(user, target))
|
||||
@@ -348,7 +348,7 @@
|
||||
add_attack_logs(user, target, "vampirebit")
|
||||
return
|
||||
//end vampire codes
|
||||
if(target.check_block()) //cqc
|
||||
if(target.check_block())
|
||||
target.visible_message("<span class='warning'>[target] blocks [user]'s attack!</span>")
|
||||
return FALSE
|
||||
if(attacker_style && attacker_style.harm_act(user, target))
|
||||
@@ -393,7 +393,7 @@
|
||||
SEND_SIGNAL(target, COMSIG_PARENT_ATTACKBY)
|
||||
|
||||
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
if(target.check_block()) //cqc
|
||||
if(target.check_block())
|
||||
target.visible_message("<span class='warning'>[target] blocks [user]'s disarm attempt!</span>")
|
||||
return FALSE
|
||||
if(attacker_style && attacker_style.disarm_act(user, target))
|
||||
|
||||
@@ -56,6 +56,9 @@
|
||||
|
||||
/datum/species/grey/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
|
||||
if(R.id == "sacid")
|
||||
H.reagents.del_reagent(R.id)
|
||||
return 0
|
||||
H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM)
|
||||
return FALSE
|
||||
if(R.id == "water")
|
||||
H.adjustFireLoss(1)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
@@ -188,6 +188,6 @@
|
||||
H.adjustFireLoss(-0.5*REAGENTS_EFFECT_MULTIPLIER)
|
||||
H.adjustPlasma(20)
|
||||
H.reagents.remove_reagent(R.id, REAGENTS_METABOLISM)
|
||||
return 0 //Handling reagent removal on our own. Prevents plasma from dealing toxin damage to Plasmamen.
|
||||
return FALSE //Handling reagent removal on our own. Prevents plasma from dealing toxin damage to Plasmamen.
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
/datum/species/skeleton/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
|
||||
// Crazylemon is still silly
|
||||
if(R.id == "milk")
|
||||
H.heal_overall_damage(4,4)
|
||||
H.heal_overall_damage(4, 4)
|
||||
if(prob(5)) // 5% chance per proc to find a random limb, and mend it
|
||||
var/list/our_organs = H.bodyparts.Copy()
|
||||
shuffle(our_organs)
|
||||
@@ -54,7 +54,7 @@
|
||||
L.perma_injury = 0
|
||||
break // We're only checking one limb here, bucko
|
||||
if(prob(3))
|
||||
H.say(pick("Thanks Mr Skeltal", "Thank for strong bones", "Doot doot!"))
|
||||
return 1
|
||||
H.say(pick("Thanks Mr. Skeltal", "Thank for strong bones", "Doot doot!"))
|
||||
return TRUE
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -2,16 +2,7 @@
|
||||
if(status_flags & GODMODE)
|
||||
return
|
||||
..(reason)
|
||||
if(stat != DEAD)
|
||||
switch(getBrainLoss())
|
||||
if(100 to 120)
|
||||
Weaken(20)
|
||||
create_debug_log("collapsed from brain damage, trigger reason: [reason]")
|
||||
if(120 to INFINITY)
|
||||
visible_message("<span class='alert'><B>[src]</B> goes limp, [p_their()] facial expression utterly blank.</span>")
|
||||
death()
|
||||
create_debug_log("died of brain damage, trigger reason: [reason]")
|
||||
else
|
||||
if(stat == DEAD)
|
||||
if(dna.species && dna.species.can_revive_by_healing)
|
||||
var/obj/item/organ/internal/brain/B = get_int_organ(/obj/item/organ/internal/brain)
|
||||
if(B)
|
||||
|
||||
@@ -52,8 +52,6 @@
|
||||
if(client)
|
||||
//regular_hud_updates() //THIS DOESN'T FUCKING UPDATE SHIT
|
||||
handle_regular_hud_updates() //IT JUST REMOVES FUCKING HUD IMAGES
|
||||
if(get_nations_mode())
|
||||
process_nations()
|
||||
|
||||
..()
|
||||
|
||||
@@ -227,10 +225,4 @@
|
||||
return
|
||||
|
||||
/mob/living/proc/handle_hud_icons_health()
|
||||
return
|
||||
|
||||
/mob/living/proc/process_nations()
|
||||
if(client)
|
||||
var/client/C = client
|
||||
for(var/mob/living/carbon/human/H in view(src, world.view))
|
||||
C.images += H.hud_list[NATIONS_HUD]
|
||||
return
|
||||
@@ -337,8 +337,4 @@
|
||||
return TRUE
|
||||
if(INTENT_DISARM)
|
||||
M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
|
||||
return TRUE
|
||||
|
||||
//defined here, overridden for humans in human_defense. By default, living mobs don't get to block anything
|
||||
/mob/living/proc/check_block()
|
||||
return FALSE
|
||||
return TRUE
|
||||
@@ -17,6 +17,4 @@
|
||||
//Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways.
|
||||
update_pipe_vision()
|
||||
|
||||
update_interface()
|
||||
|
||||
return .
|
||||
|
||||
@@ -133,9 +133,6 @@
|
||||
|
||||
process_queued_alarms()
|
||||
|
||||
if(get_nations_mode())
|
||||
process_nations_ai()
|
||||
|
||||
/mob/living/silicon/ai/updatehealth(reason = "none given")
|
||||
if(status_flags & GODMODE)
|
||||
health = 100
|
||||
@@ -156,12 +153,6 @@
|
||||
..()
|
||||
add_ai_verbs(src)
|
||||
|
||||
/mob/living/silicon/ai/proc/process_nations_ai()
|
||||
if(client)
|
||||
var/client/C = client
|
||||
for(var/mob/living/carbon/human/H in view(eyeobj, 14))
|
||||
C.images += H.hud_list[NATIONS_HUD]
|
||||
|
||||
/mob/living/silicon/ai/update_sight()
|
||||
see_invisible = initial(see_invisible)
|
||||
see_in_dark = initial(see_in_dark)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/mob/living/silicon/robot/Login()
|
||||
..()
|
||||
if(client)
|
||||
client.hotkeytype = "Cyborg"
|
||||
regenerate_icons()
|
||||
show_laws(0)
|
||||
|
||||
var/datum/hotkey_mode/cyborg/C = new(src)
|
||||
C.set_winset_values()
|
||||
|
||||
@@ -93,7 +93,7 @@ var/list/robot_verbs_default = list(
|
||||
|
||||
var/updating = 0 //portable camera camerachunk update
|
||||
|
||||
hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, NATIONS_HUD)
|
||||
hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD)
|
||||
|
||||
var/magpulse = 0
|
||||
var/ionpulse = 0 // Jetpack-like effect.
|
||||
@@ -288,10 +288,6 @@ var/list/robot_verbs_default = list(
|
||||
if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis)
|
||||
to_chat(src, "<span class='warning'>Crisis mode active. Combat module available.</span>")
|
||||
modules += "Combat"
|
||||
if(ticker && ticker.mode && ticker.mode.name == "nations")
|
||||
var/datum/game_mode/nations/N = ticker.mode
|
||||
if(N.kickoff)
|
||||
modules = list("Nations")
|
||||
if(mmi != null && mmi.alien)
|
||||
modules = list("Hunter")
|
||||
modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules
|
||||
@@ -390,11 +386,6 @@ var/list/robot_verbs_default = list(
|
||||
module.channels = list("Security" = 1)
|
||||
icon_state = "droidcombat"
|
||||
|
||||
if("Nations")
|
||||
module = new /obj/item/robot_module/nations(src)
|
||||
module.channels = list()
|
||||
icon_state = "droidpeace"
|
||||
|
||||
if("Hunter")
|
||||
module = new /obj/item/robot_module/alien/hunter(src)
|
||||
icon_state = "xenoborg-state-a"
|
||||
@@ -415,7 +406,7 @@ var/list/robot_verbs_default = list(
|
||||
feedback_inc("cyborg_[lowertext(modtype)]",1)
|
||||
rename_character(real_name, get_default_name())
|
||||
|
||||
if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Nations")
|
||||
if(modtype == "Medical" || modtype == "Security" || modtype == "Combat")
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
choose_icon(6,module_sprites)
|
||||
@@ -891,7 +882,7 @@ var/list/robot_verbs_default = list(
|
||||
else
|
||||
overlays += "[panelprefix]-openpanel -c"
|
||||
|
||||
var/combat = list("Combat","Nations")
|
||||
var/combat = list("Combat")
|
||||
if(modtype in combat)
|
||||
if(base_icon == "")
|
||||
base_icon = icon_state
|
||||
@@ -1356,24 +1347,6 @@ var/list/robot_verbs_default = list(
|
||||
/mob/living/silicon/robot/ert/gamma
|
||||
crisis = 1
|
||||
|
||||
/mob/living/silicon/robot/nations
|
||||
base_icon = "droidpeace"
|
||||
icon_state = "droidpeace"
|
||||
modtype = "Nations"
|
||||
designation = "Nations"
|
||||
|
||||
/mob/living/silicon/robot/nations/init()
|
||||
..()
|
||||
module = new /obj/item/robot_module/nations(src)
|
||||
//languages
|
||||
module.add_languages(src)
|
||||
//subsystems
|
||||
module.add_subsystems_and_actions(src)
|
||||
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
notify_ai(2)
|
||||
|
||||
/mob/living/silicon/robot/emp_act(severity)
|
||||
..()
|
||||
switch(severity)
|
||||
|
||||
@@ -497,22 +497,6 @@
|
||||
|
||||
fix_modules()
|
||||
|
||||
/obj/item/robot_module/nations
|
||||
name = "nations robot module"
|
||||
module_type = "Malf"
|
||||
|
||||
/obj/item/robot_module/nations/New()
|
||||
..()
|
||||
modules += new /obj/item/restraints/handcuffs/cable/zipties/cyborg(src)
|
||||
modules += new /obj/item/gun/energy/gun/cyborg(src)
|
||||
modules += new /obj/item/pickaxe/drill/jackhammer(src)
|
||||
modules += new /obj/item/borg/combat/shield(src)
|
||||
modules += new /obj/item/borg/combat/mobility(src)
|
||||
modules += new /obj/item/wrench/cyborg(src)
|
||||
emag = new /obj/item/gun/energy/lasercannon/cyborg(src)
|
||||
|
||||
fix_modules()
|
||||
|
||||
/obj/item/robot_module/alien/hunter
|
||||
name = "alien hunter module"
|
||||
module_type = "Standard"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/next_alarm_notice
|
||||
var/list/datum/alarm/queued_alarms = new()
|
||||
|
||||
hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD,NATIONS_HUD)
|
||||
hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD)
|
||||
|
||||
|
||||
var/med_hud = DATA_HUD_MEDICAL_ADVANCED //Determines the med hud to use
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
canlay = 1000
|
||||
spider_tier = TS_TIER_5
|
||||
projectiletype = /obj/item/projectile/terrorqueenspit/empress
|
||||
icon = 'icons/mob/terrorspider64.dmi'
|
||||
pixel_x = -16
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
icon_state = "terror_empress"
|
||||
icon_living = "terror_empress"
|
||||
icon_dead = "terror_empress_dead"
|
||||
var/datum/action/innate/terrorspider/queen/empress/empresslings/empresslings_action
|
||||
var/datum/action/innate/terrorspider/queen/empress/empresserase/empresserase_action
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
@@ -42,7 +48,7 @@
|
||||
queenfakelings_action.button.name = "Empress Lings"
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/LayQueenEggs()
|
||||
var/eggtype = input("What kind of eggs?") as null|anything in list(TS_DESC_QUEEN, TS_DESC_MOTHER, TS_DESC_PRINCE, TS_DESC_PRINCESS, TS_DESC_RED, TS_DESC_GRAY, TS_DESC_GREEN, TS_DESC_BLACK, TS_DESC_PURPLE, TS_DESC_WHITE)
|
||||
var/eggtype = input("What kind of eggs?") as null|anything in list(TS_DESC_QUEEN, TS_DESC_MOTHER, TS_DESC_PRINCE, TS_DESC_PRINCESS, TS_DESC_RED, TS_DESC_GRAY, TS_DESC_GREEN, TS_DESC_BLACK, TS_DESC_PURPLE, TS_DESC_WHITE, TS_DESC_BROWN)
|
||||
var/numlings = input("How many in the batch?") as null|anything in list(1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50)
|
||||
if(eggtype == null || numlings == null)
|
||||
to_chat(src, "<span class='danger'>Cancelled.</span>")
|
||||
@@ -60,6 +66,8 @@
|
||||
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple, numlings)
|
||||
if(TS_DESC_WHITE)
|
||||
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/white, numlings)
|
||||
if(TS_DESC_BROWN)
|
||||
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/brown, numlings)
|
||||
if(TS_DESC_PRINCE)
|
||||
DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/prince, numlings)
|
||||
if(TS_DESC_PRINCESS)
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
if(can_die())
|
||||
if(spider_awaymission && !is_away_level(z))
|
||||
canspawn = FALSE
|
||||
if(degenerate)
|
||||
canspawn = FALSE
|
||||
if(canspawn)
|
||||
canspawn = FALSE
|
||||
for(var/i in 0 to spawn_count)
|
||||
|
||||
@@ -142,9 +142,8 @@
|
||||
visible_message("<span class='danger'>\The [src] looks around warily - then seeks a better nesting ground.</span>")
|
||||
path_to_vent = 1
|
||||
else
|
||||
visible_message("<span class='danger'>\The [src] looks around, searching for the vent that should be there, but isn't. A bluespace portal forms on her, and she is gone.</span>")
|
||||
qdel(src)
|
||||
new /obj/effect/portal(get_turf(loc))
|
||||
neststep = -1
|
||||
message_admins("Warning: [key_name_admin(src)] was spawned in an area without a vent! This is likely a mapping/spawn mistake. This mob's AI has been permanently deactivated.")
|
||||
if(1)
|
||||
// No nest, and we should create one. Start NestMode(), then advance to step 2.
|
||||
if(world.time > (lastnestsetup + nestfrequency))
|
||||
|
||||
@@ -72,29 +72,3 @@
|
||||
update_client_colour(0)
|
||||
|
||||
callHook("mob_login", list("client" = client, "mob" = src))
|
||||
|
||||
// Calling update_interface() in /mob/Login() causes the Cyborg to immediately be ghosted; because of winget().
|
||||
// Calling it in the overriden Login, such as /mob/living/Login() doesn't cause this.
|
||||
/mob/proc/update_interface()
|
||||
spawn() // Spawn off so winget/winset don't delay callers.
|
||||
if(client)
|
||||
if(winget(src, "mainwindow.hotkey_toggle", "is-checked") == "true")
|
||||
update_hotkey_mode()
|
||||
else
|
||||
update_normal_mode()
|
||||
|
||||
/mob/proc/update_hotkey_mode()
|
||||
var/hotkeyname = "hotkeymode"
|
||||
if(client)
|
||||
var/hotkeys = client.hotkeylist[client.hotkeytype]
|
||||
hotkeyname = hotkeys[client.hotkeyon ? "on" : "off"]
|
||||
client.hotkeyon = 1
|
||||
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0")
|
||||
|
||||
/mob/proc/update_normal_mode()
|
||||
var/hotkeyname = "macro"
|
||||
if(client)
|
||||
var/hotkeys = client.hotkeylist[client.hotkeytype]//get the list containing the hotkey names
|
||||
hotkeyname = hotkeys[client.hotkeyon ? "on" : "off"]//get the name of the hotkey, to not clutter winset() to much
|
||||
client.hotkeyon = 0
|
||||
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5")
|
||||
|
||||
@@ -173,6 +173,9 @@
|
||||
//SSD var, changed it up some so people can have special things happen for different mobs when SSD.
|
||||
var/player_logged = 0
|
||||
|
||||
//Ghosted var, set only if a player has manually ghosted out of this mob.
|
||||
var/player_ghosted = 0
|
||||
|
||||
var/turf/listed_turf = null //the current turf being examined in the stat panel
|
||||
var/list/shouldnt_see = list(/atom/movable/lighting_overlay) //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ var/global/image/typing_indicator
|
||||
|
||||
set_typing_indicator(1)
|
||||
hud_typing = 1
|
||||
var/message = input("","say (text)") as null|text
|
||||
var/message = typing_input(src, "", "say (text)")
|
||||
hud_typing = 0
|
||||
set_typing_indicator(0)
|
||||
if(message)
|
||||
@@ -49,9 +49,10 @@ var/global/image/typing_indicator
|
||||
set name = ".Me"
|
||||
set hidden = 1
|
||||
|
||||
|
||||
set_typing_indicator(1)
|
||||
hud_typing = 1
|
||||
var/message = input("","me (text)") as null|text
|
||||
var/message = typing_input(src, "", "me (text)")
|
||||
hud_typing = 0
|
||||
set_typing_indicator(0)
|
||||
if(message)
|
||||
|
||||
@@ -283,34 +283,25 @@ var/global/list/fax_blacklist = list()
|
||||
|
||||
use_power(200)
|
||||
|
||||
var/obj/item/rcvdcopy
|
||||
if(istype(copyitem, /obj/item/paper))
|
||||
rcvdcopy = copy(copyitem)
|
||||
else if(istype(copyitem, /obj/item/photo))
|
||||
rcvdcopy = photocopy(copyitem)
|
||||
else if(istype(copyitem, /obj/item/paper_bundle))
|
||||
rcvdcopy = bundlecopy(copyitem)
|
||||
else
|
||||
if(!(istype(copyitem, /obj/item/paper) || istype(copyitem, /obj/item/paper_bundle) || istype(copyitem, /obj/item/photo)))
|
||||
visible_message("[src] beeps, \"Error transmitting message.\"")
|
||||
return
|
||||
|
||||
rcvdcopy.loc = null //hopefully this shouldn't cause trouble
|
||||
|
||||
var/datum/fax/admin/A = new /datum/fax/admin()
|
||||
A.name = rcvdcopy.name
|
||||
A.name = copyitem.name
|
||||
A.from_department = department
|
||||
A.to_department = destination
|
||||
A.origin = src
|
||||
A.message = rcvdcopy
|
||||
A.message = copyitem
|
||||
A.sent_by = sender
|
||||
A.sent_at = world.time
|
||||
|
||||
//message badmins that a fax has arrived
|
||||
switch(destination)
|
||||
if("Central Command")
|
||||
message_admins(sender, "CENTCOM FAX", destination, rcvdcopy, "#006100")
|
||||
message_admins(sender, "CENTCOM FAX", destination, copyitem, "#006100")
|
||||
if("Syndicate")
|
||||
message_admins(sender, "SYNDICATE FAX", destination, rcvdcopy, "#DC143C")
|
||||
message_admins(sender, "SYNDICATE FAX", destination, copyitem, "#DC143C")
|
||||
for(var/obj/machinery/photocopier/faxmachine/F in allfaxes)
|
||||
if(F.department == destination)
|
||||
F.receivefax(copyitem)
|
||||
|
||||
@@ -218,7 +218,7 @@ var/const/INGEST = 2
|
||||
|
||||
/datum/reagents/proc/metabolize(mob/living/M)
|
||||
if(M)
|
||||
set_reagent_temp(M.bodytemperature)
|
||||
temperature_reagents(M.bodytemperature - 30)
|
||||
|
||||
// a bitfield filled in by each reagent's `on_mob_life` to find out which states to update
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
|
||||
@@ -765,7 +765,7 @@
|
||||
/datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/M)
|
||||
if(M.bodytemperature < 360)
|
||||
M.bodytemperature = min(360, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/devilskiss
|
||||
name = "Devils Kiss"
|
||||
@@ -819,7 +819,7 @@
|
||||
/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/M)
|
||||
if(M.bodytemperature > 270)
|
||||
M.bodytemperature = max(270, M.bodytemperature - (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/grog
|
||||
name = "Grog"
|
||||
@@ -1178,7 +1178,7 @@
|
||||
if(prob(25))
|
||||
holder.remove_reagent(id, 15)
|
||||
M.fakevomit()
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/synthanol/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||
if(M.isSynthetic())
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
/datum/reagent/consumable/drink/cold/ice/on_mob_life(mob/living/M)
|
||||
M.bodytemperature = max(M.bodytemperature - 5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/drink/cold/space_cola
|
||||
name = "Cola"
|
||||
|
||||
@@ -448,7 +448,7 @@
|
||||
/datum/reagent/consumable/egg/on_mob_life(mob/living/M)
|
||||
if(prob(3))
|
||||
M.reagents.add_reagent("cholesterol", rand(1,2))
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/corn_starch
|
||||
name = "Corn Starch"
|
||||
@@ -643,9 +643,6 @@
|
||||
color = "#684435"
|
||||
taste_message = "burritos"
|
||||
|
||||
/datum/reagent/consumable/beans/on_mob_life(mob/living/M)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/bread
|
||||
name = "Bread"
|
||||
id = "bread"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
/datum/reagent/medicine/on_mob_life(mob/living/M)
|
||||
current_cycle++
|
||||
holder.remove_reagent(id, (metabolization_rate / M.metabolism_efficiency) * M.digestion_ratio) //medicine reagents stay longer if you have a better metabolism
|
||||
return STATUS_UPDATE_NONE
|
||||
|
||||
/datum/reagent/medicine/hydrocodone
|
||||
name = "Hydrocodone"
|
||||
@@ -526,6 +527,7 @@
|
||||
taste_message = "a delightful numbing"
|
||||
|
||||
/datum/reagent/medicine/morphine/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
M.AdjustJitter(-25)
|
||||
switch(current_cycle)
|
||||
if(1 to 15)
|
||||
@@ -534,9 +536,9 @@
|
||||
if(16 to 35)
|
||||
M.Drowsy(20)
|
||||
if(36 to INFINITY)
|
||||
M.Paralyse(15)
|
||||
update_flags |= M.Paralyse(15, FALSE)
|
||||
M.Drowsy(20)
|
||||
..()
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/medicine/oculine
|
||||
name = "Oculine"
|
||||
@@ -669,7 +671,7 @@
|
||||
update_flags |= M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||
/datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method = TOUCH, volume)
|
||||
if(volume < 1)
|
||||
// gotta pay to play
|
||||
return ..()
|
||||
@@ -682,25 +684,19 @@
|
||||
SM.visible_message("<span class='warning'>[M] seems to rise from the dead!</span>")
|
||||
|
||||
if(iscarbon(M))
|
||||
if(method == INGEST)
|
||||
if(method == INGEST || (method == TOUCH && prob(25)))
|
||||
if(M.stat == DEAD)
|
||||
if(M.getBruteLoss()+M.getFireLoss()+M.getCloneLoss() >= 150)
|
||||
if(M.getBruteLoss() + M.getFireLoss() + M.getCloneLoss() >= 150)
|
||||
M.delayed_gib()
|
||||
return
|
||||
var/mob/dead/observer/ghost = M.get_ghost()
|
||||
if(ghost)
|
||||
to_chat(ghost, "<span class='ghostalert'>A Strange Reagent is infusing your body with life. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
|
||||
window_flash(ghost.client)
|
||||
ghost << sound('sound/effects/genetics.ogg')
|
||||
M.visible_message("<span class='notice'>[M] doesn't appear to respond, perhaps try again later?</span>")
|
||||
if(!M.suiciding && !ghost && !(NOCLONE in M.mutations) && (M.mind && M.mind.is_revivable()))
|
||||
if(!M.suiciding && !(NOCLONE in M.mutations) && (!M.mind || M.mind && M.mind.is_revivable()))
|
||||
var/time_dead = world.time - M.timeofdeath
|
||||
M.visible_message("<span class='warning'>[M] seems to rise from the dead!</span>")
|
||||
M.adjustCloneLoss(50)
|
||||
M.setOxyLoss(0)
|
||||
M.adjustBruteLoss(rand(0,15))
|
||||
M.adjustToxLoss(rand(0,15))
|
||||
M.adjustFireLoss(rand(0,15))
|
||||
M.adjustBruteLoss(rand(0, 15))
|
||||
M.adjustToxLoss(rand(0, 15))
|
||||
M.adjustFireLoss(rand(0, 15))
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/necrosis_prob = 40 * min((20 MINUTES), max((time_dead - (1 MINUTES)), 0)) / ((20 MINUTES) - (1 MINUTES))
|
||||
@@ -715,8 +711,8 @@
|
||||
O.germ_level = INFECTION_LEVEL_THREE
|
||||
H.update_body()
|
||||
|
||||
M.grab_ghost()
|
||||
M.update_revive()
|
||||
M.stat = UNCONSCIOUS
|
||||
add_attack_logs(M, M, "Revived with strange reagent") //Yes, the logs say you revived yourself.
|
||||
..()
|
||||
|
||||
@@ -759,7 +755,7 @@
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.update_mutations()
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/datum/reagent/medicine/antihol
|
||||
name = "Antihol"
|
||||
@@ -857,6 +853,7 @@
|
||||
|
||||
/datum/reagent/medicine/insulin/on_mob_life(mob/living/M)
|
||||
M.reagents.remove_reagent("sugar", 5)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/medicine/teporone
|
||||
name = "Teporone"
|
||||
@@ -873,7 +870,7 @@
|
||||
M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT))
|
||||
else if(M.bodytemperature < 311)
|
||||
M.bodytemperature = min(310, M.bodytemperature + (40 * TEMPERATURE_DAMAGE_COEFFICIENT))
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/datum/reagent/medicine/haloperidol
|
||||
name = "Haloperidol"
|
||||
@@ -916,6 +913,7 @@
|
||||
taste_message = "sleepiness"
|
||||
|
||||
/datum/reagent/medicine/ether/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
M.AdjustJitter(-25)
|
||||
switch(current_cycle)
|
||||
if(1 to 30)
|
||||
@@ -924,9 +922,9 @@
|
||||
if(31 to 40)
|
||||
M.Drowsy(20)
|
||||
if(41 to INFINITY)
|
||||
M.Paralyse(15)
|
||||
update_flags |= M.Paralyse(15, FALSE)
|
||||
M.Drowsy(20)
|
||||
..()
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
|
||||
name = "Restorative Nanites"
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
if(!H.dna.species.exotic_blood && !(NO_BLOOD in H.dna.species.species_traits))
|
||||
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
H.blood_volume += 0.8
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||
if(M.has_bane(BANE_IRON) && holder && holder.chem_temp < 150) //If the target is weak to cold iron, then poison them.
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
var/turf/simulated/T = get_turf(M)
|
||||
goonchem_vortex(T, 1, 0)
|
||||
to_chat(M, "<span class='notice'>You briefly feel super-massive, like a black hole. Probably just your imagination...</span>")
|
||||
..()
|
||||
return ..()
|
||||
|
||||
//Berry Banned: This one is tasty and safe to drink, might have a low chance of healing a random damage type?
|
||||
/datum/reagent/consumable/drink/berry_banned
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
M.adjust_fire_stacks(mob_burning)
|
||||
M.IgniteMob()
|
||||
if(method == INGEST)
|
||||
M.adjustFireLoss(min(max(15, volume * 3), 45))
|
||||
M.adjustFireLoss(min(max(10, volume * 2), 45))
|
||||
to_chat(M, "<span class='warning'>It burns!</span>")
|
||||
M.emote("scream")
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
M.adjust_fire_stacks(10)
|
||||
M.IgniteMob()
|
||||
if(method == INGEST)
|
||||
M.adjustFireLoss(min(max(30, volume * 6), 90))
|
||||
M.adjustFireLoss(min(max(15, volume * 2.5), 90))
|
||||
to_chat(M, "<span class='warning'>It burns!</span>")
|
||||
M.emote("scream")
|
||||
|
||||
|
||||
@@ -245,7 +245,7 @@
|
||||
id = "sacid"
|
||||
description = "A strong mineral acid with the molecular formula H2SO4."
|
||||
reagent_state = LIQUID
|
||||
color = "#00D72B"
|
||||
color = "#00FF32"
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
taste_message = "<span class='userdanger'>ACID</span>"
|
||||
|
||||
@@ -254,58 +254,34 @@
|
||||
update_flags |= M.adjustFireLoss(1, FALSE)
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/sacid/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||
if(method == TOUCH)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(isgrey(H))
|
||||
return
|
||||
|
||||
/datum/reagent/sacid/reaction_mob(mob/living/M, method = TOUCH, volume)
|
||||
if(ishuman(M) && !isgrey(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(method == TOUCH)
|
||||
if(volume > 25)
|
||||
|
||||
if(H.wear_mask)
|
||||
to_chat(H, "<span class='danger'>Your mask protects you from the acid!</span>")
|
||||
to_chat(H, "<span class='danger'>Your [H.wear_mask] protects you from the acid!</span>")
|
||||
return
|
||||
|
||||
if(H.head)
|
||||
to_chat(H, "<span class='danger'>Your helmet protects you from the acid!</span>")
|
||||
to_chat(H, "<span class='danger'>Your [H.wear_mask] protects you from the acid!</span>")
|
||||
return
|
||||
|
||||
if(!M.unacidable)
|
||||
if(prob(75))
|
||||
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||
if(affecting)
|
||||
affecting.receive_damage(5, 10)
|
||||
H.UpdateDamageIcon()
|
||||
H.emote("scream")
|
||||
else
|
||||
M.take_organ_damage(5,10)
|
||||
if(prob(75))
|
||||
H.take_organ_damage(5, 10)
|
||||
H.emote("scream")
|
||||
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||
if(affecting)
|
||||
affecting.disfigure()
|
||||
else
|
||||
H.take_organ_damage(5, 10)
|
||||
else
|
||||
M.take_organ_damage(5,10)
|
||||
|
||||
if(method == INGEST)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(isgrey(H))
|
||||
return
|
||||
|
||||
if(volume >=10 && volume <=25)
|
||||
if(!H.unacidable)
|
||||
M.take_organ_damage(0,min(max(volume-10,2)*2,20))
|
||||
M.emote("scream")
|
||||
|
||||
|
||||
if(volume > 25)
|
||||
if(!M.unacidable)
|
||||
if(prob(75))
|
||||
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||
if(affecting)
|
||||
affecting.receive_damage(0, 20)
|
||||
H.UpdateDamageIcon()
|
||||
H.emote("scream")
|
||||
else
|
||||
M.take_organ_damage(0,20)
|
||||
H.take_organ_damage(5, 10)
|
||||
else
|
||||
to_chat(H, "<span class='warning'>The greenish acidic substance stings[volume < 10 ? " you, but isn't concentrated enough to harm you" : null]!</span>")
|
||||
if(volume >= 10)
|
||||
H.adjustFireLoss(min(max(4, (volume - 10) * 2), 20))
|
||||
H.emote("scream")
|
||||
|
||||
/datum/reagent/sacid/reaction_obj(obj/O, volume)
|
||||
if((istype(O,/obj/item) || istype(O,/obj/structure/glowshroom)) && prob(40))
|
||||
@@ -614,7 +590,7 @@
|
||||
id = "facid"
|
||||
description = "Fluorosulfuric acid is a an extremely corrosive super-acid."
|
||||
reagent_state = LIQUID
|
||||
color = "#4141D2"
|
||||
color = "#5050FF"
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
taste_message = "<span class='userdanger'>ACID</span>"
|
||||
|
||||
@@ -624,47 +600,38 @@
|
||||
update_flags |= M.adjustFireLoss(1, FALSE)
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/facid/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||
if(method == TOUCH || method == INGEST)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(volume < 5)
|
||||
to_chat(M, "<span class='danger'>The blueish acidic substance stings you, but isn't concentrated enough to harm you!</span>")
|
||||
|
||||
if(volume >=5 && volume <=10)
|
||||
if(!H.unacidable)
|
||||
M.take_organ_damage(0,max(volume-5,2)*4)
|
||||
M.emote("scream")
|
||||
|
||||
|
||||
if(volume > 10)
|
||||
|
||||
if(method == TOUCH)
|
||||
if(H.wear_mask)
|
||||
if(!H.wear_mask.unacidable)
|
||||
qdel(H.wear_mask)
|
||||
H.update_inv_wear_mask()
|
||||
to_chat(H, "<span class='warning'>Your mask melts away but protects you from the acid!</span>")
|
||||
else
|
||||
to_chat(H, "<span class='warning'>Your mask protects you from the acid!</span>")
|
||||
return
|
||||
|
||||
if(H.head)
|
||||
if(!H.head.unacidable)
|
||||
qdel(H.head)
|
||||
H.update_inv_head()
|
||||
to_chat(H, "<span class='warning'>Your helmet melts away but protects you from the acid</span>")
|
||||
else
|
||||
to_chat(H, "<span class='warning'>Your helmet protects you from the acid!</span>")
|
||||
return
|
||||
|
||||
if(!H.unacidable)
|
||||
var/obj/item/organ/external/head/affecting = H.get_organ("head")
|
||||
/datum/reagent/facid/reaction_mob(mob/living/M, method = TOUCH, volume)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(method == TOUCH)
|
||||
if(volume > 9)
|
||||
if(!H.wear_mask && !H.head)
|
||||
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||
if(affecting)
|
||||
affecting.receive_damage(0, 75)
|
||||
H.UpdateDamageIcon()
|
||||
affecting.disfigure()
|
||||
H.adjustFireLoss(min(max(8, (volume - 5) * 3), 75))
|
||||
H.emote("scream")
|
||||
return
|
||||
else
|
||||
var/melted_something = FALSE
|
||||
if(H.wear_mask && !H.wear_mask.unacidable)
|
||||
qdel(H.wear_mask)
|
||||
H.update_inv_wear_mask()
|
||||
to_chat(H, "<span class='danger'>Your [H.wear_mask] melts away!</span>")
|
||||
melted_something = TRUE
|
||||
|
||||
if(H.head && !H.head.unacidable)
|
||||
qdel(H.head)
|
||||
H.update_inv_head()
|
||||
to_chat(H, "<span class='danger'>Your [H.head] melts away!</span>")
|
||||
melted_something = TRUE
|
||||
if(melted_something)
|
||||
return
|
||||
|
||||
if(volume >= 5)
|
||||
H.emote("scream")
|
||||
H.adjustFireLoss(min(max(8, (volume - 5) * 3), 75))
|
||||
to_chat(H, "<span class='warning'>The blueish acidic substance stings[volume < 5 ? " you, but isn't concentrated enough to harm you" : null]!</span>")
|
||||
|
||||
/datum/reagent/facid/reaction_obj(obj/O, volume)
|
||||
if((istype(O, /obj/item) || istype(O, /obj/structure/glowshroom)))
|
||||
@@ -1156,12 +1123,16 @@
|
||||
M.apply_effect(2, IRRADIATE, 0, negate_armor = 1)
|
||||
if(!M.dna)
|
||||
return
|
||||
var/did_mutation = FALSE
|
||||
if(prob(15))
|
||||
randmutb(M)
|
||||
did_mutation = TRUE
|
||||
if(prob(3))
|
||||
randmutg(M)
|
||||
domutcheck(M, null)
|
||||
M.UpdateAppearance()
|
||||
did_mutation = TRUE
|
||||
if(did_mutation)
|
||||
domutcheck(M, null)
|
||||
M.UpdateAppearance()
|
||||
return ..()
|
||||
|
||||
/datum/reagent/ants
|
||||
|
||||
@@ -24,61 +24,34 @@
|
||||
if(method == TOUCH)
|
||||
// Put out fire
|
||||
M.adjust_fire_stacks(-(volume * 0.2))
|
||||
if(ishuman(M))
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(!isgrey(H)) //God this is so gross I hate it.
|
||||
return
|
||||
|
||||
if(isgrey(M)) // You gosh darn snowflakes
|
||||
var/mob/living/carbon/human/G = M
|
||||
if(method == TOUCH)
|
||||
if(volume > 25)
|
||||
|
||||
if(H.wear_mask)
|
||||
to_chat(H, "<span class='danger'>Your mask protects you from the water!</span>")
|
||||
if(G.wear_mask)
|
||||
to_chat(G, "<span class='danger'>Your [G.wear_mask] protects you from the acid!</span>")
|
||||
return
|
||||
|
||||
if(H.head)
|
||||
to_chat(H, "<span class='danger'>Your helmet protects you from the water!</span>")
|
||||
if(G.head)
|
||||
to_chat(G, "<span class='danger'>Your [G.wear_mask] protects you from the acid!</span>")
|
||||
return
|
||||
|
||||
if(!M.unacidable)
|
||||
if(prob(75))
|
||||
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||
if(affecting)
|
||||
affecting.receive_damage(5, 10)
|
||||
H.UpdateDamageIcon()
|
||||
H.emote("scream")
|
||||
else
|
||||
M.take_organ_damage(5,10)
|
||||
if(prob(75))
|
||||
G.take_organ_damage(5, 10)
|
||||
G.emote("scream")
|
||||
var/obj/item/organ/external/affecting = G.get_organ("head")
|
||||
if(affecting)
|
||||
affecting.disfigure()
|
||||
else
|
||||
G.take_organ_damage(5, 10)
|
||||
else
|
||||
M.take_organ_damage(5,10)
|
||||
|
||||
if(method == INGEST)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(!isgrey(H))
|
||||
return
|
||||
|
||||
if(volume < 10)
|
||||
to_chat(M, "<span class='danger'>The watery solvent substance stings you, but isn't concentrated enough to harm you!</span>")
|
||||
|
||||
if(volume >=10 && volume <=25)
|
||||
if(!H.unacidable)
|
||||
M.take_organ_damage(0,min(max(volume-10,2)*2,20))
|
||||
M.emote("scream")
|
||||
|
||||
|
||||
if(volume > 25)
|
||||
if(!M.unacidable)
|
||||
if(prob(75))
|
||||
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||
if(affecting)
|
||||
affecting.receive_damage(0, 20)
|
||||
H.UpdateDamageIcon()
|
||||
H.emote("scream")
|
||||
else
|
||||
M.take_organ_damage(0,20)
|
||||
G.take_organ_damage(5, 10)
|
||||
else
|
||||
to_chat(G, "<span class='warning'>The water stings[volume < 10 ? " you, but isn't concentrated enough to harm you" : null]!</span>")
|
||||
if(volume >= 10)
|
||||
G.adjustFireLoss(min(max(4, (volume - 10) * 2), 20))
|
||||
G.emote("scream")
|
||||
|
||||
/datum/reagent/water/reaction_turf(turf/simulated/T, volume)
|
||||
if(!istype(T))
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
required_reagents = list("plasma" = 1, "silver" = 1, "blackpowder" = 1)
|
||||
result_amount = 3
|
||||
mix_message = "<span class='danger'>A jet of sparks flies from the mixture as it merges into a flickering slurry.</span>"
|
||||
min_temp = T0C + 130
|
||||
min_temp = T0C + 50
|
||||
mix_sound = null
|
||||
|
||||
/datum/chemical_reaction/teslium/on_reaction(datum/reagents/holder, created_volume)
|
||||
|
||||
@@ -52,10 +52,11 @@
|
||||
var/egg_progress = 0 // # of on_life() cycles completed, unlike cycle_num this is reset on each hatch event
|
||||
var/egg_progress_per_hatch = 90 // if egg_progress > this, chance to hatch and reset egg_progress
|
||||
var/eggs_hatched = 0 // num of hatch events completed
|
||||
var/eggs_max = 3 // max possible spiderlings you can get from a single infection if its left to run for a very long time
|
||||
var/awaymission_checked = FALSE
|
||||
var/awaymission_infection = FALSE // TRUE if infection occurred inside gateway
|
||||
var/list/types_basic = list(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray, /mob/living/simple_animal/hostile/poison/terror_spider/green)
|
||||
var/list/types_basic = list(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray)
|
||||
var/list/types_adv = list(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray, /mob/living/simple_animal/hostile/poison/terror_spider/green)
|
||||
|
||||
|
||||
/obj/item/organ/internal/body_egg/terror_eggs/on_life()
|
||||
// Safety first.
|
||||
@@ -78,19 +79,11 @@
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
// Detect dying hosts, and try to keep them alive (so spiderlings can hatch) at the cost of some growth progress.
|
||||
if(owner.health < -25)
|
||||
to_chat(owner,"<span class='notice'>You feel a strange, blissful senstation.</span>")
|
||||
owner.adjustBruteLoss(-5)
|
||||
owner.adjustFireLoss(-5)
|
||||
owner.adjustToxLoss(-5)
|
||||
egg_progress += 10
|
||||
|
||||
// Once at least one egg has hatched from you, you'll need help to reach medbay.
|
||||
if(eggs_hatched >= 1)
|
||||
owner.Confused(2)
|
||||
|
||||
if(egg_progress > egg_progress_per_hatch && eggs_hatched < eggs_max)
|
||||
if(egg_progress > egg_progress_per_hatch)
|
||||
egg_progress -= egg_progress_per_hatch
|
||||
hatch_egg()
|
||||
|
||||
@@ -107,15 +100,22 @@
|
||||
return extra_progress
|
||||
|
||||
/obj/item/organ/internal/body_egg/terror_eggs/proc/hatch_egg()
|
||||
var/infection_completed = FALSE
|
||||
var/obj/structure/spider/spiderling/terror_spiderling/S = new(get_turf(owner))
|
||||
if(eggs_hatched >= 2) // on the third egg...
|
||||
S.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/princess
|
||||
else
|
||||
S.grow_as = pick(types_basic)
|
||||
switch(eggs_hatched)
|
||||
if(0) // First spiderling
|
||||
S.grow_as = pick(types_basic)
|
||||
if(1) // Second
|
||||
S.grow_as = pick(types_adv)
|
||||
if(2) // Last
|
||||
S.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/princess
|
||||
infection_completed = TRUE
|
||||
S.immediate_ventcrawl = TRUE
|
||||
eggs_hatched++
|
||||
to_chat(owner, "<span class='warning'>A strange prickling sensation moves across your skin... then suddenly the whole world seems to spin around you!</span>")
|
||||
owner.Paralyse(10)
|
||||
if(infection_completed && !QDELETED(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/item/organ/internal/body_egg/terror_eggs/remove(var/mob/living/carbon/M, var/special = 0)
|
||||
..()
|
||||
|
||||
Reference in New Issue
Block a user