mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 12:07:27 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into OrganRefactor
This commit is contained in:
@@ -680,6 +680,12 @@
|
||||
else
|
||||
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=cultist;jobban4=\ref[M]'>[replacetext("Cultist", " ", " ")]</a></td>"
|
||||
|
||||
//Shadowling
|
||||
if(jobban_isbanned(M, "shadowling") || isbanned_dept)
|
||||
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=shadowling;jobban4=\ref[M]'><font color=red>[replacetext("Shadowling", " ", " ")]</font></a></td>"
|
||||
else
|
||||
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=shadowling;jobban4=\ref[M]'>[replacetext("Shadowling", " ", " ")]</a></td>"
|
||||
|
||||
//Wizard
|
||||
if(jobban_isbanned(M, "wizard") || isbanned_dept)
|
||||
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=wizard;jobban4=\ref[M]'><font color=red>[replacetext("Wizard", " ", " ")]</font></a></td>"
|
||||
|
||||
@@ -15,13 +15,13 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
adminhelped = 1 //Determines if they get the message to reply by clicking the name.
|
||||
|
||||
var/msg
|
||||
var/list/type = list("Question","Player Complaint")
|
||||
var/list/type = list("Mentorhelp","Adminhelp")
|
||||
var/selected_type = input("Pick a category.", "Admin Help", null, null) as null|anything in type
|
||||
if(selected_type)
|
||||
msg = input("Please enter your message.", "Admin Help", null, null) as text|null
|
||||
|
||||
//clean the input msg
|
||||
if(!msg)
|
||||
//clean the input msg
|
||||
if(!msg)
|
||||
return
|
||||
|
||||
if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
|
||||
@@ -88,7 +88,6 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
|
||||
var/ref_mob = "\ref[mob]"
|
||||
var/ref_client = "\ref[src]"
|
||||
msg = "\blue <b><font color=red>[selected_type]: </font>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob, "holder")]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""]:</b> [msg]"
|
||||
|
||||
//send this msg to all admins
|
||||
var/admin_number_afk = 0
|
||||
@@ -109,19 +108,21 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
continue
|
||||
|
||||
switch(selected_type)
|
||||
if("Question")
|
||||
if("Mentorhelp")
|
||||
msg = "<span class='mentorhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob, "holder")]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""]:</span> <span class='mentorhelp'>[msg]</span>"
|
||||
for(var/client/X in mentorholders + modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
X << msg
|
||||
if("Player Complaint")
|
||||
if("Adminhelp")
|
||||
msg = "<span class='danger'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob, "holder")]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""]:</span> <span class='danger'>[msg]</span>"
|
||||
for(var/client/X in modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
X << msg
|
||||
|
||||
//show it to the person adminhelping too
|
||||
src << "<font color='blue'><b>[selected_type]</b>: [original_msg]</font>"
|
||||
src << "<span class='boldnotice'>[selected_type]</b>: [original_msg]</span>"
|
||||
|
||||
var/admin_number_present = adminholders.len - admin_number_afk
|
||||
log_admin("[selected_type]: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.")
|
||||
@@ -161,4 +162,3 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
else
|
||||
send2irc(source, "[msg] - All admins AFK ([admin_number_afk]/[admin_number_total]) or skipped ([admin_number_ignored]/[admin_number_total])")
|
||||
return admin_number_present
|
||||
|
||||
@@ -67,17 +67,17 @@
|
||||
if(istext(whom))
|
||||
if(cmptext(copytext(whom,1,2),"@"))
|
||||
whom = findStealthKey(whom)
|
||||
C = directory[C]
|
||||
C = directory[C]
|
||||
else if(istype(whom,/client))
|
||||
C = whom
|
||||
|
||||
|
||||
if(!C)
|
||||
if(holder)
|
||||
if(holder)
|
||||
src << "<span class='danger'>Error: Private-Message: Client not found.</span>"
|
||||
else
|
||||
else
|
||||
adminhelp(msg) //admin we are replying to left. adminhelp instead
|
||||
return
|
||||
|
||||
|
||||
/*if(C && C.last_pm_recieved + config.simultaneous_pm_warning_timeout > world.time && holder)
|
||||
//send a warning to admins, but have a delay popup for mods
|
||||
if(holder.rights & R_ADMIN)
|
||||
@@ -90,12 +90,12 @@
|
||||
if(!msg)
|
||||
msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
|
||||
|
||||
if(!msg)
|
||||
if(!msg)
|
||||
return
|
||||
if(!C)
|
||||
if(holder)
|
||||
if(holder)
|
||||
src << "<span class='danger'>Error: Admin-PM: Client not found.</span>"
|
||||
else
|
||||
else
|
||||
adminhelp(msg) //admin we are replying to has vanished, adminhelp instead
|
||||
return
|
||||
|
||||
@@ -105,10 +105,10 @@
|
||||
//clean the message if it's not sent by a high-rank admin
|
||||
if(!check_rights(R_SERVER|R_DEBUG,0))
|
||||
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
|
||||
if(!msg)
|
||||
if(!msg)
|
||||
return
|
||||
|
||||
var/recieve_color = "purple"
|
||||
var/recieve_span = "playerreply"
|
||||
var/send_pm_type = " "
|
||||
var/recieve_pm_type = "Player"
|
||||
|
||||
@@ -118,9 +118,9 @@
|
||||
//PMs sent from admins and mods display their rank
|
||||
if(holder)
|
||||
if(check_rights(R_MOD|R_MENTOR,0) && !check_rights(R_ADMIN,0))
|
||||
recieve_color = "maroon"
|
||||
recieve_span = "mentorhelp"
|
||||
else
|
||||
recieve_color = "red"
|
||||
recieve_span = "danger"
|
||||
send_pm_type = holder.rank + " "
|
||||
recieve_pm_type = holder.rank
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
var/recieve_message = ""
|
||||
|
||||
if(holder && !C.holder)
|
||||
recieve_message = "<font color='[recieve_color]' size='3'><b>-- Click the [recieve_pm_type]'s name to reply --</b></font>\n"
|
||||
recieve_message = "<span class='[recieve_span]' size='3'>-- Click the [recieve_pm_type]'s name to reply --</span>\n"
|
||||
if(C.adminhelped)
|
||||
C << recieve_message
|
||||
C.adminhelped = 0
|
||||
@@ -149,7 +149,7 @@
|
||||
adminhelp(reply) //sender has left, adminhelp instead
|
||||
return
|
||||
|
||||
recieve_message = "<font color='[recieve_color]'>[type] from-<b>[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)]</b>: [msg]</font>"
|
||||
recieve_message = "<span class='[recieve_span]'>[type] from-<b>[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)]</b>: [msg]</span>"
|
||||
C << recieve_message
|
||||
src << "<font color='blue'>[send_pm_type][type] to-<b>[key_name(C, src, holder ? 1 : 0, type)]</b>: [msg]</font>"
|
||||
|
||||
@@ -162,57 +162,6 @@
|
||||
if(C.prefs.sound & SOUND_ADMINHELP)
|
||||
C << 'sound/effects/adminhelp.ogg'
|
||||
|
||||
/*
|
||||
if(C.holder)
|
||||
if(holder) //both are admins
|
||||
if(holder.rank == "Moderator") //If moderator
|
||||
C << "<font color='maroon'>Mod PM from-<b>[key_name(src, C, 1)]</b>: [msg]</font>"
|
||||
src << "<font color='blue'>Mod PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
|
||||
else
|
||||
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 1)]</b>: [msg]</font>"
|
||||
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
|
||||
|
||||
else //recipient is an admin but sender is not
|
||||
C << "<font color='red'>Reply PM from-<b>[key_name(src, C, 1)]</b>: [msg]</font>"
|
||||
src << "<font color='blue'>PM to-<b>Admins</b>: [msg]</font>"
|
||||
|
||||
//play the recieving admin the adminhelp sound (if they have them enabled)
|
||||
if(C.prefs.toggles & SOUND_ADMINHELP)
|
||||
C << 'sound/effects/adminhelp.ogg'
|
||||
|
||||
else
|
||||
if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT
|
||||
if(holder.rank == "Moderator")
|
||||
C << "<font color='maroon'>Mod PM from-<b>[key_name(src, C, 0)]</b>: [msg]</font>"
|
||||
C << "<font color='maroon'><i>Click on the moderators's name to reply.</i></font>"
|
||||
src << "<font color='blue'>Mod PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
|
||||
else
|
||||
C << "<font color='red' size='4'><b>-- Administrator private message --</b></font>"
|
||||
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 0)]</b>: [msg]</font>"
|
||||
C << "<font color='red'><i>Click on the administrator's name to reply.</i></font>"
|
||||
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
|
||||
|
||||
//always play non-admin recipients the adminhelp sound
|
||||
C << 'sound/effects/adminhelp.ogg'
|
||||
|
||||
//AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
|
||||
if(config.popup_admin_pm)
|
||||
spawn() //so we don't hold the caller proc up
|
||||
var/sender = src
|
||||
var/sendername = key
|
||||
var/reply = input(C, msg,"Admin PM from-[sendername]", "") as text|null //show message and await a reply
|
||||
if(C && reply)
|
||||
if(sender)
|
||||
C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
|
||||
else
|
||||
adminhelp(reply) //sender has left, adminhelp instead
|
||||
return
|
||||
|
||||
else //neither are admins
|
||||
src << "<font color='red'>Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.</font>"
|
||||
return
|
||||
*/
|
||||
|
||||
log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]")
|
||||
//we don't use message_admins here because the sender/receiver might get it too
|
||||
for(var/client/X in admins)
|
||||
@@ -221,15 +170,15 @@
|
||||
continue
|
||||
if(X.key != key && X.key != C.key)
|
||||
switch(type)
|
||||
if("Question")
|
||||
if("Mentorhelp")
|
||||
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob))
|
||||
X << "<B><font color='blue'>[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]:</B> \blue [msg]</font>"
|
||||
if("Player Complaint")
|
||||
X << "<span class='mentorhelp'>[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]</span>"
|
||||
if("Adminhelp")
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
|
||||
X << "<B><font color='blue'>[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]:</B> \blue [msg]</font>"
|
||||
X << "<span class='danger'>[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]</span>"
|
||||
else
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
|
||||
X << "<B><font color='blue'>[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]:</B> \blue [msg]</font>"
|
||||
X << "<span class='boldnotice'>[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [msg]</span>"
|
||||
|
||||
/client/proc/cmd_admin_irc_pm()
|
||||
if(prefs.muted & MUTE_ADMINHELP)
|
||||
|
||||
@@ -311,7 +311,7 @@
|
||||
user << "<span class='notice'>You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.</span>"
|
||||
name = "blood-red hardsuit helmet"
|
||||
desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
|
||||
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
|
||||
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
cold_protection = HEAD
|
||||
set_light(brightness_on)
|
||||
@@ -319,7 +319,7 @@
|
||||
user << "<span class='notice'>You switch your helmet to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.</span>"
|
||||
name = "blood-red hardsuit helmet (combat)"
|
||||
desc = "A dual-mode advanced helmet designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
|
||||
flags = BLOCKHAIR | THICKMATERIAL
|
||||
flags = BLOCKHAIR | THICKMATERIAL | NODROP
|
||||
flags_inv = HIDEEARS
|
||||
cold_protection = null
|
||||
set_light(0)
|
||||
@@ -348,7 +348,7 @@
|
||||
on = !on
|
||||
if(on)
|
||||
user << "<span class='notice'>You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.</span>"
|
||||
name = "blood-red hardsuit helmet"
|
||||
name = "blood-red hardsuit"
|
||||
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
|
||||
slowdown = 1
|
||||
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
|
||||
@@ -356,7 +356,7 @@
|
||||
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
|
||||
else
|
||||
user << "<span class='notice'>You switch your hardsuit to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.</span>"
|
||||
name = "blood-red hardsuit helmet (combat)"
|
||||
name = "blood-red hardsuit (combat)"
|
||||
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
|
||||
slowdown = 0
|
||||
flags = THICKMATERIAL
|
||||
@@ -379,6 +379,15 @@
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/head/helmet/space/rig/syndi/elite/attack_self(mob/user)
|
||||
..()
|
||||
if(on)
|
||||
name = "elite syndicate hardsuit helmet"
|
||||
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders."
|
||||
else
|
||||
name = "elite syndicate hardsuit helmet (combat)"
|
||||
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
|
||||
|
||||
/obj/item/clothing/suit/space/rig/syndi/elite
|
||||
name = "elite syndicate hardsuit"
|
||||
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode."
|
||||
@@ -389,6 +398,15 @@
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/suit/space/rig/syndi/elite/attack_self(mob/user)
|
||||
..()
|
||||
if(on)
|
||||
name = "elite syndicate hardsuit"
|
||||
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders."
|
||||
else
|
||||
name = "elite syndicate hardsuit (combat)"
|
||||
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
|
||||
|
||||
//Wizard Rig
|
||||
/obj/item/clothing/head/helmet/space/rig/wizard
|
||||
name = "gem-encrusted hardsuit helmet"
|
||||
|
||||
@@ -154,7 +154,7 @@ var/list/event_last_fired = list()
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 150)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ion_storm, 0, list(ASSIGNMENT_AI = 50, ASSIGNMENT_CYBORG = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Borer Infestation", /datum/event/borer_infestation, 20, list(ASSIGNMENT_SECURITY = 20), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Borer Infestation", /datum/event/borer_infestation, 40, list(ASSIGNMENT_SECURITY = 30), 1),
|
||||
//new /datum/event_meta/ninja(EVENT_LEVEL_MODERATE, "Space Ninja", /datum/event/space_ninja, 0, list(ASSIGNMENT_SECURITY = 15), 1),
|
||||
// NON-BAY EVENTS
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Mass Hallucination", /datum/event/mass_hallucination, 300),
|
||||
|
||||
@@ -332,6 +332,8 @@
|
||||
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800),
|
||||
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
|
||||
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1000),
|
||||
new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/device/mobcapsule, 800),
|
||||
new /datum/data/mining_equipment("Lazarus Capsule belt",/obj/item/weapon/storage/belt/lazarus, 200),
|
||||
new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 2000),
|
||||
new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 2000),
|
||||
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
|
||||
|
||||
@@ -192,3 +192,61 @@
|
||||
icon_opened = "miningcaropen"
|
||||
icon_closed = "miningcar"
|
||||
|
||||
/*********************Mob Capsule*************************/
|
||||
|
||||
/obj/item/device/mobcapsule
|
||||
name = "lazarus capsule"
|
||||
desc = "It allows you to store and deploy lazarus-injected creatures easier."
|
||||
icon = 'icons/obj/mobcap.dmi'
|
||||
icon_state = "mobcap0"
|
||||
w_class = 1.0
|
||||
throw_range = 20
|
||||
var/mob/living/simple_animal/captured = null
|
||||
var/colorindex = 0
|
||||
|
||||
/obj/item/device/mobcapsule/Destroy()
|
||||
if(captured)
|
||||
qdel(captured)
|
||||
captured = null
|
||||
return ..()
|
||||
|
||||
/obj/item/device/mobcapsule/attack(var/atom/A, mob/user, prox_flag)
|
||||
if(!istype(A, /mob/living/simple_animal))
|
||||
return ..()
|
||||
capture(A, user)
|
||||
return 1
|
||||
|
||||
/obj/item/device/mobcapsule/proc/capture(var/mob/target, var/mob/U as mob)
|
||||
var/mob/living/simple_animal/T = target
|
||||
if(captured)
|
||||
U << "<span class='notice'>Capture failed!</span>: The capsule already has a mob registered to it!"
|
||||
else
|
||||
if(istype(T) && "neutral" in T.faction)
|
||||
T.forceMove(src)
|
||||
T.name = "[U.name]'s [initial(T.name)]"
|
||||
T.cancel_camera()
|
||||
name = "Lazarus Capsule: [initial(T.name)]"
|
||||
U << "<span class='notice'>You placed a [T.name] inside the Lazarus Capsule!</span>"
|
||||
captured = T
|
||||
else
|
||||
U << "You can't capture that mob!"
|
||||
|
||||
/obj/item/device/mobcapsule/throw_impact(atom/A, mob/user)
|
||||
..()
|
||||
if(captured)
|
||||
dump_contents(user)
|
||||
|
||||
/obj/item/device/mobcapsule/proc/dump_contents(mob/user)
|
||||
if(captured)
|
||||
captured.forceMove(get_turf(src))
|
||||
if(captured.client)
|
||||
captured.client.eye = captured.client.mob
|
||||
captured.client.perspective = MOB_PERSPECTIVE
|
||||
captured = null
|
||||
|
||||
/obj/item/device/mobcapsule/attack_self(mob/user)
|
||||
colorindex += 1
|
||||
if(colorindex >= 6)
|
||||
colorindex = 0
|
||||
icon_state = "mobcap[colorindex]"
|
||||
update_icon()
|
||||
@@ -264,19 +264,27 @@
|
||||
playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
if(!player_logged)
|
||||
M.visible_message( \
|
||||
"\blue [M] shakes [src] trying to wake [t_him] up!", \
|
||||
"\blue You shake [src] trying to wake [t_him] up!", \
|
||||
"<span class='notice'>[M] shakes [src] trying to wake [t_him] up!</span>",\
|
||||
"<span class='notice'>You shake [src] trying to wake [t_him] up!</span>",\
|
||||
)
|
||||
// BEGIN HUGCODE - N3X
|
||||
else
|
||||
if (istype(src,/mob/living/carbon/human) && src:w_uniform)
|
||||
var/mob/living/carbon/human/H = src
|
||||
H.w_uniform.add_fingerprint(M)
|
||||
playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
M.visible_message( \
|
||||
"\blue [M] gives [src] a [pick("hug","warm embrace")].", \
|
||||
"\blue You hug [src].", \
|
||||
if(M.zone_sel.selecting == "head")
|
||||
M.visible_message(\
|
||||
"<span class='notice'>[M] pats [src] on the head.</span>",\
|
||||
"<span class='notice'>You pat [src] on the head.</span>",\
|
||||
)
|
||||
else
|
||||
|
||||
M.visible_message(\
|
||||
"<span class='notice'>[M] gives [src] a [pick("hug","warm embrace")].</span>",\
|
||||
"<span class='notice'>You hug [src].</span>",\
|
||||
)
|
||||
if(istype(src,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.w_uniform)
|
||||
H.w_uniform.add_fingerprint(M)
|
||||
|
||||
|
||||
/mob/living/carbon/proc/eyecheck()
|
||||
@@ -771,4 +779,24 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
W.loc = loc
|
||||
W.dropped(src)
|
||||
if (W)
|
||||
W.layer = initial(W.layer)
|
||||
W.layer = initial(W.layer)
|
||||
|
||||
|
||||
/mob/living/carbon/proc/slip(var/description, var/stun, var/weaken, var/tilesSlipped, var/walkSafely, var/slipAny)
|
||||
if (flying || buckled || (walkSafely && m_intent == "walk"))
|
||||
return
|
||||
if (!(slipAny))
|
||||
if (istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if ((isobj(H.shoes) && H.shoes.flags & NOSLIP) || H.species.bodyflags & FEET_NOSLIP)
|
||||
return
|
||||
if (tilesSlipped)
|
||||
for(var/t = 0, t<=tilesSlipped, t++)
|
||||
spawn (t) step(src, src.dir)
|
||||
stop_pulling()
|
||||
src << "<span class='notice'>You slipped on the [description]!</span>"
|
||||
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
|
||||
if (stun)
|
||||
Stun(stun)
|
||||
Weaken(weaken)
|
||||
return 1
|
||||
|
||||
@@ -441,8 +441,7 @@
|
||||
/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
|
||||
if (health > -100)
|
||||
|
||||
if(stat != DEAD)
|
||||
M.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>The [M.name] glomps [src]!</span>", \
|
||||
"<span class='userdanger'>The [M.name] glomps [src]!</span>")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//Updates the mob's health from organs and mob damage variables
|
||||
/mob/living/carbon/human/updatehealth()
|
||||
if(status_flags & GODMODE)
|
||||
health = 100
|
||||
health = maxHealth
|
||||
stat = CONSCIOUS
|
||||
return
|
||||
|
||||
@@ -12,15 +12,15 @@
|
||||
total_brute += O.brute_dam //calculates health based on organ brute and burn
|
||||
total_burn += O.burn_dam
|
||||
|
||||
health = 100 - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
|
||||
health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
|
||||
|
||||
//TODO: fix husking
|
||||
if(((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) //100 is the magic human max health number
|
||||
ChangeToHusk() //BECAUSE NO ONE THOUGHT TO USE LIVING/VAR/MAXHEALTH I GUESS
|
||||
if(((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD)
|
||||
ChangeToHusk()
|
||||
if(species.can_revive_by_healing)
|
||||
var/obj/item/organ/internal/brain/B = get_int_organ(/obj/item/organ/internal/brain)
|
||||
if(B)
|
||||
if((health >= (config.health_threshold_dead / 100 * 75)) && stat == DEAD)
|
||||
if((health >= (config.health_threshold_dead + config.health_threshold_crit) * 0.5) && stat == DEAD)
|
||||
update_revive()
|
||||
if(stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix
|
||||
update_revive()
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
|
||||
|
||||
|
||||
var/health_deficiency = (100 - health + staminaloss)
|
||||
var/health_deficiency = (maxHealth - health + staminaloss)
|
||||
if(reagents)
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
if(R.shock_reduction)
|
||||
|
||||
@@ -295,14 +295,14 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
|
||||
if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage)
|
||||
|
||||
/mob/living/carbon/human/breathe()
|
||||
if(reagents.has_reagent("lexorin"))
|
||||
|
||||
if((NO_BREATH in mutations) || (species && (species.flags & NO_BREATHE)) || reagents.has_reagent("lexorin"))
|
||||
adjustOxyLoss(-5)
|
||||
oxygen_alert = 0
|
||||
toxins_alert = 0
|
||||
return
|
||||
if(NO_BREATH in mutations)
|
||||
return // No breath mutation means no breathing. //DID YOU REALLY NEED TO FUCKING STATE THIS?
|
||||
if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
|
||||
return
|
||||
if(species && (species.flags & NO_BREATHE))
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/environment
|
||||
if(loc)
|
||||
|
||||
@@ -18,6 +18,12 @@
|
||||
heat_level_2 = 400 // Heat damage level 2 above this point.
|
||||
heat_level_3 = 500 // Heat damage level 3 above this point.
|
||||
|
||||
suicide_messages = list(
|
||||
"is twisting their own neck!",
|
||||
"is letting some O2 in!",
|
||||
"realizes the existential problem of being made out of plasma!",
|
||||
"shows their true colors, which happens to be the color of plasma!")
|
||||
|
||||
/datum/species/plasmaman/say_filter(mob/M, message, datum/language/speaking)
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
message = replacetext(message, "s", stutter("ss"))
|
||||
|
||||
@@ -31,8 +31,31 @@
|
||||
heat_level_2 = 999999999
|
||||
heat_level_3 = 999999999
|
||||
heat_level_3_breathe = 999999999
|
||||
|
||||
|
||||
suicide_messages = list(
|
||||
"is snapping their own bones!",
|
||||
"is collapsing into a pile!",
|
||||
"is twisting their skull off!")
|
||||
"is twisting their skull off!")
|
||||
has_organ = list(
|
||||
"brain" = /obj/item/organ/brain/golem,
|
||||
)
|
||||
|
||||
/datum/species/skeleton/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
|
||||
// Crazylemon is still silly
|
||||
if(R.id == "milk")
|
||||
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.organs.Copy()
|
||||
shuffle(our_organs)
|
||||
for(var/obj/item/organ/external/L in our_organs)
|
||||
if(istype(L))
|
||||
if(L.brute_dam < L.min_broken_damage)
|
||||
L.status &= ~ORGAN_BROKEN
|
||||
L.status &= ~ORGAN_SPLINTED
|
||||
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
|
||||
|
||||
return ..()
|
||||
@@ -392,7 +392,7 @@
|
||||
H.see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
if(H.mind && H.mind.vampire)
|
||||
if(VAMP_VISION in H.mind.vampire.powers && !(VAMP_FULL in H.mind.vampire.powers))
|
||||
if((VAMP_VISION in H.mind.vampire.powers) && (!(VAMP_FULL in H.mind.vampire.powers)))
|
||||
H.sight |= SEE_MOBS
|
||||
|
||||
else if(VAMP_FULL in H.mind.vampire.powers)
|
||||
@@ -619,4 +619,11 @@ It'll return null if the organ doesn't correspond, so include null checks when u
|
||||
/datum/species/proc/return_organ(var/organ_slot)
|
||||
if(!(organ_slot in has_organ))
|
||||
return null
|
||||
return has_organ[organ_slot]
|
||||
return has_organ[organ_slot]
|
||||
|
||||
// Do species-specific reagent handling here
|
||||
// Return 1 if it should do normal processing too
|
||||
// Return 0 if it shouldn't deplete and do its normal effect
|
||||
// Other return values will cause weird badness
|
||||
/datum/species/proc/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
|
||||
return 1
|
||||
@@ -182,6 +182,13 @@
|
||||
blood_color = "#1D2CBF"
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
suicide_messages = list(
|
||||
"is attempting to bite their tongue off!",
|
||||
"is jamming their thumbs into their eye sockets!",
|
||||
"is twisting their own neck!",
|
||||
"makes like a fish and suffocates!",
|
||||
"is strangling themselves with their own tendrils!")
|
||||
|
||||
/datum/species/vox
|
||||
name = "Vox"
|
||||
name_plural = "Vox"
|
||||
@@ -374,7 +381,8 @@
|
||||
|
||||
suicide_messages = list(
|
||||
"is melting into a puddle!",
|
||||
"is turning a dull, brown color and melting into a puddle!")
|
||||
"is turning a dull, brown color and melting into a puddle!",
|
||||
"is ripping out their own core!")
|
||||
|
||||
/datum/species/grey
|
||||
name = "Grey"
|
||||
@@ -478,7 +486,8 @@
|
||||
|
||||
suicide_messages = list(
|
||||
"is losing branches!",
|
||||
"is pulling themselves apart!")
|
||||
"is pulling themselves apart!",
|
||||
"pulls out a secret stash of herbicide and takes a hearty swig!")
|
||||
|
||||
/datum/species/diona/can_understand(var/mob/other)
|
||||
var/mob/living/simple_animal/diona/D = other
|
||||
@@ -577,7 +586,9 @@
|
||||
"is powering down!",
|
||||
"is smashing their own monitor!",
|
||||
"is twisting their own neck!",
|
||||
"is blocking their ventilation port!")
|
||||
"is blocking their ventilation port!",
|
||||
"is downloading extra RAM!",
|
||||
"is frying their own circuits!")
|
||||
|
||||
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
|
||||
H.h_style = ""
|
||||
|
||||
@@ -462,7 +462,9 @@ var/global/list/damage_icon_parts = list()
|
||||
if(hair_style && hair_style.species_allowed)
|
||||
if(src.species.name in hair_style.species_allowed)
|
||||
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
|
||||
if(hair_style.do_colouration)
|
||||
if(src.get_species() == "Slime People") // I am el worstos
|
||||
hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND)
|
||||
else if(hair_style.do_colouration)
|
||||
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
|
||||
|
||||
hair_standing.Blend(hair_s, ICON_OVERLAY)
|
||||
@@ -497,7 +499,9 @@ var/global/list/damage_icon_parts = list()
|
||||
if(facial_hair_style && facial_hair_style.species_allowed)
|
||||
if(src.species.name in facial_hair_style.species_allowed)
|
||||
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
|
||||
if(facial_hair_style.do_colouration)
|
||||
if(src.get_species() == "Slime People") // I am el worstos
|
||||
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND)
|
||||
else if(facial_hair_style.do_colouration)
|
||||
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
||||
face_standing.Blend(facial_s, ICON_OVERLAY)
|
||||
else
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/mob/living/Destroy()
|
||||
..()
|
||||
return QDEL_HINT_HARDDEL_NOW
|
||||
|
||||
|
||||
/mob/living/Stat()
|
||||
. = ..()
|
||||
if(. && get_rig_stats)
|
||||
@@ -34,11 +34,17 @@
|
||||
/mob/living/verb/succumb()
|
||||
set hidden = 1
|
||||
if (InCritical())
|
||||
src.attack_log += "[src] has ["succumbed to death"] with [round(health, 0.1)] points of health!"
|
||||
src.adjustOxyLoss(src.health - config.health_threshold_dead)
|
||||
attack_log += "[src] has ["succumbed to death"] with [round(health, 0.1)] points of health!"
|
||||
adjustOxyLoss(health - config.health_threshold_dead)
|
||||
updatehealth()
|
||||
// super check for weird mobs, including ones that adjust hp
|
||||
// we don't want to go overboard and gib them, though
|
||||
for(var/i = 1 to 5)
|
||||
if(health < config.health_threshold_dead)
|
||||
break
|
||||
take_overall_damage(max(5, health - config.health_threshold_dead), 0)
|
||||
updatehealth()
|
||||
src << "<span class='notice'>You have given up life and succumbed to death.</span>"
|
||||
death()
|
||||
|
||||
/mob/living/proc/InCritical()
|
||||
return (src.health < 0 && src.health > -95.0 && stat == UNCONSCIOUS)
|
||||
|
||||
@@ -71,7 +71,6 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
var/mob/living/silicon/ai/parent = null
|
||||
|
||||
var/apc_override = 0 //hack for letting the AI use its APC even when visionless
|
||||
var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through.
|
||||
var/datum/trackable/track = null
|
||||
var/last_paper_seen = null
|
||||
|
||||
@@ -135,10 +135,8 @@
|
||||
src << "Receiving control information from APC."
|
||||
sleep(2)
|
||||
//bring up APC dialog
|
||||
apc_override = 1
|
||||
theAPC.attack_ai(src)
|
||||
apc_override = 0
|
||||
aiRestorePowerRoutine = 3
|
||||
theAPC.attack_ai(src)
|
||||
src << "Here are your current laws:"
|
||||
src.show_laws() //WHY THE FUCK IS THIS HERE
|
||||
sleep(50)
|
||||
|
||||
@@ -78,21 +78,6 @@
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
/mob/living/simple_animal/construct/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
|
||||
if(O.force)
|
||||
var/damage = O.force
|
||||
if (O.damtype == STAMINA)
|
||||
damage = 0
|
||||
adjustBruteLoss(damage)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b [src] has been attacked with [O] by [user]. ")
|
||||
else
|
||||
usr << "\red This weapon is ineffective, it does no damage."
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red [user] gently taps [src] with [O]. ")
|
||||
|
||||
|
||||
/mob/living/simple_animal/construct/narsie_act()
|
||||
return
|
||||
@@ -120,26 +105,7 @@
|
||||
attack_sound = 'sound/weapons/punch3.ogg'
|
||||
status_flags = 0
|
||||
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall)
|
||||
|
||||
/mob/living/simple_animal/construct/armoured/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
|
||||
if(O.force)
|
||||
if(O.force >= 11)
|
||||
var/damage = O.force
|
||||
if (O.damtype == STAMINA)
|
||||
damage = 0
|
||||
adjustBruteLoss(damage)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b [src] has been attacked with [O] by [user]. ")
|
||||
else
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b [O] bounces harmlessly off of [src]. ")
|
||||
else
|
||||
usr << "\red This weapon is ineffective, it does no damage."
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red [user] gently taps [src] with [O]. ")
|
||||
force_threshold = 11
|
||||
|
||||
|
||||
/mob/living/simple_animal/construct/armoured/Life()
|
||||
@@ -245,30 +211,10 @@
|
||||
speed = 5
|
||||
environment_smash = 2
|
||||
attack_sound = 'sound/weapons/punch4.ogg'
|
||||
force_threshold = 11
|
||||
var/energy = 0
|
||||
var/max_energy = 1000
|
||||
|
||||
/mob/living/simple_animal/construct/behemoth/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
|
||||
if(O.force)
|
||||
if(O.force >= 11)
|
||||
var/damage = O.force
|
||||
if (O.damtype == STAMINA)
|
||||
damage = 0
|
||||
adjustBruteLoss(damage)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b [src] has been attacked with [O] by [user]. ")
|
||||
else
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b [O] bounces harmlessly off of [src]. ")
|
||||
else
|
||||
usr << "\red This weapon is ineffective, it does no damage."
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red [user] gently taps [src] with [O]. ")
|
||||
|
||||
|
||||
|
||||
/////////////////////////////Harvester/////////////////////////
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
density = 0
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
ventcrawler = 2
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
meat_amount = 0
|
||||
|
||||
/mob/living/simple_animal/butterfly/New()
|
||||
..()
|
||||
|
||||
@@ -20,3 +20,5 @@
|
||||
density = 0
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
can_hide = 1
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
meat_amount = 1
|
||||
|
||||
@@ -414,7 +414,7 @@
|
||||
else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
|
||||
if(istype(O, /obj/item/weapon/kitchen/knife))
|
||||
harvest()
|
||||
else
|
||||
else if(istype(O) && istype(user) && !O.attack(src, user))
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
var/damage = 0
|
||||
|
||||
@@ -257,15 +257,21 @@ datum/preferences
|
||||
preview_icon.Blend(markings_s, ICON_OVERLAY)
|
||||
|
||||
|
||||
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s")
|
||||
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
|
||||
var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s")
|
||||
if(!(current_species.bodyflags & NO_EYES))
|
||||
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s")
|
||||
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
|
||||
face_s.Blend(eyes_s, ICON_OVERLAY)
|
||||
|
||||
|
||||
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
|
||||
if(hair_style)
|
||||
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
|
||||
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
|
||||
eyes_s.Blend(hair_s, ICON_OVERLAY)
|
||||
if(current_species.name == "Slime People") // whee I am part of the problem
|
||||
hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
|
||||
else
|
||||
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
|
||||
face_s.Blend(hair_s, ICON_OVERLAY)
|
||||
|
||||
//Head Accessory
|
||||
if(current_species && (current_species.bodyflags & HAS_HEAD_ACCESSORY))
|
||||
@@ -273,13 +279,16 @@ datum/preferences
|
||||
if(head_accessory_style && head_accessory_style.species_allowed)
|
||||
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
|
||||
head_accessory_s.Blend(rgb(r_headacc, g_headacc, b_headacc), ICON_ADD)
|
||||
eyes_s.Blend(head_accessory_s, ICON_OVERLAY)
|
||||
face_s.Blend(head_accessory_s, ICON_OVERLAY)
|
||||
|
||||
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
|
||||
if(facial_hair_style && facial_hair_style.species_allowed)
|
||||
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
|
||||
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
||||
eyes_s.Blend(facial_s, ICON_OVERLAY)
|
||||
if(current_species.name == "Slime People") // whee I am part of the problem
|
||||
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
|
||||
else
|
||||
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
||||
face_s.Blend(facial_s, ICON_OVERLAY)
|
||||
|
||||
var/icon/underwear_s = null
|
||||
if(underwear && (current_species.clothing_flags & HAS_UNDERWEAR))
|
||||
@@ -829,12 +838,11 @@ datum/preferences
|
||||
preview_icon.Blend(socks_s, ICON_OVERLAY)
|
||||
if(clothes_s)
|
||||
preview_icon.Blend(clothes_s, ICON_OVERLAY)
|
||||
if(!(current_species.bodyflags & NO_EYES))
|
||||
preview_icon.Blend(eyes_s, ICON_OVERLAY)
|
||||
preview_icon.Blend(face_s, ICON_OVERLAY)
|
||||
preview_icon_front = new(preview_icon, dir = SOUTH)
|
||||
preview_icon_side = new(preview_icon, dir = WEST)
|
||||
|
||||
qdel(eyes_s)
|
||||
qdel(face_s)
|
||||
qdel(underwear_s)
|
||||
qdel(undershirt_s)
|
||||
qdel(socks_s)
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
|
||||
|
||||
// Restrict some styles to specific species
|
||||
var/list/species_allowed = list("Human")
|
||||
var/list/species_allowed = list("Human", "Slime People")
|
||||
|
||||
// Whether or not the accessory can be affected by colouration
|
||||
var/do_colouration = 1
|
||||
@@ -485,7 +485,7 @@
|
||||
name = "Shaved"
|
||||
icon_state = "bald"
|
||||
gender = NEUTER
|
||||
species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Diona","Kidan","Greys","Machine", "Vulpkanin")
|
||||
species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Diona","Kidan","Greys","Machine", "Vulpkanin", "Slime People")
|
||||
|
||||
|
||||
watson
|
||||
@@ -631,6 +631,11 @@
|
||||
species_allowed = list("Skrell")
|
||||
gender = FEMALE
|
||||
|
||||
taj_ears
|
||||
name = "Tajaran Ears"
|
||||
icon_state = "ears_plain"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_ears_clean
|
||||
name = "Tajara Clean"
|
||||
icon_state = "hair_clean"
|
||||
|
||||
@@ -32,6 +32,9 @@
|
||||
|
||||
/mob/living/silicon/ai/default_can_use_topic(var/src_object)
|
||||
. = shared_nano_interaction()
|
||||
// Fix the weird hacking blurb to actually let them restore power
|
||||
if(aiRestorePowerRoutine == 3 && istype(src_object, /obj/machinery/power/apc))
|
||||
return STATUS_INTERACTIVE
|
||||
if(. != STATUS_INTERACTIVE)
|
||||
return
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
var/mob/living/silicon/robot/R = src.loc
|
||||
if(R && R.cell)
|
||||
R.cell.use(charge_cost)
|
||||
in_chamber = new/obj/item/projectile/beam(src)
|
||||
in_chamber = new projectile_type(src)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -203,16 +203,13 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
charge_cost = 5000
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell/emproof"
|
||||
fire_delay = 16 //Because guncode is bad and you can bug the reload for rapid fire otherwise.
|
||||
var/overheat = 0
|
||||
var/overheat_time = 16
|
||||
var/recent_reload = 1
|
||||
var/recently_fired = 0
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/super
|
||||
name = "super-kinetic accelerator"
|
||||
desc = "An upgraded, superior version of the proto-kinetic accelerator."
|
||||
icon_state = "kineticgun_u"
|
||||
projectile_type = "/obj/item/projectile/kinetic/super"
|
||||
overheat_time = 15
|
||||
fire_delay = 15
|
||||
origin_tech = "combat=3;powerstorage=2"
|
||||
|
||||
@@ -221,7 +218,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
desc = "An upgraded, even more superior version of the proto-kinetic accelerator."
|
||||
icon_state = "kineticgun_h"
|
||||
projectile_type = "/obj/item/projectile/kinetic/hyper"
|
||||
overheat_time = 13
|
||||
fire_delay = 13
|
||||
origin_tech = "combat=4;powerstorage=3"
|
||||
|
||||
@@ -229,26 +225,23 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/Fire()
|
||||
overheat = 1
|
||||
spawn(overheat_time)
|
||||
overheat = 0
|
||||
recent_reload = 0
|
||||
if(!recently_fired)
|
||||
recently_fired = 1
|
||||
spawn(fire_delay)
|
||||
reload(usr)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/attack_self(var/mob/living/user/L)
|
||||
if(overheat || recent_reload)
|
||||
return
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload(mob/living/user)
|
||||
power_supply.give(5000)
|
||||
if(!silenced)
|
||||
playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
|
||||
else
|
||||
else if(user)
|
||||
usr << "<span class='warning'>You silently charge [src].<span>"
|
||||
recent_reload = 1
|
||||
recently_fired = 0
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
|
||||
name = "mini energy crossbow"
|
||||
@@ -261,7 +254,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
silenced = 1
|
||||
projectile_type = "/obj/item/projectile/energy/bolt"
|
||||
fire_sound = 'sound/weapons/Genhit.ogg'
|
||||
overheat_time = 20
|
||||
fire_delay = 20
|
||||
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large
|
||||
|
||||
@@ -578,7 +578,7 @@
|
||||
if (count <= 0) return
|
||||
var/amount_per_pill = reagents.total_volume/count
|
||||
if (amount_per_pill > 50) amount_per_pill = 50
|
||||
var/name = input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)") as text|null
|
||||
var/name = input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill]u)") as text|null
|
||||
if(!name)
|
||||
return
|
||||
name = reject_bad_text(name)
|
||||
@@ -618,7 +618,7 @@
|
||||
if (count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines?
|
||||
var/amount_per_patch = reagents.total_volume/count
|
||||
if (amount_per_patch > 40) amount_per_patch = 40
|
||||
var/name = input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch] units)") as text|null
|
||||
var/name = input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch]u)") as text|null
|
||||
if(!name)
|
||||
return
|
||||
name = reject_bad_text(name)
|
||||
|
||||
@@ -165,6 +165,10 @@
|
||||
addiction_threshold = 10
|
||||
metabolization_rate = 0.6
|
||||
|
||||
/datum/reagent/methamphetamine/meth2 //for donk pockets
|
||||
id = "methamphetamine2"
|
||||
addiction_threshold = 20
|
||||
|
||||
/datum/reagent/methamphetamine/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.")
|
||||
|
||||
@@ -32,9 +32,14 @@ datum/reagents/proc/metabolize(var/mob/M)
|
||||
//Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
|
||||
if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
|
||||
can_process = 1
|
||||
|
||||
//If handle_reagents returns 0, it's doing the reagent removal on its own
|
||||
var/species_handled = !(H.species.handle_reagents(H, R))
|
||||
can_process = can_process && !species_handled
|
||||
//If the mob can't process it, remove the reagent at it's normal rate without doing any addictions, overdoses, or on_mob_life() for the reagent
|
||||
if(can_process == 0)
|
||||
R.holder.remove_reagent(R.id, R.metabolization_rate)
|
||||
if(!species_handled)
|
||||
R.holder.remove_reagent(R.id, R.metabolization_rate)
|
||||
continue
|
||||
//We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption)
|
||||
else
|
||||
|
||||
@@ -223,9 +223,18 @@
|
||||
M.fakevomit(1)
|
||||
else
|
||||
M.fakevomit(0)
|
||||
..()
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/fishwater/toiletwater
|
||||
name = "Toilet Water"
|
||||
id = "toiletwater"
|
||||
description = "Filthy water scoured from a nasty toilet bowl. Absolutely disgusting."
|
||||
reagent_state = LIQUID
|
||||
color = "#757547"
|
||||
|
||||
/datum/reagent/fishwater/toiletwater/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //For shennanigans
|
||||
return
|
||||
|
||||
/datum/reagent/holywater
|
||||
name = "Water"
|
||||
|
||||
@@ -12,9 +12,13 @@
|
||||
set name = "Set transfer amount"
|
||||
set category = "Object"
|
||||
set src in range(0)
|
||||
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
return
|
||||
var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
|
||||
var/default = null
|
||||
if(amount_per_transfer_from_this in possible_transfer_amounts)
|
||||
default = amount_per_transfer_from_this
|
||||
var/N = input("Amount per transfer from this:", "[src]", default) as null|anything in possible_transfer_amounts
|
||||
if (N)
|
||||
amount_per_transfer_from_this = N
|
||||
|
||||
|
||||
@@ -834,7 +834,7 @@
|
||||
reagents.add_reagent("synaptizine", 15)
|
||||
reagents.add_reagent("salglu_solution", 15)
|
||||
reagents.add_reagent("salbutamol", 15)
|
||||
reagents.add_reagent("methamphetamine", 15)
|
||||
reagents.add_reagent("methamphetamine2", 15)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/brainburger
|
||||
name = "brainburger"
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
/obj/structure/table,
|
||||
/obj/structure/closet,
|
||||
/obj/structure/sink,
|
||||
/obj/structure/toilet,
|
||||
/obj/item/weapon/storage,
|
||||
/obj/machinery/atmospherics/unary/cryo_cell,
|
||||
/obj/machinery/dna_scannernew,
|
||||
@@ -336,7 +337,7 @@
|
||||
materials = list(MAT_METAL=200)
|
||||
w_class = 3.0
|
||||
amount_per_transfer_from_this = 20
|
||||
possible_transfer_amounts = list(5,10,15,25,30,50,80,100,120)
|
||||
possible_transfer_amounts = list(5,10,15,20,25,30,50,80,100,120)
|
||||
volume = 120
|
||||
flags = OPENCONTAINER
|
||||
|
||||
|
||||
@@ -92,6 +92,7 @@
|
||||
icon_state = "weldtank"
|
||||
amount_per_transfer_from_this = 10
|
||||
var/obj/item/device/assembly_holder/rig = null
|
||||
var/accepts_rig = 1
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/New()
|
||||
..()
|
||||
@@ -126,7 +127,7 @@
|
||||
overlays = new/list()
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
if (istype(W,/obj/item/device/assembly_holder))
|
||||
if (istype(W,/obj/item/device/assembly_holder) && accepts_rig)
|
||||
if (rig)
|
||||
user << "\red There is another device in the way."
|
||||
return ..()
|
||||
@@ -254,3 +255,9 @@
|
||||
/obj/structure/reagent_dispensers/spacecleanertank/New()
|
||||
..()
|
||||
reagents.add_reagent("cleaner",5000)
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/chem
|
||||
icon_state = "weldingtank_chem"
|
||||
anchored = 1
|
||||
density = 0
|
||||
accepts_rig = 0
|
||||
@@ -177,6 +177,7 @@ proc/CallMaterialName(ID)
|
||||
/obj/machinery/computer/rdconsole/emag_act(user as mob)
|
||||
if(!emagged)
|
||||
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
|
||||
req_access = list()
|
||||
emagged = 1
|
||||
user << "<span class='notice'>You disable the security protocols</span>"
|
||||
|
||||
|
||||
@@ -571,7 +571,11 @@ Note that amputating the affected organ does in fact remove the infection from t
|
||||
|
||||
if(!(status & ORGAN_ROBOT) && W.bleeding())
|
||||
W.bleed_timer--
|
||||
status |= ORGAN_BLEEDING
|
||||
if(H && (H.species.flags & NO_BLOOD)) // Bloodless organic races are finicky
|
||||
W.clamped = 1
|
||||
W.bleed_timer = 0
|
||||
else
|
||||
status |= ORGAN_BLEEDING
|
||||
|
||||
clamped |= W.clamped
|
||||
|
||||
|
||||
@@ -67,7 +67,9 @@ var/global/list/limb_icon_cache = list()
|
||||
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
|
||||
if(facial_hair_style && facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed))
|
||||
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
|
||||
if(facial_hair_style.do_colouration)
|
||||
if(species.name == "Slime People") // I am el worstos
|
||||
facial_s.Blend(rgb(owner.r_skin, owner.g_skin, owner.b_skin, 160), ICON_AND)
|
||||
else if(facial_hair_style.do_colouration)
|
||||
facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD)
|
||||
overlays |= facial_s
|
||||
|
||||
@@ -75,7 +77,9 @@ var/global/list/limb_icon_cache = list()
|
||||
var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style]
|
||||
if(hair_style && (species.name in hair_style.species_allowed))
|
||||
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
|
||||
if(hair_style.do_colouration)
|
||||
if(species.name == "Slime People") // I am el worstos
|
||||
hair_s.Blend(rgb(owner.r_skin, owner.g_skin, owner.b_skin, 160), ICON_AND)
|
||||
else if(hair_style.do_colouration)
|
||||
hair_s.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD)
|
||||
overlays |= hair_s
|
||||
|
||||
|
||||
Reference in New Issue
Block a user