mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 08:34:16 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into ImportentpAIUpdate
This commit is contained in:
@@ -5,88 +5,83 @@
|
||||
//////Allows admin's to right click on any mob/mech and freeze them in place.///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/client/proc/freeze(mob/living/M as mob in mob_list)
|
||||
var/global/list/frozen_mob_list = list()
|
||||
/client/proc/freeze(var/mob/living/M as mob in mob_list)
|
||||
set category = "Special Verbs"
|
||||
set name = "Freeze"
|
||||
if(!holder)
|
||||
src << "Only administrators may use this command."
|
||||
src << "<font color='red'>Error: Freeze: Only administrators may use this command.</font>"
|
||||
return
|
||||
if(!mob)
|
||||
return
|
||||
if(!istype(M))
|
||||
alert("Cannot freeze a ghost")
|
||||
return
|
||||
if(usr)
|
||||
if (usr.client)
|
||||
if(usr.client.holder)
|
||||
if (istype(M, /mob/living/carbon/slime))
|
||||
if(!M.paralysis)
|
||||
M.adjustToxLoss(2147483647)
|
||||
M.AdjustParalysis(2147483647)
|
||||
var/adminomaly = new/obj/effect/overlay/adminoverlay
|
||||
spawn(50)
|
||||
M.overlays += adminomaly
|
||||
M << "<b><font color= red>You have been frozen by <a href='?priv_msg=\ref[usr.client]'>[key]</a></b></font>"
|
||||
message_admins("\blue [key_name_admin(usr)] froze [key_name(M)]")
|
||||
log_admin("[key_name(usr)] froze [key_name(M)]")
|
||||
else if (M.paralysis)
|
||||
M.AdjustParalysis(-2147483647)
|
||||
M.blinded = 0
|
||||
M.lying = 0
|
||||
M.stat = 0
|
||||
M << "<b> <font color= red>You have been unfrozen by <a href='?priv_msg=\ref[usr.client]'>[key]</a></b></font>"
|
||||
message_admins("\blue [key_name_admin(usr)] unfroze [key_name(M)]")
|
||||
log_admin("[key_name(usr)] unfroze [key_name(M)]")
|
||||
M.revive()
|
||||
else if (istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/FM = M
|
||||
if(!istype(M)) return
|
||||
if(!check_rights(R_ADMIN)) return
|
||||
if(M in frozen_mob_list)
|
||||
M.admin_unFreeze(src)
|
||||
else
|
||||
M.admin_Freeze(src)
|
||||
|
||||
if(!FM.paralysis)
|
||||
FM.anchored = 1
|
||||
FM.frozen = 1
|
||||
FM.AdjustParalysis(2147483647)
|
||||
var/adminomaly = new/obj/effect/overlay/adminoverlay
|
||||
spawn(50)
|
||||
FM.overlays += adminomaly
|
||||
FM << "<b><font color= red>You have been frozen by <a href='?priv_msg=\ref[usr.client]'>[key]</a></b></font>"
|
||||
message_admins("\blue [key_name_admin(usr)] froze [key_name(FM)]")
|
||||
log_admin("[key_name(usr)] froze [key_name(FM)]")
|
||||
else if (M.paralysis)
|
||||
FM.anchored = 0
|
||||
FM.frozen = 0
|
||||
FM.AdjustParalysis(-2147483647)
|
||||
FM.blinded = 0
|
||||
FM.lying = 0
|
||||
FM.stat = 0
|
||||
///mob freeze procs
|
||||
|
||||
FM << "<b> <font color= red>You have been unfrozen by <a href='?priv_msg=\ref[usr.client]'>[key]</a></b></font>"
|
||||
message_admins("\blue [key_name_admin(usr)] unfroze [key_name(FM)]")
|
||||
log_admin("[key_name(usr)] unfroze [key_name(FM)]")
|
||||
/mob/living/var/frozen = 0 //used for preventing attacks on admin-frozen mobs
|
||||
/mob/living/var/admin_prev_sleeping = 0 //used for keeping track of previous sleeping value with admin freeze
|
||||
|
||||
else
|
||||
/mob/living/proc/admin_Freeze(var/client/admin)
|
||||
if(istype(admin))
|
||||
src << "<b><font color= red>You have been frozen by <a href='?priv_msg=\ref[admin]'>[admin.key]</a></b></font>"
|
||||
message_admins("\blue [key_name_admin(admin)] froze [key_name(src)]")
|
||||
log_admin("[key_name(admin)] froze [key_name(src)]")
|
||||
|
||||
if(!M.paralysis)
|
||||
M.anchored = 1
|
||||
M.AdjustParalysis(2147483647)
|
||||
var/adminomaly = new/obj/effect/overlay/adminoverlay
|
||||
spawn(50)
|
||||
M.overlays += adminomaly
|
||||
M << "<b><font color= red>You have been frozen by <a href='?priv_msg=\ref[usr.client]'>[key]</a></b></font>"
|
||||
message_admins("\blue [key_name_admin(usr)] froze [key_name(M)]")
|
||||
log_admin("[key_name(usr)] froze [key_name(M)]")
|
||||
else if (M.paralysis)
|
||||
M.anchored = 0
|
||||
M.AdjustParalysis(-2147483647)
|
||||
M.blinded = 0
|
||||
M.lying = 0
|
||||
M.stat = 0
|
||||
var/obj/effect/overlay/adminoverlay/AO = new
|
||||
src.overlays += AO
|
||||
|
||||
M << "<b> <font color= red>You have been unfrozen by <a href='?priv_msg=\ref[usr.client]'>[key]</a></b></font>"
|
||||
message_admins("\blue [key_name_admin(usr)] unfroze [key_name(M)]")
|
||||
log_admin("[key_name(usr)] unfroze [key_name(M)]")
|
||||
anchored = 1
|
||||
frozen = 1
|
||||
admin_prev_sleeping = sleeping
|
||||
sleeping += 20000
|
||||
if(!(src in frozen_mob_list))
|
||||
frozen_mob_list += src
|
||||
|
||||
/mob/living/proc/admin_unFreeze(var/client/admin)
|
||||
if(istype(admin))
|
||||
src << "<b><font color= red>You have been unfrozen by <a href='?priv_msg=\ref[usr.client]'>[key]</a></b></font>"
|
||||
message_admins("\blue [key_name_admin(admin)] unfroze [key_name(src)]")
|
||||
log_admin("[key_name(admin)] unfroze [key_name(src)]")
|
||||
|
||||
update_icons()
|
||||
|
||||
anchored = 0
|
||||
frozen = 0
|
||||
sleeping = admin_prev_sleeping
|
||||
admin_prev_sleeping = null
|
||||
if(src in frozen_mob_list)
|
||||
frozen_mob_list -= src
|
||||
|
||||
|
||||
/client/proc/freezemecha(obj/mecha/O as obj in mechas_list)
|
||||
/mob/living/carbon/slime/admin_Freeze(admin)
|
||||
..(admin)
|
||||
adjustToxLoss(1010101010) //arbitrary large value
|
||||
|
||||
/mob/living/carbon/slime/admin_unFreeze(admin)
|
||||
..(admin)
|
||||
adjustToxLoss(-1010101010)
|
||||
stat = 0
|
||||
revive()
|
||||
|
||||
|
||||
/mob/living/simple_animal/var/admin_prev_health = null
|
||||
|
||||
/mob/living/simple_animal/admin_Freeze(admin)
|
||||
..(admin)
|
||||
admin_prev_health = health
|
||||
health = 0
|
||||
|
||||
/mob/living/simple_animal/admin_unFreeze(admin)
|
||||
..(admin)
|
||||
revive()
|
||||
overlays.Cut()
|
||||
|
||||
//////////////////////////Freeze Mech
|
||||
|
||||
/client/proc/freezemecha(var/obj/mecha/O as obj in mechas_list)
|
||||
set category = "Special Verbs"
|
||||
set name = "Freeze Mech"
|
||||
if(!holder)
|
||||
|
||||
@@ -23,6 +23,21 @@
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/meson/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if (user.stat || user.restrained() || !ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(O, /obj/item/clothing/glasses/regular))
|
||||
H.unEquip(src)
|
||||
H.unEquip(O)
|
||||
var/obj/item/clothing/glasses/meson/prescription/P = new /obj/item/clothing/glasses/meson/prescription(get_turf(H))
|
||||
H << "You fit \the [src.name] with lenses from \the [O.name]."
|
||||
H.put_in_hands(P)
|
||||
qdel(O)
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/glasses/meson/night
|
||||
name = "Night Vision Optical Meson Scanner"
|
||||
desc = "An Optical Meson Scanner fitted with an amplified visible light spectrum overlay, providing greater visual clarity in darkness."
|
||||
@@ -31,6 +46,12 @@
|
||||
darkness_view = 8
|
||||
see_darkness = 0
|
||||
|
||||
/obj/item/clothing/glasses/meson/night/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(istype(O, /obj/item/clothing/glasses/regular))
|
||||
user << "\The [src.name] is too complex for you to fit with prescription lenses."
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/glasses/meson/prescription
|
||||
name = "prescription mesons"
|
||||
desc = "Optical Meson Scanner with prescription lenses."
|
||||
@@ -40,6 +61,24 @@
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/meson/prescription/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if (user.stat || user.restrained() || !ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(O, /obj/item/clothing/glasses/regular))
|
||||
H <<"You can't possibly imagine how adding more lenses would improve \the [src.name]."
|
||||
return
|
||||
if(istype(O, /obj/item/weapon/screwdriver))
|
||||
H.unEquip(src)
|
||||
var/obj/item/clothing/glasses/meson/M = new /obj/item/clothing/glasses/meson(get_turf(H))
|
||||
var/obj/item/clothing/glasses/regular/R = new /obj/item/clothing/glasses/regular(get_turf(H))
|
||||
H << "You salvage the prescription lenses from \the [src.name]."
|
||||
H.put_in_hands(M)
|
||||
H.put_in_hands(R)
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/glasses/meson/cyber
|
||||
name = "Eye Replacement Implant"
|
||||
desc = "An implanted replacement for a left eye with meson vision capabilities."
|
||||
@@ -145,6 +184,21 @@
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if (user.stat || user.restrained() || !ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(O, /obj/item/clothing/glasses/regular))
|
||||
H.unEquip(src)
|
||||
H.unEquip(O)
|
||||
var/obj/item/clothing/glasses/sunglasses/prescription/P = new /obj/item/clothing/glasses/sunglasses/prescription(get_turf(H))
|
||||
H << "You fit \the [src.name] with lenses from \the [O.name]."
|
||||
H.put_in_hands(P)
|
||||
qdel(O)
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/glasses/virussunglasses
|
||||
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
|
||||
name = "sunglasses"
|
||||
@@ -233,6 +287,12 @@
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/blindfold/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(istype(O, /obj/item/clothing/glasses/regular))
|
||||
user << "You doubt you can make a blindfold actually IMPROVE vision."
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/prescription
|
||||
name = "prescription sunglasses"
|
||||
prescription = 1
|
||||
@@ -241,6 +301,24 @@
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/prescription/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if (user.stat || user.restrained() || !ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(O, /obj/item/clothing/glasses/regular))
|
||||
H <<"You can't possibly imagine how adding more lenses would improve \the [src.name]."
|
||||
return
|
||||
if(istype(O, /obj/item/weapon/screwdriver))
|
||||
H.unEquip(src)
|
||||
var/obj/item/clothing/glasses/sunglasses/S = new /obj/item/clothing/glasses/sunglasses(get_turf(H))
|
||||
var/obj/item/clothing/glasses/regular/R = new /obj/item/clothing/glasses/regular(get_turf(H))
|
||||
H << "You salvage the prescription lenses from \the [src.name]."
|
||||
H.put_in_hands(S)
|
||||
H.put_in_hands(R)
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/big
|
||||
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks many flashes."
|
||||
icon_state = "bigsunglasses"
|
||||
@@ -265,6 +343,47 @@
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/sechud/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if (user.stat || user.restrained() || !ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(O, /obj/item/clothing/glasses/regular))
|
||||
H.unEquip(src)
|
||||
H.unEquip(O)
|
||||
var/obj/item/clothing/glasses/sunglasses/sechud/prescription/P = new /obj/item/clothing/glasses/sunglasses/sechud/prescription(get_turf(H))
|
||||
H << "You fit \the [src.name] with lenses from \the [O.name]."
|
||||
H.put_in_hands(P)
|
||||
qdel(O)
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/sechud/prescription
|
||||
name = "prescription HUDSunglasses"
|
||||
prescription = 1
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/sechud/prescription/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if (user.stat || user.restrained() || !ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(O, /obj/item/clothing/glasses/regular))
|
||||
H <<"You can't possibly imagine how adding more lenses would improve \the [src.name]."
|
||||
return
|
||||
if(istype(O, /obj/item/weapon/screwdriver))
|
||||
H.unEquip(src)
|
||||
var/obj/item/clothing/glasses/sunglasses/sechud/S = new /obj/item/clothing/glasses/sunglasses/sechud(get_turf(H))
|
||||
var/obj/item/clothing/glasses/regular/R = new /obj/item/clothing/glasses/regular(get_turf(H))
|
||||
H << "You salvage the prescription lenses from \the [src.name]."
|
||||
H.put_in_hands(S)
|
||||
H.put_in_hands(R)
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/glasses/thermal
|
||||
name = "Optical Thermal Scanner"
|
||||
desc = "Thermals in the shape of glasses."
|
||||
|
||||
@@ -122,6 +122,13 @@
|
||||
icon_state = "deus_blueshield"
|
||||
item_state = "deus_blueshield"
|
||||
|
||||
/obj/item/clothing/suit/jacket/fluff/kidosvest //Anxipal: Kido Qasteth
|
||||
name = "Kido's Vest"
|
||||
desc = "A rugged leather vest with a tag labelled \"Men of Mayhem.\""
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "kidosvest"
|
||||
item_state = "kidosvest"
|
||||
|
||||
//////////// Uniforms ////////////
|
||||
/obj/item/clothing/under/psysuit/fluff/isaca_sirius_1 // Xilia: Isaca Sirius
|
||||
name = "Isaca's suit"
|
||||
|
||||
@@ -134,7 +134,8 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)),
|
||||
// NON-BAY EVENTS
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Cargo Bonus", /datum/event/cargo_bonus, 100)
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Cargo Bonus", /datum/event/cargo_bonus, 100),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Revenant", /datum/event/revenant, 50)
|
||||
)
|
||||
|
||||
/datum/event_container/moderate
|
||||
|
||||
@@ -50,6 +50,7 @@ var/global/list/possibleEvents = list()
|
||||
//possibleEvents[/datum/event/mundane_news] = 300
|
||||
|
||||
possibleEvents[/datum/event/cargo_bonus] = 150
|
||||
possibleEvents[/datum/event/revenant] = 75
|
||||
|
||||
possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200)
|
||||
possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50)
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/datum/controller/process/lighting/setup()
|
||||
name = "lighting"
|
||||
schedule_interval = LIGHTING_INTERVAL
|
||||
@@ -6,7 +5,10 @@
|
||||
create_lighting_overlays()
|
||||
|
||||
/datum/controller/process/lighting/doWork()
|
||||
for(var/datum/light_source/L in lighting_update_lights)
|
||||
var/list/lighting_update_lights_old = lighting_update_lights //We use a different list so any additions to the update lists during a delay from scheck() don't cause things to be cut from the list without being updated.
|
||||
lighting_update_lights = list()
|
||||
|
||||
for(var/datum/light_source/L in lighting_update_lights_old)
|
||||
if(L.needs_update)
|
||||
if(L.destroyed || L.check() || L.force_update)
|
||||
L.remove_lum()
|
||||
@@ -16,13 +18,12 @@
|
||||
|
||||
scheck()
|
||||
|
||||
lighting_update_lights.Cut()
|
||||
var/list/lighting_update_overlays_old = lighting_update_overlays //Same as above.
|
||||
lighting_update_overlays = list()
|
||||
|
||||
for(var/atom/movable/lighting_overlay/O in lighting_update_overlays)
|
||||
for(var/atom/movable/lighting_overlay/O in lighting_update_overlays_old)
|
||||
if(O.needs_update)
|
||||
O.update_overlay()
|
||||
O.needs_update = 0
|
||||
|
||||
scheck()
|
||||
|
||||
lighting_update_overlays.Cut()
|
||||
@@ -80,7 +80,5 @@
|
||||
|
||||
var/lastFart = 0 // Toxic fart cooldown.
|
||||
|
||||
var/frozen = 0 //used for preventing attacks on admin-frozen people
|
||||
|
||||
var/fire_dmi = 'icons/mob/OnFire.dmi'
|
||||
var/fire_sprite = "Standing"
|
||||
@@ -744,11 +744,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
|
||||
|
||||
proc/handle_chemicals_in_body()
|
||||
|
||||
if(reagents) //Synths don't process reagents. // fuck you they do now - Iamgoofball
|
||||
var/alien = 0
|
||||
if(species && species.reagent_tag)
|
||||
alien = species.reagent_tag
|
||||
reagents.metabolize(src,alien)
|
||||
if(reagents)
|
||||
reagents.metabolize(src)
|
||||
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND
|
||||
dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
base_color = "#704300"
|
||||
flesh_color = "#704300"
|
||||
blood_color = "#FFFF99"
|
||||
@@ -90,6 +91,7 @@
|
||||
flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN
|
||||
dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
has_organ = list(
|
||||
"heart" = /obj/item/organ/heart,
|
||||
"crystalized brain" = /obj/item/organ/brain/crystal,
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
default_language = "Galactic Common"
|
||||
flags = NO_BREATHE | NO_PAIN | NO_BLOOD | NO_SCAN
|
||||
dietflags = DIET_OMNI //golems can eat anything because they are magic or something
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
blood_color = "#515573"
|
||||
flesh_color = "#137E8F"
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
tail = "chimptail"
|
||||
bodyflags = FEET_PADDED | HAS_TAIL
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
//unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws)
|
||||
//inherent_verbs = list(/mob/living/proc/ventcrawl)
|
||||
@@ -60,6 +61,7 @@ datum/species/monkey/get_random_name(var/gender)
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
tail = "farwatail"
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
|
||||
/datum/species/monkey/vulpkanin
|
||||
@@ -73,6 +75,7 @@ datum/species/monkey/get_random_name(var/gender)
|
||||
flesh_color = "#966464"
|
||||
base_color = "#BE8264"
|
||||
tail = "wolpintail"
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
|
||||
/datum/species/monkey/skrell
|
||||
@@ -85,7 +88,7 @@ datum/species/monkey/get_random_name(var/gender)
|
||||
default_language = "Neara"
|
||||
flesh_color = "#8CD7A3"
|
||||
blood_color = "#1D2CBF"
|
||||
reagent_tag = IS_SKRELL
|
||||
reagent_tag = PROCESS_ORG
|
||||
tail = null
|
||||
|
||||
bodyflags = FEET_PADDED
|
||||
@@ -102,6 +105,6 @@ datum/species/monkey/get_random_name(var/gender)
|
||||
default_language = "Stok"
|
||||
flesh_color = "#34AF10"
|
||||
base_color = "#066000"
|
||||
reagent_tag = IS_UNATHI
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
bodyflags = FEET_CLAWS | HAS_TAIL
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
flags = IS_WHITELISTED | NO_BLOOD
|
||||
dietflags = DIET_OMNI
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
//default_mutations=list(SKELETON) // This screws things up
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
flags = NO_BLOOD | NO_BREATHE | NO_SCAN
|
||||
bodyflags = FEET_NOSLIP
|
||||
dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
|
||||
H.dust()
|
||||
@@ -15,6 +15,8 @@
|
||||
interests, rampant cyber and bio-augmentation and secretive factions make life on most human \
|
||||
worlds tumultous at best."
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
/datum/species/unathi
|
||||
name = "Unathi"
|
||||
icobase = 'icons/mob/human_races/r_lizard.dmi'
|
||||
@@ -48,7 +50,7 @@
|
||||
|
||||
flesh_color = "#34AF10"
|
||||
|
||||
reagent_tag = IS_UNATHI
|
||||
reagent_tag = PROCESS_ORG
|
||||
base_color = "#066000"
|
||||
|
||||
/datum/species/unathi/handle_death(var/mob/living/carbon/human/H)
|
||||
@@ -87,6 +89,7 @@
|
||||
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
|
||||
dietflags = DIET_OMNI
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
|
||||
@@ -116,6 +119,7 @@
|
||||
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
|
||||
dietflags = DIET_OMNI
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
flesh_color = "#966464"
|
||||
base_color = "#BE8264"
|
||||
|
||||
@@ -145,7 +149,7 @@
|
||||
|
||||
flesh_color = "#8CD7A3"
|
||||
blood_color = "#1D2CBF"
|
||||
reagent_tag = IS_SKRELL
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
/datum/species/vox
|
||||
name = "Vox"
|
||||
@@ -185,7 +189,7 @@
|
||||
blood_color = "#2299FC"
|
||||
flesh_color = "#808D11"
|
||||
|
||||
reagent_tag = IS_VOX
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
makeName(var/gender,var/mob/living/carbon/human/H=null)
|
||||
var/sounds = rand(2,8)
|
||||
@@ -239,7 +243,7 @@
|
||||
blood_color = "#2299FC"
|
||||
flesh_color = "#808D11"
|
||||
|
||||
reagent_tag = IS_VOX
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
tail = "armalis_tail"
|
||||
icon_template = 'icons/mob/human_races/r_armalis.dmi'
|
||||
@@ -270,7 +274,7 @@
|
||||
dietflags = DIET_HERB
|
||||
|
||||
blood_color = "#FB9800"
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
/datum/species/slime
|
||||
name = "Slime People"
|
||||
@@ -286,6 +290,7 @@
|
||||
bloodflags = BLOOD_SLIME
|
||||
dietflags = DIET_CARN
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
//ventcrawler = 1 //ventcrawling commented out
|
||||
|
||||
has_organ = list(
|
||||
@@ -310,6 +315,7 @@
|
||||
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
|
||||
dietflags = DIET_HERB
|
||||
|
||||
reagent_tag = PROCESS_ORG
|
||||
blood_color = "#A200FF"
|
||||
|
||||
/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove)
|
||||
@@ -363,7 +369,7 @@
|
||||
blood_color = "#004400"
|
||||
flesh_color = "#907E4A"
|
||||
|
||||
reagent_tag = IS_DIONA
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
has_organ = list(
|
||||
"nutrient channel" = /obj/item/organ/diona/nutrients,
|
||||
@@ -445,6 +451,7 @@
|
||||
dietflags = 0 //IPCs can't eat, so no diet
|
||||
blood_color = "#1F181F"
|
||||
flesh_color = "#AAAAAA"
|
||||
reagent_tag = PROCESS_SYN
|
||||
|
||||
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
|
||||
H.emote("deathgasp")
|
||||
|
||||
@@ -202,9 +202,15 @@
|
||||
user.visible_message("<span class='notice'> [user] has analyzed [M]'s components.","<span class='notice'> You have analyzed [M]'s components.")
|
||||
var/BU = M.getFireLoss() > 50 ? "<b>[M.getFireLoss()]</b>" : M.getFireLoss()
|
||||
var/BR = M.getBruteLoss() > 50 ? "<b>[M.getBruteLoss()]</b>" : M.getBruteLoss()
|
||||
var/TX = M.getToxLoss() > 50 ? "<b>[M.getToxLoss()]</b>" : M.getToxLoss()
|
||||
|
||||
user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]")
|
||||
user.show_message("\t Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>", 1)
|
||||
user.show_message("\t Damage Specifics: <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>")
|
||||
if (ishuman(M) && (M:species.flags & IS_SYNTHETIC))
|
||||
user.show_message("\t Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>/<font color='green'>Residue</font>", 1)
|
||||
user.show_message("\t Damage Specifics: <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font> - <font color='green'>[TX]</font>")
|
||||
else
|
||||
user.show_message("\t Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>", 1)
|
||||
user.show_message("\t Damage Specifics: <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>")
|
||||
if(M.tod && M.stat == DEAD)
|
||||
user.show_message("\blue Time of Disable: [M.tod]")
|
||||
|
||||
@@ -238,6 +244,12 @@
|
||||
(org.burn_dam > 0) ? "<font color='#FFA500'>[org.burn_dam]</font>" :0),1)
|
||||
else
|
||||
user.show_message("\blue \t Components are OK.",1)
|
||||
if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0)
|
||||
user.show_message("\red Subject posibrain is unresponsive. System shutdown imminent.")
|
||||
else if (M.getBrainLoss() >= 60)
|
||||
user.show_message("\red Severe posibrain damage detected. Heavy corrosion present.")
|
||||
else if (M.getBrainLoss() >= 10)
|
||||
user.show_message("\red Significant posibrain damage detected. Moderate corrosion present.")
|
||||
|
||||
user.show_message("\blue Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
|
||||
|
||||
|
||||
@@ -363,6 +363,11 @@
|
||||
desc = "That's not red paint. That's real corgi blood."
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/mask/fakemoustache)
|
||||
name = "Definitely Not [real_name]"
|
||||
desc = "That's Definitely Not [real_name]"
|
||||
valid = 1
|
||||
|
||||
if(valid)
|
||||
if(user && !user.drop_item())
|
||||
user << "<span class='warning'>\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!</span>"
|
||||
|
||||
@@ -0,0 +1,315 @@
|
||||
//Revenants: based off of wraiths from Goon
|
||||
//"Ghosts" that are invisible and move like ghosts, cannot take damage while invsible
|
||||
//Don't hear deadchat and are NOT normal ghosts
|
||||
//Admin-spawn or random event
|
||||
|
||||
/mob/living/simple_animal/revenant
|
||||
name = "revenant"
|
||||
desc = "A malevolent spirit."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "revenant_idle"
|
||||
incorporeal_move = 3
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
health = 25
|
||||
maxHealth = 25
|
||||
see_in_dark = 255
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
universal_understand = 1
|
||||
response_help = "passes through"
|
||||
response_disarm = "swings at"
|
||||
response_harm = "punches"
|
||||
minbodytemp = 0
|
||||
maxbodytemp = INFINITY
|
||||
harm_intent_damage = 5
|
||||
speak_emote = list("hisses", "spits", "growls")
|
||||
friendly = "touches"
|
||||
status_flags = 0
|
||||
wander = 0
|
||||
density = 0
|
||||
|
||||
var/essence = 25 //The resource of revenants. Max health is equal to twice this amount
|
||||
var/essence_regen_cap = 25 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount.
|
||||
var/essence_regen = 1 //If the revenant regenerates essence or not; 1 for yes, 0 for no
|
||||
var/essence_min = 1 //The minimum amount of essence a revenant can have; by default, it never drops below one
|
||||
var/strikes = 0 //How many times a revenant can die before dying for good
|
||||
var/revealed = 0 //If the revenant can take damage from normal sources.
|
||||
var/inhibited = 0 //If the revenant's abilities are blocked by a chaplain's power.
|
||||
|
||||
/mob/living/simple_animal/revenant/Life()
|
||||
..()
|
||||
if(essence < essence_min)
|
||||
essence = essence_min
|
||||
if(strikes > 0)
|
||||
strikes--
|
||||
src << "<span class='boldannounce'>Your essence has dropped below critical levels. You barely manage to save yourself - [strikes ? "you can't keep this up!" : "next time, it's death."]</span>"
|
||||
else if(strikes <= 0)
|
||||
death()
|
||||
maxHealth = essence * 2
|
||||
if(!revealed)
|
||||
health = maxHealth //Heals to full when not revealed
|
||||
if(essence_regen && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
|
||||
essence++
|
||||
|
||||
/mob/living/simple_animal/revenant/ex_act(severity)
|
||||
return 1 //Immune to the effects of explosions.
|
||||
|
||||
/mob/living/simple_animal/revenant/ClickOn(var/atom/A, var/params) //Copypaste from ghost code - revenants can't interact with the world directly.
|
||||
if(client.buildmode)
|
||||
build_click(src, client.buildmode, params, A)
|
||||
return
|
||||
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
return
|
||||
if(modifiers["shift"])
|
||||
ShiftClickOn(A)
|
||||
return
|
||||
if(modifiers["alt"])
|
||||
AltClickOn(A)
|
||||
return
|
||||
if(modifiers["ctrl"])
|
||||
CtrlClickOn(A)
|
||||
return
|
||||
|
||||
if(world.time <= next_move)
|
||||
return
|
||||
A.attack_ghost(src)
|
||||
|
||||
/mob/living/simple_animal/revenant/say(message)
|
||||
return 0 //Revenants cannot speak out loud.
|
||||
|
||||
/mob/living/simple_animal/revenant/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
stat(null, "Current essence: [essence]E")
|
||||
|
||||
/mob/living/simple_animal/revenant/New()
|
||||
..()
|
||||
spawn(5)
|
||||
if(src.mind)
|
||||
src.mind.wipe_memory()
|
||||
src << 'sound/effects/ghost.ogg'
|
||||
src << "<br>"
|
||||
src << "<span class='deadsay'><font size=3><b>You are a revenant.</b></font></span>"
|
||||
src << "<b>Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.</b>"
|
||||
src << "<b>You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds.</b>"
|
||||
src << "<b>You are invincible and invisible to everyone but other ghosts. Some abilities may change this.</b>"
|
||||
src << "<b>To function, you are to drain the life essence from humans. This essence is a resource and will power all of your abilities.</b>"
|
||||
src << "<b><i>You do not remember anything of your past lives, nor will you remember anything about this one after your death.</i></b>"
|
||||
src << "<b>Be sure to read the wiki page at http://nanotrasen.se/wiki/index.php/Revenant to learn more.</b>"
|
||||
var/datum/objective/revenant/objective = new
|
||||
objective.owner = src
|
||||
src.mind.objectives += objective
|
||||
src << "<b>Objective #1</b>: [objective.explanation_text]"
|
||||
var/datum/objective/revenantFluff/objective2 = new
|
||||
objective2.owner = src
|
||||
src.mind.objectives += objective2
|
||||
src << "<b>Objective #2</b>: [objective2.explanation_text]"
|
||||
ticker.mode.traitors |= src.mind //Necessary for announcing
|
||||
if(!src.giveSpells())
|
||||
message_admins("Revenant was created but has no mind. Trying again in five seconds.")
|
||||
spawn(50)
|
||||
if(!src.giveSpells())
|
||||
message_admins("Revenant still has no mind. Deleting...")
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/giveSpells()
|
||||
if(src.mind)
|
||||
src.mind.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/revenant_harvest
|
||||
src.mind.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/revenant_transmit
|
||||
src.mind.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/revenant_light
|
||||
src.mind.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/revenantDefile
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/revenant/death()
|
||||
if(strikes)
|
||||
return 0 //Impossible to die with strikes still active
|
||||
..(1)
|
||||
src << "<span class='userdanger'><b>NO! No... it's too late, you can feel yourself fading...</b></span>"
|
||||
notransform = 1
|
||||
revealed = 1
|
||||
invisibility = 0
|
||||
playsound(src, 'sound/effects/screech.ogg', 100, 1)
|
||||
visible_message("<span class='warning'>[src] lets out a waning screech as violet mist swirls around its dissolving body!</span>")
|
||||
icon_state = "revenant_draining"
|
||||
for(var/i = alpha, i > 0, i -= 10)
|
||||
sleep(0.1)
|
||||
alpha = i
|
||||
visible_message("<span class='danger'>[src]'s body breaks apart into blue dust.</span>")
|
||||
new /obj/item/weapon/ectoplasm/revenant(get_turf(src))
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params)
|
||||
..()
|
||||
if(istype(W, /obj/item/weapon/nullrod))
|
||||
visible_message("<span class='warning'>[src] violently flinches!</span>", \
|
||||
"<span class='boldannounce'>The null rod invokes agony in you! You feel your essence draining away!</span>")
|
||||
essence -= 25 //hella effective
|
||||
inhibited = 1
|
||||
spawn(30)
|
||||
inhibited = 0
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/castcheck(var/essence_cost)
|
||||
var/mob/living/simple_animal/revenant/user = usr
|
||||
if(!istype(user) || !user)
|
||||
return
|
||||
var/turf/T = get_turf(usr)
|
||||
if(istype(T, /turf/simulated/wall))
|
||||
user << "<span class='warning'>You cannot use abilities from inside of a wall.</span>"
|
||||
return 0
|
||||
if(!user.change_essence_amount(essence_cost, 1))
|
||||
user << "<span class='warning'>You lack the essence to use that ability.</span>"
|
||||
return 0
|
||||
if(user.inhibited)
|
||||
user << "<span class='warning'>Your powers have been suppressed by holy energies!</span>"
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/change_essence_amount(var/essence_amt, var/silent = 0, var/source = null)
|
||||
var/mob/living/simple_animal/revenant/user = usr
|
||||
if(!istype(usr) || !usr)
|
||||
return
|
||||
if(user.essence + essence_amt <= 0)
|
||||
return
|
||||
user.essence += essence_amt
|
||||
user.essence = Clamp(user.essence, 0, INFINITY)
|
||||
if(!silent)
|
||||
if(essence_amt > 0)
|
||||
user << "<span class='notice'>Gained [essence_amt]E from [source].</span>"
|
||||
else
|
||||
user << "<span class='danger'>Lost [essence_amt]E from [source].</span>"
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/reveal(var/time, var/stun)
|
||||
var/mob/living/simple_animal/revenant/R = usr
|
||||
if(!istype(usr) || !usr)
|
||||
return
|
||||
R.revealed = 1
|
||||
R.invisibility = 0
|
||||
if(stun)
|
||||
R.notransform = 1
|
||||
R << "<span class='warning'>You have been revealed [stun ? "and cannot move" : ""].</span>"
|
||||
spawn(time)
|
||||
R.revealed = 0
|
||||
R.invisibility = INVISIBILITY_OBSERVER
|
||||
if(stun)
|
||||
R.notransform = 0
|
||||
R << "<span class='notice'>You are once more concealed [stun ? "and can move again" : ""].</span>"
|
||||
|
||||
/datum/objective/revenant
|
||||
var/targetAmount = 100
|
||||
|
||||
/datum/objective/revenant/New()
|
||||
targetAmount = rand(100,200)
|
||||
explanation_text = "Absorb [targetAmount] points of essence."
|
||||
..()
|
||||
|
||||
/datum/objective/revenant/check_completion()
|
||||
if(!istype(owner.current, /mob/living/simple_animal/revenant) || !owner.current)
|
||||
return 0
|
||||
var/mob/living/simple_animal/revenant/R = owner.current
|
||||
if(!R || R.stat == DEAD)
|
||||
return 0
|
||||
var/essenceAccumulated = R.essence
|
||||
if(essenceAccumulated < targetAmount)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/objective/revenantFluff
|
||||
|
||||
/datum/objective/revenantFluff/New()
|
||||
var/list/explanationTexts = list("Attempt to make your presence unknown to the crew.", \
|
||||
"Collaborate with existing antagonists aboard the station to gain essence.", \
|
||||
"Remain nonlethal and only absorb bodies that have already died.", \
|
||||
"Use your environments to eliminate isolated people.", \
|
||||
"If there is a chaplain aboard the station, ensure they are killed.", \
|
||||
"Hinder the crew without killing them.")
|
||||
explanation_text = pick(explanationTexts)
|
||||
..()
|
||||
|
||||
/datum/objective/revenantFluff/check_completion()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant
|
||||
name = "glimmering residue"
|
||||
desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "revenantEctoplasm"
|
||||
w_class = 2
|
||||
var/reforming = 0
|
||||
var/reformed = 0
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/New()
|
||||
..()
|
||||
reforming = 1
|
||||
spawn(1800) //3 minutes
|
||||
if(src && reforming)
|
||||
return reform()
|
||||
if(src && !reforming)
|
||||
visible_message("<span class='warning'>[src] settles down and seems lifeless.</span>")
|
||||
return
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/attack_hand(mob/user)
|
||||
if(reformed)
|
||||
user << "<span class='warning'>[src] keeps slipping out of your hands, you can't get a hold on it!</span>"
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/attack_self(mob/user)
|
||||
if(!reforming)
|
||||
return ..()
|
||||
user.visible_message("<span class='notice'>[user] scatters [src] in all directions.</span>", \
|
||||
"<span class='notice'>You scatter [src] across the area. The particles slowly fade away.</span>")
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
visible_message("<span class='notice'>[src] breaks into particles upon impact, which fade away to nothingness.</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/examine(mob/user)
|
||||
..()
|
||||
if(reforming)
|
||||
user << "<span class='warning'>It is shifting and distorted. It would be wise to destroy this.</span>"
|
||||
else if(!reforming)
|
||||
user << "<span class='notice'>It seems inert.</span>"
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/proc/reform()
|
||||
if(!reforming || !src)
|
||||
return
|
||||
message_admins("Revenant ectoplasm was left undestroyed for 3 minutes and has reformed into a new revenant.")
|
||||
loc = get_turf(src) //In case it's in a backpack or someone's hand
|
||||
visible_message("<span class='boldannounce'>[src] suddenly rises into the air before fading away.</span>")
|
||||
var/mob/living/simple_animal/revenant/R = new(get_turf(src))
|
||||
qdel(src)
|
||||
var/list/candidates = get_candidates(BE_REVENANT)
|
||||
if(!candidates.len)
|
||||
message_admins("No candidates were found for the new revenant. Oh well!")
|
||||
return 0
|
||||
var/client/C = pick(candidates)
|
||||
var/key_of_revenant = C.key
|
||||
if(!key_of_revenant)
|
||||
message_admins("No ckey was found for the new revenant. Oh well!")
|
||||
return 0
|
||||
var/datum/mind/player_mind = new /datum/mind(key_of_revenant)
|
||||
player_mind.active = 1
|
||||
player_mind.transfer_to(R)
|
||||
player_mind.assigned_role = "revenant"
|
||||
player_mind.special_role = "Revenant"
|
||||
ticker.mode.traitors |= player_mind
|
||||
message_admins("[key_of_revenant] has been made into a revenant by reforming ectoplasm.")
|
||||
log_game("[key_of_revenant] was spawned as a revenant by reforming ectoplasm.")
|
||||
return 1
|
||||
@@ -0,0 +1,188 @@
|
||||
//Harvest Essence: The bread and butter of the revenant. The basic way of harvesting additional essence.
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/revenant_harvest
|
||||
name = "Harvest (0E)"
|
||||
desc = "Siphons the lingering spectral essence from a human, empowering yourself."
|
||||
panel = "Revenant Abilities"
|
||||
charge_max = 100 //Short cooldown
|
||||
clothes_req = 0
|
||||
range = 5
|
||||
var/essence_drained = 0
|
||||
var/draining
|
||||
var/list/drained_mobs = list() //Cannot harvest the same mob twice
|
||||
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/revenant_harvest/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(!user.castcheck(0))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/carbon/human/target in targets)
|
||||
spawn(0)
|
||||
if(draining)
|
||||
user << "<span class='warning'>You are already siphoning the essence of a soul!</span>"
|
||||
return
|
||||
if(target in drained_mobs)
|
||||
user << "<span class='warning'>[target]'s soul is dead and empty.</span>"
|
||||
return
|
||||
if(target.stat != DEAD)
|
||||
user << "<span class='notice'>This being's soul is too strong to harvest.</span>"
|
||||
if(prob(10))
|
||||
target << "You feel as if you are being watched."
|
||||
return
|
||||
draining = 1
|
||||
essence_drained = 1
|
||||
user << "<span class='notice'>You search for the still-living soul of [target].</span>"
|
||||
sleep(10)
|
||||
if(target.ckey)
|
||||
user << "<span class='notice'>Their soul burns with intelligence.</span>"
|
||||
essence_drained += 3
|
||||
sleep(20)
|
||||
switch(essence_drained)
|
||||
if(1 to 2)
|
||||
user << "<span class='info'>[target] will not yield much essence. Still, every bit counts.</span>"
|
||||
if(3 to 4)
|
||||
user << "<span class='info'>[target] will yield an average amount of essence.</span>"
|
||||
if(5 to INFINITY)
|
||||
user << "<span class='info'>Such a feast! [target] will yield much essence to you.</span>"
|
||||
sleep(30)
|
||||
if(!in_range(user, target))
|
||||
user << "<span class='warning'>You are not close enough to siphon [target]'s soul. The link has been broken.</span>"
|
||||
draining = 0
|
||||
return
|
||||
if(!target.stat)
|
||||
user << "<span class='warning'>They are now powerful enough to fight off your draining.</span>"
|
||||
target << "<span class='boldannounce'>You feel something tugging across your body before subsiding.</span>"
|
||||
user << "<span class='danger'>You begin siphoning essence from [target]'s soul. You can not move while this is happening.</span>"
|
||||
if(target.stat != DEAD)
|
||||
target << "<span class='warning'>You feel a horribly unpleasant draining sensation as your grip on life weakens...</span>"
|
||||
user.icon_state = "revenant_draining"
|
||||
user.notransform = 1
|
||||
user.revealed = 1
|
||||
user.invisibility = 0
|
||||
target.visible_message("<span class='warning'>[target] suddenly rises slightly into the air, their skin turning an ashy gray.</span>")
|
||||
target.Beam(user,icon_state="drain_life",icon='icons/effects/effects.dmi',time=80)
|
||||
target.death(0)
|
||||
target.visible_message("<span class='warning'>[target] gently slumps back onto the ground.</span>")
|
||||
user.icon_state = "revenant_idle"
|
||||
user.change_essence_amount(essence_drained * 5, 0, target)
|
||||
user << "<span class='info'>[target]'s soul has been considerably weakened and will yield no more essence for the time being.</span>"
|
||||
user.revealed = 0
|
||||
user.notransform = 0
|
||||
user.invisibility = INVISIBILITY_OBSERVER
|
||||
drained_mobs.Add(target)
|
||||
draining = 0
|
||||
|
||||
|
||||
//Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob for 5E.
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/revenant_transmit
|
||||
name = "Transmit (5E)"
|
||||
desc = "Telepathically transmits a message to the target."
|
||||
panel = "Revenant Abilities (Locked)"
|
||||
charge_max = 50
|
||||
clothes_req = 0
|
||||
range = -1
|
||||
include_user = 1
|
||||
var/locked = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/wizard/targeted/revenant_transmit/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(!user.castcheck(-5))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(locked)
|
||||
usr << "<span class='info'>You have unlocked Transmit!</span>"
|
||||
locked = 0
|
||||
charge_counter = charge_max
|
||||
panel = "Revenant Abilities"
|
||||
range = 7
|
||||
include_user = 0
|
||||
return
|
||||
for(var/mob/living/M in targets)
|
||||
spawn(0)
|
||||
var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "")
|
||||
if(!msg)
|
||||
charge_counter = charge_max
|
||||
return
|
||||
usr << "<span class='info'><b>You transmit to [M]:</b> [msg]</span>"
|
||||
M << "<span class='deadsay'><b>A strange voice resonates in your head...</b></span><i> [msg]</I>"
|
||||
|
||||
|
||||
//Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people.
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/revenant_light
|
||||
name = "Overload Light (25E)"
|
||||
desc = "Directs a large amount of essence into an electrical light, causing an impressive light show."
|
||||
panel = "Revenant Abilities (Locked)"
|
||||
charge_max = 300
|
||||
clothes_req = 0
|
||||
range = 1
|
||||
var/locked = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/revenant_light/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(!user.castcheck(-25))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(locked)
|
||||
user << "<span class='info'>You have unlocked Overload Light!</span>"
|
||||
panel = "Revenant Abilities"
|
||||
locked = 0
|
||||
range = 5
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/turf/T in targets)
|
||||
spawn(0)
|
||||
for(var/obj/machinery/light/L in T.contents)
|
||||
spawn(0)
|
||||
if(!L.on)
|
||||
return
|
||||
L.visible_message("<span class='warning'><b>\The [L] suddenly flares brightly and begins to spark!</span>")
|
||||
sleep(20)
|
||||
for(var/mob/living/M in orange(4, L))
|
||||
if(M == user)
|
||||
return
|
||||
M.Beam(L,icon_state="lightning",icon='icons/effects/effects.dmi',time=5)
|
||||
M.electrocute_act(25, "[L.name]")
|
||||
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
user.reveal(50, 1)
|
||||
|
||||
|
||||
//Defile: Corrupts nearby stuff, unblesses floor tiles.
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/revenantDefile
|
||||
name = "Defile (30E)"
|
||||
desc = "Twists and corrupts certain nearby objects. Also dispels holy auras on floors, but not salt lines."
|
||||
panel = "Revenant Abilities (Locked)"
|
||||
charge_max = 300
|
||||
clothes_req = 0
|
||||
range = 1
|
||||
var/locked = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/wizard/aoe_turf/revenantDefile/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(!user.castcheck(-30))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(locked)
|
||||
user << "<span class='info'>You have unlocked Defile!</span>"
|
||||
panel = "Revenant Abilities"
|
||||
locked = 0
|
||||
range = 4
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/turf/T in targets)
|
||||
spawn(0)
|
||||
if(T.flags & NOJAUNT)
|
||||
T.flags -= NOJAUNT
|
||||
for(var/obj/machinery/bot/secbot/secbot in T.contents) //Not including ED-209
|
||||
secbot.emagged = 2
|
||||
secbot.Emag(null)
|
||||
for(var/obj/machinery/bot/cleanbot/cleanbot in T.contents)
|
||||
cleanbot.emagged = 2
|
||||
cleanbot.Emag(null)
|
||||
for(var/mob/living/carbon/human/human in T.contents)
|
||||
human << "<span class='warning'>You suddenly feel tired.</span>"
|
||||
human.adjustStaminaLoss(25)
|
||||
for(var/mob/living/silicon/robot/robot in T.contents)
|
||||
robot.visible_message("<span class='warning'>[robot] lets out an alarm!</span>", \
|
||||
"<span class='boldannounce'>01001111 01010110 01000101 01010010 01001100 01001111 01000001 01000100</span>") //Translates to "OVERLOAD"
|
||||
robot << 'sound/misc/interference.ogg'
|
||||
playsound(robot, 'sound/machines/warning-buzzer.ogg', 50, 1)
|
||||
for(var/obj/structure/window/window in T.contents)
|
||||
window.hit(rand(10,50))
|
||||
for(var/obj/machinery/light/light in T.contents)
|
||||
light.flicker() //spooky
|
||||
user.reveal(30, 1)
|
||||
@@ -0,0 +1,67 @@
|
||||
#define REVENANT_SPAWN_THRESHOLD 10
|
||||
|
||||
/datum/event/revenant
|
||||
var/key_of_revenant
|
||||
|
||||
|
||||
/datum/event/revenant/proc/get_revenant(var/end_if_fail = 0)
|
||||
var/deadMobs = 0
|
||||
for(var/mob/M in dead_mob_list)
|
||||
deadMobs++
|
||||
if(deadMobs < REVENANT_SPAWN_THRESHOLD)
|
||||
message_admins("Random event attempted to spawn a revenant, but there were only [deadMobs]/[REVENANT_SPAWN_THRESHOLD] dead mobs.")
|
||||
return
|
||||
key_of_revenant = null
|
||||
if(!key_of_revenant)
|
||||
var/list/candidates = get_candidates(BE_REVENANT)
|
||||
if(!candidates.len)
|
||||
if(end_if_fail)
|
||||
return 0
|
||||
return find_revenant()
|
||||
var/client/C = pick(candidates)
|
||||
key_of_revenant = C.key
|
||||
if(!key_of_revenant)
|
||||
if(end_if_fail)
|
||||
return 0
|
||||
return find_revenant()
|
||||
var/datum/mind/player_mind = new /datum/mind(key_of_revenant)
|
||||
player_mind.active = 1
|
||||
var/list/spawn_locs = list()
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if(isturf(L.loc))
|
||||
switch(L.name)
|
||||
if("revenantspawn")
|
||||
spawn_locs += L.loc
|
||||
if(!spawn_locs) //If we can't find any revenant spawns, try the carp spawns
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if(isturf(L.loc))
|
||||
switch(L.name)
|
||||
if("carpspawn")
|
||||
spawn_locs += L.loc
|
||||
if(!spawn_locs) //If we can't find either, just spawn the revenant at the player's location
|
||||
spawn_locs += get_turf(player_mind.current)
|
||||
if(!spawn_locs) //If we can't find THAT, then just retry
|
||||
return find_revenant()
|
||||
var/mob/living/simple_animal/revenant/revvie = new /mob/living/simple_animal/revenant/(pick(spawn_locs))
|
||||
player_mind.transfer_to(revvie)
|
||||
player_mind.assigned_role = "revenant"
|
||||
player_mind.special_role = "Revenant"
|
||||
ticker.mode.traitors |= player_mind
|
||||
message_admins("[key_of_revenant] has been made into a revenant by an event.")
|
||||
log_game("[key_of_revenant] was spawned as a revenant by an event.")
|
||||
return 1
|
||||
|
||||
|
||||
/datum/event/revenant/start()
|
||||
get_revenant()
|
||||
|
||||
|
||||
/datum/event/revenant/proc/find_revenant()
|
||||
message_admins("An event failed to spawn a revenant. Retrying momentarily...")
|
||||
spawn(50)
|
||||
if(get_revenant(1))
|
||||
message_admins("[key_of_revenant] has been spawned as a revenant.")
|
||||
log_game("[key_of_revenant] was spawned as a revenant by an event.")
|
||||
return 0
|
||||
message_admins("No candidates were available for becoming a revenant.")
|
||||
return kill()
|
||||
@@ -440,6 +440,16 @@
|
||||
anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,L.dir)
|
||||
L.loc = get_step(L, direct)
|
||||
L.dir = direct
|
||||
if(3) //Incorporeal move, but blocked by holy-watered tiles
|
||||
var/turf/simulated/floor/stepTurf = get_step(L, direct)
|
||||
if(stepTurf.flags & NOJAUNT)
|
||||
L << "<span class='warning'>Holy energies block your path.</span>"
|
||||
L.notransform = 1
|
||||
spawn(2)
|
||||
L.notransform = 0
|
||||
else
|
||||
L.loc = get_step(L, direct)
|
||||
L.dir = direct
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
@@ -77,7 +77,24 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
|
||||
mob/living/carbon/human/proc/handle_pain()
|
||||
// not when sleeping
|
||||
|
||||
if(species && species.flags & NO_PAIN) return
|
||||
if(species && species.flags & NO_PAIN)
|
||||
//While IPCs don't feel pain, they will notice their gears gunking up with residue (toxins)
|
||||
if(species && species.flags & IS_SYNTHETIC)
|
||||
var/toxDamageMessage = null
|
||||
var/toxMessageProb = 1
|
||||
switch(getToxLoss())
|
||||
if(25 to 50)
|
||||
toxMessageProb = 1
|
||||
toxDamageMessage = "Your servos seem to be working harder."
|
||||
if(50 to 75)
|
||||
toxMessageProb = 2
|
||||
toxDamageMessage = "Your joints seem to stick randomly."
|
||||
if(75 to INFINITY)
|
||||
toxMessageProb = 5
|
||||
toxDamageMessage = "Your motors seem to slip; it really grinds your gears!"
|
||||
if(toxDamageMessage && prob(toxMessageProb))
|
||||
src.custom_pain(toxDamageMessage, getToxLoss() >= 15)
|
||||
return
|
||||
|
||||
if(stat >= 2) return
|
||||
if(reagents.has_reagent("morphine"))
|
||||
|
||||
@@ -404,6 +404,27 @@ datum
|
||||
del_reagent(R.id)
|
||||
return 0
|
||||
|
||||
reaction_check(var/mob/M, var/datum/reagent/R)
|
||||
var/can_process = 0
|
||||
if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check)
|
||||
return can_process
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
//Check if this mob's species is set and can process this type of reagent
|
||||
if(H.species && H.species.reagent_tag)
|
||||
if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
|
||||
can_process = 1
|
||||
if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
|
||||
can_process = 1
|
||||
//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
|
||||
//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
|
||||
if(R.process_flags != SYNTHETIC)
|
||||
can_process = 1
|
||||
return can_process
|
||||
|
||||
reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0)
|
||||
|
||||
switch(method)
|
||||
@@ -412,7 +433,11 @@ datum
|
||||
if(ismob(A))
|
||||
spawn(0)
|
||||
if(!R) return
|
||||
else R.reaction_mob(A, TOUCH, R.volume+volume_modifier)
|
||||
var/check = reaction_check(A, R)
|
||||
if(!check)
|
||||
continue
|
||||
else
|
||||
R.reaction_mob(A, TOUCH, R.volume+volume_modifier)
|
||||
if(isturf(A))
|
||||
spawn(0)
|
||||
if(!R) return
|
||||
@@ -426,7 +451,11 @@ datum
|
||||
if(ismob(A) && R)
|
||||
spawn(0)
|
||||
if(!R) return
|
||||
else R.reaction_mob(A, INGEST, R.volume+volume_modifier)
|
||||
var/check = reaction_check(A, R)
|
||||
if(!check)
|
||||
continue
|
||||
else
|
||||
R.reaction_mob(A, INGEST, R.volume+volume_modifier)
|
||||
if(isturf(A) && R)
|
||||
spawn(0)
|
||||
if(!R) return
|
||||
|
||||
@@ -7,10 +7,6 @@
|
||||
//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent)
|
||||
//so that it can continue working when the reagent is deleted while the proc is still active.
|
||||
|
||||
//Some on_mob_life() procs check for alien races.
|
||||
#define IS_DIONA 1
|
||||
#define IS_VOX 2
|
||||
// ^ fuck this shit holy fuck - Iamgoofball
|
||||
datum
|
||||
reagent
|
||||
var/name = "Reagent"
|
||||
@@ -26,6 +22,9 @@ datum
|
||||
var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
|
||||
var/shock_reduction = 0
|
||||
var/penetrates_skin = 0 //Whether or not a reagent penetrates the skin
|
||||
//Processing flags, defines the type of mobs the reagent will affect
|
||||
//By default, all reagents will ONLY affect organics, not synthetics. Re-define in the reagent's definition if the reagent is meant to affect synths
|
||||
var/process_flags = ORGANIC
|
||||
proc
|
||||
reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
|
||||
if(!istype(M, /mob/living)) return 0
|
||||
@@ -303,6 +302,7 @@ datum
|
||||
name = "Hell Water"
|
||||
id = "hell_water"
|
||||
description = "YOUR FLESH! IT BURNS!"
|
||||
process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL.
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
M.fire_stacks = min(5,M.fire_stacks + 3)
|
||||
@@ -467,6 +467,7 @@ datum
|
||||
description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen."
|
||||
reagent_state = LIQUID
|
||||
color = "#0064C8" // rgb: 0, 100, 200
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(ishuman(M))
|
||||
@@ -515,6 +516,15 @@ datum
|
||||
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
|
||||
return
|
||||
|
||||
|
||||
reaction_turf(var/turf/simulated/T, var/volume)
|
||||
..()
|
||||
if(!istype(T)) return
|
||||
if(volume>=10)
|
||||
for(var/obj/effect/rune/R in T)
|
||||
qdel(R)
|
||||
T.Bless()
|
||||
|
||||
serotrotium
|
||||
name = "Serotrotium"
|
||||
id = "serotrotium"
|
||||
@@ -573,10 +583,12 @@ datum
|
||||
|
||||
on_mob_life(var/mob/living/M as mob, var/alien)
|
||||
if(M.stat == 2) return
|
||||
if(alien && alien == IS_VOX)
|
||||
M.adjustToxLoss(REAGENTS_METABOLISM)
|
||||
holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
|
||||
return
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis"))
|
||||
M.adjustToxLoss(REAGENTS_METABOLISM)
|
||||
holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
|
||||
return
|
||||
..()
|
||||
|
||||
copper
|
||||
@@ -596,10 +608,12 @@ datum
|
||||
|
||||
on_mob_life(var/mob/living/M as mob, var/alien)
|
||||
if(M.stat == 2) return
|
||||
if(alien && alien == IS_VOX)
|
||||
M.adjustOxyLoss(-2*REM)
|
||||
holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
|
||||
return
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species && (H.species.name == "Vox" || H.species.name =="Vox Armalis"))
|
||||
M.adjustOxyLoss(-2*REM)
|
||||
holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
|
||||
return
|
||||
..()
|
||||
|
||||
hydrogen
|
||||
@@ -662,6 +676,7 @@ datum
|
||||
reagent_state = GAS
|
||||
color = "#808080" // rgb: 128, 128, 128
|
||||
penetrates_skin = 1
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
@@ -676,6 +691,7 @@ datum
|
||||
reagent_state = GAS
|
||||
color = "#6A6054"
|
||||
penetrates_skin = 1
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
@@ -749,6 +765,7 @@ datum
|
||||
description = "A strong mineral acid with the molecular formula H2SO4."
|
||||
reagent_state = LIQUID
|
||||
color = "#00D72B"
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
@@ -872,6 +889,7 @@ datum
|
||||
description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls."
|
||||
reagent_state = SOLID
|
||||
color = "#673910" // rgb: 103, 57, 16
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
reaction_turf(var/turf/T, var/volume)
|
||||
src = null
|
||||
@@ -1190,6 +1208,7 @@ datum
|
||||
description = "It's magic. We don't have to explain it."
|
||||
reagent_state = LIQUID
|
||||
color = "#C8A5DC" // rgb: 200, 165, 220
|
||||
process_flags = ORGANIC | SYNTHETIC //Adminbuse knows no bounds!
|
||||
|
||||
on_mob_life(var/mob/living/carbon/M as mob)
|
||||
if(!M) M = holder.my_atom ///This can even heal dead people.
|
||||
@@ -1688,6 +1707,7 @@ datum
|
||||
description = "A special oil that noticably chills the body. Extraced from Icepeppers."
|
||||
reagent_state = LIQUID
|
||||
color = "#B31008" // rgb: 139, 166, 233
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
@@ -2491,8 +2511,10 @@ datum
|
||||
|
||||
d/=sober_str
|
||||
|
||||
if(alien && alien == IS_SKRELL) //Skrell get very drunk very quickly.
|
||||
d*=5
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species && (H.species.name == "Skrell" || H.species.name =="Neara")) //Skrell and Neara get very drunk very quickly.
|
||||
d*=5
|
||||
|
||||
M.dizziness += dizzy_adj.
|
||||
if(d >= slur_start && d < pass_out)
|
||||
@@ -3216,4 +3238,4 @@ datum
|
||||
holder.reagent_list -= src
|
||||
holder = null
|
||||
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
#define REM REAGENTS_EFFECT_MULTIPLIER
|
||||
|
||||
datum/reagent/nicotine
|
||||
/datum/reagent/nicotine
|
||||
name = "Nicotine"
|
||||
id = "nicotine"
|
||||
description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage."
|
||||
@@ -13,7 +13,7 @@ datum/reagent/nicotine
|
||||
overdose_threshold = 35
|
||||
addiction_threshold = 30
|
||||
|
||||
datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob)
|
||||
/datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.")
|
||||
if(prob(5))
|
||||
@@ -26,7 +26,7 @@ datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/nicotine/overdose_process(var/mob/living/M as mob)
|
||||
/datum/reagent/nicotine/overdose_process(var/mob/living/M as mob)
|
||||
if(prob(20))
|
||||
M << "You feel like you smoked too much."
|
||||
M.adjustToxLoss(1*REM)
|
||||
@@ -34,7 +34,7 @@ datum/reagent/nicotine/overdose_process(var/mob/living/M as mob)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/crank
|
||||
/datum/reagent/crank
|
||||
name = "Crank"
|
||||
id = "crank"
|
||||
description = "Reduces stun times by about 200%. If overdosed or addicted it will deal significant Toxin, Brute and Brain damage."
|
||||
@@ -43,7 +43,7 @@ datum/reagent/crank
|
||||
overdose_threshold = 20
|
||||
addiction_threshold = 10
|
||||
|
||||
datum/reagent/crank/on_mob_life(var/mob/living/M as mob)
|
||||
/datum/reagent/crank/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.")
|
||||
if(prob(5))
|
||||
@@ -53,26 +53,26 @@ datum/reagent/crank/on_mob_life(var/mob/living/M as mob)
|
||||
M.AdjustWeakened(-2)
|
||||
..()
|
||||
return
|
||||
datum/reagent/crank/overdose_process(var/mob/living/M as mob)
|
||||
/datum/reagent/crank/overdose_process(var/mob/living/M as mob)
|
||||
M.adjustBrainLoss(rand(1,10)*REM)
|
||||
M.adjustToxLoss(rand(1,10)*REM)
|
||||
M.adjustBruteLoss(rand(1,10)*REM)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/crank/addiction_act_stage1(var/mob/living/M as mob)
|
||||
/datum/reagent/crank/addiction_act_stage1(var/mob/living/M as mob)
|
||||
M.adjustBrainLoss(rand(1,10)*REM)
|
||||
..()
|
||||
return
|
||||
datum/reagent/crank/addiction_act_stage2(var/mob/living/M as mob)
|
||||
/datum/reagent/crank/addiction_act_stage2(var/mob/living/M as mob)
|
||||
M.adjustToxLoss(rand(1,10)*REM)
|
||||
..()
|
||||
return
|
||||
datum/reagent/crank/addiction_act_stage3(var/mob/living/M as mob)
|
||||
/datum/reagent/crank/addiction_act_stage3(var/mob/living/M as mob)
|
||||
M.adjustBruteLoss(rand(1,10)*REM)
|
||||
..()
|
||||
return
|
||||
datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob)
|
||||
/datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob)
|
||||
M.adjustBrainLoss(rand(1,10)*REM)
|
||||
M.adjustToxLoss(rand(1,10)*REM)
|
||||
M.adjustBruteLoss(rand(1,10)*REM)
|
||||
@@ -397,6 +397,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob)
|
||||
color = "#A42964"
|
||||
metabolization_rate = 0.2
|
||||
overdose_threshold = 15
|
||||
process_flags = ORGANIC | SYNTHETIC //Flipping for everyone!
|
||||
|
||||
/datum/chemical_reaction/fliptonium
|
||||
name = "fliptonium"
|
||||
@@ -406,7 +407,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob)
|
||||
result_amount = 4
|
||||
mix_message = "The mixture swirls around excitedly!"
|
||||
|
||||
datum/reagent/fliptonium/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
||||
/datum/reagent/fliptonium/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
||||
if(!istype(M, /mob/living))
|
||||
return
|
||||
if(method == INGEST || method == TOUCH)
|
||||
@@ -437,10 +438,10 @@ datum/reagent/fliptonium/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
||||
..()
|
||||
return
|
||||
|
||||
datum/reagent/fliptonium/reagent_deleted(var/mob/living/M as mob)
|
||||
/datum/reagent/fliptonium/reagent_deleted(var/mob/living/M as mob)
|
||||
M.SpinAnimation(speed = 12, loops = -1)
|
||||
|
||||
datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob)
|
||||
/datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob)
|
||||
if(volume > 15)
|
||||
if(prob(5))
|
||||
switch(pick(1, 2, 3))
|
||||
@@ -457,4 +458,173 @@ datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob)
|
||||
M.drop_r_hand()
|
||||
M.adjustToxLoss(1)
|
||||
..()
|
||||
return
|
||||
return
|
||||
|
||||
//////////////////////////////
|
||||
// Synth-Drugs //
|
||||
//////////////////////////////
|
||||
|
||||
//Ultra-Lube: Meth
|
||||
/datum/reagent/lube/ultra
|
||||
name = "Ultra-Lube"
|
||||
id = "ultralube"
|
||||
description = "Ultra-Lube is an enhanced lubricant which induces effect similar to Methamphetamine in synthetic users by drastically reducing internal friction and increasing cooling capabilities."
|
||||
reagent_state = LIQUID
|
||||
color = "#1BB1FF"
|
||||
|
||||
process_flags = SYNTHETIC
|
||||
overdose_threshold = 20
|
||||
addiction_threshold = 10
|
||||
metabolization_rate = 0.6
|
||||
|
||||
/datum/chemical_reaction/lube/ultra
|
||||
name = "Ultra-Lube"
|
||||
id = "ultralube"
|
||||
result = "ultralube"
|
||||
required_reagents = list("lube" = 2, "formaldehyde" = 1, "cryostylane" = 1)
|
||||
result_amount = 2
|
||||
mix_message = "The mixture darkens and appears to partially vaporize into a chilling aerosol."
|
||||
|
||||
/datum/reagent/lube/ultra/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
var/high_message = pick("You feel your servos whir!", "You feel like you need to go faster.", "You feel like you were just overclocked!")
|
||||
if(prob(1))
|
||||
if(prob(1))
|
||||
high_message = "0100011101001111010101000101010001000001010001110100111101000110010000010101001101010100!"
|
||||
if(prob(5))
|
||||
M << "<span class='notice'>[high_message]</span>"
|
||||
M.AdjustParalysis(-2)
|
||||
M.AdjustStunned(-2)
|
||||
M.AdjustWeakened(-2)
|
||||
M.adjustStaminaLoss(-2)
|
||||
M.status_flags |= GOTTAGOREALLYFAST
|
||||
M.Jitter(3)
|
||||
M.adjustBrainLoss(0.5)
|
||||
if(prob(5))
|
||||
M.emote(pick("twitch", "shiver"))
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/lube/ultra/overdose_process(var/mob/living/M as mob)
|
||||
if(prob(20))
|
||||
M.emote("ping")
|
||||
if(prob(33))
|
||||
M.visible_message("<span class = 'danger'>[M]'s hands flip out and flail everywhere!</span>")
|
||||
var/obj/item/I = M.get_active_hand()
|
||||
if(I)
|
||||
M.drop_item()
|
||||
..()
|
||||
if(prob(50))
|
||||
M.adjustToxLoss(10)
|
||||
M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
|
||||
return
|
||||
|
||||
/datum/reagent/lube/ultra/addiction_act_stage1(var/mob/living/M as mob)
|
||||
M.Jitter(5)
|
||||
if(prob(20))
|
||||
M.emote(pick("twitch","buzz","moan"))
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/lube/ultra/addiction_act_stage2(var/mob/living/M as mob)
|
||||
M.Jitter(10)
|
||||
M.Dizzy(10)
|
||||
if(prob(30))
|
||||
M.emote(pick("twitch","buzz","moan"))
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/lube/ultra/addiction_act_stage3(var/mob/living/M as mob)
|
||||
M.Jitter(15)
|
||||
M.Dizzy(15)
|
||||
if(prob(40))
|
||||
M.emote(pick("twitch","buzz","moan"))
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/lube/ultra/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
|
||||
M.Jitter(20)
|
||||
M.Dizzy(20)
|
||||
M.adjustToxLoss(5)
|
||||
if(prob(50))
|
||||
M.emote(pick("twitch","buzz","moan"))
|
||||
..()
|
||||
return
|
||||
|
||||
//Surge: Krokodil
|
||||
/datum/reagent/surge
|
||||
name = "Surge"
|
||||
id = "surge"
|
||||
description = "A sketchy superconducting gel that overloads processors, causing an effect reportedly similar to opiates in synthetic units."
|
||||
reagent_state = LIQUID
|
||||
color = "#6DD16D"
|
||||
|
||||
process_flags = SYNTHETIC
|
||||
overdose_threshold = 20
|
||||
addiction_threshold = 15
|
||||
|
||||
|
||||
/datum/reagent/surge/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.druggy = max(M.druggy, 15)
|
||||
var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.")
|
||||
if(prob(1))
|
||||
if(prob(1))
|
||||
high_message = "01010100010100100100000101001110010100110100001101000101010011100100010001000101010011100100001101000101."
|
||||
if(prob(5))
|
||||
M << "<span class='notice'>[high_message]</span>"
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/surge/overdose_process(var/mob/living/M as mob)
|
||||
//Hit them with the same effects as an electrode!
|
||||
M.Stun(5)
|
||||
M.Weaken(5)
|
||||
M.Jitter(20)
|
||||
M.apply_effect(STUTTER, 5)
|
||||
if(prob(10))
|
||||
M << "<span class='danger'>You experience a violent electrical discharge!</span>"
|
||||
playsound(get_turf(M), 'sound/effects/eleczap.ogg', 75, 1)
|
||||
//Lightning effect for electrical discharge visualization
|
||||
var/icon/I=new('icons/obj/zap.dmi',"lightningend")
|
||||
I.Turn(-135)
|
||||
var/obj/effect/overlay/beam/B = new(get_turf(M))
|
||||
B.pixel_x = rand(-20, 0)
|
||||
B.pixel_y = rand(-20, 0)
|
||||
B.icon = I
|
||||
M.adjustFireLoss(rand(1,5)*REM)
|
||||
M.adjustBruteLoss(rand(1,5)*REM)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/surge/addiction_act_stage1(var/mob/living/M as mob)
|
||||
M.adjustBrainLoss(rand(1,5)*REM)
|
||||
M.adjustToxLoss(rand(1,5)*REM)
|
||||
..()
|
||||
return
|
||||
/datum/reagent/surge/addiction_act_stage2(var/mob/living/M as mob)
|
||||
if(prob(25))
|
||||
M << "<span class='danger'>Your casing feels loose...</span>"
|
||||
..()
|
||||
return
|
||||
/datum/reagent/surge/addiction_act_stage3(var/mob/living/M as mob)
|
||||
if(prob(25))
|
||||
M << "<span class='danger'>Your casing starts to come apart...</span>"
|
||||
M.adjustBruteLoss(3*REM)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/surge/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
|
||||
if(prob(25))
|
||||
M << "<span class='userdanger'>Your exposed wiring begins corroding!</span>"
|
||||
M.adjustFireLoss(5*REM)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/surge
|
||||
name = "Surge"
|
||||
id = "surge"
|
||||
result = "surge"
|
||||
required_reagents = list("thermite" = 3, "uranium" = 1, "fluorosurfactant" = 1, "sacid" = 1)
|
||||
result_amount = 6
|
||||
mix_message = "The mixture congeals into a metallic green gel that crackles with electrical activity."
|
||||
|
||||
@@ -337,6 +337,7 @@ datum/reagent/greenvomit/reaction_turf(var/turf/T, var/volume)
|
||||
description = "A bizarre gelatinous substance supposedly derived from ghosts."
|
||||
reagent_state = LIQUID
|
||||
color = "#8EAE7B"
|
||||
process_flags = ORGANIC | SYNTHETIC //Because apparently ghosts in the shell
|
||||
|
||||
datum/reagent/ectoplasm/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
|
||||
if(!istype(M, /mob/living))
|
||||
|
||||
@@ -911,4 +911,71 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
|
||||
result = "haloperidol"
|
||||
required_reagents = list("chlorine" = 1, "fluorine" = 1, "aluminum" = 1, "potass_iodide" = 1, "oil" = 1)
|
||||
result_amount = 4
|
||||
mix_message = "The chemicals mix into an odd pink slush."
|
||||
mix_message = "The chemicals mix into an odd pink slush."
|
||||
|
||||
//////////////////////////////
|
||||
// Synth-Meds //
|
||||
//////////////////////////////
|
||||
|
||||
//Degreaser: Anti-toxin / Lube Remover
|
||||
/datum/reagent/degreaser
|
||||
name = "Degreaser"
|
||||
id = "degreaser"
|
||||
description = "An industrial degreaser which can be used to clean residual build-up from machinery and surfaces."
|
||||
reagent_state = LIQUID
|
||||
color = "#CC7A00"
|
||||
process_flags = SYNTHETIC
|
||||
|
||||
/datum/chemical_reaction/degreaser
|
||||
name = "Degreaser"
|
||||
id = "degreaser"
|
||||
result = "degreaser"
|
||||
required_reagents = list("oil" = 1, "sterilizine" = 1)
|
||||
result_amount = 2
|
||||
|
||||
/datum/reagent/degreaser/reaction_turf(var/turf/simulated/T, var/volume)
|
||||
if (!istype(T)) return
|
||||
src = null
|
||||
if(volume >= 1)
|
||||
if(T.wet >= 2) //Clears lube! Fight back against the slipping, and WIN!
|
||||
T.wet = 0
|
||||
if(T.wet_overlay)
|
||||
T.overlays -= T.wet_overlay
|
||||
T.wet_overlay = null
|
||||
return
|
||||
|
||||
/datum/reagent/degreaser/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.adjustToxLoss(-1.5*REM)
|
||||
for(var/datum/reagent/R in M.reagents.reagent_list)
|
||||
if(R != src)
|
||||
if(R.id == "ultralube" || R.id == "lube")
|
||||
//Flushes lube and ultra-lube even faster than other chems
|
||||
M.reagents.remove_reagent(R.id, 5)
|
||||
else
|
||||
M.reagents.remove_reagent(R.id,1)
|
||||
..()
|
||||
return
|
||||
|
||||
//Liquid Solder: Mannitol
|
||||
/datum/reagent/liquid_solder
|
||||
name = "Liquid Solder"
|
||||
id = "liquid_solder"
|
||||
description = "A solution formulated to clean and repair damaged connections in posibrains while in use."
|
||||
reagent_state = LIQUID
|
||||
color = "#D7B395"
|
||||
process_flags = SYNTHETIC
|
||||
|
||||
/datum/reagent/liquid_solder/on_mob_life(mob/living/M as mob)
|
||||
M.adjustBrainLoss(-3)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/liquid_solder
|
||||
name = "Liquid Solder"
|
||||
id = "liquid_solder"
|
||||
result = "liquid_solder"
|
||||
required_reagents = list("ethanol" = 1, "copper" = 1, "silver" = 1)
|
||||
result_amount = 3
|
||||
required_temp = 370
|
||||
mix_message = "The solution gently swirls with a metallic sheen."
|
||||
|
||||
@@ -11,10 +11,35 @@ datum/reagents
|
||||
|
||||
datum/reagents/proc/metabolize(var/mob/M)
|
||||
if(M)
|
||||
if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check)
|
||||
return
|
||||
chem_temp = M.bodytemperature
|
||||
handle_reactions()
|
||||
for(var/A in reagent_list)
|
||||
var/datum/reagent/R = A
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
//Check if this mob's species is set and can process this type of reagent
|
||||
var/can_process = 0
|
||||
//If we somehow avoided getting a species or reagent_tag set, we'll assume we aren't meant to process ANY reagents (CODERS: SET YOUR SPECIES AND TAG!)
|
||||
if(H.species && H.species.reagent_tag)
|
||||
if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
|
||||
can_process = 1
|
||||
if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
|
||||
can_process = 1
|
||||
//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 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)
|
||||
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
|
||||
if(R.process_flags == SYNTHETIC)
|
||||
R.holder.remove_reagent(R.id, R.metabolization_rate)
|
||||
continue
|
||||
//If you got this far, that means we can process whatever reagent this iteration is for. Handle things normally from here.
|
||||
if(M && R)
|
||||
if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0)
|
||||
R.overdosed = 1
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#FF0000"
|
||||
metabolization_rate = 4
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
/datum/chemical_reaction/clf3
|
||||
name = "Chlorine Trifluoride"
|
||||
@@ -413,6 +414,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
|
||||
description = "Catches you on fire and makes you ignite."
|
||||
reagent_state = LIQUID
|
||||
color = "#FF9999"
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
/datum/chemical_reaction/phlogiston
|
||||
name = "phlogiston"
|
||||
@@ -443,6 +445,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
|
||||
description = "Very flammable."
|
||||
reagent_state = LIQUID
|
||||
color = "#FF9999"
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
/datum/reagent/napalm/on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
@@ -467,6 +470,7 @@ datum/reagent/cryostylane
|
||||
id = "cryostylane"
|
||||
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K."
|
||||
color = "#B2B2FF" // rgb: 139, 166, 233
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
/datum/chemical_reaction/cryostylane
|
||||
name = "cryostylane"
|
||||
@@ -500,6 +504,7 @@ datum/reagent/pyrosium
|
||||
id = "pyrosium"
|
||||
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K."
|
||||
color = "#B20000" // rgb: 139, 166, 233
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
/datum/chemical_reaction/pyrosium
|
||||
name = "pyrosium"
|
||||
|
||||
@@ -226,6 +226,7 @@ datum/reagent/facid
|
||||
description = "Fluorosulfuric acid is a an extremely corrosive super-acid."
|
||||
reagent_state = LIQUID
|
||||
color = "#4141D2"
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
datum/reagent/facid/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
|
||||
if(!istype(M, /mob/living))
|
||||
@@ -720,6 +721,7 @@ datum/reagent/ants
|
||||
description = "A sample of a lost breed of Space Ants (formicidae bastardium tyrannus), they are well-known for ravaging the living shit out of pretty much anything."
|
||||
reagent_state = SOLID
|
||||
color = "#993333"
|
||||
process_flags = ORGANIC | SYNTHETIC
|
||||
|
||||
datum/reagent/ants/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) //NOT THE ANTS
|
||||
if(iscarbon(M))
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
var/activated = 0
|
||||
var/looptick = 0
|
||||
|
||||
var/delay_timer = null
|
||||
|
||||
var/list/blacklist = list(/obj/tram/rail,/atom/movable/lighting_overlay)
|
||||
var/list/ancwhitelist = list(/obj/tram, /obj/vehicle, /obj/structure/stool/bed/chair, /obj/structure/grille, /obj/structure/window)
|
||||
|
||||
@@ -72,7 +74,11 @@
|
||||
|
||||
/obj/tram/tram_controller/proc/tram_rail_follow()
|
||||
var/stored_rail = null
|
||||
if(delay_timer >= world.time) return
|
||||
for(var/obj/tram/rail/RT in get_turf(src))
|
||||
if(RT.stop_duration && !delay_timer)
|
||||
delay_timer = world.time + RT.stop_duration
|
||||
return
|
||||
if(RT.godir)
|
||||
handle_move(RT.godir)
|
||||
last_played_rail = RT
|
||||
@@ -84,6 +90,7 @@
|
||||
if(R != last_played_rail)
|
||||
handle_move(get_dir(src,R))
|
||||
last_played_rail = stored_rail
|
||||
return
|
||||
|
||||
//INITIALIZATION PROCS
|
||||
|
||||
@@ -212,6 +219,7 @@
|
||||
collide_list = collisions
|
||||
|
||||
/obj/tram/tram_controller/proc/handle_move(var/dir)
|
||||
delay_timer = null //reset delay
|
||||
gen_collision() //Look for collisions
|
||||
if(dir in collide_list) //Prevent moving if there are collisions in that direction
|
||||
return 0
|
||||
|
||||
@@ -4,4 +4,5 @@
|
||||
icon = 'icons/obj/tram/tram_rail.dmi'
|
||||
icon_state = "rail"
|
||||
var/godir = null
|
||||
var/stop_duration = null
|
||||
layer = TURF_LAYER + 0.1
|
||||
Reference in New Issue
Block a user