WIP fix of this PR

This commit is contained in:
Aronai Sieyes
2021-06-21 19:29:43 -04:00
parent 385fa640af
commit 85c31e9fda
70 changed files with 1878 additions and 4962 deletions
+1 -6
View File
@@ -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
+16 -16
View File
@@ -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"
+2 -2
View File
@@ -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'
+7 -7
View File
@@ -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
+1 -13
View File
@@ -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"
-1
View File
@@ -371,5 +371,4 @@
#undef LUM_FALLOFF
#undef REMOVE_CORNER
#undef APPLY_CORNER
#undef REMOVE_CORNER_SIMPLE
#undef APPLY_CORNER_SIMPLE
+1 -964
View File
@@ -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)]&deg;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
+1 -1
View File
@@ -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)
-141
View File
@@ -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)
+11 -11
View File
@@ -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
+38 -38
View File
@@ -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)
+2 -20
View File
@@ -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(
+26 -25
View File
@@ -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)
+25 -25
View File
@@ -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"
+3 -3
View File
@@ -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)