mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-21 19:19:12 +01:00
WIP fix of this PR
This commit is contained in:
@@ -1,10 +1,5 @@
|
||||
<<<<<<< HEAD
|
||||
proc/createRandomZlevel()
|
||||
if(awaydestinations.len || UNIT_TEST) //crude, but it saves another var! //VOREStation Edit - No loading away missions during CI testing
|
||||
=======
|
||||
/proc/createRandomZlevel()
|
||||
if(awaydestinations.len) //crude, but it saves another var!
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if(awaydestinations.len || UNIT_TEST) //crude, but it saves another var! //VOREStation Edit - No loading away missions during CI testing
|
||||
return
|
||||
|
||||
var/list/potentialRandomZlevels = list()
|
||||
|
||||
@@ -140,11 +140,7 @@
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["metadata"])
|
||||
<<<<<<< HEAD
|
||||
var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , html_decode(pref.metadata)) as message, extra = 0) //VOREStation Edit
|
||||
=======
|
||||
var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , pref.metadata) as message|null)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , html_decode(pref.metadata)) as message|null, extra = 0) //VOREStation Edit
|
||||
if(new_metadata && CanUseTopic(user))
|
||||
pref.metadata = new_metadata
|
||||
return TOPIC_REFRESH
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -135,10 +135,10 @@
|
||||
tgarscreen_path = /datum/tgui_module/crew_monitor/glasses
|
||||
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_AUGMENTED)
|
||||
|
||||
ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
/obj/item/clothing/glasses/omnihud/med/ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/glasses/omnihud/sec
|
||||
name = "\improper AR-S glasses"
|
||||
@@ -151,10 +151,10 @@
|
||||
tgarscreen_path = /datum/tgui_module/alarm_monitor/security/glasses
|
||||
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_WANTED,VIS_AUGMENTED)
|
||||
|
||||
ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
/obj/item/clothing/glasses/omnihud/sec/ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/glasses/omnihud/eng
|
||||
name = "\improper AR-E glasses"
|
||||
@@ -166,10 +166,10 @@
|
||||
action_button_name = "AR Console (Station Alerts)"
|
||||
tgarscreen_path = /datum/tgui_module/alarm_monitor/engineering/glasses
|
||||
|
||||
ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
/obj/item/clothing/glasses/omnihud/eng/ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/glasses/omnihud/rnd
|
||||
name = "\improper AR-R glasses"
|
||||
@@ -226,10 +226,10 @@
|
||||
action_button_name = "AR Console (All Alerts)"
|
||||
tgarscreen_path = /datum/tgui_module/alarm_monitor/all/glasses
|
||||
|
||||
ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
/obj/item/clothing/glasses/omnihud/all/ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/eyepatch
|
||||
name = "Security Hudpatch"
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
icon_state = "talon_captain_cap"
|
||||
item_state = "taloncaptaincap"
|
||||
|
||||
obj/item/clothing/head/beret/talon
|
||||
/obj/item/clothing/head/beret/talon
|
||||
name = "ITV beret"
|
||||
desc = "It's a basic baret colored to match ITV's uniforms."
|
||||
icon = 'icons/obj/clothing/hats_vr.dmi'
|
||||
@@ -122,7 +122,7 @@ obj/item/clothing/head/beret/talon
|
||||
icon_state = "beret_talon"
|
||||
item_state = "baret_talon"
|
||||
|
||||
obj/item/clothing/head/beret/talon/command
|
||||
/obj/item/clothing/head/beret/talon/command
|
||||
name = "ITV officer beret"
|
||||
desc = "It's a basic baret colored to match ITV's uniforms with a badge pinned on the front. Perfect for commanders."
|
||||
icon = 'icons/obj/clothing/hats_vr.dmi'
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
icon = 'icons/mob/taursuits_wolf_vr.dmi'
|
||||
icon_state = "wolf_item"
|
||||
item_state = "heavy_wolf_armor"
|
||||
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/wolf))
|
||||
return ..()
|
||||
else
|
||||
to_chat(H,"<span class='warning'>You need to have a wolf-taur half to wear this.</span>")
|
||||
return 0
|
||||
/obj/item/clothing/suit/armor/vest/wolftaur/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/wolf))
|
||||
return ..()
|
||||
else
|
||||
to_chat(H,"<span class='warning'>You need to have a wolf-taur half to wear this.</span>")
|
||||
return 0
|
||||
|
||||
// HoS armor improved by Vorestation to be slightly better than normal security stuff.
|
||||
/obj/item/clothing/suit/storage/vest/hoscoat
|
||||
|
||||
@@ -104,12 +104,8 @@
|
||||
matter = list("glass" = 175)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change()
|
||||
<<<<<<< HEAD
|
||||
cut_overlays()
|
||||
=======
|
||||
overlays.Cut()
|
||||
name = "shot glass"
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
if(!reagents.total_volume)
|
||||
return
|
||||
@@ -120,17 +116,9 @@
|
||||
if(4 to 7) filling.icon_state = "[icon_state]5"
|
||||
if(8 to INFINITY) filling.icon_state = "[icon_state]12"
|
||||
|
||||
<<<<<<< HEAD
|
||||
filling.color += reagents.get_color()
|
||||
add_overlay(filling)
|
||||
name = "shot glass of " + reagents.get_master_reagent_name() //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future.
|
||||
else
|
||||
name = "shot glass"
|
||||
=======
|
||||
filling.color += reagents.get_color()
|
||||
overlays += filling
|
||||
add_overlay(filling)
|
||||
name += " of [reagents.get_master_reagent_name()]" //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future.
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask
|
||||
name = "fitness shaker"
|
||||
|
||||
@@ -371,5 +371,4 @@
|
||||
#undef LUM_FALLOFF
|
||||
#undef REMOVE_CORNER
|
||||
#undef APPLY_CORNER
|
||||
#undef REMOVE_CORNER_SIMPLE
|
||||
#undef APPLY_CORNER_SIMPLE
|
||||
@@ -1,4 +1,3 @@
|
||||
<<<<<<< HEAD
|
||||
/mob/observer
|
||||
name = "observer"
|
||||
desc = "This shouldn't appear"
|
||||
@@ -838,7 +837,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master.
|
||||
plane_holder.set_vis(VIS_GHOSTS, ghostvision)
|
||||
|
||||
mob/observer/dead/MayRespawn(var/feedback = 0)
|
||||
/mob/observer/dead/MayRespawn(var/feedback = 0)
|
||||
if(!client)
|
||||
return 0
|
||||
if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse)
|
||||
@@ -968,965 +967,3 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
|
||||
set name = "Respawn"
|
||||
set category = "Ghost"
|
||||
src.abandon_mob()
|
||||
=======
|
||||
/mob/observer
|
||||
name = "observer"
|
||||
desc = "This shouldn't appear"
|
||||
density = 0
|
||||
|
||||
/mob/observer/dead
|
||||
name = "ghost"
|
||||
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
|
||||
icon = 'icons/mob/ghost.dmi'
|
||||
icon_state = "ghost"
|
||||
stat = DEAD
|
||||
canmove = 0
|
||||
blinded = 0
|
||||
anchored = 1 // don't get pushed around
|
||||
|
||||
var/can_reenter_corpse
|
||||
var/datum/hud/living/carbon/hud = null // hud
|
||||
var/bootime = 0
|
||||
var/started_as_observer //This variable is set to 1 when you enter the game as an observer.
|
||||
//If you died in the game and are a ghsot - this will remain as null.
|
||||
//Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot.
|
||||
var/has_enabled_antagHUD = 0
|
||||
var/medHUD = 0
|
||||
var/secHUD = 0
|
||||
var/antagHUD = 0
|
||||
universal_speak = 1
|
||||
var/atom/movable/following = null
|
||||
var/admin_ghosted = 0
|
||||
var/anonsay = 0
|
||||
var/ghostvision = 1 //is the ghost able to see things humans can't?
|
||||
incorporeal_move = 1
|
||||
|
||||
var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil.
|
||||
var/ghost_sprite = null
|
||||
var/global/list/possible_ghost_sprites = list(
|
||||
"Clear" = "blank",
|
||||
"Green Blob" = "otherthing",
|
||||
"Bland" = "ghost",
|
||||
"Robed-B" = "ghost1",
|
||||
"Robed-BAlt" = "ghost2",
|
||||
"King" = "ghostking",
|
||||
"Shade" = "shade",
|
||||
"Hecate" = "ghost-narsie",
|
||||
"Glowing Statue" = "armour",
|
||||
"Artificer" = "artificer",
|
||||
"Behemoth" = "behemoth",
|
||||
"Harvester" = "harvester",
|
||||
"Wraith" = "wraith",
|
||||
"Viscerator" = "viscerator",
|
||||
"Corgi" = "corgi",
|
||||
"Tamaskan" = "tamaskan",
|
||||
"Black Cat" = "blackcat",
|
||||
"Lizard" = "lizard",
|
||||
"Goat" = "goat",
|
||||
"Space Bear" = "bear",
|
||||
"Bats" = "bat",
|
||||
"Chicken" = "chicken_white",
|
||||
"Parrot"= "parrot_fly",
|
||||
"Goose" = "goose",
|
||||
"Penguin" = "penguin",
|
||||
"Brown Crab" = "crab",
|
||||
"Gray Crab" = "evilcrab",
|
||||
"Trout" = "trout-swim",
|
||||
"Salmon" = "salmon-swim",
|
||||
"Pike" = "pike-swim",
|
||||
"Koi" = "koi-swim",
|
||||
"Carp" = "carp",
|
||||
"Red Robes" = "robe_red",
|
||||
"Faithless" = "faithless",
|
||||
"Shadowform" = "forgotten",
|
||||
"Dark Ethereal" = "bloodguardian",
|
||||
"Holy Ethereal" = "lightguardian",
|
||||
"Red Elemental" = "magicRed",
|
||||
"Blue Elemental" = "magicBlue",
|
||||
"Pink Elemental" = "magicPink",
|
||||
"Orange Elemental" = "magicOrange",
|
||||
"Green Elemental" = "magicGreen",
|
||||
"Daemon" = "daemon",
|
||||
"Guard Spider" = "guard",
|
||||
"Hunter Spider" = "hunter",
|
||||
"Nurse Spider" = "nurse",
|
||||
"Rogue Drone" = "drone",
|
||||
"ED-209" = "ed209",
|
||||
"Beepsky" = "secbot"
|
||||
)
|
||||
var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners.
|
||||
var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns
|
||||
|
||||
/mob/observer/dead/New(mob/body)
|
||||
|
||||
appearance = body
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
layer = BELOW_MOB_LAYER
|
||||
plane = PLANE_GHOSTS
|
||||
alpha = 127
|
||||
|
||||
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but...
|
||||
verbs += /mob/observer/dead/proc/dead_tele
|
||||
|
||||
var/turf/T
|
||||
if(ismob(body))
|
||||
T = get_turf(body) //Where is the body located?
|
||||
attack_log = body.attack_log //preserve our attack logs by copying them to our ghost
|
||||
gender = body.gender
|
||||
if(body.mind && body.mind.name)
|
||||
name = body.mind.name
|
||||
else
|
||||
if(body.real_name)
|
||||
name = body.real_name
|
||||
else
|
||||
if(gender == MALE)
|
||||
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
||||
else
|
||||
name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
|
||||
|
||||
mind = body.mind //we don't transfer the mind but we keep a reference to it.
|
||||
|
||||
// Fix for naked ghosts.
|
||||
// Unclear why this isn't being grabbed by appearance.
|
||||
if(ishuman(body))
|
||||
var/mob/living/carbon/human/H = body
|
||||
add_overlay(H.overlays_standing)
|
||||
|
||||
if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position
|
||||
forceMove(T)
|
||||
|
||||
if(!name) //To prevent nameless ghosts
|
||||
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
||||
real_name = name
|
||||
animate(src, pixel_y = 2, time = 10, loop = -1)
|
||||
..()
|
||||
|
||||
/mob/observer/dead/Topic(href, href_list)
|
||||
if (href_list["track"])
|
||||
var/mob/target = locate(href_list["track"]) in mob_list
|
||||
if(target)
|
||||
ManualFollow(target)
|
||||
if(href_list["reenter"])
|
||||
reenter_corpse()
|
||||
return
|
||||
|
||||
/mob/observer/dead/attackby(obj/item/W, mob/user)
|
||||
if(istype(W,/obj/item/weapon/book/tome))
|
||||
var/mob/observer/dead/M = src
|
||||
M.manifest(user)
|
||||
|
||||
/mob/observer/dead/CanPass(atom/movable/mover, turf/target)
|
||||
return TRUE
|
||||
|
||||
/mob/observer/dead/set_stat(var/new_stat)
|
||||
if(new_stat != DEAD)
|
||||
CRASH("It is best if observers stay dead, thank you.")
|
||||
|
||||
/mob/observer/dead/examine_icon()
|
||||
var/icon/I = get_cached_examine_icon(src)
|
||||
if(!I)
|
||||
I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE)
|
||||
set_cached_examine_icon(src, I, 200 SECONDS)
|
||||
return I
|
||||
|
||||
/mob/observer/dead/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
if(is_admin(user))
|
||||
. += "\t><span class='admin'>[ADMIN_FULLMONTY(src)]</span>"
|
||||
|
||||
/*
|
||||
Transfer_mind is there to check if mob is being deleted/not going to have a body.
|
||||
Works together with spawning an observer, noted above.
|
||||
*/
|
||||
|
||||
/mob/observer/dead/Life()
|
||||
..()
|
||||
if(!loc) return
|
||||
if(!client) return 0
|
||||
|
||||
handle_regular_hud_updates()
|
||||
handle_vision()
|
||||
|
||||
/mob/proc/ghostize(var/can_reenter_corpse = 1)
|
||||
if(key)
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.vr_holder && !can_reenter_corpse)
|
||||
H.exit_vr()
|
||||
return 0
|
||||
var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc.
|
||||
ghost.can_reenter_corpse = can_reenter_corpse
|
||||
ghost.timeofdeath = src.timeofdeath //BS12 EDIT
|
||||
ghost.key = key
|
||||
if(istype(loc, /obj/structure/morgue))
|
||||
var/obj/structure/morgue/M = loc
|
||||
M.update()
|
||||
else if(istype(loc, /obj/structure/closet/body_bag))
|
||||
var/obj/structure/closet/body_bag/B = loc
|
||||
B.update()
|
||||
if(ghost.client)
|
||||
ghost.client.time_died_as_mouse = ghost.timeofdeath
|
||||
if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed.
|
||||
ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing!
|
||||
return ghost
|
||||
|
||||
/*
|
||||
This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues.
|
||||
*/
|
||||
/mob/living/verb/ghost()
|
||||
set category = "OOC"
|
||||
set name = "Ghost"
|
||||
set desc = "Relinquish your life and enter the land of the dead."
|
||||
|
||||
if(stat == DEAD && !forbid_seeing_deadchat)
|
||||
announce_ghost_joinleave(ghostize(1))
|
||||
else
|
||||
var/response
|
||||
if(src.client && src.client.holder)
|
||||
response = alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", "Ghost", "Admin Ghost", "Stay in body")
|
||||
if(response == "Admin Ghost")
|
||||
if(!src.client)
|
||||
return
|
||||
src.client.admin_ghost()
|
||||
else
|
||||
response = alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. If you ghost, you won't be able to play this round until you respawn as a new character! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body")
|
||||
if(response != "Ghost")
|
||||
return
|
||||
resting = 1
|
||||
var/turf/location = get_turf(src)
|
||||
var/special_role = check_special_role()
|
||||
if(!istype(loc,/obj/machinery/cryopod))
|
||||
log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)",usr)
|
||||
else if(special_role)
|
||||
log_and_message_admins("has ghosted in cryo as [special_role]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)",usr)
|
||||
var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
|
||||
if(ghost)
|
||||
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
|
||||
ghost.set_respawn_timer()
|
||||
announce_ghost_joinleave(ghost)
|
||||
|
||||
/mob/observer/dead/can_use_hands() return 0
|
||||
/mob/observer/dead/is_active() return 0
|
||||
|
||||
/mob/observer/dead/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
if(emergency_shuttle)
|
||||
var/eta_status = emergency_shuttle.get_status_panel_eta()
|
||||
if(eta_status)
|
||||
stat(null, eta_status)
|
||||
|
||||
/mob/observer/dead/verb/reenter_corpse()
|
||||
set category = "Ghost"
|
||||
set name = "Re-enter Corpse"
|
||||
if(!client) return
|
||||
if(!(mind && mind.current && can_reenter_corpse))
|
||||
to_chat(src, "<span class='warning'>You have no body.</span>")
|
||||
return
|
||||
if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients
|
||||
to_chat(usr, "<span class='warning'>Another consciousness is in your body... it is resisting you.</span>")
|
||||
return
|
||||
if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune).
|
||||
var/found_rune
|
||||
for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune
|
||||
if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune.
|
||||
found_rune = 1
|
||||
break
|
||||
if(!found_rune)
|
||||
to_chat(usr, "<span class='warning'>The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.</span>")
|
||||
return
|
||||
mind.current.ajourn=0
|
||||
mind.current.key = key
|
||||
mind.current.teleop = null
|
||||
if(istype(mind.current.loc, /obj/structure/morgue))
|
||||
var/obj/structure/morgue/M = mind.current.loc
|
||||
M.update(1)
|
||||
else if(istype(mind.current.loc, /obj/structure/closet/body_bag))
|
||||
var/obj/structure/closet/body_bag/B = mind.current.loc
|
||||
B.update(1)
|
||||
if(!admin_ghosted)
|
||||
announce_ghost_joinleave(mind, 0, "They now occupy their body again.")
|
||||
return 1
|
||||
|
||||
/mob/observer/dead/verb/toggle_medHUD()
|
||||
set category = "Ghost"
|
||||
set name = "Toggle MedicHUD"
|
||||
set desc = "Toggles Medical HUD allowing you to see how everyone is doing"
|
||||
|
||||
medHUD = !medHUD
|
||||
plane_holder.set_vis(VIS_CH_HEALTH, medHUD)
|
||||
plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD)
|
||||
to_chat(src, "<font color='blue'><B>Medical HUD [medHUD ? "Enabled" : "Disabled"]</B></font>")
|
||||
|
||||
/mob/observer/dead/verb/toggle_secHUD()
|
||||
set category = "Ghost"
|
||||
set name = "Toggle Security HUD"
|
||||
set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc"
|
||||
|
||||
secHUD = !secHUD
|
||||
plane_holder.set_vis(VIS_CH_ID, secHUD)
|
||||
plane_holder.set_vis(VIS_CH_WANTED, secHUD)
|
||||
plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD)
|
||||
plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD)
|
||||
plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD)
|
||||
to_chat(src, "<font color='blue'><B>Security HUD [secHUD ? "Enabled" : "Disabled"]</B></font>")
|
||||
|
||||
/mob/observer/dead/verb/toggle_antagHUD()
|
||||
set category = "Ghost"
|
||||
set name = "Toggle AntagHUD"
|
||||
set desc = "Toggles AntagHUD allowing you to see who is the antagonist"
|
||||
|
||||
if(!config.antag_hud_allowed && !client.holder)
|
||||
to_chat(src, "<font color='red'>Admins have disabled this for this round.</font>")
|
||||
return
|
||||
if(jobban_isbanned(src, "AntagHUD"))
|
||||
to_chat(src, "<font color='red'><B>You have been banned from using this feature</B></font>")
|
||||
return
|
||||
if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder)
|
||||
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
|
||||
if(response == "No") return
|
||||
can_reenter_corpse = FALSE
|
||||
set_respawn_timer(-1) // Foreeeever
|
||||
if(!has_enabled_antagHUD && !client.holder)
|
||||
has_enabled_antagHUD = TRUE
|
||||
|
||||
antagHUD = !antagHUD
|
||||
plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD)
|
||||
to_chat(src, "<font color='blue'><B>AntagHUD [antagHUD ? "Enabled" : "Disabled"]</B></font>")
|
||||
|
||||
/mob/observer/dead/proc/jumpable_areas()
|
||||
var/list/areas = return_sorted_areas()
|
||||
if(client?.holder)
|
||||
return areas
|
||||
|
||||
for(var/area/A as anything in areas)
|
||||
if(A.z in using_map?.secret_levels)
|
||||
areas -= A
|
||||
return areas
|
||||
|
||||
/mob/observer/dead/proc/jumpable_mobs()
|
||||
var/list/mobs = getmobs()
|
||||
if(client?.holder)
|
||||
return mobs
|
||||
|
||||
for(var/key in mobs)
|
||||
var/mobz = get_z(mobs[key])
|
||||
if(mobz in using_map?.secret_levels)
|
||||
mobs -= key
|
||||
return mobs
|
||||
|
||||
/mob/observer/dead/proc/dead_tele(var/area/A in jumpable_areas())
|
||||
set category = "Ghost"
|
||||
set name = "Teleport"
|
||||
set desc = "Teleport to a location"
|
||||
|
||||
if(!istype(usr, /mob/observer/dead))
|
||||
to_chat(usr, "Not when you're not dead!")
|
||||
return
|
||||
|
||||
if(!A)
|
||||
A = input(usr, "Select an area:", "Ghost Teleport") as null|anything in jumpable_areas()
|
||||
if(!A)
|
||||
return
|
||||
|
||||
usr.forceMove(pick(get_area_turfs(A)))
|
||||
usr.on_mob_jump()
|
||||
|
||||
/mob/observer/dead/verb/follow(input in jumpable_mobs())
|
||||
set category = "Ghost"
|
||||
set name = "Follow" // "Haunt"
|
||||
set desc = "Follow and haunt a mob."
|
||||
|
||||
if(!input)
|
||||
input = input(usr, "Select a mob:", "Ghost Follow") as null|anything in jumpable_mobs()
|
||||
if(!input)
|
||||
return
|
||||
|
||||
var/target = jumpable_mobs()[input]
|
||||
if(!target) return
|
||||
ManualFollow(target)
|
||||
|
||||
/mob/observer/dead/forceMove(atom/destination)
|
||||
if(client?.holder)
|
||||
return ..()
|
||||
|
||||
if(get_z(destination) in using_map?.secret_levels)
|
||||
to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts."))
|
||||
if(following)
|
||||
stop_following()
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
/mob/observer/dead/Move(atom/newloc, direct = 0, movetime)
|
||||
if(client?.holder)
|
||||
return ..()
|
||||
|
||||
if(get_z(newloc) in using_map?.secret_levels)
|
||||
to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts."))
|
||||
if(following)
|
||||
stop_following()
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
// This is the ghost's follow verb with an argument
|
||||
/mob/observer/dead/proc/ManualFollow(var/atom/movable/target)
|
||||
if(!target)
|
||||
return
|
||||
|
||||
var/turf/targetloc = get_turf(target)
|
||||
if(check_holy(targetloc))
|
||||
to_chat(usr, "<span class='warning'>You cannot follow a mob standing on holy grounds!</span>")
|
||||
return
|
||||
if(get_z(target) in using_map?.secret_levels)
|
||||
to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go."))
|
||||
return
|
||||
if(target != src)
|
||||
if(following && following == target)
|
||||
return
|
||||
following = target
|
||||
to_chat(src, "<span class='notice'>Now following [target]</span>")
|
||||
if(ismob(target))
|
||||
forceMove(get_turf(target))
|
||||
var/mob/M = target
|
||||
M.following_mobs += src
|
||||
else
|
||||
spawn(0)
|
||||
while(target && following == target && client)
|
||||
var/turf/T = get_turf(target)
|
||||
if(!T)
|
||||
break
|
||||
// To stop the ghost flickering.
|
||||
if(loc != T)
|
||||
forceMove(T)
|
||||
sleep(15)
|
||||
|
||||
var/icon/I = icon(target.icon,target.icon_state,target.dir)
|
||||
|
||||
var/orbitsize = (I.Width()+I.Height())*0.5
|
||||
orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25)
|
||||
|
||||
var/rot_seg
|
||||
|
||||
/* We don't have this pref yet
|
||||
switch(ghost_orbit)
|
||||
if(GHOST_ORBIT_TRIANGLE)
|
||||
rot_seg = 3
|
||||
if(GHOST_ORBIT_SQUARE)
|
||||
rot_seg = 4
|
||||
if(GHOST_ORBIT_PENTAGON)
|
||||
rot_seg = 5
|
||||
if(GHOST_ORBIT_HEXAGON)
|
||||
rot_seg = 6
|
||||
else //Circular
|
||||
rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle
|
||||
*/
|
||||
|
||||
orbit(target, orbitsize, FALSE, 20, rot_seg)
|
||||
|
||||
/mob/observer/dead/orbit()
|
||||
set_dir(2) //reset dir so the right directional sprites show up
|
||||
return ..()
|
||||
|
||||
/mob/observer/dead/stop_orbit()
|
||||
. = ..()
|
||||
//restart our floating animation after orbit is done.
|
||||
pixel_y = 0
|
||||
pixel_x = 0
|
||||
transform = null
|
||||
animate(src, pixel_y = 2, time = 10, loop = -1)
|
||||
|
||||
/mob/observer/dead/proc/stop_following()
|
||||
following = null
|
||||
stop_orbit()
|
||||
|
||||
/mob/proc/update_following()
|
||||
. = get_turf(src)
|
||||
for(var/mob/observer/dead/M in following_mobs)
|
||||
if(M.following != src)
|
||||
following_mobs -= M
|
||||
else
|
||||
if(M.loc != .)
|
||||
M.forceMove(.)
|
||||
|
||||
/mob
|
||||
var/list/following_mobs = list()
|
||||
|
||||
/mob/Destroy()
|
||||
for(var/mob/observer/dead/M in following_mobs)
|
||||
M.stop_following()
|
||||
following_mobs = null
|
||||
return ..()
|
||||
|
||||
/mob/observer/dead/Destroy()
|
||||
if(ismob(following))
|
||||
var/mob/M = following
|
||||
M.following_mobs -= src
|
||||
stop_following()
|
||||
return ..()
|
||||
|
||||
/mob/Moved(atom/old_loc, direction, forced = FALSE)
|
||||
. = ..()
|
||||
update_following()
|
||||
|
||||
/mob/Life()
|
||||
// to catch teleports etc which directly set loc
|
||||
update_following()
|
||||
return ..()
|
||||
|
||||
/mob/proc/check_holy(var/turf/T)
|
||||
return 0
|
||||
|
||||
/mob/observer/dead/check_holy(var/turf/T)
|
||||
if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src))
|
||||
return 0
|
||||
|
||||
return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists))
|
||||
|
||||
/mob/observer/dead/verb/jumptomob(input in jumpable_mobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak
|
||||
set category = "Ghost"
|
||||
set name = "Jump to Mob"
|
||||
set desc = "Teleport to a mob"
|
||||
set popup_menu = FALSE
|
||||
|
||||
if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer!
|
||||
return
|
||||
|
||||
if(!input)
|
||||
input = input(usr, "Select a mob:", "Ghost Jump") as null|anything in jumpable_mobs()
|
||||
if(!input)
|
||||
return
|
||||
|
||||
var/target = jumpable_mobs()[input]
|
||||
if (!target)//Make sure we actually have a target
|
||||
return
|
||||
else
|
||||
var/mob/M = target //Destination mob
|
||||
var/turf/T = get_turf(M) //Turf of the destination mob
|
||||
|
||||
if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination.
|
||||
forceMove(T)
|
||||
stop_following()
|
||||
else
|
||||
to_chat(src, "This mob is not located in the game world.")
|
||||
|
||||
/mob/observer/dead/memory()
|
||||
set hidden = 1
|
||||
to_chat(src, "<font color='red'>You are dead! You have no mind to store memory!</font>")
|
||||
|
||||
/mob/observer/dead/add_memory()
|
||||
set hidden = 1
|
||||
to_chat(src, "<font color='red'>You are dead! You have no mind to store memory!</font>")
|
||||
|
||||
/mob/observer/dead/Post_Incorpmove()
|
||||
stop_following()
|
||||
|
||||
/mob/observer/dead/verb/analyze_air()
|
||||
set name = "Analyze Air"
|
||||
set category = "Ghost"
|
||||
|
||||
if(!istype(usr, /mob/observer/dead)) return
|
||||
|
||||
// Shamelessly copied from the Gas Analyzers
|
||||
if (!( istype(usr.loc, /turf) ))
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/environment = usr.loc.return_air()
|
||||
|
||||
var/pressure = environment.return_pressure()
|
||||
var/total_moles = environment.total_moles
|
||||
|
||||
to_chat(src, "<font color='blue'><B>Results:</B></font>")
|
||||
if(abs(pressure - ONE_ATMOSPHERE) < 10)
|
||||
to_chat(src, "<font color='blue'>Pressure: [round(pressure,0.1)] kPa</font>")
|
||||
else
|
||||
to_chat(src, "<font color='red'>Pressure: [round(pressure,0.1)] kPa</font>")
|
||||
if(total_moles)
|
||||
for(var/g in environment.gas)
|
||||
to_chat(src, "<font color='blue'>[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)</font>")
|
||||
to_chat(src, "<font color='blue'>Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)</font>")
|
||||
to_chat(src, "<font color='blue'>Heat Capacity: [round(environment.heat_capacity(),0.1)]</font>")
|
||||
|
||||
/mob/observer/dead/verb/check_radiation()
|
||||
set name = "Check Radiation"
|
||||
set category = "Ghost"
|
||||
|
||||
var/turf/t = get_turf(src)
|
||||
if(t)
|
||||
var/rads = SSradiation.get_rads_at_turf(t)
|
||||
to_chat(src, "<span class='notice'>Radiation level: [rads ? rads : "0"] Bq.</span>")
|
||||
|
||||
|
||||
/mob/observer/dead/verb/become_mouse()
|
||||
set name = "Become mouse"
|
||||
set category = "Ghost"
|
||||
|
||||
if(config.disable_player_mice)
|
||||
to_chat(src, "<span class='warning'>Spawning as a mouse is currently disabled.</span>")
|
||||
return
|
||||
|
||||
if(!MayRespawn(1))
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T || (T.z in using_map.admin_levels))
|
||||
to_chat(src, "<span class='warning'>You may not spawn as a mouse on this Z-level.</span>")
|
||||
return
|
||||
|
||||
var/timedifference = world.time - client.time_died_as_mouse
|
||||
if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600)
|
||||
var/timedifference_text
|
||||
timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss")
|
||||
to_chat(src, "<span class='warning'>You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.</span>")
|
||||
return
|
||||
|
||||
var/response = alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?","Squeek!","Nope!")
|
||||
if(response != "Squeek!") return //Hit the wrong key...again.
|
||||
|
||||
|
||||
//find a viable mouse candidate
|
||||
var/mob/living/simple_mob/animal/passive/mouse/host
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
|
||||
var/list/found_vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines)
|
||||
if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20)
|
||||
found_vents.Add(v)
|
||||
if(found_vents.len)
|
||||
vent_found = pick(found_vents)
|
||||
host = new /mob/living/simple_mob/animal/passive/mouse(vent_found)
|
||||
else
|
||||
to_chat(src, "<span class='warning'>Unable to find any unwelded vents to spawn mice at.</span>")
|
||||
|
||||
if(host)
|
||||
if(config.uneducated_mice)
|
||||
host.universal_understand = 0
|
||||
announce_ghost_joinleave(src, 0, "They are now a mouse.")
|
||||
host.ckey = src.ckey
|
||||
host.add_ventcrawl(vent_found)
|
||||
to_chat(host, "<span class='info'>You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.</span>")
|
||||
|
||||
/mob/observer/dead/verb/view_manfiest()
|
||||
set name = "Show Crew Manifest"
|
||||
set category = "Ghost"
|
||||
|
||||
var/dat
|
||||
dat += "<h4>Crew Manifest</h4>"
|
||||
dat += data_core.get_manifest()
|
||||
|
||||
src << browse(dat, "window=manifest;size=370x420;can_close=1")
|
||||
|
||||
//This is called when a ghost is drag clicked to something.
|
||||
/mob/observer/dead/MouseDrop(atom/over)
|
||||
if(!usr || !over) return
|
||||
if (isobserver(usr) && usr.client && usr.client.holder && isliving(over))
|
||||
if (usr.client.holder.cmd_ghost_drag(src,over))
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
//Used for drawing on walls with blood puddles as a spooky ghost.
|
||||
/mob/observer/dead/verb/bloody_doodle()
|
||||
|
||||
set category = "Ghost"
|
||||
set name = "Write in blood"
|
||||
set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC."
|
||||
|
||||
if(!(config.cult_ghostwriter))
|
||||
to_chat(src, "<font color='red'>That verb is not currently permitted.</font>")
|
||||
return
|
||||
|
||||
if (!src.stat)
|
||||
return
|
||||
|
||||
if (usr != src)
|
||||
return 0 //something is terribly wrong
|
||||
|
||||
var/ghosts_can_write
|
||||
if(ticker.mode.name == "cult")
|
||||
if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists)
|
||||
ghosts_can_write = 1
|
||||
|
||||
if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such.
|
||||
to_chat(src, "<font color='red'>The veil is not thin enough for you to do that.</font>")
|
||||
return
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/obj/effect/decal/cleanable/blood/B in view(1,src))
|
||||
if(B.amount > 0)
|
||||
choices += B
|
||||
|
||||
if(!choices.len)
|
||||
to_chat(src, "<span class = 'warning'>There is no blood to use nearby.</span>")
|
||||
return
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/choice = input(src,"What blood would you like to use?") in null|choices
|
||||
|
||||
var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West")
|
||||
var/turf/simulated/T = src.loc
|
||||
if (direction != "Here")
|
||||
T = get_step(T,text2dir(direction))
|
||||
|
||||
if (!istype(T))
|
||||
to_chat(src, "<span class='warning'>You cannot doodle there.</span>")
|
||||
return
|
||||
|
||||
if(!choice || choice.amount == 0 || !(src.Adjacent(choice)))
|
||||
return
|
||||
|
||||
var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808"
|
||||
|
||||
var/num_doodles = 0
|
||||
for (var/obj/effect/decal/cleanable/blood/writing/W in T)
|
||||
num_doodles++
|
||||
if (num_doodles > 4)
|
||||
to_chat(src, "<span class='warning'>There is no space to write on!</span>")
|
||||
return
|
||||
|
||||
var/max_length = 50
|
||||
|
||||
var/message = sanitize(input("Write a message. It cannot be longer than [max_length] characters.","Blood writing", ""))
|
||||
|
||||
if (message)
|
||||
|
||||
if (length(message) > max_length)
|
||||
message += "-"
|
||||
to_chat(src, "<span class='warning'>You ran out of blood to write with!</span>")
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/writing/W = new(T)
|
||||
W.basecolor = doodle_color
|
||||
W.update_icon()
|
||||
W.message = message
|
||||
W.add_hiddenprint(src)
|
||||
W.visible_message("<font color='red'>Invisible fingers crudely paint something in blood on [T]...</font>")
|
||||
|
||||
/mob/observer/dead/pointed(atom/A as mob|obj|turf in view())
|
||||
if(!..())
|
||||
return 0
|
||||
usr.visible_message("<span class='deadsay'><b>[src]</b> points to [A]</span>")
|
||||
return 1
|
||||
|
||||
/mob/observer/dead/proc/manifest(mob/user)
|
||||
is_manifest = TRUE
|
||||
verbs |= /mob/observer/dead/proc/toggle_visibility
|
||||
verbs |= /mob/observer/dead/proc/ghost_whisper
|
||||
to_chat(src, "<font color='purple'>As you are now in the realm of the living, you can whisper to the living with the <b>Spectral Whisper</b> verb, inside the IC tab.</font>")
|
||||
if(plane != PLANE_WORLD)
|
||||
user.visible_message( \
|
||||
"<span class='warning'>\The [user] drags ghost, [src], to our plane of reality!</span>", \
|
||||
"<span class='warning'>You drag [src] to our plane of reality!</span>" \
|
||||
)
|
||||
toggle_visibility(TRUE)
|
||||
else
|
||||
var/datum/gender/T = gender_datums[user.get_visible_gender()]
|
||||
user.visible_message ( \
|
||||
"<span class='warning'>\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.</span>", \
|
||||
"<span class='warning'>You get the feeling that the ghost can't become any more visible.</span>" \
|
||||
)
|
||||
|
||||
/mob/observer/dead/proc/toggle_icon(var/icon)
|
||||
if(!client)
|
||||
return
|
||||
|
||||
var/iconRemoved = 0
|
||||
for(var/image/I in client.images)
|
||||
if(I.icon_state == icon)
|
||||
iconRemoved = 1
|
||||
qdel(I)
|
||||
|
||||
if(!iconRemoved)
|
||||
var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon)
|
||||
client.images += J
|
||||
|
||||
/mob/observer/dead/proc/toggle_visibility(var/forced = 0)
|
||||
set category = "Ghost"
|
||||
set name = "Toggle Visibility"
|
||||
set desc = "Allows you to turn (in)visible (almost) at will."
|
||||
|
||||
var/toggled_invisible
|
||||
if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600)
|
||||
to_chat(src, "You must gather strength before you can turn visible again...")
|
||||
return
|
||||
|
||||
if(plane == PLANE_WORLD)
|
||||
toggled_invisible = world.time
|
||||
visible_message("<span class='emote'>It fades from sight...</span>", "<span class='info'>You are now invisible.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='info'>You are now visible!</span>")
|
||||
|
||||
plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS
|
||||
invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER
|
||||
|
||||
// Give the ghost a cult icon which should be visible only to itself
|
||||
toggle_icon("cult")
|
||||
|
||||
/mob/observer/dead/verb/toggle_anonsay()
|
||||
set category = "Ghost"
|
||||
set name = "Toggle Anonymous Chat"
|
||||
set desc = "Toggles showing your key in dead chat."
|
||||
|
||||
src.anonsay = !src.anonsay
|
||||
if(anonsay)
|
||||
to_chat(src, "<span class='info'>Your key won't be shown when you speak in dead chat.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='info'>Your key will be publicly visible again.</span>")
|
||||
|
||||
/mob/observer/dead/canface()
|
||||
return 1
|
||||
|
||||
/mob/observer/dead/proc/can_admin_interact()
|
||||
return check_rights(R_ADMIN|R_EVENT, 0, src)
|
||||
|
||||
/mob/observer/dead/verb/toggle_ghostsee()
|
||||
set name = "Toggle Ghost Vision"
|
||||
set desc = "Toggles your ability to see things only ghosts can see, like other ghosts"
|
||||
set category = "Ghost"
|
||||
ghostvision = !ghostvision
|
||||
updateghostsight()
|
||||
to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.")
|
||||
|
||||
/mob/observer/dead/verb/toggle_darkness()
|
||||
set name = "Toggle Darkness"
|
||||
set desc = "Toggles your ability to see lighting overlays, and the darkness they create."
|
||||
set category = "Ghost"
|
||||
seedarkness = !seedarkness
|
||||
updateghostsight()
|
||||
to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.")
|
||||
|
||||
/mob/observer/dead/proc/updateghostsight()
|
||||
plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master.
|
||||
plane_holder.set_vis(VIS_GHOSTS, ghostvision)
|
||||
|
||||
/mob/observer/dead/MayRespawn(var/feedback = 0)
|
||||
if(!client)
|
||||
return 0
|
||||
if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse)
|
||||
if(feedback)
|
||||
to_chat(src, "<span class='warning'>Your non-dead body prevent you from respawning.</span>")
|
||||
return 0
|
||||
if(config.antag_hud_restricted && has_enabled_antagHUD == 1)
|
||||
if(feedback)
|
||||
to_chat(src, "<span class='warning'>antagHUD restrictions prevent you from respawning.</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/atom/proc/extra_ghost_link()
|
||||
return
|
||||
|
||||
/mob/extra_ghost_link(var/atom/ghost)
|
||||
if(client && eyeobj)
|
||||
return "|<a href='byond://?src=\ref[ghost];track=\ref[eyeobj]'>eye</a>"
|
||||
|
||||
/mob/observer/dead/extra_ghost_link(var/atom/ghost)
|
||||
if(mind && mind.current)
|
||||
return "|<a href='byond://?src=\ref[ghost];track=\ref[mind.current]'>body</a>"
|
||||
|
||||
/proc/ghost_follow_link(var/atom/target, var/atom/ghost)
|
||||
if((!target) || (!ghost)) return
|
||||
. = "<a href='byond://?src=\ref[ghost];track=\ref[target]'>follow</a>"
|
||||
. += target.extra_ghost_link(ghost)
|
||||
|
||||
//Culted Ghosts
|
||||
|
||||
/mob/observer/dead/proc/ghost_whisper()
|
||||
set name = "Spectral Whisper"
|
||||
set category = "IC"
|
||||
|
||||
if(is_manifest) //Only able to whisper if it's hit with a tome.
|
||||
var/list/options = list()
|
||||
for(var/mob/living/Ms in view(src))
|
||||
options += Ms
|
||||
var/mob/living/M = input(src, "Select who to whisper to:", "Whisper to?", null) as null|mob in options
|
||||
if(!M)
|
||||
return 0
|
||||
var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null)
|
||||
if(msg)
|
||||
log_say("(SPECWHISP to [key_name(M)]): [msg]", src)
|
||||
to_chat(M, "<span class='warning'> You hear a strange, unidentifiable voice in your head... <font color='purple'>[msg]</font></span>")
|
||||
to_chat(src, "<span class='warning'> You said: '[msg]' to [M].</span>")
|
||||
else
|
||||
return
|
||||
return 1
|
||||
else
|
||||
to_chat(src, "<span class='danger'>You have not been pulled past the veil!</span>")
|
||||
|
||||
/mob/observer/dead/verb/choose_ghost_sprite()
|
||||
set category = "Ghost"
|
||||
set name = "Choose Sprite"
|
||||
|
||||
var/choice
|
||||
var/previous_state
|
||||
var/finalized = "No"
|
||||
|
||||
while(finalized == "No" && src.client)
|
||||
choice = input(usr,"What would you like to use for your ghost sprite?") as null|anything in possible_ghost_sprites
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
if(choice)
|
||||
icon = 'icons/mob/ghost.dmi'
|
||||
overlays.Cut()
|
||||
|
||||
if(icon_state && icon)
|
||||
previous_state = icon_state
|
||||
|
||||
icon_state = possible_ghost_sprites[choice]
|
||||
finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")
|
||||
|
||||
ghost_sprite = possible_ghost_sprites[choice]
|
||||
|
||||
if(finalized == "No")
|
||||
icon_state = previous_state
|
||||
|
||||
/mob/observer/dead/is_blind()
|
||||
return FALSE
|
||||
|
||||
/mob/observer/dead/is_deaf()
|
||||
return FALSE
|
||||
|
||||
/mob/observer/dead/verb/paialert()
|
||||
set category = "Ghost"
|
||||
set name = "Blank pAI alert"
|
||||
set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
|
||||
|
||||
if(usr.client.prefs?.be_special & BE_PAI)
|
||||
var/count = 0
|
||||
for(var/obj/item/device/paicard/p in all_pai_cards)
|
||||
var/obj/item/device/paicard/PP = p
|
||||
if(PP.pai == null)
|
||||
count++
|
||||
PP.overlays += "pai-ghostalert"
|
||||
spawn(54)
|
||||
PP.overlays.Cut()
|
||||
to_chat(usr,"<span class='notice'>Flashing the displays of [count] unoccupied PAIs.</span>")
|
||||
else
|
||||
to_chat(usr,"<span class='warning'>You have 'Be pAI' disabled in your character prefs, so we can't help you.</span>")
|
||||
|
||||
/mob/observer/dead/speech_bubble_appearance()
|
||||
return "ghost"
|
||||
|
||||
// Lets a ghost know someone's trying to bring them back, and for them to get into their body.
|
||||
// Mostly the same as TG's sans the hud element, since we don't have TG huds.
|
||||
/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source)
|
||||
if((last_revive_notification + 2 MINUTES) > world.time)
|
||||
return
|
||||
last_revive_notification = world.time
|
||||
|
||||
if(flashwindow)
|
||||
window_flash(client)
|
||||
if(message)
|
||||
to_chat(src, "<span class='ghostalert'><font size=4>[message]</font></span>")
|
||||
if(source)
|
||||
throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source)
|
||||
to_chat(src, "<span class='ghostalert'><a href=?src=[REF(src)];reenter=1>(Click to re-enter)</a></span>")
|
||||
if(sound)
|
||||
SEND_SOUND(src, sound(sound))
|
||||
|
||||
/mob/observer/dead/verb/respawn()
|
||||
set name = "Respawn"
|
||||
set category = "Ghost"
|
||||
src.abandon_mob()
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
@@ -336,7 +336,7 @@
|
||||
)
|
||||
wikilink="https://wiki.vore-station.net/Vox"
|
||||
|
||||
datum/species/harpy
|
||||
/datum/species/harpy
|
||||
name = SPECIES_RAPALA
|
||||
name_plural = "Rapalans"
|
||||
icobase = 'icons/mob/human_races/r_harpy_vr.dmi'
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/trait/negative
|
||||
category = -1
|
||||
|
||||
@@ -34,9 +31,9 @@
|
||||
cost = -2
|
||||
var_changes = list("total_health" = 75)
|
||||
|
||||
apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
/datum/trait/negative/endurance_low/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
|
||||
/datum/trait/negative/endurance_very_low
|
||||
name = "Extremely Low Endurance"
|
||||
@@ -44,9 +41,9 @@
|
||||
cost = -3 //Teshari HP. This makes the person a lot more suseptable to getting stunned, killed, etc.
|
||||
var_changes = list("total_health" = 50)
|
||||
|
||||
apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
/datum/trait/negative/endurance_very_low/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
|
||||
/datum/trait/negative/minor_brute_weak
|
||||
name = "Minor Brute Weakness"
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/trait/neutral
|
||||
|
||||
/datum/trait/neutral/metabolism_up
|
||||
@@ -174,7 +171,7 @@
|
||||
desc = "You're highly allergic to gluten proteins, which are found in most common grains."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var/allergen = GRAINS
|
||||
var/allergen = ALLERGEN_GRAINS
|
||||
|
||||
/datum/trait/neutral/allergy/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
S.allergens |= allergen
|
||||
@@ -185,63 +182,63 @@
|
||||
desc = "You're highly allergic to just about any form of meat. You're probably better off just sticking to vegetables. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = MEAT
|
||||
allergen = ALLERGEN_MEAT
|
||||
|
||||
/datum/trait/neutral/allergy/fish
|
||||
name = "Allergy: Fish"
|
||||
desc = "You're highly allergic to fish. It's probably best to avoid seafood in general. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = FISH
|
||||
allergen = ALLERGEN_FISH
|
||||
|
||||
/datum/trait/neutral/allergy/fruit
|
||||
name = "Allergy: Fruit"
|
||||
desc = "You're highly allergic to fruit. Vegetables are fine, but you should probably read up on how to tell the difference. Remember, tomatoes are a fruit. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = FRUIT
|
||||
allergen = ALLERGEN_FRUIT
|
||||
|
||||
/datum/trait/neutral/allergy/vegetable
|
||||
name = "Allergy: Vegetable"
|
||||
desc = "You're highly allergic to vegetables. Fruit are fine, but you should probably read up on how to tell the difference. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = VEGETABLE
|
||||
allergen = ALLERGEN_VEGETABLE
|
||||
|
||||
/datum/trait/neutral/allergy/nuts
|
||||
name = "Allergy: Nuts"
|
||||
desc = "You're highly allergic to hard-shell seeds, such as peanuts. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = SEEDS
|
||||
allergen = ALLERGEN_SEEDS
|
||||
|
||||
/datum/trait/neutral/allergy/soy
|
||||
name = "Allergy: Soy"
|
||||
desc = "You're highly allergic to soybeans, and some other kinds of bean. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = BEANS
|
||||
allergen = ALLERGEN_BEANS
|
||||
|
||||
/datum/trait/neutral/allergy/dairy
|
||||
name = "Allergy: Lactose"
|
||||
desc = "You're highly allergic to lactose, and consequently, just about all forms of dairy. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = DAIRY
|
||||
allergen = ALLERGEN_DAIRY
|
||||
|
||||
/datum/trait/neutral/allergy/fungi
|
||||
name = "Allergy: Fungi"
|
||||
desc = "You're highly allergic to fungi such as mushrooms. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = FUNGI
|
||||
allergen = ALLERGEN_FUNGI
|
||||
|
||||
/datum/trait/neutral/allergy/coffee
|
||||
name = "Allergy: Coffee"
|
||||
desc = "You're highly allergic to coffee in specific. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = COFFEE
|
||||
allergen = ALLERGEN_COFFEE
|
||||
|
||||
/datum/trait/neutral/allergen_reduced_effect
|
||||
name = "Reduced Allergen Reaction"
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/trait/positive
|
||||
category = 1
|
||||
|
||||
@@ -28,9 +25,9 @@
|
||||
cost = 4
|
||||
var_changes = list("total_health" = 125)
|
||||
|
||||
apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
/datum/trait/positive/endurance_high/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
|
||||
/datum/trait/positive/nonconductive
|
||||
name = "Non-Conductive"
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/trait
|
||||
var/name
|
||||
var/desc = "Contact a developer if you see this trait."
|
||||
|
||||
@@ -79,7 +79,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
||||
#define SUIT_STORE_LAYER 17 //Suit storage-slot item
|
||||
#define BACK_LAYER 18 //Back-slot item
|
||||
#define HAIR_LAYER 19 //The human's hair
|
||||
<<<<<<< HEAD
|
||||
#define HAIR_ACCESSORY_LAYER 20 //VOREStation edit. Simply move this up a number if things are added.
|
||||
#define EARS_LAYER 21 //Both ear-slot items (combined image)
|
||||
#define EYES_LAYER 22 //Mob's eyes (used for glowing eyes)
|
||||
@@ -93,26 +92,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
||||
#define TAIL_LAYER_ALT 30 //Modified tail-sprite layer. Tend to be larger.
|
||||
#define MODIFIER_EFFECTS_LAYER 31 //Effects drawn by modifiers
|
||||
#define FIRE_LAYER 32 //'Mob on fire' overlay layer
|
||||
#define WATER_LAYER 33 //'Mob submerged' overlay layer
|
||||
#define MOB_WATER_LAYER 33 //'Mob submerged' overlay layer
|
||||
#define TARGETED_LAYER 34 //'Aimed at' overlay layer
|
||||
#define TOTAL_LAYERS 34 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
|
||||
=======
|
||||
#define EARS_LAYER 20 //Both ear-slot items (combined image)
|
||||
#define EYES_LAYER 21 //Mob's eyes (used for glowing eyes)
|
||||
#define FACEMASK_LAYER 22 //Mask-slot item
|
||||
#define HEAD_LAYER 23 //Head-slot item
|
||||
#define HANDCUFF_LAYER 24 //Handcuffs, if the human is handcuffed, in a secret inv slot
|
||||
#define LEGCUFF_LAYER 25 //Same as handcuffs, for legcuffs
|
||||
#define L_HAND_LAYER 26 //Left-hand item
|
||||
#define R_HAND_LAYER 27 //Right-hand item
|
||||
#define WING_LAYER 28 //Wings or protrusions over the suit.
|
||||
#define TAIL_LAYER_ALT 29 //Modified tail-sprite layer. Tend to be larger.
|
||||
#define MODIFIER_EFFECTS_LAYER 30 //Effects drawn by modifiers
|
||||
#define FIRE_LAYER 31 //'Mob on fire' overlay layer
|
||||
#define MOB_WATER_LAYER 32 //'Mob submerged' overlay layer
|
||||
#define TARGETED_LAYER 33 //'Aimed at' overlay layer
|
||||
#define TOTAL_LAYERS 33//<---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
//////////////////////////////////
|
||||
|
||||
/mob/living/carbon/human
|
||||
@@ -1239,15 +1221,11 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
||||
tail_s.Blend(overlay, ICON_OVERLAY)
|
||||
qdel(overlay)
|
||||
|
||||
<<<<<<< HEAD
|
||||
var/image/working = image(tail_s)
|
||||
if(tail_style.em_block)
|
||||
working.overlays += em_block_image_generic(working) // Leaving this as overlays +=
|
||||
|
||||
if(isTaurTail(tail_style))
|
||||
=======
|
||||
if(istaurtail(tail_style))
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
var/datum/sprite_accessory/tail/taur/taurtype = tail_style
|
||||
working.pixel_x = -16
|
||||
if(taurtype.can_ride && !riding_datum)
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(isTaurTail(H.tail_style))
|
||||
if(istaurtail(H.tail_style))
|
||||
to_chat(src, "<span class='warning'>Too many legs. TOO MANY LEGS!!</span>")
|
||||
return FALSE
|
||||
if(M.loc != src.loc)
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
#define NOT_WHILE_SHIFTED 1
|
||||
#define ONLY_WHILE_SHIFTED 2
|
||||
#define SHIFTED_OR_NOT 3
|
||||
|
||||
#define BLUE_EYES 1
|
||||
#define RED_EYES 2
|
||||
#define PURPLE_EYES 3
|
||||
#define YELLOW_EYES 4
|
||||
#define GREEN_EYES 5
|
||||
#define ORANGE_EYES 6
|
||||
|
||||
#define AB_PHASE_SHIFTED 0x1
|
||||
#define AB_SHADE_REGEN 0x2
|
||||
@@ -1,11 +0,0 @@
|
||||
#undef NOT_WHILE_SHIFTED
|
||||
#undef ONLY_WHILE_SHIFTED
|
||||
#undef SHIFTED_OR_NOT
|
||||
|
||||
#undef BLUE_EYES
|
||||
#undef RED_EYES
|
||||
#undef PURPLE_EYES
|
||||
#undef YELLOW_EYES
|
||||
|
||||
#undef AB_PHASE_SHIFTED
|
||||
#undef AB_SHADE_REGEN
|
||||
@@ -1038,7 +1038,7 @@
|
||||
pixel_x--
|
||||
is_shifted = TRUE
|
||||
|
||||
mob/verb/shifteast()
|
||||
/mob/verb/shifteast()
|
||||
set hidden = TRUE
|
||||
if(!canface())
|
||||
return FALSE
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -61,7 +61,7 @@
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
obj/machinery/computer/ship/disperser/proc/is_valid_setup()
|
||||
/obj/machinery/computer/ship/disperser/proc/is_valid_setup()
|
||||
if(front && middle && back)
|
||||
var/everything_in_range = (get_dist(src, front) < link_range) && (get_dist(src, middle) < link_range) && (get_dist(src, back) < link_range)
|
||||
var/everything_in_order = (middle.Adjacent(front) && middle.Adjacent(back)) && (front.dir == middle.dir && middle.dir == back.dir)
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
/obj/machinery/power/generator_type2
|
||||
name = "thermoelectric generator"
|
||||
desc = "It's a high efficiency thermoelectric generator."
|
||||
icon_state = "teg"
|
||||
anchored = 1
|
||||
density = 1
|
||||
use_power = USE_POWER_OFF
|
||||
|
||||
var/obj/machinery/atmospherics/unary/generator_input/input1
|
||||
var/obj/machinery/atmospherics/unary/generator_input/input2
|
||||
|
||||
var/lastgen = 0
|
||||
var/lastgenlev = -1
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/Initialize()
|
||||
. = ..()
|
||||
input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, 90))
|
||||
input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, -90))
|
||||
if(!input1 || !input2)
|
||||
stat |= BROKEN
|
||||
updateicon()
|
||||
|
||||
/obj/machinery/power/generator_type2/proc/updateicon()
|
||||
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
cut_overlays()
|
||||
else
|
||||
cut_overlays()
|
||||
|
||||
if(lastgenlev != 0)
|
||||
add_overlay("teg-op[lastgenlev]")
|
||||
|
||||
#define GENRATE 800 // generator output coefficient from Q
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/process()
|
||||
if(!input1 || !input2)
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/air1 = input1.return_exchange_air()
|
||||
var/datum/gas_mixture/air2 = input2.return_exchange_air()
|
||||
|
||||
|
||||
lastgen = 0
|
||||
|
||||
if(air1 && air2)
|
||||
var/datum/gas_mixture/hot_air = air1
|
||||
var/datum/gas_mixture/cold_air = air2
|
||||
if(hot_air.temperature < cold_air.temperature)
|
||||
hot_air = air2
|
||||
cold_air = air1
|
||||
|
||||
var/hot_air_heat_capacity = hot_air.heat_capacity()
|
||||
var/cold_air_heat_capacity = cold_air.heat_capacity()
|
||||
|
||||
var/delta_temperature = hot_air.temperature - cold_air.temperature
|
||||
|
||||
if(delta_temperature > 1 && cold_air_heat_capacity > 0.01 && hot_air_heat_capacity > 0.01)
|
||||
var/efficiency = (1 - cold_air.temperature/hot_air.temperature)*0.65 //65% of Carnot efficiency
|
||||
|
||||
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
|
||||
|
||||
var/heat = energy_transfer*(1-efficiency)
|
||||
lastgen = energy_transfer*efficiency
|
||||
|
||||
hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
|
||||
cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
|
||||
|
||||
//to_world("POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]")
|
||||
|
||||
if(input1.network)
|
||||
input1.network.update = 1
|
||||
|
||||
if(input2.network)
|
||||
input2.network.update = 1
|
||||
|
||||
add_avail(lastgen)
|
||||
// update icon overlays only if displayed level has changed
|
||||
|
||||
var/genlev = max(0, min( round(11*lastgen / 100000), 11))
|
||||
if(genlev != lastgenlev)
|
||||
lastgenlev = genlev
|
||||
updateicon()
|
||||
|
||||
src.updateDialog()
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/attack_ai(mob/user)
|
||||
if(stat & (BROKEN|NOPOWER)) return
|
||||
interact(user)
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
if(stat & (BROKEN|NOPOWER)) return
|
||||
interact(user)
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/interact(mob/user)
|
||||
if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
|
||||
user.unset_machine()
|
||||
user << browse(null, "window=teg")
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
|
||||
var/t = "<PRE><B>Thermo-Electric Generator</B><HR>"
|
||||
|
||||
t += "Output : [round(lastgen)] W<BR><BR>"
|
||||
|
||||
t += "<B>Cold loop</B><BR>"
|
||||
t += "Temperature: [round(input1.air_contents.temperature, 0.1)] K<BR>"
|
||||
t += "Pressure: [round(input1.air_contents.return_pressure(), 0.1)] kPa<BR>"
|
||||
|
||||
t += "<B>Hot loop</B><BR>"
|
||||
t += "Temperature: [round(input2.air_contents.temperature, 0.1)] K<BR>"
|
||||
t += "Pressure: [round(input2.air_contents.return_pressure(), 0.1)] kPa<BR>"
|
||||
|
||||
t += "<BR><HR><A href='?src=\ref[src];close=1'>Close</A>"
|
||||
|
||||
t += "</PRE>"
|
||||
user << browse(t, "window=teg;size=460x300")
|
||||
onclose(user, "teg")
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/Topic(href, href_list)
|
||||
..()
|
||||
|
||||
if( href_list["close"] )
|
||||
usr << browse(null, "window=teg")
|
||||
usr.unset_machine()
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/power_change()
|
||||
..()
|
||||
updateicon()
|
||||
@@ -200,36 +200,26 @@
|
||||
///////////////////////////////
|
||||
//SLIME CORES BELOW HERE///////
|
||||
///////////////////////////////
|
||||
|
||||
|
||||
|
||||
/decl/chemical_reaction/instant/slime_food
|
||||
name = "Slime Bork"
|
||||
id = "m_tele2"
|
||||
result = null
|
||||
required_reagents = list("phoron" = 10, "slimejelly" = 5, "nutriment" = 20)
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
|
||||
var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks // BORK BORK BORK
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
/* Removed at some point, unsure what to replace with
|
||||
for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
|
||||
if(M:eyecheck() <= 0)
|
||||
flick("e_flash", M.flash)
|
||||
*/
|
||||
for(var/i = 1, i <= 4 + rand(1,2), i++)
|
||||
var/chosen = pick(borks)
|
||||
var/obj/B = new chosen
|
||||
if(B)
|
||||
B.loc = get_turf(holder.my_atom)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(B, pick(NORTH,SOUTH,EAST,WEST))
|
||||
|
||||
/decl/chemical_reaction/instant/slime_food/on_reaction(var/datum/reagents/holder)
|
||||
var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks // BORK BORK BORK
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
|
||||
for(var/i = 1, i <= 4 + rand(1,2), i++)
|
||||
var/chosen = pick(borks)
|
||||
var/obj/B = new chosen
|
||||
if(B)
|
||||
B.loc = get_turf(holder.my_atom)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(B, pick(NORTH,SOUTH,EAST,WEST))
|
||||
|
||||
/decl/chemical_reaction/instant/materials
|
||||
name = "Slime materials"
|
||||
@@ -237,56 +227,52 @@
|
||||
result = null
|
||||
required_reagents = list("phoron" = 20, "slimejelly" = 40, "aluminum" = 20) //Woah there! You have the possibility of making diamonds! 8 ground up slimes required for one of these, and you still have a 10% chance for it to fail.
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
var/fail_chance = rand(1,1000)
|
||||
if(fail_chance == 1) // 0.1% chance of exploding, so scientists don't exclusively abuse this to obtain materials.
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The solution begins to vibrate violently!</span>"), 1) // It was at this moment, the Xenobiologist knew... he fucked up.
|
||||
sleep(30)
|
||||
playsound(holder.my_atom, 'sound/items/Welder2.ogg', 100, 1)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The reaction begins to rapidly sizzle and swell outwards!</span>"), 1)
|
||||
sleep(20)
|
||||
explosion(get_turf(holder.my_atom), 0 ,4, 8) //Enough to cause severe damage in the area, but not so much that it'll instantly gib the person.
|
||||
empulse(get_turf(holder.my_atom), 3, 7) //Uh oh, it produced some uranium, too! EMP blast!
|
||||
return
|
||||
|
||||
if(fail_chance < 101) // 10% chance of it not working at all.
|
||||
playsound(holder.my_atom, 'sound/items/Welder.ogg', 100, 1)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime core fizzles disappointingly.</span>"), 1)
|
||||
return
|
||||
/decl/chemical_reaction/instant/materials/on_reaction(var/datum/reagents/holder)
|
||||
var/fail_chance = rand(1,1000)
|
||||
if(fail_chance == 1) // 0.1% chance of exploding, so scientists don't exclusively abuse this to obtain materials.
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The solution begins to vibrate violently!</span>"), 1) // It was at this moment, the Xenobiologist knew... he fucked up.
|
||||
sleep(30)
|
||||
playsound(holder.my_atom, 'sound/items/Welder2.ogg', 100, 1)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The reaction begins to rapidly sizzle and swell outwards!</span>"), 1)
|
||||
sleep(20)
|
||||
explosion(get_turf(holder.my_atom), 0 ,4, 8) //Enough to cause severe damage in the area, but not so much that it'll instantly gib the person.
|
||||
empulse(get_turf(holder.my_atom), 3, 7) //Uh oh, it produced some uranium, too! EMP blast!
|
||||
return
|
||||
|
||||
var/blocked = list(
|
||||
/obj/item/stack/material, //Technical stacks
|
||||
/obj/item/stack/hairlesshide, //Useless leather production steps
|
||||
/obj/item/stack/wetleather,
|
||||
/obj/item/stack/material/algae/ten) //Why is this one even a separate thing
|
||||
blocked += typesof(/obj/item/stack/material/cyborg) //Borg matter synths, should only exist in borgs
|
||||
blocked += typesof(/obj/item/stack/animalhide) //Hides which are only used for leather production anyway
|
||||
if(fail_chance < 101) // 10% chance of it not working at all.
|
||||
playsound(holder.my_atom, 'sound/items/Welder.ogg', 100, 1)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime core fizzles disappointingly.</span>"), 1)
|
||||
return
|
||||
|
||||
var/rare_types = list(
|
||||
/obj/item/stack/material/morphium, //Complex materials requiring Particle Smasher to create
|
||||
/obj/item/stack/material/morphium/hull,
|
||||
/obj/item/stack/material/valhollide,
|
||||
/obj/item/stack/material/supermatter)
|
||||
var/blocked = list(
|
||||
/obj/item/stack/material, //Technical stacks
|
||||
/obj/item/stack/hairlesshide, //Useless leather production steps
|
||||
/obj/item/stack/wetleather,
|
||||
/obj/item/stack/material/algae/ten) //Why is this one even a separate thing
|
||||
blocked += typesof(/obj/item/stack/material/cyborg) //Borg matter synths, should only exist in borgs
|
||||
blocked += typesof(/obj/item/stack/animalhide) //Hides which are only used for leather production anyway
|
||||
|
||||
var/list/material = typesof(/obj/item/stack/material) - blocked
|
||||
var/rare_types = list(
|
||||
/obj/item/stack/material/morphium, //Complex materials requiring Particle Smasher to create
|
||||
/obj/item/stack/material/morphium/hull,
|
||||
/obj/item/stack/material/valhollide,
|
||||
/obj/item/stack/material/supermatter)
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
/* Removed at some point, unsure what to replace with
|
||||
for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
|
||||
if(M:eyecheck() <= 0)
|
||||
flick("e_flash", M.flash)
|
||||
*/
|
||||
var/spawn_amount = rand(1,50)
|
||||
var/chosen = pick(material)
|
||||
if(chosen in rare_types)
|
||||
spawn_amount = rand(1,15)
|
||||
var/obj/item/stack/material/C = new chosen
|
||||
C.amount = spawn_amount
|
||||
C.loc = get_turf(holder.my_atom)
|
||||
var/list/material = typesof(/obj/item/stack/material) - blocked
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
|
||||
var/spawn_amount = rand(1,50)
|
||||
var/chosen = pick(material)
|
||||
if(chosen in rare_types)
|
||||
spawn_amount = rand(1,15)
|
||||
var/obj/item/stack/material/C = new chosen
|
||||
C.amount = spawn_amount
|
||||
C.loc = get_turf(holder.my_atom)
|
||||
|
||||
/decl/chemical_reaction/instant/slimelight
|
||||
name = "Slime Glow"
|
||||
@@ -294,11 +280,12 @@
|
||||
result = null
|
||||
required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 10) //Takes 10 water so it doesn't mess with the frost oil.
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'> The contents of the slime core harden and begin to emit a warm, bright light.</span>"), 1)
|
||||
var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
|
||||
F.loc = get_turf(holder.my_atom)
|
||||
|
||||
/decl/chemical_reaction/instant/slimelight/on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'> The contents of the slime core harden and begin to emit a warm, bright light.</span>"), 1)
|
||||
var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
|
||||
F.loc = get_turf(holder.my_atom)
|
||||
|
||||
|
||||
/decl/chemical_reaction/instant/slimephoron
|
||||
@@ -307,10 +294,11 @@
|
||||
result = null
|
||||
required_reagents = list("phoron" = 20, "uranium" = 20, "slimejelly" = 20)
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
var/obj/item/stack/material/phoron/P = new /obj/item/stack/material/phoron
|
||||
P.amount = 10
|
||||
P.loc = get_turf(holder.my_atom)
|
||||
|
||||
/decl/chemical_reaction/instant/slimephoron/on_reaction(var/datum/reagents/holder)
|
||||
var/obj/item/stack/material/phoron/P = new /obj/item/stack/material/phoron
|
||||
P.amount = 10
|
||||
P.loc = get_turf(holder.my_atom)
|
||||
|
||||
/decl/chemical_reaction/instant/slimefreeze
|
||||
name = "Slime Freeze"
|
||||
@@ -318,17 +306,15 @@
|
||||
result = null
|
||||
required_reagents = list("phoron" = 10, "coolant" = 10, "slimejelly" = 10)
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime extract begins to vibrate violently!</span>"), 1)
|
||||
sleep(50)
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
for(var/mob/living/M in range (get_turf(holder.my_atom), 7))
|
||||
M.bodytemperature -= 140
|
||||
to_chat(M, "<span class='notice'> You suddenly feel a chill!</span>")
|
||||
|
||||
|
||||
|
||||
/decl/chemical_reaction/instant/slimefreeze/on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime extract begins to vibrate violently!</span>"), 1)
|
||||
sleep(50)
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
for(var/mob/living/M in range (get_turf(holder.my_atom), 7))
|
||||
M.bodytemperature -= 140
|
||||
to_chat(M, "<span class='notice'> You suddenly feel a chill!</span>")
|
||||
|
||||
/decl/chemical_reaction/instant/slimefrost
|
||||
name = "Slime Frost Oil"
|
||||
@@ -337,24 +323,21 @@
|
||||
required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 5, "coolant" = 5)
|
||||
result_amount = 10
|
||||
|
||||
|
||||
|
||||
|
||||
/decl/chemical_reaction/instant/slimefire
|
||||
name = "Slime fire"
|
||||
id = "m_fire"
|
||||
result = null
|
||||
required_reagents = list("phoron" = 60, "slimejelly" = 30, "potassium" = 30)
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime extract begins to vibrate violently!</span>"), 1)
|
||||
sleep(50)
|
||||
var/turf/location = get_turf(holder.my_atom.loc)
|
||||
for(var/turf/simulated/floor/target_tile in range(0,location))
|
||||
target_tile.assume_gas("phoron", 25, 1400)
|
||||
spawn (0) target_tile.hotspot_expose(700, 400)
|
||||
|
||||
/decl/chemical_reaction/instant/slimefire/on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime extract begins to vibrate violently!</span>"), 1)
|
||||
sleep(50)
|
||||
var/turf/location = get_turf(holder.my_atom.loc)
|
||||
for(var/turf/simulated/floor/target_tile in range(0,location))
|
||||
target_tile.assume_gas("phoron", 25, 1400)
|
||||
spawn (0) target_tile.hotspot_expose(700, 400)
|
||||
|
||||
/decl/chemical_reaction/instant/slimeify
|
||||
name = "Advanced Mutation Toxin"
|
||||
@@ -363,25 +346,22 @@
|
||||
required_reagents = list("phoron" = 15, "slimejelly" = 15, "mutationtoxin" = 15) //In case a xenobiologist wants to become a fully fledged slime person.
|
||||
result_amount = 1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/decl/chemical_reaction/instant/slimeheal //A slime healing mixture. Why not.
|
||||
name = "Slime Health"
|
||||
id = "slimeheal"
|
||||
result = "null"
|
||||
required_reagents = list("phoron" = 10, "bicaridine" = 10, "kelotane" = 10, "inaprovaline" = 10, "slimejelly" = 10)
|
||||
on_reaction(var/datum/reagents/holder, var/created_volume)
|
||||
for (var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
|
||||
to_chat(C, "<span class='notice'>A wave of energy suddenly invigorates you.</span>")
|
||||
C.adjustBruteLoss(-25)
|
||||
C.adjustFireLoss(-25)
|
||||
C.adjustToxLoss(-25)
|
||||
C.adjustOxyLoss(-25)
|
||||
C.adjustBrainLoss(-25)
|
||||
C.adjustCloneLoss(-25)
|
||||
C.updatehealth()
|
||||
|
||||
/decl/chemical_reaction/instant/slimeheal/on_reaction(var/datum/reagents/holder, var/created_volume)
|
||||
for (var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
|
||||
to_chat(C, "<span class='notice'>A wave of energy suddenly invigorates you.</span>")
|
||||
C.adjustBruteLoss(-25)
|
||||
C.adjustFireLoss(-25)
|
||||
C.adjustToxLoss(-25)
|
||||
C.adjustOxyLoss(-25)
|
||||
C.adjustBrainLoss(-25)
|
||||
C.adjustCloneLoss(-25)
|
||||
C.updatehealth()
|
||||
|
||||
/decl/chemical_reaction/instant/slimejelly
|
||||
name = "Slime Jam"
|
||||
@@ -396,62 +376,58 @@
|
||||
result = null
|
||||
required_reagents = list("phoron" = 20, "nutriment" = 20, "sugar" = 20, "mutationtoxin" = 20) //Can't do slime jelly as it'll conflict with another, but mutation toxin will do.
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
var/mob_path = /mob/living/simple_mob
|
||||
var/blocked = list( //List of things we do NOT want to spawn
|
||||
/mob/living/simple_mob, //Technical parent mobs
|
||||
/mob/living/simple_mob/animal,
|
||||
/mob/living/simple_mob/animal/passive,
|
||||
/mob/living/simple_mob/animal/space,
|
||||
/mob/living/simple_mob/blob,
|
||||
/mob/living/simple_mob/mechanical,
|
||||
/mob/living/simple_mob/mechanical/mecha,
|
||||
/mob/living/simple_mob/slime,
|
||||
/mob/living/simple_mob/vore,
|
||||
/mob/living/simple_mob/vore/aggressive,
|
||||
/mob/living/simple_mob/illusion, //Other technical mobs
|
||||
/mob/living/simple_mob/animal/passive/crab/Coffee, //Unique pets/named mobs
|
||||
/mob/living/simple_mob/animal/passive/cat/runtime,
|
||||
/mob/living/simple_mob/animal/passive/cat/bones,
|
||||
/mob/living/simple_mob/animal/passive/cat/tabiranth,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/puppy/Bockscar,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/Ian,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/Lisa,
|
||||
/mob/living/simple_mob/animal/passive/dog/tamaskan/Spice,
|
||||
/mob/living/simple_mob/animal/passive/fox/renault,
|
||||
/mob/living/simple_mob/animal/passive/bird/azure_tit/tweeter,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/poly,
|
||||
/mob/living/simple_mob/animal/sif/fluffy,
|
||||
/mob/living/simple_mob/animal/sif/fluffy/silky,
|
||||
/mob/living/simple_mob/animal/passive/snake/noodle,
|
||||
/mob/living/simple_mob/slime/xenobio/rainbow/kendrick,
|
||||
/mob/living/simple_mob/animal/space/space_worm, //Space Worm parts that aren't proper heads
|
||||
/mob/living/simple_mob/animal/space/space_worm/head/severed,
|
||||
/mob/living/simple_mob/animal/borer, //Event/player-control-only mobs
|
||||
/mob/living/simple_mob/vore/hostile/morph
|
||||
)//exclusion list for things you don't want the reaction to create.
|
||||
blocked += typesof(/mob/living/simple_mob/mechanical/ward) //Wards that should be created with ward items, are mobs mostly on technicalities
|
||||
blocked += typesof(/mob/living/simple_mob/construct) //Should only exist
|
||||
blocked += typesof(/mob/living/simple_mob/vore/demon) //as player-controlled
|
||||
blocked += typesof(/mob/living/simple_mob/shadekin) //and/or event things
|
||||
blocked += typesof(/mob/living/simple_mob/horror)
|
||||
var/list/voremobs = typesof(mob_path) - blocked // list of possible hostile mobs
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
/* Removed at some point, unsure what to replace with
|
||||
for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
|
||||
if(M:eyecheck() <= 0)
|
||||
flick("e_flash", M.flash)
|
||||
*/
|
||||
var/spawn_count = rand(1,3)
|
||||
for(var/i = 1, i <= spawn_count, i++)
|
||||
var/chosen = pick(voremobs)
|
||||
var/mob/living/simple_mob/C = new chosen
|
||||
C.faction = "slimesummon"
|
||||
C.loc = get_turf(holder.my_atom)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(C, pick(NORTH,SOUTH,EAST,WEST))
|
||||
/decl/chemical_reaction/instant/slimevore/on_reaction(var/datum/reagents/holder)
|
||||
var/mob_path = /mob/living/simple_mob
|
||||
var/blocked = list( //List of things we do NOT want to spawn
|
||||
/mob/living/simple_mob, //Technical parent mobs
|
||||
/mob/living/simple_mob/animal,
|
||||
/mob/living/simple_mob/animal/passive,
|
||||
/mob/living/simple_mob/animal/space,
|
||||
/mob/living/simple_mob/blob,
|
||||
/mob/living/simple_mob/mechanical,
|
||||
/mob/living/simple_mob/mechanical/mecha,
|
||||
/mob/living/simple_mob/slime,
|
||||
/mob/living/simple_mob/vore,
|
||||
/mob/living/simple_mob/vore/aggressive,
|
||||
/mob/living/simple_mob/illusion, //Other technical mobs
|
||||
/mob/living/simple_mob/animal/passive/crab/Coffee, //Unique pets/named mobs
|
||||
/mob/living/simple_mob/animal/passive/cat/runtime,
|
||||
/mob/living/simple_mob/animal/passive/cat/bones,
|
||||
/mob/living/simple_mob/animal/passive/cat/tabiranth,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/puppy/Bockscar,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/Ian,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/Lisa,
|
||||
/mob/living/simple_mob/animal/passive/dog/tamaskan/Spice,
|
||||
/mob/living/simple_mob/animal/passive/fox/renault,
|
||||
/mob/living/simple_mob/animal/passive/bird/azure_tit/tweeter,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/poly,
|
||||
/mob/living/simple_mob/animal/sif/fluffy,
|
||||
/mob/living/simple_mob/animal/sif/fluffy/silky,
|
||||
/mob/living/simple_mob/animal/passive/snake/noodle,
|
||||
/mob/living/simple_mob/slime/xenobio/rainbow/kendrick,
|
||||
/mob/living/simple_mob/animal/space/space_worm, //Space Worm parts that aren't proper heads
|
||||
/mob/living/simple_mob/animal/space/space_worm/head/severed,
|
||||
/mob/living/simple_mob/animal/borer, //Event/player-control-only mobs
|
||||
/mob/living/simple_mob/vore/hostile/morph
|
||||
)//exclusion list for things you don't want the reaction to create.
|
||||
blocked += typesof(/mob/living/simple_mob/mechanical/ward) //Wards that should be created with ward items, are mobs mostly on technicalities
|
||||
blocked += typesof(/mob/living/simple_mob/construct) //Should only exist
|
||||
blocked += typesof(/mob/living/simple_mob/vore/demon) //as player-controlled
|
||||
blocked += typesof(/mob/living/simple_mob/shadekin) //and/or event things
|
||||
blocked += typesof(/mob/living/simple_mob/horror)
|
||||
var/list/voremobs = typesof(mob_path) - blocked // list of possible hostile mobs
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
var/spawn_count = rand(1,3)
|
||||
for(var/i = 1, i <= spawn_count, i++)
|
||||
var/chosen = pick(voremobs)
|
||||
var/mob/living/simple_mob/C = new chosen
|
||||
C.faction = "slimesummon"
|
||||
C.loc = get_turf(holder.my_atom)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(C, pick(NORTH,SOUTH,EAST,WEST))
|
||||
|
||||
/decl/chemical_reaction/instant/slime/sapphire_mutation
|
||||
name = "Slime Mutation Toxins"
|
||||
|
||||
@@ -73,11 +73,7 @@
|
||||
return
|
||||
|
||||
/obj/structure/bigDelivery/update_icon()
|
||||
<<<<<<< HEAD
|
||||
cut_overlays()
|
||||
=======
|
||||
overlays = new()
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if(nameset || examtext)
|
||||
var/image/I = new/image('icons/obj/storage.dmi',"delivery_label")
|
||||
if(icon_state == "deliverycloset")
|
||||
@@ -90,11 +86,7 @@
|
||||
label_x = rand(-8, 6)
|
||||
I.pixel_x = label_x
|
||||
I.pixel_y = -3
|
||||
<<<<<<< HEAD
|
||||
add_overlay(I)
|
||||
=======
|
||||
overlays += I
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if(src.sortTag)
|
||||
var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag")
|
||||
if(icon_state == "deliverycloset")
|
||||
@@ -107,11 +99,7 @@
|
||||
tag_x = rand(-8, 6)
|
||||
I.pixel_x = tag_x
|
||||
I.pixel_y = -3
|
||||
<<<<<<< HEAD
|
||||
add_overlay(I)
|
||||
=======
|
||||
overlays += I
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/structure/bigDelivery/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -197,20 +185,12 @@
|
||||
return
|
||||
|
||||
/obj/item/smallDelivery/update_icon()
|
||||
<<<<<<< HEAD
|
||||
cut_overlays()
|
||||
=======
|
||||
overlays = new()
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if((nameset || examtext) && icon_state != "deliverycrate1")
|
||||
var/image/I = new/image('icons/obj/storage.dmi',"delivery_label")
|
||||
if(icon_state == "deliverycrate5")
|
||||
I.pixel_y = -1
|
||||
<<<<<<< HEAD
|
||||
add_overlay(I)
|
||||
=======
|
||||
overlays += I
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if(src.sortTag)
|
||||
var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag")
|
||||
switch(icon_state)
|
||||
@@ -227,11 +207,7 @@
|
||||
I.pixel_y = 3
|
||||
if("deliverycrate5")
|
||||
I.pixel_y = -3
|
||||
<<<<<<< HEAD
|
||||
add_overlay(I)
|
||||
=======
|
||||
overlays += I
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/item/smallDelivery/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -363,7 +339,6 @@
|
||||
item_state = "electronic"
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
<<<<<<< HEAD
|
||||
/obj/item/device/destTagger/tgui_state(mob/user)
|
||||
return GLOB.tgui_inventory_state
|
||||
|
||||
@@ -395,32 +370,6 @@
|
||||
return FALSE
|
||||
currTag = new_tag
|
||||
. = TRUE
|
||||
=======
|
||||
/obj/item/device/destTagger/proc/openwindow(mob/user as mob)
|
||||
var/dat = "<tt><center><h1><b>TagMaster 2.3</b></h1></center>"
|
||||
|
||||
dat += "<table style='width:100%; padding:4px;'><tr>"
|
||||
for(var/i = 1, i <= GLOB.tagger_locations.len, i++)
|
||||
dat += "<td><a href='?src=\ref[src];nextTag=[GLOB.tagger_locations[i]]'>[GLOB.tagger_locations[i]]</a></td>"
|
||||
|
||||
if (i%4==0)
|
||||
dat += "</tr><tr>"
|
||||
|
||||
dat += "</tr></table><br>Current Selection: [currTag ? currTag : "None"]</tt>"
|
||||
|
||||
user << browse(dat, "window=destTagScreen;size=450x350")
|
||||
onclose(user, "destTagScreen")
|
||||
|
||||
/obj/item/device/destTagger/attack_self(mob/user as mob)
|
||||
openwindow(user)
|
||||
return
|
||||
|
||||
/obj/item/device/destTagger/Topic(href, href_list)
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["nextTag"] && (href_list["nextTag"] in GLOB.tagger_locations))
|
||||
src.currTag = href_list["nextTag"]
|
||||
openwindow(usr)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/machinery/disposal/deliveryChute
|
||||
name = "Delivery chute"
|
||||
@@ -430,20 +379,11 @@
|
||||
|
||||
var/c_mode = 0
|
||||
|
||||
<<<<<<< HEAD
|
||||
/obj/machinery/disposal/deliveryChute/New()
|
||||
..()
|
||||
spawn(5)
|
||||
trunk = locate() in src.loc
|
||||
if(trunk)
|
||||
trunk.linked = src // link the pipe trunk to self
|
||||
=======
|
||||
/obj/machinery/disposal/deliveryChute/Initialize()
|
||||
. = ..()
|
||||
trunk = locate() in src.loc
|
||||
if(trunk)
|
||||
trunk.linked = src // link the pipe trunk to self
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/machinery/disposal/deliveryChute/interact()
|
||||
return
|
||||
@@ -498,36 +438,6 @@
|
||||
return
|
||||
|
||||
if(I.is_screwdriver())
|
||||
<<<<<<< HEAD
|
||||
if(c_mode==0)
|
||||
c_mode=1
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
to_chat(user, "You remove the screws around the power connection.")
|
||||
return
|
||||
else if(c_mode==1)
|
||||
c_mode=0
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
to_chat(user, "You attach the screws around the power connection.")
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/weldingtool) && c_mode==1)
|
||||
var/obj/item/weapon/weldingtool/W = I
|
||||
if(W.remove_fuel(0,user))
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
to_chat(user, "You start slicing the floorweld off the delivery chute.")
|
||||
if(do_after(user,20 * W.toolspeed))
|
||||
if(!src || !W.isOn()) return
|
||||
to_chat(user, "You sliced the floorweld off the delivery chute.")
|
||||
var/obj/structure/disposalconstruct/C = new (src.loc)
|
||||
C.ptype = 8 // 8 = Delivery chute
|
||||
C.update()
|
||||
C.anchored = 1
|
||||
C.density = 1
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
to_chat(user, "You need more welding fuel to complete this task.")
|
||||
return
|
||||
=======
|
||||
c_mode = !c_mode
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
to_chat(user, "You [c_mode ? "remove" : "attach"] the screws around the power connection.")
|
||||
@@ -549,7 +459,6 @@
|
||||
C.density = 1
|
||||
qdel(src)
|
||||
return
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/machinery/disposal/deliveryChute/Destroy()
|
||||
if(trunk)
|
||||
|
||||
@@ -301,25 +301,25 @@
|
||||
ram_cost = 15
|
||||
id = "ar_hud"
|
||||
|
||||
toggle(mob/living/silicon/infomorph/user)
|
||||
user.arHUD = !user.arHUD
|
||||
if(user.plane_holder)
|
||||
user.plane_holder.set_vis(VIS_CH_ID,user.arHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_HEALTH_VR,user.arHUD)
|
||||
/datum/infomorph_software/ar_hud/toggle(mob/living/silicon/infomorph/user)
|
||||
user.arHUD = !user.arHUD
|
||||
if(user.plane_holder)
|
||||
user.plane_holder.set_vis(VIS_CH_ID,user.arHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_HEALTH_VR,user.arHUD)
|
||||
|
||||
is_active(mob/living/silicon/infomorph/user)
|
||||
return user.arHUD
|
||||
/datum/infomorph_software/ar_hud/is_active(mob/living/silicon/infomorph/user)
|
||||
return user.arHUD
|
||||
|
||||
/datum/infomorph_software/translator
|
||||
name = "Universal Translator"
|
||||
ram_cost = 15
|
||||
id = "translator"
|
||||
|
||||
toggle(mob/living/silicon/infomorph/user)
|
||||
user.translator.attack_self(user)
|
||||
/datum/infomorph_software/translator/toggle(mob/living/silicon/infomorph/user)
|
||||
user.translator.attack_self(user)
|
||||
|
||||
is_active(mob/living/silicon/infomorph/user)
|
||||
return user.translator.listening
|
||||
/datum/infomorph_software/translator/is_active(mob/living/silicon/infomorph/user)
|
||||
return user.translator.listening
|
||||
|
||||
|
||||
/datum/infomorph_software/signaller
|
||||
|
||||
@@ -92,28 +92,28 @@
|
||||
type_wall = /turf/simulated/wall
|
||||
type_under = /turf/simulated/floor/plating
|
||||
|
||||
New()
|
||||
..()
|
||||
spot_add(1,1,type_wall) //Bottom left corner
|
||||
spot_add(1,2,type_wall)
|
||||
spot_add(1,3,type_wall)
|
||||
spot_add(2,1,type_wall)
|
||||
spot_add(2,2,type_under) //Center floor
|
||||
spot_add(2,2,/obj/random/roguemineloot) //Loot!
|
||||
spot_add(2,3,type_wall)
|
||||
spot_add(3,1,type_wall)
|
||||
spot_add(3,2,type_wall)
|
||||
spot_add(3,3,type_wall) //Bottom right corner
|
||||
/datum/rogue/asteroid/predef/cargo/New()
|
||||
..()
|
||||
spot_add(1,1,type_wall) //Bottom left corner
|
||||
spot_add(1,2,type_wall)
|
||||
spot_add(1,3,type_wall)
|
||||
spot_add(2,1,type_wall)
|
||||
spot_add(2,2,type_under) //Center floor
|
||||
spot_add(2,2,/obj/random/roguemineloot) //Loot!
|
||||
spot_add(2,3,type_wall)
|
||||
spot_add(3,1,type_wall)
|
||||
spot_add(3,2,type_wall)
|
||||
spot_add(3,3,type_wall) //Bottom right corner
|
||||
|
||||
//Abandoned 1-tile hollow cargo box (ANGRY).
|
||||
/datum/rogue/asteroid/predef/cargo/angry
|
||||
type_wall = /turf/simulated/wall
|
||||
type_under = /turf/simulated/floor/plating
|
||||
|
||||
New()
|
||||
..()
|
||||
spot_add(2,2,/obj/random/roguemineloot) //EXTRA loot!
|
||||
spot_add(2,2,/mob/living/simple_mob/animal/space/alien) //GRRR
|
||||
/datum/rogue/asteroid/predef/cargo/angry/New()
|
||||
..()
|
||||
spot_add(2,2,/obj/random/roguemineloot) //EXTRA loot!
|
||||
spot_add(2,2,/mob/living/simple_mob/animal/space/alien) //GRRR
|
||||
|
||||
//Longer cargo container for higher difficulties
|
||||
/datum/rogue/asteroid/predef/cargo_large
|
||||
@@ -121,30 +121,30 @@
|
||||
type_wall = /turf/simulated/wall
|
||||
type_under = /turf/simulated/floor/plating
|
||||
|
||||
New()
|
||||
..()
|
||||
spot_add(1,2,type_wall) //--
|
||||
spot_add(1,3,type_wall) //Left end of cargo container
|
||||
spot_add(1,4,type_wall) //--
|
||||
/datum/rogue/asteroid/predef/cargo_large/New()
|
||||
..()
|
||||
spot_add(1,2,type_wall) //--
|
||||
spot_add(1,3,type_wall) //Left end of cargo container
|
||||
spot_add(1,4,type_wall) //--
|
||||
|
||||
spot_add(5,2,type_wall) //--
|
||||
spot_add(5,3,type_wall) //Right end of cargo container
|
||||
spot_add(5,4,type_wall) //--
|
||||
spot_add(5,2,type_wall) //--
|
||||
spot_add(5,3,type_wall) //Right end of cargo container
|
||||
spot_add(5,4,type_wall) //--
|
||||
|
||||
spot_add(2,4,type_wall) //--
|
||||
spot_add(3,4,type_wall) //Top and
|
||||
spot_add(4,4,type_wall) //bottom of
|
||||
spot_add(2,2,type_wall) //cargo
|
||||
spot_add(3,2,type_wall) //container
|
||||
spot_add(4,2,type_wall) //--
|
||||
spot_add(2,4,type_wall) //--
|
||||
spot_add(3,4,type_wall) //Top and
|
||||
spot_add(4,4,type_wall) //bottom of
|
||||
spot_add(2,2,type_wall) //cargo
|
||||
spot_add(3,2,type_wall) //container
|
||||
spot_add(4,2,type_wall) //--
|
||||
|
||||
spot_add(2,3,type_under) //Left floor
|
||||
spot_add(3,3,type_under) //Mid floor
|
||||
spot_add(4,3,type_under) //Right floor
|
||||
spot_add(2,3,type_under) //Left floor
|
||||
spot_add(3,3,type_under) //Mid floor
|
||||
spot_add(4,3,type_under) //Right floor
|
||||
|
||||
spot_add(2,3,/obj/random/roguemineloot) //Left loot
|
||||
spot_add(3,3,/obj/random/roguemineloot) //Mid loot
|
||||
spot_add(4,3,/obj/random/roguemineloot) //Right loot
|
||||
spot_add(2,3,/obj/random/roguemineloot) //Left loot
|
||||
spot_add(3,3,/obj/random/roguemineloot) //Mid loot
|
||||
spot_add(4,3,/obj/random/roguemineloot) //Right loot
|
||||
|
||||
if(prob(30))
|
||||
spot_add(3,3,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian) //And maybe a big friend for big loot.
|
||||
if(prob(30))
|
||||
spot_add(3,3,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian) //And maybe a big friend for big loot.
|
||||
|
||||
@@ -148,11 +148,6 @@
|
||||
build_path = /obj/machinery/computer/roguezones
|
||||
origin_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 1)
|
||||
|
||||
// Undefine our constants to not pollute namespace
|
||||
#undef OUTPOST_Z
|
||||
#undef TRANSIT_Z
|
||||
#undef BELT_Z
|
||||
|
||||
/obj/item/weapon/paper/rogueminer
|
||||
name = "R-38 Scanner Console Guide"
|
||||
info = {"<h4>Getting Started</h4>
|
||||
|
||||
@@ -224,31 +224,6 @@
|
||||
return S.memory[address]
|
||||
|
||||
else
|
||||
<<<<<<< HEAD
|
||||
newsign.data["name"] = "<i>[html_encode(uppertext(source))]</i>"
|
||||
newsign.data["realname"] = newsign.data["name"]
|
||||
newsign.data["job"] = job
|
||||
newsign.data["compression"] = 0
|
||||
newsign.data["message"] = message_to_multilingual(message)
|
||||
newsign.data["type"] = 2 // artificial broadcast
|
||||
if(!isnum(freq))
|
||||
freq = text2num(freq)
|
||||
newsign.frequency = freq
|
||||
|
||||
var/datum/radio_frequency/connection = radio_controller.return_frequency(freq)
|
||||
newsign.data["connection"] = connection
|
||||
|
||||
|
||||
newsign.data["radio"] = hradio
|
||||
newsign.data["vmessage"] = message_to_multilingual(message)
|
||||
newsign.data["vname"] = source
|
||||
newsign.data["vmask"] = 0
|
||||
newsign.data["level"] = list()
|
||||
|
||||
var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub")
|
||||
if(!pass)
|
||||
S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
|
||||
=======
|
||||
S.memory[address] = value
|
||||
|
||||
|
||||
@@ -303,5 +278,4 @@
|
||||
var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub")
|
||||
if(!pass)
|
||||
S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
|
||||
@@ -48,14 +48,8 @@
|
||||
var/datum/shuttle/autodock/ferry/escape_pod/pod
|
||||
valid_actions = list("toggle_override", "force_door")
|
||||
|
||||
<<<<<<< HEAD
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/tgui_data(mob/user)
|
||||
var/datum/computer/file/embedded_program/docking/simple/docking_program = program // Cast to proper type
|
||||
=======
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
var/data[0]
|
||||
var/datum/embedded_program/docking/simple/docking_program = program // Cast to proper type
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
. = list(
|
||||
"docking_status" = docking_program.get_docking_status(),
|
||||
@@ -85,27 +79,15 @@
|
||||
//This controller is for the escape pod berth (station side)
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth
|
||||
name = "escape pod berth controller"
|
||||
<<<<<<< HEAD
|
||||
program = /datum/computer/file/embedded_program/docking/simple/escape_pod_berth
|
||||
program = /datum/embedded_program/docking/simple/escape_pod_berth
|
||||
valid_actions = list("toggle_override", "force_door")
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/tgui_data(mob/user)
|
||||
var/datum/computer/file/embedded_program/docking/simple/docking_program = program // Cast to proper type
|
||||
|
||||
var/armed = null
|
||||
if(istype(docking_program, /datum/computer/file/embedded_program/docking/simple/escape_pod_berth))
|
||||
var/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/P = docking_program
|
||||
=======
|
||||
program = /datum/embedded_program/docking/simple/escape_pod_berth
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
var/data[0]
|
||||
var/datum/embedded_program/docking/simple/docking_program = program // Cast to proper type
|
||||
|
||||
var/armed = null
|
||||
if (istype(docking_program, /datum/embedded_program/docking/simple/escape_pod_berth))
|
||||
if(istype(docking_program, /datum/embedded_program/docking/simple/escape_pod_berth))
|
||||
var/datum/embedded_program/docking/simple/escape_pod_berth/P = docking_program
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
armed = P.armed
|
||||
|
||||
. = list(
|
||||
|
||||
@@ -5,24 +5,25 @@
|
||||
name = "Mlemington's Syndrome"
|
||||
stage = 1
|
||||
chance_maxm = 25
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
mob.say("[pick("Mlem.","MLEM!","Mlem?")]")
|
||||
|
||||
/datum/disease2/effect/mlem/activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
mob.say("[pick("Mlem.","MLEM!","Mlem?")]")
|
||||
|
||||
/datum/disease2/effect/spin
|
||||
name = "Spyndrome"
|
||||
stage = 1
|
||||
chance_maxm = 7
|
||||
|
||||
var/list/directions = list(2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8)
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
if(mob.buckled())
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] struggles violently against their restraints!</span>")
|
||||
else
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] spins around violently!</span>")
|
||||
for(var/D in directions)
|
||||
mob.dir = D
|
||||
sleep(1)
|
||||
mob.dir = pick(2,4,1,8) //For that added annoyance
|
||||
|
||||
/datum/disease2/effect/spin/activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
if(mob.buckled())
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] struggles violently against their restraints!</span>")
|
||||
else
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] spins around violently!</span>")
|
||||
for(var/D in directions)
|
||||
mob.dir = D
|
||||
sleep(1)
|
||||
mob.dir = pick(2,4,1,8) //For that added annoyance
|
||||
|
||||
///////////////////////////////////////////////
|
||||
/////////////////// Stage 2 ///////////////////
|
||||
@@ -32,8 +33,8 @@
|
||||
stage = 2
|
||||
chance_maxm = 2
|
||||
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
mob.set_default_language(pick(mob.languages))
|
||||
/datum/disease2/effect/lang/activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
mob.set_default_language(pick(mob.languages))
|
||||
|
||||
///////////////////////////////////////////////
|
||||
/////////////////// Stage 3 ///////////////////
|
||||
@@ -43,20 +44,20 @@
|
||||
stage = 3
|
||||
chance_maxm = 1
|
||||
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
var/newsize = rand (25, 200)
|
||||
mob.resize(newsize/100)
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] suddenly changes size!</span>")
|
||||
/datum/disease2/effect/size/activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
var/newsize = rand (25, 200)
|
||||
mob.resize(newsize/100)
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] suddenly changes size!</span>")
|
||||
|
||||
/datum/disease2/effect/flip
|
||||
name = "Flipponov's Disease"
|
||||
stage = 3
|
||||
chance_maxm = 5
|
||||
|
||||
activate(var/mob/living/carbon/mob,var/multiplier) //Remind me why mob is carbon...?
|
||||
if(ishuman(mob))
|
||||
var/mob/living/carbon/human/H = mob
|
||||
H.emote("flip")
|
||||
else
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] does a backflip!</span>")
|
||||
mob.SpinAnimation(7,1)
|
||||
/datum/disease2/effect/flip/activate(var/mob/living/carbon/mob,var/multiplier) //Remind me why mob is carbon...?
|
||||
if(ishuman(mob))
|
||||
var/mob/living/carbon/human/H = mob
|
||||
H.emote("flip")
|
||||
else
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] does a backflip!</span>")
|
||||
mob.SpinAnimation(7,1)
|
||||
|
||||
@@ -100,13 +100,13 @@
|
||||
name = "Ivy's Courier"
|
||||
desc = "A bag resembling something used by college students. Contains items for ''MooMoo''."
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/clothing/head/beretg(src)
|
||||
new /obj/item/device/fluff/id_kit_ivy(src)
|
||||
new /obj/item/weapon/storage/fancy/cigarettes/dromedaryco(src)
|
||||
new /obj/item/weapon/storage/box/matches(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake(src)
|
||||
/obj/item/weapon/storage/backpack/messenger/sec/fluff/ivymoomoo/New()
|
||||
..()
|
||||
new /obj/item/clothing/head/beretg(src)
|
||||
new /obj/item/device/fluff/id_kit_ivy(src)
|
||||
new /obj/item/weapon/storage/fancy/cigarettes/dromedaryco(src)
|
||||
new /obj/item/weapon/storage/box/matches(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake(src)
|
||||
|
||||
// jemli:Cirra Mayhem
|
||||
/obj/item/weapon/storage/box/fluff/cirra
|
||||
@@ -139,16 +139,16 @@
|
||||
item_state = "duffle_med"
|
||||
slowdown = 0
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/clothing/accessory/holster/hip(src)
|
||||
new /obj/item/clothing/suit/storage/fluff/modernfedcoat(src)
|
||||
new /obj/item/clothing/head/caphat/formal/fedcover(src)
|
||||
new /obj/item/clothing/suit/armor/det_suit(src)
|
||||
new /obj/item/weapon/flame/lighter/zippo/fluff/joan(src)
|
||||
new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src)
|
||||
new /obj/item/clothing/head/helmet/space/fluff/joan(src)
|
||||
new /obj/item/clothing/suit/space/fluff/joan(src)
|
||||
/obj/item/weapon/storage/backpack/dufflebag/sec/fluff/joanrisu/New()
|
||||
..()
|
||||
new /obj/item/clothing/accessory/holster/hip(src)
|
||||
new /obj/item/clothing/suit/storage/fluff/modernfedcoat(src)
|
||||
new /obj/item/clothing/head/caphat/formal/fedcover(src)
|
||||
new /obj/item/clothing/suit/armor/det_suit(src)
|
||||
new /obj/item/weapon/flame/lighter/zippo/fluff/joan(src)
|
||||
new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src)
|
||||
new /obj/item/clothing/head/helmet/space/fluff/joan(src)
|
||||
new /obj/item/clothing/suit/space/fluff/joan(src)
|
||||
|
||||
//joanrisu:Katarina Eine
|
||||
/obj/item/weapon/storage/backpack/dufflebag/sec/fluff/katarina
|
||||
@@ -156,14 +156,14 @@
|
||||
desc = "A duffle bag Katarina uses to carry her tools."
|
||||
slowdown = 0
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/clothing/accessory/holster/hip(src)
|
||||
new /obj/item/clothing/suit/storage/fluff/fedcoat(src)
|
||||
new /obj/item/clothing/suit/armor/det_suit(src)
|
||||
new /obj/item/clothing/accessory/storage/black_vest(src)
|
||||
new /obj/item/weapon/material/knife/tacknife/combatknife/fluff/katarina(src)
|
||||
new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src)
|
||||
/obj/item/weapon/storage/backpack/dufflebag/sec/fluff/katarina/New()
|
||||
..()
|
||||
new /obj/item/clothing/accessory/holster/hip(src)
|
||||
new /obj/item/clothing/suit/storage/fluff/fedcoat(src)
|
||||
new /obj/item/clothing/suit/armor/det_suit(src)
|
||||
new /obj/item/clothing/accessory/storage/black_vest(src)
|
||||
new /obj/item/weapon/material/knife/tacknife/combatknife/fluff/katarina(src)
|
||||
new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src)
|
||||
|
||||
//Razerwing:Archer Maximus
|
||||
/obj/item/weapon/storage/box/fluff/archermaximus
|
||||
|
||||
@@ -1761,13 +1761,13 @@ Departamental Swimsuits, for general use
|
||||
item_state = "hasd_helm"
|
||||
species_restricted = null
|
||||
|
||||
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(H.ckey != "silencedmp5a5")
|
||||
to_chat(H, "<span class='warning'>...The faceplate is clearly not made for your anatomy, thus, does not fit.</span>")
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
/obj/item/clothing/head/helmet/space/void/security/hasd/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(H.ckey != "silencedmp5a5")
|
||||
to_chat(H, "<span class='warning'>...The faceplate is clearly not made for your anatomy, thus, does not fit.</span>")
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/suit/space/void/security/hasd
|
||||
name = "HASD EVA bodyplates"
|
||||
@@ -1779,12 +1779,12 @@ Departamental Swimsuits, for general use
|
||||
item_state = "hasd_suit"
|
||||
pixel_x = -16
|
||||
|
||||
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..() && istype(H) && H.ckey == "silencedmp5a5")
|
||||
return 1
|
||||
else
|
||||
to_chat(H, "<span class='warning'>This suit is not designed for you.</span>")
|
||||
return 0
|
||||
/obj/item/clothing/suit/space/void/security/hasd/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..() && istype(H) && H.ckey == "silencedmp5a5")
|
||||
return 1
|
||||
else
|
||||
to_chat(H, "<span class='warning'>This suit is not designed for you.</span>")
|
||||
return 0
|
||||
|
||||
//Zigfe:Zaoozaoo Xrimxuqmqixzix
|
||||
/obj/item/clothing/head/fluff/zao
|
||||
|
||||
@@ -773,11 +773,12 @@
|
||||
icon_state = "dragor_dot"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
attack_self(mob/user as mob)
|
||||
if(user.ckey == "pontifexminimus")
|
||||
user.verbs |= /mob/living/carbon/human/proc/shapeshifter_select_gender
|
||||
else
|
||||
return
|
||||
/obj/item/weapon/fluff/dragor_dot/attack_self(mob/user as mob)
|
||||
if(user.ckey == "pontifexminimus")
|
||||
user.verbs |= /mob/living/carbon/human/proc/shapeshifter_select_gender
|
||||
else
|
||||
return
|
||||
|
||||
//LuminescentRing: Briana Moore
|
||||
/obj/item/weapon/storage/backpack/messenger/black/fluff/briana
|
||||
name = "2561 graduation bag"
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.flying)
|
||||
return TRUE //Silently pass without a message.
|
||||
if(isTaurTail(H.tail_style))
|
||||
if(istaurtail(H.tail_style))
|
||||
var/datum/sprite_accessory/tail/taur/tail = H.tail_style
|
||||
src_message = tail.msg_owner_help_run
|
||||
tmob_message = tail.msg_prey_help_run
|
||||
@@ -223,7 +223,7 @@
|
||||
src_message = "You run between [tmob]'s legs."
|
||||
tmob_message = "[src] runs between your legs."
|
||||
var/mob/living/carbon/human/H = tmob
|
||||
if(isTaurTail(H.tail_style))
|
||||
if(istaurtail(H.tail_style))
|
||||
var/datum/sprite_accessory/tail/taur/tail = H.tail_style
|
||||
src_message = tail.msg_prey_stepunder
|
||||
tmob_message = tail.msg_owner_stepunder
|
||||
@@ -304,7 +304,7 @@
|
||||
var/message_pred = null
|
||||
var/message_prey = null
|
||||
var/datum/sprite_accessory/tail/taur/tail = null
|
||||
if(isTaurTail(pred.tail_style))
|
||||
if(istaurtail(pred.tail_style))
|
||||
tail = pred.tail_style
|
||||
|
||||
if(a_intent == I_GRAB)
|
||||
|
||||
Reference in New Issue
Block a user