This commit is contained in:
izac112
2022-03-26 19:03:28 +01:00
42 changed files with 1293 additions and 375 deletions
+2 -1
View File
@@ -112,10 +112,11 @@ SUBSYSTEM_DEF(transcore)
if(since_backup < overdue_time)
curr_MR.dead_state = MR_NORMAL
else
if(curr_MR.dead_state != MR_DEAD) //First time switching to dead
/* if(curr_MR.dead_state != MR_DEAD) //First time switching to dead //Remove auto notification! Ghosts have a button to notify, so no more false flags.
if(curr_MR.do_notify)
db.notify(curr_MR)
curr_MR.last_notification = world.time
*/
curr_MR.dead_state = MR_DEAD
if(MC_TICK_CHECK)
@@ -60,10 +60,8 @@
/datum/crafting_recipe/scopedrifle
name = "Bolt scope to bolt-action (cannot be removed)"
result = /obj/item/weapon/gun/projectile/shotgun/pump/rifle/scoped
reqs = list(
/obj/item/device/binoculars/scope = 1,
/obj/item/weapon/gun/projectile/shotgun/pump/rifle = 1
)
reqs = list(list(/obj/item/device/binoculars/scope = 1),
list(/obj/item/weapon/gun/projectile/shotgun/pump/rifle = 1))
time = 180
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
subcategory = CAT_WEAPON
+3
View File
@@ -228,6 +228,9 @@
if(!temp)
to_chat(user, "<span class='notice'>You try to use your hand, but realize it is no longer attached!</span>")
return
if(istype(src, /obj/item/weapon/holder))
var/obj/item/weapon/holder/D = src
if(D.held_mob == user) return // No picking your own micro self up
var/old_loc = src.loc
if (istype(src.loc, /obj/item/weapon/storage))
@@ -298,7 +298,8 @@ var/global/list/default_medbay_channels = list(
GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer)
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels)
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels, var/states) //VOREStation Edit
if(!GLOB.autospeaker)
return
var/datum/radio_frequency/connection = null
@@ -314,12 +315,15 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer)
if(!LAZYLEN(zlevels))
zlevels = list(0)
//VOREStation Edit Start
if(!states)
states = "states"
//VOREStation Edit End
GLOB.autospeaker.SetName(from)
Broadcast_Message(connection, GLOB.autospeaker,
0, "*garbled automated announcement*", src,
message_to_multilingual(message), from, "Automated Announcement", from, "synthesized voice",
DATA_FAKE, 0, zlevels, connection.frequency, "states")
DATA_FAKE, 0, zlevels, connection.frequency, states) //VOREStation Edit
// Interprets the message mode when talking into a radio, possibly returning a connection datum
/obj/item/device/radio/proc/handle_message_mode(mob/living/M as mob, list/message_pieces, message_mode)
+21
View File
@@ -33,6 +33,27 @@
options["Stun Revolver"] = list(/obj/item/weapon/gun/energy/stunrevolver/detective, /obj/item/weapon/cell/device/weapon, /obj/item/weapon/cell/device/weapon)
options["Taser"] = list(/obj/item/weapon/gun/energy/taser, /obj/item/weapon/cell/device/weapon, /obj/item/weapon/cell/device/weapon)
var/choice = tgui_input_list(user,"Please, select an option.", "Stun Gun!", options)
if(src && choice)
var/list/things_to_spawn = options[choice]
for(var/new_type in things_to_spawn) // Spawn all the things, the gun and the ammo.
var/atom/movable/AM = new new_type(get_turf(src))
if(istype(AM, /obj/item/weapon/gun))
to_chat(user, "You have chosen \the [AM]. Say hello to your new friend.")
qdel(src)
/*
* CentCom Pistol
*/
/obj/item/gunbox/centcom
name = "centcom sidearm box"
desc = "A secure box containing a lethal sidearm used by Central Command."
w_class = ITEMSIZE_HUGE
/obj/item/gunbox/centcom/attack_self(mob/living/user)
var/list/options = list()
options["Écureuil (10mm)"] = list(/obj/item/weapon/gun/projectile/ecureuil, /obj/item/ammo_magazine/m10mm/pistol, /obj/item/ammo_magazine/m10mm/pistol)
options["Écureuil Olive (10mm)"] = list(/obj/item/weapon/gun/projectile/ecureuil/tac, /obj/item/ammo_magazine/m10mm/pistol, /obj/item/ammo_magazine/m10mm/pistol)
options["Écureuil Tan (10mm)"] = list(/obj/item/weapon/gun/projectile/ecureuil/tac2, /obj/item/ammo_magazine/m10mm/pistol, /obj/item/ammo_magazine/m10mm/pistol)
var/choice = tgui_input_list(user,"Please, select an option.", "Gun!", options)
if(src && choice)
var/list/things_to_spawn = options[choice]
for(var/new_type in things_to_spawn) // Spawn all the things, the gun and the ammo.
@@ -25,7 +25,7 @@
var/max_w_class = ITEMSIZE_SMALL //Max size of objects that this object can store (in effect only if can_hold isn't set)
var/max_storage_space = ITEMSIZE_COST_SMALL * 4 //The sum of the storage costs of all the items in this storage item.
var/storage_slots = null //The number of storage slots in this container. If null, it uses the volume-based storage instead.
/// Boxes screen object for fixed-size storage (belts, etc)
var/obj/screen/storage/boxes = null
/// List of 'click catchers' for boxes for fixed-size storage
@@ -37,8 +37,8 @@
var/obj/screen/storage/storage_continue = null
/// For dynamic storage, the rightmost pixel column for the whole storage display. Decorative.
var/obj/screen/storage/storage_end = null
/// The "X" button at the far right of the storage
/// The "X" button at the far right of the storage
var/obj/screen/close/closer = null
var/use_to_pickup //Set this to make it possible to use this item in an inverse way, so you can have the item in your hand and click items on the floor to pick them up.
@@ -189,12 +189,12 @@
return
if(user.s_active)
user.s_active.hide_from(user)
var/client/C = user.client
if(!C)
return
if(storage_slots)
if(storage_slots)
C.screen += src.boxes
create_slot_catchers()
C.screen += src.box_catchers
@@ -202,7 +202,7 @@
C.screen += src.storage_start
C.screen += src.storage_continue
C.screen += src.storage_end
C.screen += src.closer
C.screen += src.contents
@@ -212,12 +212,12 @@
/obj/item/weapon/storage/proc/hide_from(mob/user as mob)
var/client/C = user.client
LAZYREMOVE(is_seeing,user)
if(!C)
if(!LAZYLEN(is_seeing))
clear_slot_catchers()
return
if(storage_slots)
C.screen -= src.boxes
C.screen -= src.box_catchers
@@ -225,13 +225,13 @@
C.screen -= src.storage_start
C.screen -= src.storage_continue
C.screen -= src.storage_end
C.screen -= src.closer
C.screen -= src.contents
if(user.s_active == src)
user.s_active = null
if(!LAZYLEN(is_seeing))
clear_slot_catchers()
@@ -330,7 +330,7 @@
/obj/item/weapon/storage/proc/space_orient_objs(var/list/obj/item/display_contents)
SHOULD_NOT_SLEEP(TRUE)
/// A prototype for drawing the leftmost border behind each item in storage
var/static/mutable_appearance/stored_start
/// A prototype for drawing the wide backing space behind each item in storage
@@ -856,7 +856,7 @@
ASSERT(held_item)
name += held_item.name
src.held_item = weakref(held_item)
/atom/movable/storage_slot/Destroy()
held_item = null
@@ -869,4 +869,33 @@
var/obj/item/I = held_item?.resolve()
if(I)
usr.ClickOn(I)
return 1
return 1
// Allows micros to drag themselves into storage items
/obj/item/weapon/storage/MouseDrop_T(mob/living/target, mob/living/user)
if(!istype(user)) return // If the user passed in isn't a living mob, exit
if(target != user) return // If the user didn't drag themselves, exit
if(user.incapacitated() || user.buckled) return // If user is incapacitated or buckled, exit
if(get_holder_of_type(src, /mob/living/carbon/human) == user) return // No jumping into your own equipment
if(ishuman(user) && user.get_effective_size() > 0.25) return // Only micro characters
if(ismouse(user) && user.get_effective_size() > 1) return // Only normal sized mice or less
// Create a dummy holder with user's size to test insertion
var/obj/item/weapon/holder/D = new/obj/item/weapon/holder
if(ismouse(user))
D.w_class = ITEMSIZE_TINY // Mouse smol
else if(ishuman(user))
D.w_class = ITEMSIZE_SMALL // Players small
else // Other creatures not accepted at this time
qdel(D) // If there's a better way to check the size of a
return // mob's holder and if it fits, replace this slab
if(!src.can_be_inserted(D, 1)) // If the dummy item doesn't fit, exit
qdel(D)
return
qdel(D)
// Scoop and insert target into storage
var/obj/item/weapon/holder/H = new user.holder_type(get_turf(user), user)
src.handle_item_insertion(H, 1)
to_chat(user, "<span class='notice'>You climb into \the [src].</span>")
return ..()
+2 -2
View File
@@ -379,8 +379,8 @@
),
prob(5);list(
/obj/item/weapon/gun/projectile/luger,
/obj/item/ammo_magazine/m9mm/compact,
/obj/item/ammo_magazine/m9mm/compact
/obj/item/ammo_magazine/m9mm/luger,
/obj/item/ammo_magazine/m9mm/luger
),
prob(4);list(
/obj/item/weapon/gun/projectile/luger/brown,
@@ -29,11 +29,9 @@
/obj/item/device/radio/headset/heads/hop,
/obj/item/device/radio/headset/heads/hop/alt,
/obj/item/weapon/storage/box/ids = 2,
///obj/item/weapon/gun/energy/gun, //YW Edit,
/obj/item/weapon/gun/energy/gun/martin, //VOREStation Add,
/obj/item/weapon/storage/box/commandkeys, //VOREStation Add,
/obj/item/weapon/storage/box/servicekeys, //VOREStation Add,
///obj/item/weapon/gun/projectile/sec/flash, //VOREStation Removal,
/obj/item/weapon/gun/energy/gun/compact,
/obj/item/weapon/storage/box/commandkeys,
/obj/item/weapon/storage/box/servicekeys,
/obj/item/device/flash)
/obj/structure/closet/secure_closet/hop2
+2
View File
@@ -138,6 +138,8 @@
if(M.slip("the [floor_type] floor", slip_stun))
for(var/i = 1 to slip_dist)
if(isbelly(M.loc)) //VOREEdit, Stop the slip if we're in a belly. Inspired by a chompedit, cleaned it up with isbelly instead of a variable since the var was resetting too fast.
return
step(M, M.dir)
sleep(1)
else
+9 -3
View File
@@ -714,10 +714,16 @@ var/datum/announcement/minor/admin_min_announcer = new
if(sender) //They put a sender
sender = sanitize(sender, 75, extra = 0)
var/message = input(usr, "Message content (max 500):", "Contents", "This is a test of the announcement system.") as null|message
var/msgverb = input(usr, "Name of verb (Such as 'states', 'says', 'asks', etc):", "Verb", "says") as null|text //VOREStation Addition
if(message) //They put a message
message = sanitize(message, 500, extra = 0)
global_announcer.autosay("[message]", "[sender]", "[channel == "Common" ? null : channel]") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
//VOREStation Edit Start
if(msgverb)
msgverb = sanitize(msgverb, 50, extra = 0)
else
msgverb = "states"
global_announcer.autosay("[message]", "[sender]", "[channel == "Common" ? null : channel]", states = msgverb) //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
//VOREStation Edit End
log_admin("Intercom: [key_name(usr)] : [sender]:[message]")
feedback_add_details("admin_verb","IN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -802,7 +808,7 @@ var/datum/announcement/minor/admin_min_announcer = new
var/this_sender = decomposed[i]
var/this_message = decomposed[++i]
var/this_wait = decomposed[++i]
global_announcer.autosay("[this_message]", "[this_sender]", "[channel == "Common" ? null : channel]") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
global_announcer.autosay("[this_message]", "[this_sender]", "[channel == "Common" ? null : channel]", "says") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set. //VOREStation Edit
sleep(this_wait SECONDS)
/datum/admins/proc/toggleooc()
+2 -1
View File
@@ -159,7 +159,8 @@ var/list/admin_verbs_fun = list(
/client/proc/smite_vr, //VOREStation Add,
/client/proc/admin_lightning_strike,
/client/proc/resize, //VOREStation Add,
/client/proc/cmd_admin_droppod_deploy
/client/proc/cmd_admin_droppod_deploy,
/client/proc/adminorbit //VOREStation Add,
)
var/list/admin_verbs_spawn = list(
+56
View File
@@ -0,0 +1,56 @@
/client/proc/adminorbit()
set category = "Fun"
set name = "Orbit Things"
set desc = "Makes something orbit around something else."
set popup_menu = FALSE
if(!check_rights(R_FUN))
return
var/center
var/atom/movable/orbiter
var/input
if(holder.marked_datum)
input = tgui_alert(usr, "You have \n[holder.marked_datum] marked, should this be the center of the orbit, or the orbiter?", "Orbit", list("Center", "Orbiter", "Neither"))
switch(input)
if("Center")
center = holder.marked_datum
if("Orbiter")
orbiter = holder.marked_datum
var/list/possible_things = list()
for(var/T as mob in view(view)) //Let's do mobs before objects
if(ismob(T))
possible_things |= T
for(var/T as obj in view(view))
if(isobj(T))
possible_things |= T
if(!center)
center = input(usr, "What should act as the center of the orbit?", "Center") as anything in possible_things
possible_things -= center
if(!orbiter)
orbiter = input(usr, "What should act as the orbiter of the orbit?", "Orbiter") as anything in possible_things
if(!center || !orbiter)
to_chat(usr, "<span class = 'warning'>A center of orbit and an orbiter must be configured. You can also do this by marking a target.</span>")
return
if(center == orbiter)
to_chat(usr, "<span class = 'warning'>The center of the orbit cannot also be the orbiter.</span>")
return
if(isturf(orbiter))
to_chat(usr, "<span class = 'warning'>The orbiter cannot be a turf. It can only be used as a center.</span>")
return
var/distance = input(usr, "How large will their orbit radius be? (In pixels. 32 is 'near around a character)", "Orbit Radius", 32) as num|null
var/speed = input(usr, "How fast will they orbit (negative numbers spin clockwise)", "Orbit Speed", 20) as num|null
var/segments = input(usr, "How many segments will they have in their orbit? (3 is a triangle, 36 is a circle, etc)", "Orbit Segments", 36) as num|null
var/clock = FALSE
if(!distance)
distance = 32
if(!speed)
speed = 20
else if (speed < 0)
clock = TRUE
speed *= -1
if(!segments)
segments = 36
if(tgui_alert(usr, "\The [orbiter] will orbit around [center]. Is this okay?", "Confirm Orbit", list("Yes", "No")) == "Yes")
orbiter.orbit(center, distance, clock, speed, segments)
+10 -8
View File
@@ -10,18 +10,18 @@
set category = "Admin"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT))
return
if(!config.allow_admin_jump)
tgui_alert_async(usr, "Admin jumping disabled")
return
var/area/A
if(areaname)
A = return_sorted_areas()[areaname]
else
A = tgui_input_list(usr, "Pick an area:", "Jump to Area", return_sorted_areas())
if(!A)
return
@@ -62,7 +62,7 @@
if(!config.allow_admin_jump)
tgui_alert_async(usr, "Admin jumping disabled")
return
if(!M)
M = tgui_input_list(usr, "Pick a mob:", "Jump to Mob", mob_list)
if(!M)
@@ -78,7 +78,7 @@
feedback_add_details("admin_verb","JM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
to_chat(A, "<span class='filter_adminlog'>This mob is not located in the game world.</span>")
/client/proc/jumptocoord(tx as num, ty as num, tz as num)
set category = "Admin"
set name = "Jump to Coordinate"
@@ -94,7 +94,7 @@
if(!T)
to_chat(usr, "<span class='warning'>Those coordinates are outside the boundaries of the map.</span>")
return
A.forceMove(T)
A.forceMove(T)
feedback_add_details("admin_verb","JC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]")
@@ -124,15 +124,17 @@
else
tgui_alert_async(usr, "Admin jumping disabled")
/client/proc/Getmob()
/client/proc/Getmob(mob/living/M as null|anything in mob_list) //VOREStation Edit
set category = "Admin"
set name = "Get Mob"
set desc = "Mob to teleport"
set popup_menu = TRUE //VOREStation Edit
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT))
return
if(config.allow_admin_jump)
var/mob/M = tgui_input_list(usr, "Pick a mob:", "Get Mob", mob_list)
if(!M) //VOREStation Edit
M = tgui_input_list(usr, "Pick a mob:", "Get Mob", mob_list) //VOREStation Edit
if(!M)
return
log_admin("[key_name(usr)] jumped [key_name(M)] to them")
+2
View File
@@ -9,6 +9,8 @@
return
for(var/obj/item/W in M)
if(istype(W, /obj/item/weapon/implant/backup) || istype(W, /obj/item/device/nif)) //VOREStation Edit - There's basically no reason to remove either of these
continue //VOREStation Edit
M.drop_from_inventory(W)
log_admin("[key_name(usr)] made [key_name(M)] drop everything!")
@@ -105,6 +105,16 @@
/datum/ai_holder/simple_mob/xenobio_slime/handle_special_strategical()
discipline_decay()
/datum/ai_holder/simple_mob/xenobio_slime/request_help()
if(target)
if(istype(target, /mob/living/simple_mob/slime/xenobio)) //Don't call reinforcements for internal disputes
return
if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/H = target
if(istype(H.species, /datum/species/monkey)) //Or for food
return
..()
// Handles decay of discipline.
/datum/ai_holder/simple_mob/xenobio_slime/proc/discipline_decay()
if(discipline > 0 && last_discipline_decay + discipline_decay_time < world.time)
+39 -5
View File
@@ -68,8 +68,14 @@
var/datum/transcore_db/db = SStranscore.db_by_mind_name(mind.name)
if(db)
var/datum/transhuman/mind_record/record = db.backed_up[src.mind.name]
if(!(record.dead_state == MR_DEAD))
to_chat(src, "<span class='warning'>Your backup is not past-due yet.</span>")
if(!(record.dead_state == MR_DEAD))
if((world.time - timeofdeath ) > 5 MINUTES) //Allows notify transcore to be used if you have an entry but for some reason weren't marked as dead
record.dead_state = MR_DEAD //Such as if you got scanned but didn't take an implant. It's a little funky, but I mean, you got scanned
db.notify(record) //So you probably will want to let someone know if you die.
record.last_notification = world.time
to_chat(src, "<span class='notice'>New notification has been sent.</span>")
else
to_chat(src, "<span class='warning'>Your backup is not past-due yet.</span>")
else if((world.time - record.last_notification) < 5 MINUTES)
to_chat(src, "<span class='warning'>Too little time has passed since your last notification.</span>")
else
@@ -78,7 +84,7 @@
to_chat(src, "<span class='notice'>New notification has been sent.</span>")
else
to_chat(src,"<span class='warning'>No backup record could be found, sorry.</span>")
/*
/mob/observer/dead/verb/backup_delay()
set category = "Ghost"
set name = "Cancel Transcore Notification"
@@ -97,7 +103,7 @@
to_chat(src, "<span class='notice'>Overdue mind backup notification delayed successfully.</span>")
else
to_chat(src,"<span class='warning'>No backup record could be found, sorry.</span>")
*/
/mob/observer/dead/verb/findghostpod() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
set category = "Ghost"
set name = "Find Ghost Pod"
@@ -123,4 +129,32 @@
forceMove(T)
stop_following()
else
to_chat(src, "This ghost pod is not located in the game world.")
to_chat(src, "This ghost pod is not located in the game world.")
/mob/observer/dead/verb/findautoresleever()
set category = "Ghost"
set name = "Find Auto Resleever"
set desc = "Find a Auto Resleever"
set popup_menu = FALSE
if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer!
return
var/list/ar = list()
for(var/obj/machinery/transhuman/autoresleever/A in world)
if(A.spawntype)
continue
else
ar |= A
var/obj/machinery/transhuman/autoresleever/thisone = pick(ar)
if(!thisone)
to_chat(src, "<span class='warning'>There appears to be no auto-resleevers available.</span>")
return
var/L = get_turf(thisone)
if(!L)
to_chat(src, "<span class='warning'>There appears to be something wrong with this auto-resleever, try again.</span>")
return
forceMove(L)
@@ -383,6 +383,7 @@
blob.Weaken(2)
blob.transforming = TRUE
blob.ckey = ckey
blob.ooc_notes = ooc_notes
blob.transforming = FALSE
blob.name = name
blob.nutrition = nutrition
@@ -454,6 +455,7 @@
playsound(src.loc, "sound/effects/slime_squish.ogg", 15)
transforming = TRUE
ckey = blob.ckey
ooc_notes = blob.ooc_notes // Updating notes incase they change them in blob form.
transforming = FALSE
blob.name = "Promethean Blob"
var/obj/item/hat = blob.hat
@@ -378,6 +378,7 @@ var/global/list/disallowed_protean_accessories = list(
//Put our owner in it (don't transfer var/mind)
blob.ckey = ckey
blob.ooc_notes = ooc_notes
temporary_form = blob
//Mail them to nullspace
@@ -459,6 +460,7 @@ var/global/list/disallowed_protean_accessories = list(
//Put our owner in it (don't transfer var/mind)
ckey = blob.ckey
ooc_notes = blob.ooc_notes // Lets give the protean any updated notes from blob form.
temporary_form = null
//Transfer vore organs
+3 -2
View File
@@ -171,9 +171,10 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
SC.brainmobs = list()
stat = NIF_PREINSTALL
vis_update()
H.verbs -= /mob/living/carbon/human/proc/set_nif_examine
if(H)
H.verbs -= /mob/living/carbon/human/proc/set_nif_examine
H.nif = null
qdel_null(menu)
H.nif = null
human = null
install_done = null
update_icon()
+2 -6
View File
@@ -85,7 +85,7 @@ var/global/datum/unarmed_attack/hardclaws/unarmed_hardclaws = new()
var/mob/living/carbon/human/H = nif.human
H.adjustHalLoss(30)
var/obj/item/weapon/gun/energy/gun/martin/dazzle/dgun = new(get_turf(H))
var/obj/item/weapon/gun/energy/gun/compact/dazzle/dgun = new(get_turf(H))
H.put_in_hands(dgun)
nif.notify("Weapon deployed!",TRUE)
used = TRUE
@@ -93,10 +93,6 @@ var/global/datum/unarmed_attack/hardclaws/unarmed_hardclaws = new()
uninstall()
//The gun to go with this implant
/obj/item/weapon/gun/energy/gun/martin/dazzle
/obj/item/weapon/gun/energy/gun/compact/dazzle
name = "Microlaser"
desc = "A tiny nanofabricated laser."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "PDW"
item_state = "gun"
+4 -3
View File
@@ -485,9 +485,10 @@ This function completely restores a damaged organ to perfect condition.
// remove embedded objects and drop them on the floor
for(var/obj/implanted_object in implants)
if(!istype(implanted_object,/obj/item/weapon/implant) && !istype(implanted_object,/obj/item/device/nif)) // We don't want to remove REAL implants. Just shrapnel etc. //VOREStation Edit - NIFs pls
implanted_object.loc = get_turf(src)
implants -= implanted_object
if(istype(implanted_object,/obj/item/weapon/implant) || istype(implanted_object,/obj/item/device/nif)) // We don't want to remove REAL implants. Just shrapnel etc. //VOREStation Edit - NIFs pls
continue
implanted_object.loc = get_turf(src)
implants -= implanted_object
if(!owner.has_embedded_objects())
owner.clear_alert("embeddedobject")
@@ -108,6 +108,38 @@
name = "speedloader (.38 haywire)"
ammo_type = /obj/item/ammo_casing/a38/emp
// Makarov
/obj/item/ammo_magazine/m38/makarov
name = "makarov magazine (.38)"
icon_state = "45"
origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
matter = list(MAT_STEEL = 480)
caliber = ".38"
ammo_type = /obj/item/ammo_casing/a38
max_ammo = 8
multiple_sprites = 1
/obj/item/ammo_magazine/m38/makarov/rubber
name = "makarov magazine (.38 rubber)"
ammo_type = /obj/item/ammo_casing/a38/rubber
// Giskard
/obj/item/ammo_magazine/m38/giskard
name = "magazine (.38)"
icon_state = "m91"
origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
matter = list(MAT_STEEL = 540)
caliber = ".38"
ammo_type = /obj/item/ammo_casing/a38
max_ammo = 10
multiple_sprites = 1
/obj/item/ammo_magazine/m38/giskard/rubber
name = "makarov magazine (.38 rubber)"
ammo_type = /obj/item/ammo_casing/a38/rubber
///////// .45 /////////
/obj/item/ammo_magazine/m45
@@ -345,6 +377,25 @@
name = "compact magazine (9mm practice)"
ammo_type = /obj/item/ammo_casing/a9mm/practice
// Luger
/obj/item/ammo_magazine/m9mm/luger
name = "\improper \"Mäuse\" magazine (9mm)"
icon_state = "9x19p"
origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
matter = list(MAT_STEEL = 480)
caliber = "9mm"
ammo_type = /obj/item/ammo_casing/a9mm
max_ammo = 8
multiple_sprites = 1
/obj/item/ammo_magazine/m9mm/luger/empty
initial_ammo = 0
/obj/item/ammo_magazine/m9mm/luger/rubber
name = "\improper \"Mäuse\" magazine (9mm rubber)"
ammo_type = /obj/item/ammo_casing/a9mm/rubber
// SMG
/obj/item/ammo_magazine/m9mmt
name = "top mounted magazine (9mm)"
@@ -431,7 +482,7 @@
ammo_type = /obj/item/ammo_casing/a9mm/ap
matter = list(MAT_STEEL = 2000)
/obj/item/ammo_magazine/m9mmR/saber/empty
/obj/item/ammo_magazine/m9mmAdvanced/empty
initial_ammo = 0
///////// 10mm /////////
@@ -450,6 +501,45 @@
/obj/item/ammo_magazine/m10mm/empty
initial_ammo = 0
/obj/item/ammo_magazine/m10mm/practice
name = "magazine (10mm practice)"
matter = list(MAT_STEEL = 1000)
ammo_type = /obj/item/ammo_casing/a10mm/practice
/obj/item/ammo_magazine/m10mm/rubber
name = "magazine (10mm rubber)"
matter = list(MAT_STEEL = 1000)
ammo_type = /obj/item/ammo_casing/a10mm/rubber
/obj/item/ammo_magazine/m10mm/emp
name = "magazine (10mm haywire)"
matter = list(MAT_STEEL = 1500, MAT_URANIUM = 2000)
ammo_type = /obj/item/ammo_casing/a10mm/emp
// Pistol
/obj/item/ammo_magazine/m10mm/pistol
icon_state = "m91"
matter = list(MAT_STEEL = 1000)
max_ammo = 12
/obj/item/ammo_magazine/m10mm/pistol/practice
name = "magazine (10mm practice)"
matter = list(MAT_STEEL = 800)
ammo_type = /obj/item/ammo_casing/a10mm/practice
/obj/item/ammo_magazine/m10mm/pistol/rubber
name = "magazine (10mm rubber)"
matter = list(MAT_STEEL = 800)
ammo_type = /obj/item/ammo_casing/a10mm/rubber
/obj/item/ammo_magazine/m10mm/pistol/emp
name = "magazine (10mm haywire)"
matter = list(MAT_STEEL = 1000, MAT_URANIUM = 1500)
ammo_type = /obj/item/ammo_casing/a10mm/emp
/obj/item/ammo_magazine/m10mm/pistol/empty
initial_ammo = 0
///////// 5.45mm /////////
/obj/item/ammo_magazine/m545
@@ -80,21 +80,7 @@
//////////////////// Energy Weapons ////////////////////
// ------------ Energy Luger ------------
/obj/item/weapon/gun/energy/gun/eluger
name = "energy Luger"
desc = "The finest sidearm produced by RauMauser. Although its battery cannot be removed, its ergonomic design makes it easy to shoot, allowing for rapid follow-up shots. It also has the ability to toggle between stun and kill."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "elugerstun100"
item_state = "gun"
fire_delay = null // Lugers are quite comfortable to shoot, thus allowing for more controlled follow-up shots. Rate of fire similar to a laser carbine.
battery_lock = 1 // In exchange for balance, you cannot remove the battery. Also there's no sprite for that and I fucking suck at sprites. -Ace
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2) // Illegal tech cuz Space Nazis
modifystate = "elugerstun"
fire_sound = 'sound/weapons/Taser.ogg'
firemodes = list(
list(mode_name="stun", charge_cost=120,projectile_type=/obj/item/projectile/beam/stun, modifystate="elugerstun", fire_sound='sound/weapons/Taser.ogg'),
list(mode_name="lethal", charge_cost=240,projectile_type=/obj/item/projectile/beam/eluger, modifystate="elugerkill", fire_sound='sound/weapons/eluger.ogg'),
)
//MOVED TO nuclear.dm
//////////////////// Eris Ported Guns ////////////////////
//HoP gun
+100 -51
View File
@@ -1,52 +1,120 @@
/*
* Energy Gun
*/
/obj/item/weapon/gun/energy/gun
name = "energy gun"
desc = "Another bestseller of Lawson Arms, the LAEP90 Perun is a versatile energy based sidearm, capable of switching between low and high capacity projectile settings. In other words: Stun or Kill."
desc = "Another bestseller of Lawson Arms, the LAEP80 Thor is a versatile energy based pistol, capable of switching between low and high capacity projectile settings. In other words: Stun or Kill."
description_fluff = "Lawson Arms is Hephaestus Industries main personal-energy-weapon branding, often sold alongside MarsTech projectile weapons to security and law enforcement agencies."
icon_state = "energystun100"
item_state = null //so the human update icon uses the icon_state instead.
fire_delay = 10 // Handguns should be inferior to two-handed weapons.
icon_state = "egunstun"
item_state = null //so the human update icon uses the icon_state instead.
fire_delay = 8
projectile_type = /obj/item/projectile/beam/stun/med
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
modifystate = "egunstun"
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="egunstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 240),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="egunkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 480),
)
/*
* Energy Rifle
*/
/obj/item/weapon/gun/energy/gun/rifle
name = "energy rifle"
desc = "Another bestseller of Lawson Arms, the LAEP100 Svarog is a versatile energy rifle, capable of switching between low and high capacity projectile settings. In other words: Stun or Kill."
icon_state = "riflestun"
item_state = null //so the human update icon uses the icon_state instead.
wielded_item_state = "riflestun-wielded"
force = 8
w_class = ITEMSIZE_LARGE
fire_delay = 6
one_handed_penalty = 30
projectile_type = /obj/item/projectile/beam/stun
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 3)
modifystate = "riflestun"
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="riflestun", fire_sound='sound/weapons/Taser.ogg', wielded_item_state="riflestun-wielded", charge_cost = 120),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="riflekill", fire_sound='sound/weapons/Laser.ogg', wielded_item_state="riflekill-wielded", charge_cost = 240),
)
/*
* Energy Carbine (Burst Laser)
*/
/obj/item/weapon/gun/energy/gun/burst
name = "energy carbine"
desc = "The Lawson Arms FM-2t is a versatile energy based carbine made from modifying the original LAEP100 design. It is capable of switching between stun or kill with a three round burst option for both settings."
icon_state = "energystun"
item_state = null //so the human update icon uses the icon_state instead.
force = 8
w_class = ITEMSIZE_LARGE
fire_delay = 6
projectile_type = /obj/item/projectile/beam/stun/weak
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2, TECH_ILLEGAL = 3)
modifystate = "energystun"
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="energystun", charge_cost = 240),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="energykill", charge_cost = 480),
list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun", charge_cost = 100),
list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun"),
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="energykill", charge_cost = 200),
list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="energykill"),
)
/*
* Energy PDW (Martin)
*/
/obj/item/weapon/gun/energy/gun/compact
name = "personal energy weapon"
desc = "The RayZar EW20 \"Martin\" personal energy weapon - or PEW - is Ward-Takahasi's entry into the variable capacity energy gun market. New users are advised to 'set RayZars to stun'."
description_fluff = "RayZar is Ward-Takahashis main consumer weapons brand, known for producing and licensing a wide variety of specialist energy weapons of various types and quality primarily for the civilian market."
icon_state = "PDWstun"
fire_sound = 'sound/weapons/Taser.ogg'
w_class = ITEMSIZE_SMALL
projectile_type = /obj/item/projectile/beam/stun/med
origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 3)
modifystate = "PDWstun"
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="PDWstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 240),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="PDWkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 480),
)
/*
* Energy Luger
*/
/obj/item/weapon/gun/energy/gun/eluger
name = "energy Luger"
desc = "The finest sidearm produced by RauMauser. Although its battery cannot be removed, its ergonomic design makes it easy to shoot, allowing for rapid follow-up shots. It also has the ability to toggle between stun and kill."
icon_state = "ep08stun"
item_state = "gun"
fire_delay = null // Lugers are quite comfortable to shoot, thus allowing for more controlled follow-up shots. Rate of fire similar to a laser carbine.
battery_lock = 1 // In exchange for balance, you cannot remove the battery. Also there's no sprite for that and I fucking suck at sprites. -Ace
projectile_type = /obj/item/projectile/beam/stun/med
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2) // Illegal tech cuz Space Nazis
modifystate = "ep08stun"
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="ep08stun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 120),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam/eluger, modifystate="ep08kill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 240),
)
/*
* Mounted Energy Gun
*/
/obj/item/weapon/gun/energy/gun/mounted
name = "mounted energy gun"
self_recharge = 1
use_external_power = 1
/obj/item/weapon/gun/energy/gun/burst
name = "burst laser"
desc = "The Lawson Arms FM-2t is a versatile energy based weapon, capable of switching between stun or kill with a three round burst option for both settings."
description_fluff = "Lawson Arms is Hephaestus Industries main personal-energy-weapon branding, often sold alongside MarsTech projectile weapons to security and law enforcement agencies."
icon_state = "fm-2tstun100" //May resprite this to be more rifley
item_state = null //so the human update icon uses the icon_state instead.
charge_cost = 100
force = 8
w_class = ITEMSIZE_LARGE //Probably gonna make it a rifle sooner or later
fire_delay = 6
projectile_type = /obj/item/projectile/beam/stun/weak
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2, TECH_ILLEGAL = 3)
modifystate = "fm-2tstun"
// requires_two_hands = 1
// one_handed_penalty = 30
firemodes = list(
list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", charge_cost = 100),
list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun"),
list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", charge_cost = 200),
list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill"),
)
/*
* Nuclear Energy Gun
*/
/obj/item/weapon/gun/energy/gun/nuclear
name = "advanced energy gun"
desc = "An energy gun with an experimental miniaturized reactor, based on a Lawson Arms platform."
@@ -61,26 +129,7 @@
battery_lock = 1
modifystate = null
// requires_two_hands = 1
// one_handed_penalty = 15 // It's rather bulky, so holding it in one hand is a little harder than with two, however it's not 'required'.
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="nucgunstun", charge_cost = 240),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="nucgunkill", charge_cost = 480),
)
//Functionally a Perun, but flavoured.
/obj/item/weapon/gun/energy/gun/compact
name = "personal energy weapon"
desc = "The RayZar EW20 Cygnus personal energy weapon - or PEW - is Ward-Takahasi's entry into the variable capacity energy gun market. New users are advised to 'set RayZars to stun'."
description_fluff = "RayZar is Ward-Takahashis main consumer weapons brand, known for producing and licensing a wide variety of specialist energy weapons of various types and quality primarily for the civilian market."
icon_state = "PDWstun100"
projectile_type = /obj/item/projectile/beam/stun/med
origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 3)
modifystate = "PDWstun"
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="PDWstun", charge_cost = 240),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="PDWkill", charge_cost = 480),
)
@@ -1,14 +0,0 @@
/*
// Virgo's very own file for overriding Polaris' eguns! Should include: Regular egun, Advanced egun, burst egun, mounted egun
//
// NOTICE: All the eguns are child objects of the base thing. If you modify the base egun, all the other eguns will inherit it unless they explicitly override it.
*/
/obj/item/weapon/gun/energy/gun
icon = 'icons/obj/eguns_vr.dmi' //makes the egun look for icons here instead. ALL of the eguns.
/obj/item/weapon/gun/energy/gun/burst
icon = 'icons/obj/gun.dmi' //Points it back at the default file so eguns_vr.dmi doesn't need to mirror all the sprites
/obj/item/weapon/gun/energy/gun/nuclear
icon = 'icons/obj/gun.dmi' //Points it back at the default file so eguns_vr.dmi doesn't need to mirror all the sprites
@@ -1,10 +1,18 @@
/*
* Gram
*/
/obj/item/weapon/gun/projectile/contender
name = "H-H Gram"
desc = "Hedberg-Hammarstrom's flagship one-shot hand-cannon. For when you really want to make a hole. This one has been modified to work almost like a bolt-action. Uses .357 rounds."
description_fluff = "Sifs largest home-grown firearms manufacturer, the Hedberg-Hammarstrom company offers a range of high-quality, high-cost hunting rifles and shotguns designed with the Sivian wilderness - and its wildlife - in mind. \
The company operates just one production plant in Kalmar, but their weapons have found popularity on garden worlds as far afield as the Tajaran homeworld due to their excellent build quality, precision, and stopping power."
name = "\improper \"Gram\" Contender"
desc = "Hedberg-Hammarstrom's flagship one-shot hand-cannon. For when you \
really want to make a hole. This one has been modified to work almost like \
a bolt-action. Uses .357 rounds."
description_fluff = "The Hedberg-Hammarstrom company offers a range of high-quality, \
high-cost hunting rifles and shotguns designed with the Sivian wilderness - and its \
wildlife - in mind. The company operates just one production plant in Kalmar, but \
their weapons have found popularity on garden worlds as far afield as the Tajaran \
homeworld due to their excellent build quality, precision, and stopping power."
icon_state = "pockrifle"
var/icon_retracted = "pockrifle-empty"
var/icon_retracted = "pockrifle-e"
item_state = "revolver"
caliber = ".357"
handle_casings = HOLD_CASINGS
@@ -39,8 +47,13 @@
return
..()
/*
* Balmung
*/
/obj/item/weapon/gun/projectile/contender/tacticool
name = "H-H Balmung"
desc = "A later model of the Hedberg-Hammarstrom Gram, reinvented with a tactical look. For when you really want to make a hole. This one has been modified to work almost like a bolt-action. Uses .357 rounds."
name = "\improper \"Balmung\" Contender"
desc = "A later model of the Hedberg-Hammarstrom \"Gram\", reinvented with a \
tactical look. For when you really want to make a hole. This one has been \
modified to work almost like a bolt-action. Uses .357 rounds."
icon_state = "pockrifle_b"
icon_retracted = "pockrifle_b-empty"
icon_retracted = "pockrifle_b-e"
@@ -72,14 +72,6 @@
to_chat(M, "Your gun is now sprited as [choice]. Say hello to your new friend.")
return 1
/*//apart of reskins that have two sprites, touching may result in frustration and breaks
/obj/item/weapon/gun/projectile/colt/detective/attack_hand(var/mob/living/user)
if(!unique_reskin && loc == user)
reskin_gun(user)
return
..()
*/
/*
* Security Sidearm
*/
@@ -104,12 +96,11 @@
icon_state = "secgun-e"
/obj/item/weapon/gun/projectile/sec/flash
name = ".45 signal pistol"
magazine_type = /obj/item/ammo_magazine/m45/flash
/obj/item/weapon/gun/projectile/sec/wood
name = "custom .45 pistol"
desc = "The MT Mk58 is a cheap, ubiquitous sidearm, produced by MarsTech. This one has a sweet wooden grip. Uses .45 rounds."
name = "custom .45 Pistol"
icon_state = "secgunb"
/obj/item/weapon/gun/projectile/sec/wood/update_icon()
@@ -140,6 +131,13 @@
/obj/item/weapon/gun/projectile/silenced/empty
magazine_type = null
/obj/item/weapon/gun/projectile/silenced/update_icon()
..()
if(ammo_magazine)
icon_state = "silenced_pistol"
else
icon_state = "silenced_pistol-e"
/*
* Deagle
*/
@@ -178,7 +176,7 @@
/*
* Gyro Pistol (Admin Abuse in gun form)
*/
/obj/item/weapon/gun/projectile/gyropistol // Does this even appear anywhere outside of admin abuse?
/obj/item/weapon/gun/projectile/gyropistol
name = "gyrojet pistol"
desc = "Speak softly, and carry a big gun. Fires rare .75 caliber self-propelled exploding bolts--because fuck you and everything around you."
icon_state = "gyropistol"
@@ -200,12 +198,22 @@
else
icon_state = "gyropistol"
/*
* Silencer
*/
/obj/item/weapon/silencer
name = "silencer"
desc = "a silencer"
icon = 'icons/obj/gun.dmi'
icon_state = "silencer"
w_class = ITEMSIZE_SMALL
/*
* Compact Pistol
*/
/obj/item/weapon/gun/projectile/pistol
name = "compact pistol"
desc = "The Lumoco Arms P3 Whisper. A compact, easily concealable gun, though it's only compatible with compact magazines. Uses 9mm rounds."
desc = "The Lumoco Arms P3 \"Whisper\". A compact, easily concealable gun, though it's only compatible with compact magazines. Uses 9mm rounds."
icon_state = "pistol"
item_state = null
w_class = ITEMSIZE_SMALL
@@ -218,7 +226,6 @@
projectile_type = /obj/item/projectile/bullet/pistol
/obj/item/weapon/gun/projectile/pistol/flash
name = "compact signal pistol"
magazine_type = /obj/item/ammo_magazine/m9mm/compact/flash
/obj/item/weapon/gun/projectile/pistol/attack_hand(mob/living/user as mob)
@@ -250,21 +257,70 @@
..()
/obj/item/weapon/gun/projectile/pistol/update_icon()
..()
if(silenced)
icon_state = "pistol-silencer"
if(ammo_magazine)
if(silenced)
icon_state = "pistol-s"
else
icon_state = "pistol"
else
icon_state = "pistol"
if(silenced)
icon_state = "pistol-s-e"
else
icon_state = "pistol-e"
/*
* Silencer
* Pistol
*/
/obj/item/weapon/silencer
name = "silencer"
desc = "a silencer"
icon = 'icons/obj/gun.dmi'
icon_state = "silencer"
w_class = ITEMSIZE_SMALL
/obj/item/weapon/gun/projectile/aps
name = "pistol"
desc = "The Lumoco Arms P6 \"Rustle\". A standard self-defense pistol that takes standard magazines. Uses 9mm rounds."
icon_state = "aps"
item_state = null
caliber = "9mm"
silenced = 0
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 2)
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/m9mm
allowed_magazines = list(/obj/item/ammo_magazine/m9mm)
projectile_type = /obj/item/projectile/bullet/pistol
/obj/item/weapon/gun/projectile/aps/attack_hand(mob/living/user as mob)
if(user.get_inactive_hand() == src)
if(silenced)
if(!user.item_is_in_hands(src))
..()
return
to_chat(user, "<span class='notice'>You unscrew [silenced] from [src].</span>")
user.put_in_hands(silenced)
silenced = 0
update_icon()
return
..()
/obj/item/weapon/gun/projectile/aps/attackby(obj/item/I as obj, mob/living/user as mob)
if(istype(I, /obj/item/weapon/silencer))
if(!user.item_is_in_hands(src)) //if we're not in his hands
to_chat(user, "<span class='notice'>You'll need [src] in your hands to do that.</span>")
return
user.drop_item()
to_chat(user, "<span class='notice'>You screw [I] onto [src].</span>")
silenced = I //dodgy?
I.loc = src //put the silencer into the gun
update_icon()
return
..()
/obj/item/weapon/gun/projectile/aps/update_icon()
if(ammo_magazine)
if(silenced)
icon_state = "aps-s"
else
icon_state = "aps"
else
if(silenced)
icon_state = "aps-s-e"
else
icon_state = "aps-e"
/*
* Zip Gun (yar har)
@@ -272,7 +328,7 @@
/obj/item/weapon/gun/projectile/pirate
name = "zip gun"
desc = "Little more than a barrel, handle, and firing mechanism, cheap makeshift firearms like this one are not uncommon in frontier systems."
icon_state = "sawnshotgun"
icon_state = "zipgun"
item_state = "sawnshotgun"
handle_casings = CYCLE_CASINGS //player has to take the old casing out manually before reloading
load_method = SINGLE_CASING
@@ -323,18 +379,20 @@
* Luger
*/
/obj/item/weapon/gun/projectile/luger
name = "\improper Jindal T15 Chooha"
desc = "Almost seventy percent guaranteed not to be a cheap rimworld knockoff! Accuracy, easy handling, and its distinctive appearance make it popular among gun collectors. Uses 9mm rounds."
name = "\improper Jindal T15 \"Mäuse\""
desc = "Almost seventy percent guaranteed not to be a cheap rimworld knockoff! Accuracy, easy handling, and its distinctive appearance \
make it popular among gun collectors. Uses 9mm rounds."
description_fluff = "While Jindals rugged, affordable weapons intended for the colonial sector are a major export of Tau Ceti, \
the Jindal Arms company is perhaps best known for its liberal sale of production licenses to just about any fledgling rimworld venture who asks, and has cash to spare. \
While Jindals 'authentic' Binma-built weapons are renowned for their reliability, the same cannot be said for the hundreds of low-grade (But technically legal) \
copies circulating the squalid habitats and smoke-filled junk ships of the frontier."
icon_state = "p08"
the Jindal Arms company is perhaps best known for its liberal sale of production licenses to just about any fledgling rimworld \
venture who asks, and has cash to spare. While Jindals 'authentic' Binma-built weapons are renowned for their reliability, the \
same cannot be said for the hundreds of low-grade (But technically legal) copies circulating the squalid habitats and smoke-filled \
junk ships of the frontier."
icon_state = "p08a"
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2)
caliber = "9mm"
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/m9mm/compact
allowed_magazines = list(/obj/item/ammo_magazine/m9mm/compact)
magazine_type = /obj/item/ammo_magazine/m9mm/luger
allowed_magazines = list(/obj/item/ammo_magazine/m9mm/luger)
projectile_type = /obj/item/projectile/bullet/pistol
/obj/item/weapon/gun/projectile/luger/update_icon()
@@ -345,9 +403,10 @@
icon_state = "[initial(icon_state)]-e"
/obj/item/weapon/gun/projectile/luger/brown
name = "\improper Jindal KP-45W"
name = "\improper Jindal T15b \"Mäuse\""
description_fluff = "While wholly owned by Hephaestus Industries, the Jindal Arms brand does not appear prominently in most company catalogues \
(Perhaps owing to its less than prestigious image), instead being sold almost exclusively through retailers and advertising platforms targeting the 'independent roughneck' demographic."
(Perhaps owing to its less than prestigious image), instead being sold almost exclusively through retailers and advertising platforms targeting \
the 'independent roughneck' demographic."
icon_state = "p08b"
/*
@@ -377,4 +436,173 @@
icon_state = "p92xb"
/obj/item/weapon/gun/projectile/p92x/large
magazine_type = /obj/item/ammo_magazine/m9mm/large // Spawns with illegal magazines.
magazine_type = /obj/item/ammo_magazine/m9mm/large // Spawns with illegal magazines.
/obj/item/weapon/gun/projectile/p92x/large/preban
magazine_type = /obj/item/ammo_magazine/m9mm/large/preban // Spawns with big magazines that are legal.
/obj/item/weapon/gun/projectile/p92x/large/preban/hp
magazine_type = /obj/item/ammo_magazine/m9mm/large/preban/hp // Spawns with legal hollow-point mag
/*
* Giskard (Eris Port)
*/
/obj/item/weapon/gun/projectile/giskard
name = "\improper \"Giskard\" holdout pistol"
desc = "The FS HG .38 \"Giskard\" can even fit into the pocket! Uses .38 rounds."
icon_state = "giskardcivil"
item_state = "giskardcivil"
caliber = ".38"
magazine_type = /obj/item/ammo_magazine/m38
allowed_magazines = list(/obj/item/ammo_magazine/m38)
load_method = MAGAZINE
w_class = ITEMSIZE_SMALL
fire_sound = 'sound/weapons/gunshot_pathetic.ogg'
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 3)
/obj/item/weapon/gun/projectile/giskard/update_icon()
..()
if(ammo_magazine && ammo_magazine.stored_ammo.len)
icon_state = "giskardcivil"
else
icon_state = "giskardcivil_empty"
/obj/item/weapon/gun/projectile/giskard/olivaw
name = "\improper \"Olivaw\" holdout burst-pistol"
desc = "The FS HG .38 \"Olivaw\" is a more advanced version of the \"Giskard\". \
This one seems to have a two-round burst-fire mode. Uses .38 rounds."
icon_state = "olivawcivil"
item_state = "giskardcivil"
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=1.2, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="2-round bursts", burst=2, fire_delay=0.2, move_delay=4, burst_accuracy=list(0,-15), dispersion=list(1.2, 1.8)),
)
/obj/item/weapon/gun/projectile/giskard/olivaw/update_icon()
..()
if(ammo_magazine && ammo_magazine.stored_ammo.len)
icon_state = "olivawcivil"
else
icon_state = "olivawcivil-e"
/*
* Makarov
*/
/obj/item/weapon/gun/projectile/makarov
name = "makarov"
desc = "A small, rugged pistol from a bygone era. Uses .38 rounds."
icon_state = "makarov"
item_state = "gun"
caliber = ".38"
magazine_type = /obj/item/ammo_magazine/m38
allowed_magazines = list(/obj/item/ammo_magazine/m38)
projectile_type = /obj/item/projectile/bullet/pistol/medium
load_method = MAGAZINE
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
/obj/item/weapon/gun/projectile/makarov/update_icon()
if(ammo_magazine)
icon_state = "Makarov"
else
icon_state = "Makarov-e"
/*
* N99 (Fallout)
*/
/obj/item/weapon/gun/projectile/n99
name = "promotional pistol"
desc = "A very robust looking pistol that was made to promote 'Radius: Legend of the Demon Core', a popular \
post-apocolyptic TV series. It's rare to come across as marketing swiftly switched to a toy version as \
opposed to a live weapon due to safety concerns. Uses 10mm rounds."
icon_state = "n99"
item_state = "gun"
caliber = "10mm"
magazine_type = /obj/item/ammo_magazine/m10mm/pistol
allowed_magazines = list(/obj/item/ammo_magazine/m10mm/pistol)
projectile_type = /obj/item/projectile/bullet/pistol/medium
load_method = MAGAZINE
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
/obj/item/weapon/gun/projectile/n99/update_icon()
if(ammo_magazine)
icon_state = "n99"
else
icon_state = "n99-e"
/obj/item/weapon/gun/projectile/n80
icon_state = "n80"
/obj/item/weapon/gun/projectile/n80/update_icon()
if(ammo_magazine)
icon_state = "n80"
else
icon_state = "n80-e"
/*
* Écureuil 10mm Pistol (Skyrat Port)
*/
/obj/item/weapon/gun/projectile/ecureuil
name = "\improper \"Écureuil\" 10mm pistol"
desc = "The 10mm MarsTech sidearm \"Écureuil\" is a well known military grade pistol. \
It's mostly used by ranking members of NanoTrasen as a means of self defense. Uses 10mm rounds."
icon_state = "ecureuil"
item_state = "gun"
caliber = "10mm"
magazine_type = /obj/item/ammo_magazine/m10mm/pistol
allowed_magazines = list(/obj/item/ammo_magazine/m10mm/pistol)
projectile_type = /obj/item/projectile/bullet/pistol/medium
load_method = MAGAZINE
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
/obj/item/weapon/gun/projectile/ecureuil/update_icon()
if(ammo_magazine)
icon_state = "ecureuil"
else
icon_state = "ecureuil-e"
/obj/item/weapon/gun/projectile/ecureuil/tac
name = "\improper Tactical \"Écureuil\" 10mm pistol"
icon_state = "tac_ecureuil"
/obj/item/weapon/gun/projectile/ecureuil/tac/update_icon()
if(ammo_magazine)
icon_state = "tac_ecureuil"
else
icon_state = "tac_ecureuil-e"
/obj/item/weapon/gun/projectile/ecureuil/tac2
name = "\improper Tactical \"Écureuil\" 10mm pistol"
icon_state = "tac_ecureuil"
/obj/item/weapon/gun/projectile/ecureuil/tac2/update_icon()
if(ammo_magazine)
icon_state = "tac2_ecureuil"
else
icon_state = "tac2_ecureuil-e"
/*
* Lamia (Eris Port)
*/
/obj/item/weapon/gun/projectile/lamia
name = "\improper FS HG .44 \"Lamia\""
desc = "The FS HG .44 \"Lamia\" is the epitome of power in a handheld device. Uses .44 rounds."
icon_state = "lamia"
item_state = "revolver"
caliber = ".44"
magazine_type = /obj/item/ammo_magazine/m44/rubber
allowed_magazines = list(/obj/item/ammo_magazine/m44,/obj/item/ammo_magazine/m44/rubber)
load_method = MAGAZINE
auto_eject = 1
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4)
/obj/item/weapon/gun/projectile/lamia/update_icon()
cut_overlays()
if(!ammo_magazine)
return
var/ratio = ammo_magazine.stored_ammo.len * 100 / ammo_magazine.max_ammo
ratio = round(ratio, 33)
add_overlay("lamia_[ratio]")
@@ -1,77 +0,0 @@
/obj/item/weapon/gun/projectile/sec/flash
name = ".45 pistol"
/obj/item/weapon/gun/projectile/p92x/sec
magazine_type = /obj/item/ammo_magazine/m9mm/rubber
/obj/item/weapon/gun/projectile/p92x/large/preban
icon_state = "p92x-brown"
magazine_type = /obj/item/ammo_magazine/m9mm/large/preban // Spawns with big magazines that are legal.
/obj/item/weapon/gun/projectile/p92x/large/preban/hp
magazine_type = /obj/item/ammo_magazine/m9mm/large/preban/hp // Spawns with legal hollow-point mag
//////////////////// Eris Ported Guns ////////////////////
//HoS Gun
/obj/item/weapon/gun/projectile/lamia
name = "FS HG .44 \"Lamia\""
desc = "Uses .44 rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "Headdeagle"
item_state = "revolver"
caliber = ".44"
magazine_type = /obj/item/ammo_magazine/m44/rubber
allowed_magazines = list(/obj/item/ammo_magazine/m44,/obj/item/ammo_magazine/m44/rubber)
load_method = MAGAZINE
auto_eject = 1
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4)
/obj/item/weapon/gun/projectile/lamia/update_icon()
cut_overlays()
if(!ammo_magazine)
return
var/ratio = ammo_magazine.stored_ammo.len * 100 / ammo_magazine.max_ammo
ratio = round(ratio, 33)
add_overlay("deagle_[ratio]")
//Civilian gun
/obj/item/weapon/gun/projectile/giskard
name = "\improper \"Giskard\" holdout pistol"
desc = "The FS HG .380 \"Giskard\" can even fit into the pocket! Uses .380 rounds."
icon = 'icons/obj/gun_vr.dmi'
icon_override = 'icons/obj/gun_vr.dmi'
icon_state = "giskardcivil"
item_state = "giskardcivil"
caliber = ".380"
magazine_type = /obj/item/ammo_magazine/m380
allowed_magazines = list(/obj/item/ammo_magazine/m380)
load_method = MAGAZINE
w_class = ITEMSIZE_SMALL
fire_sound = 'sound/weapons/gunshot_pathetic.ogg'
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 3)
/obj/item/weapon/gun/projectile/giskard/update_icon()
..()
if(ammo_magazine && ammo_magazine.stored_ammo.len)
icon_state = "giskardcivil"
else
icon_state = "giskardcivil_empty"
//Not so civilian gun
/obj/item/weapon/gun/projectile/giskard/olivaw
name = "\improper \"Olivaw\" holdout burst-pistol"
desc = "The FS HG .380 \"Olivaw\" is a more advanced version of the \"Giskard\". This one seems to have a two-round burst-fire mode. Uses .380 rounds."
icon_state = "olivawcivil"
item_state = "olivawcivil"
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=1.2, move_delay=null, burst_accuracy=null, dispersion=null),
list(mode_name="2-round bursts", burst=2, fire_delay=0.2, move_delay=4, burst_accuracy=list(0,-15), dispersion=list(1.2, 1.8)),
)
/obj/item/weapon/gun/projectile/giskard/olivaw/update_icon()
..()
if(ammo_magazine && ammo_magazine.stored_ammo.len)
icon_state = "olivawcivil"
else
icon_state = "olivawcivil_empty"
@@ -52,7 +52,6 @@
damage = 30
armor_penetration = 10
/obj/item/projectile/beam/midlaser
damage = 40
armor_penetration = 10
+1
View File
@@ -10,6 +10,7 @@
limit_x = 3
limit_y = 3
preserve_map = 0
max_attempts = 1
wall_type = /turf/simulated/wall/titanium
floor_type = /turf/simulated/floor/reinforced
+201
View File
@@ -0,0 +1,201 @@
/obj/machinery/transhuman/autoresleever
name = "automatic resleever"
desc = "Uses advanced technology to detect when someone needs to be resleeved, and automatically prints and sleeves them into a new body. It even generates its own biomass!"
icon = 'icons/obj/machines/autoresleever.dmi'
icon_state = "autoresleever"
density = TRUE
anchored = TRUE
var/equip_body = FALSE //If true, this will spawn the person with equipment
var/default_job = USELESS_JOB //The job that will be assigned if equip_body is true and the ghost doesn't have a job
var/ghost_spawns = FALSE //If true, allows ghosts who haven't been spawned yet to spawn
var/vore_respawn = 15 MINUTES //The time to wait if you died from vore
var/respawn = 30 MINUTES //The time to wait if you didn't die from vore
var/spawn_slots = -1 //How many people can be spawned from this? If -1 it's unlimited
var/spawntype //The kind of mob that will be spawned, if set.
/obj/machinery/transhuman/autoresleever/update_icon()
. = ..()
if(stat)
icon_state = "autoresleever-o"
else
icon_state = "autoresleever"
/obj/machinery/transhuman/autoresleever/power_change()
. = ..()
update_icon()
/obj/machinery/transhuman/autoresleever/attack_ghost(mob/observer/dead/user as mob)
update_icon()
if(spawn_slots == 0)
to_chat(user, "<span class='warning'>There are no more respawn slots.</span>")
return
if(user.mind)
if(user.mind.vore_death)
if(vore_respawn <= world.time - user.timeofdeath)
autoresleeve(user)
else
to_chat(user, "<span class='warning'>You must wait [((vore_respawn - (world.time - user.timeofdeath)) * 0.1) / 60] minutes to use \the [src].</span>")
return
else if(respawn <= world.time - user.timeofdeath)
autoresleeve(user)
else
to_chat(user, "<span class='warning'>You must wait [((respawn - (world.time - user.timeofdeath)) * 0.1) /60] minutes to use \the [src].</span>")
return
else if(spawntype)
if(tgui_alert(user, "This [src] spawns something special, would you like to play as it?", "Creachur", list("No","Yes")) == "Yes")
autoresleeve(user)
else if(ghost_spawns)
if(tgui_alert(user, "Would you like to be spawned here as your presently loaded character?", "Spawn here", list("No","Yes")) == "Yes")
autoresleeve(user)
else
to_chat(user, "<span class='warning'>You need to have been spawned in order to respawn here.</span>")
/obj/machinery/transhuman/autoresleever/attackby(var/mob/user) //Let's not let people mess with this.
update_icon()
if(istype(user,/mob/observer/dead))
attack_ghost(user)
else
return
/obj/machinery/transhuman/autoresleever/proc/autoresleeve(var/mob/observer/dead/ghost)
if(stat)
to_chat(ghost, "<span class='warning'>This machine is not functioning...</span>")
return
if(!istype(ghost,/mob/observer/dead))
return
if(ghost.mind && ghost.mind.current && ghost.mind.current.stat != DEAD)
if(istype(ghost.mind.current.loc, /obj/item/device/mmi))
if(tgui_alert(ghost, "Your brain is still alive, using the auto-resleever will delete that brain. Are you sure?", "Delete Brain", list("No","Yes")) != "Yes")
return
if(istype(ghost.mind.current.loc, /obj/item/device/mmi))
qdel(ghost.mind.current.loc)
else
to_chat(ghost, "<span class='warning'>Your body is still alive, you cannot be resleeved.</span>")
return
var/client/ghost_client = ghost.client
//Name matching is ugly but mind doesn't persist to look at.
var/charjob
var/datum/data/record/record_found
record_found = find_general_record("name",ghost_client.prefs.real_name)
//Found their record, they were spawned previously
if(record_found)
charjob = record_found.fields["real_rank"]
else if(equip_body || ghost_spawns)
charjob = default_job
else
to_chat(ghost, "<span class='warning'>It appears as though your loaded character has not been spawned this round, or has quit the round. If you died as a different character, please load them, and try again.</span>")
return
//For logging later
var/player_key = ghost_client.key
var/picked_ckey = ghost_client.ckey
var/picked_slot = ghost_client.prefs.default_slot
var/spawnloc = get_turf(src)
//Did we actually get a loc to spawn them?
if(!spawnloc)
to_chat(ghost, "<span class='warning'>Could not find a valid location to spawn your character.</span>")
return
if(spawntype)
var/spawnthing = new spawntype(spawnloc)
if(isliving(spawnthing))
var/mob/living/L = spawnthing
L.key = player_key
L.ckey = picked_ckey
log_admin("[L.ckey]'s has been spawned as [L] via \the [src].")
message_admins("[L.ckey]'s has been spawned as [L] via \the [src].")
else
to_chat(ghost, "<span class='warning'>You can't play as a [spawnthing]...</span>")
return
if(spawn_slots == -1)
return
else if(spawn_slots == 0)
return
else
spawn_slots --
return
if(tgui_alert(ghost, "Would you like to be resleeved?", "Resleeve", list("No","Yes")) == "No")
return
var/mob/living/carbon/human/new_character
new_character = new(spawnloc)
//We were able to spawn them, right?
if(!new_character)
to_chat(ghost, "Something went wrong and spawning failed.")
return
//Write the appearance and whatnot out to the character
ghost_client.prefs.copy_to(new_character)
if(new_character.dna)
new_character.dna.ResetUIFrom(new_character)
new_character.sync_organ_dna()
new_character.key = player_key
//Were they any particular special role? If so, copy.
if(new_character.mind)
new_character.mind.loaded_from_ckey = picked_ckey
new_character.mind.loaded_from_slot = picked_slot
var/datum/antagonist/antag_data = get_antag_data(new_character.mind.special_role)
if(antag_data)
antag_data.add_antagonist(new_character.mind)
antag_data.place_mob(new_character)
for(var/lang in ghost_client.prefs.alternate_languages)
var/datum/language/chosen_language = GLOB.all_languages[lang]
if(chosen_language)
if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs)))
new_character.add_language(lang)
//If desired, apply equipment.
if(equip_body)
if(charjob)
job_master.EquipRank(new_character, charjob, 1)
new_character.mind.assigned_role = charjob
new_character.mind.role_alt_title = job_master.GetPlayerAltTitle(new_character, charjob)
//A redraw for good measure
new_character.regenerate_icons()
new_character.update_transform()
log_admin("[new_character.ckey]'s character [new_character.real_name] has been auto-resleeved.")
message_admins("[new_character.ckey]'s character [new_character.real_name] has been auto-resleeved.")
var/obj/item/weapon/implant/backup/imp = new(src)
if(imp.handle_implant(new_character,new_character.zone_sel.selecting))
imp.post_implant(new_character)
var/datum/transcore_db/db = SStranscore.db_by_mind_name(new_character.mind.name)
if(db)
var/datum/transhuman/mind_record/record = db.backed_up[new_character.mind.name]
if((world.time - record.last_notification) < 30 MINUTES)
global_announcer.autosay("[new_character.name] has been resleeved by the automatic resleeving system.", "TransCore Oversight", new_character.isSynthetic() ? "Science" : "Medical")
spawn(0) //Wait a second for nif to do its thing if there is one
if(record.nif_path)
var/obj/item/device/nif/nif
if(new_character.nif)
nif = new_character.nif
else
nif = new record.nif_path(new_character,null,record.nif_savedata)
spawn(0) //Wait another second in case we just gave them a new nif
if(nif) //Now restore the software
for(var/path in record.nif_software)
new path(nif)
nif.durability = record.nif_durability
if(spawn_slots == -1)
return
else if(spawn_slots == 0)
return
else
spawn_slots --
return
+4 -2
View File
@@ -366,9 +366,11 @@
H.held_mob.muffled = FALSE
H.held_mob.forced_psay = FALSE
if(isliving(M))
var/mob/living/slip = M
slip.slip_protect = world.time + 25 // This is to prevent slipping back into your pred if they stand on soap or something.
//Place them into our drop_location
M.forceMove(drop_location())
items_preserved -= M
//Special treatment for absorbed prey
@@ -774,7 +776,7 @@
/////////////////////////////////////////////////////////////////////////
/obj/belly/proc/handle_absorb_langs()
owner.absorb_langs()
////////////////////////////////////////////////////////////////////////
+9 -3
View File
@@ -504,9 +504,15 @@
to_chat(user, "<span class='notice'>They aren't able to be devoured.</span>")
log_and_message_admins("[key_name_admin(src)] attempted to devour [key_name_admin(prey)] against their prefs ([prey ? ADMIN_JMP(prey) : "null"])")
return FALSE
// Slipnoms from chompstation downstream, credit to cadyn for the original PR.
// Prepare messages
if(user == pred) //Feeding someone to yourself
if(prey.is_slipping)
attempt_msg = "<span class='warning'>It seems like [prey] is about to slide into [pred]'s [lowertext(belly.name)]!</span>"
success_msg = "<span class='warning'>[prey] suddenly slides into [pred]'s [lowertext(belly.name)]!</span>"
else if(pred.is_slipping)
attempt_msg = "<span class='warning'>It seems like [prey] is gonna end up inside [pred]'s [lowertext(belly.name)] as [pred] comes sliding over!</span>"
success_msg = "<span class='warning'>[prey] suddenly slips inside of [pred]'s [lowertext(belly.name)] as [pred] slides into them!</span>"
else if(user == pred) //Feeding someone to yourself
attempt_msg = "<span class='warning'>[pred] is attempting to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!</span>"
success_msg = "<span class='warning'>[pred] manages to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!</span>"
else //Feeding someone to another person
@@ -566,7 +572,7 @@
var/air_type = /datum/gas_mixture/belly_air
if(istype(lifeform)) // If this doesn't succeed, then 'lifeform' is actually a bag or capture crystal with someone inside
air_type = lifeform.get_perfect_belly_air_type() // Without any overrides/changes, its gonna be /datum/gas_mixture/belly_air
var/air = new air_type(1000)
return air
+60
View File
@@ -0,0 +1,60 @@
// Slipnoms from chompstation downstream, credit to cadyn for the original PR.
/mob/living
var/is_slipping = FALSE
var/slip_vore_in_progress = FALSE
var/slip_protect = 1
/mob/living/proc/can_slip_vore(var/mob/living/target)
if(!target.is_slipping) //Obviously they have to be slipping to get slip vored
return FALSE
if(world.time <= target.slip_protect)
return FALSE
if(!(src.can_be_drop_pred && target.devourable && target.can_be_drop_prey)) //Make sure both of their prefs align with what we're gonna do.
return FALSE
if(!is_vore_predator(src)) //Check their bellies and stuff
return FALSE
if(!src.vore_selected) //Gotta have one selected as well.
return FALSE
return TRUE
/mob/living/proc/can_be_slip_vored_by(var/mob/living/target)
if(!target.is_slipping) //Obviously they have to be slipping to get slip vored
return FALSE
if(world.time <= target.slip_protect)
return FALSE
if(!(target.can_be_drop_pred && src.devourable && src.can_be_drop_prey)) //Make sure both of their prefs align with what we're gonna do.
return FALSE
if(!is_vore_predator(target)) //Check their bellies and stuff
return FALSE
if(!target.vore_selected) //Gotta have one selected as well.
return FALSE
return TRUE
/mob/living/Crossed(var/atom/movable/AM)
..()
var/mob/living/target = AM
if(istype(target) && !target.incorporeal_move && !src.incorporeal_move) //The slip vore begins
if(can_slip_vore(target) && !src.slip_vore_in_progress && !target.slip_vore_in_progress) //If we can vore them go for it
perform_the_nom(src,target,src,src.vore_selected,1)
target.slip_vore_in_progress = FALSE
target.is_slipping = FALSE
return
else if(can_be_slip_vored_by(target) && !src.slip_vore_in_progress && !target.slip_vore_in_progress) //Otherwise, if they can vore us, make it happen.
perform_the_nom(target,src,target,target.vore_selected,1)
slip_vore_in_progress = FALSE
is_slipping = FALSE
return
/mob/living/carbon/slip(var/slipped_on,stun_duration=8)
. = ..()
if(.)
is_slipping = TRUE
return .
/mob/living/update_canmove()
. = ..()
if(is_slipping && !lying)
is_slipping = FALSE
return .
+1
View File
@@ -981,6 +981,7 @@
return FALSE
var/new_new_damage = CLAMP(new_damage, 0, 12)
host.vore_selected.digest_oxy = new_new_damage
. = TRUE
if("b_emoteactive")
host.vore_selected.emote_active = !host.vore_selected.emote_active
. = TRUE
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

+17 -14
View File
@@ -2075,6 +2075,10 @@
/obj/machinery/computer/transhuman/resleeving{
dir = 8
},
/obj/item/device/radio/intercom{
dir = 4;
pixel_x = 24
},
/turf/simulated/floor/tiled/eris/white/bluecorner,
/area/stellardelight/deck1/resleeving)
"ew" = (
@@ -6726,7 +6730,7 @@
dir = 5
},
/obj/machinery/button/remote/airlock{
desc = "A remote control switch for the medbay foyer.";
desc = "A remote control switch for the cleaning room exit.";
dir = 4;
id = "resleeveexit";
name = "Door Control";
@@ -7381,6 +7385,14 @@
/obj/effect/floor_decal/steeldecal/steel_decals4{
dir = 1
},
/obj/machinery/button/remote/airlock{
desc = "A remote control switch for the cleaning room.";
dir = 4;
id = "resleeveclean";
name = "Door Control";
pixel_x = -27;
pixel_y = -27
},
/turf/simulated/floor/tiled/eris/white/bluecorner,
/area/stellardelight/deck1/resleeving)
"pC" = (
@@ -7970,7 +7982,7 @@
/turf/simulated/floor/carpet,
/area/chapel/main)
"qR" = (
/obj/structure/table/glass,
/obj/machinery/transhuman/autoresleever,
/turf/simulated/floor/tiled/dark,
/area/stellardelight/deck1/resleeving)
"qS" = (
@@ -16013,16 +16025,6 @@
/obj/effect/floor_decal/milspec/color/black,
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"Ij" = (
/obj/structure/bed/chair{
dir = 1
},
/obj/item/device/radio/intercom{
dir = 8;
pixel_x = -24
},
/turf/simulated/floor/tiled/eris/white/bluecorner,
/area/stellardelight/deck1/resleeving)
"Ik" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -20510,8 +20512,9 @@
/obj/machinery/door/airlock/angled_bay/standard/color{
dir = 8;
door_color = "#ffffff";
id_tag = "resleeveclean";
name = "Cleaning Room";
req_access = null;
req_access = list(5);
stripe_color = "#5a96bb"
},
/turf/simulated/floor/tiled/steel_ridged,
@@ -33859,7 +33862,7 @@ dH
oW
vb
pA
Ij
hv
CG
ZB
hg
+287 -91
View File
@@ -2264,6 +2264,11 @@
/obj/effect/floor_decal/steeldecal/steel_decals4{
dir = 5
},
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
"adS" = (
@@ -2288,6 +2293,11 @@
name = "Mental Health";
req_one_access = list()
},
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
"adV" = (
@@ -2358,6 +2368,11 @@
pixel_x = -26;
pixel_y = -26
},
/obj/structure/cable/green{
d1 = 2;
d2 = 4;
icon_state = "2-4"
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
"adY" = (
@@ -2379,6 +2394,11 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
"adZ" = (
@@ -2552,11 +2572,11 @@
/turf/simulated/floor/carpet/blue,
/area/tether/surfacebase/medical/mentalhealth)
"aem" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 10
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 4
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
@@ -2824,6 +2844,13 @@
/obj/effect/floor_decal/corner/paleblue/bordercorner2{
dir = 5
},
/obj/structure/disposalpipe/trunk{
dir = 4
},
/obj/machinery/disposal/wall{
dir = 8;
name = "auto-resleeving equipment deposit"
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
"aeE" = (
@@ -3295,6 +3322,17 @@
/obj/effect/floor_decal/steeldecal/steel_decals4{
dir = 4
},
/obj/structure/cable/green{
d1 = 1;
d2 = 4;
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 6
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
"afp" = (
@@ -3345,6 +3383,17 @@
/obj/effect/floor_decal/corner/paleblue/bordercorner2{
dir = 4
},
/obj/structure/cable/green{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
"aft" = (
@@ -3381,6 +3430,7 @@
dir = 4;
pixel_x = 24
},
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"afz" = (
@@ -8206,12 +8256,6 @@
dir = 4
},
/obj/random/junk,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 5
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"anG" = (
@@ -11278,11 +11322,13 @@
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
/obj/structure/disposalpipe/segment{
dir = 8;
icon_state = "pipe-c"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 5
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"asU" = (
@@ -13876,6 +13922,11 @@
/obj/machinery/door/firedoor/glass/hidden/steel{
dir = 1
},
/obj/structure/cable/green{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
"awZ" = (
@@ -15870,12 +15921,12 @@
d2 = 8;
icon_state = "2-8"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 10
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
},
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 4
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"azU" = (
@@ -30423,13 +30474,19 @@
/turf/simulated/floor/tiled,
/area/hallway/lower/first_west)
"bbI" = (
/obj/item/weapon/tool/wrench{
desc = "The lower jaw seems to keep jiggling...";
name = "loose wrench";
toolspeed = 3
/obj/machinery/vending/loadout/uniform,
/obj/machinery/light{
dir = 8
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
/obj/effect/floor_decal/borderfloorwhite{
dir = 9
},
/obj/effect/floor_decal/corner/paleblue/border{
dir = 9
},
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"bbJ" = (
/obj/structure/cable/green,
/obj/structure/cable/green{
@@ -30470,9 +30527,15 @@
/turf/simulated/floor,
/area/maintenance/substation/SurfMedsubstation)
"bbM" = (
/obj/random/cigarettes,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
/obj/machinery/transhuman/autoresleever,
/obj/effect/floor_decal/borderfloorwhite{
dir = 1
},
/obj/effect/floor_decal/corner/paleblue/border{
dir = 1
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"bbN" = (
/obj/structure/cable/green{
d1 = 4;
@@ -30628,9 +30691,18 @@
/turf/simulated/floor,
/area/maintenance/substation/SurfMedsubstation)
"bbZ" = (
/obj/random/junk,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
/obj/structure/disposalpipe/trunk{
dir = 2
},
/obj/structure/disposaloutlet,
/obj/effect/floor_decal/borderfloorwhite{
dir = 1
},
/obj/effect/floor_decal/corner/paleblue/border{
dir = 1
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"bca" = (
/obj/effect/floor_decal/borderfloor,
/obj/effect/floor_decal/corner/brown/border,
@@ -31706,12 +31778,6 @@
},
/turf/simulated/floor/plating,
/area/maintenance/lower/trash_pit)
"bTE" = (
/obj/structure/railing{
dir = 1
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"bWg" = (
/obj/machinery/vending/loadout/costume{
dir = 4
@@ -31803,12 +31869,11 @@
/turf/simulated/floor/tiled/monotile,
/area/crew_quarters/locker/laundry_arrival)
"cqg" = (
/obj/structure/railing{
dir = 1
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
/turf/simulated/wall,
/area/tether/surfacebase/medical/autoresleeving)
"cqZ" = (
/obj/effect/floor_decal/borderfloor{
dir = 8
@@ -32326,6 +32391,10 @@
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"dUK" = (
/obj/structure/disposalpipe/segment,
/turf/simulated/wall,
/area/tether/surfacebase/medical/autoresleeving)
"dYd" = (
/obj/machinery/firealarm{
layer = 3.3;
@@ -32773,10 +32842,24 @@
/turf/simulated/floor/plating,
/area/tether/surfacebase/funny/clownoffice)
"fKm" = (
/obj/random/junk,
/obj/random/maintenance/cargo,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
/obj/machinery/firealarm{
dir = 8;
pixel_x = -24
},
/obj/effect/floor_decal/borderfloorwhite{
dir = 8
},
/obj/effect/floor_decal/corner/paleblue/border{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"fLB" = (
/obj/effect/floor_decal/steeldecal/steel_decals6{
dir = 5
@@ -33806,13 +33889,23 @@
/turf/simulated/floor/tiled,
/area/rnd/hallway)
"idk" = (
/obj/item/weapon/tool/wirecutters{
desc = "It gets jammed a lot.";
name = "janky wirecutters";
toolspeed = 2
/obj/effect/floor_decal/borderfloorwhite{
dir = 6
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
/obj/effect/floor_decal/corner/paleblue/border{
dir = 6
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
},
/obj/machinery/alarm{
alarm_id = "pen_nine";
breach_detection = 0;
dir = 1;
pixel_y = -22
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"iee" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -33895,6 +33988,25 @@
/obj/item/device/radio/beacon,
/turf/simulated/floor/tiled,
/area/tether/surfacebase/surface_one_hall)
"itj" = (
/obj/structure/cable/green{
d2 = 8;
icon_state = "0-8"
},
/obj/machinery/power/apc{
dir = 4;
name = "east bump";
nightshift_setting = 2;
pixel_x = 24
},
/obj/effect/floor_decal/borderfloorwhite{
dir = 6
},
/obj/effect/floor_decal/corner/paleblue/border{
dir = 6
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"iue" = (
/turf/simulated/floor/looking_glass{
dir = 1
@@ -34049,9 +34161,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 5
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"jhN" = (
@@ -34822,9 +34931,13 @@
/turf/simulated/floor/tiled,
/area/crew_quarters/visitor_laundry)
"lbd" = (
/obj/random/maintenance/cargo,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
/obj/effect/floor_decal/borderfloorwhite/corner,
/obj/effect/floor_decal/corner/paleblue/bordercorner,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 8
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"lbu" = (
/obj/effect/floor_decal/borderfloorwhite,
/obj/effect/floor_decal/corner/paleblue/border,
@@ -35003,6 +35116,25 @@
/obj/machinery/holoposter,
/turf/simulated/wall,
/area/hallway/lower/first_west)
"lBv" = (
/obj/machinery/door/airlock/maintenance/medical{
id_tag = "autor";
name = "Auto-Resleeving";
req_access = list(5)
},
/obj/structure/cable/green{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"lBO" = (
/obj/structure/cable{
d1 = 1;
@@ -35148,9 +35280,32 @@
/turf/simulated/floor/tiled,
/area/tether/surfacebase/surface_one_hall)
"lPQ" = (
/obj/item/stack/cable_coil/random_belt,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
/obj/machinery/button/remote/airlock{
desc = "A remote control door switch.";
id = "autor";
name = "Exit Button";
pixel_x = -26;
pixel_y = -26
},
/obj/structure/cable/green{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/obj/effect/floor_decal/borderfloorwhite{
dir = 10
},
/obj/effect/floor_decal/corner/paleblue/border{
dir = 10
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 9
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"lQu" = (
/obj/item/weapon/reagent_containers/glass/bucket,
/obj/structure/table/steel,
@@ -35873,6 +36028,14 @@
/obj/effect/floor_decal/industrial/warning,
/turf/simulated/floor/tiled/dark,
/area/tether/surfacebase/security/weaponsrange)
"nzU" = (
/obj/machinery/door/airlock/medical{
id_tag = null;
name = "Auto Resleeving";
req_access = list(5)
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"nAK" = (
/turf/simulated/wall/r_wall,
/area/maintenance/engineering/atmos/airlock/gas)
@@ -36375,9 +36538,22 @@
/turf/simulated/floor/carpet/gaycarpet,
/area/tether/surfacebase/funny/clownoffice)
"oPH" = (
/obj/random/pizzabox,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
/obj/machinery/light{
dir = 4
},
/obj/item/device/radio/intercom{
dir = 1;
pixel_y = 24
},
/obj/effect/floor_decal/borderfloorwhite{
dir = 5
},
/obj/effect/floor_decal/corner/paleblue/border{
dir = 5
},
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"oQm" = (
/obj/effect/floor_decal/borderfloor/corner,
/obj/structure/cable{
@@ -36818,6 +36994,15 @@
"qwV" = (
/turf/simulated/wall,
/area/tether/surfacebase/security/brig)
"qBa" = (
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"qBb" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 1
@@ -37024,12 +37209,12 @@
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"qVi" = (
/obj/structure/railing{
dir = 1
/obj/structure/disposalpipe/segment{
dir = 8;
icon_state = "pipe-c"
},
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
/turf/simulated/wall,
/area/tether/surfacebase/medical/autoresleeving)
"qWk" = (
/obj/machinery/light,
/obj/structure/disposalpipe/segment{
@@ -37649,6 +37834,10 @@
},
/turf/simulated/floor/tiled,
/area/engineering/atmos)
"sOx" = (
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"sQc" = (
/obj/structure/sign/securearea{
desc = "A warning sign which reads 'HIGH VOLTAGE'";
@@ -38176,10 +38365,17 @@
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/xenoflora)
"utQ" = (
/obj/fiftyspawner/steel,
/obj/random/junk,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
/obj/structure/disposalpipe/segment,
/obj/effect/floor_decal/borderfloorwhite,
/obj/effect/floor_decal/corner/paleblue/border,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 8
},
/obj/machinery/shower{
dir = 1
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/autoresleeving)
"uuu" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -38318,6 +38514,9 @@
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
"uIU" = (
/turf/simulated/wall,
/area/tether/surfacebase/medical/autoresleeving)
"uKS" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -38465,11 +38664,8 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
dir = 5
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
@@ -53037,11 +53233,11 @@ aan
atP
awE
aeU
aeU
aeU
aeU
aef
aef
uIU
uIU
uIU
lBv
cqg
afE
aef
aef
@@ -53179,11 +53375,11 @@ aan
uHS
awC
aeU
aeU
uIU
bbI
fKm
lPQ
bTE
cqg
akA
aAG
tdg
@@ -53321,10 +53517,10 @@ afb
atO
awC
aeU
aeU
uIU
bbM
lbd
aAI
itj
cqg
jcT
ksK
@@ -53463,10 +53659,10 @@ afb
atO
awp
axO
aeU
uIU
bbZ
utQ
lbd
dUK
qVi
anF
ksK
@@ -53605,11 +53801,11 @@ afb
atO
awG
aed
aeU
uIU
oPH
idk
bbZ
bTE
uIU
sOx
vuO
ksK
tdg
@@ -53747,12 +53943,12 @@ afb
atO
awz
aeU
aeU
uIU
uIU
nzU
uIU
axP
axP
axP
axP
vuO
qBa
ksK
oKn
oKn
+3 -1
View File
@@ -39409,7 +39409,9 @@
alarms_hidden = 1;
dir = 1;
name = "north bump";
pixel_y = 28
pixel_y = 28;
req_access = null;
req_one_access = list(11,67)
},
/obj/structure/cable/green{
icon_state = "0-4"
+2
View File
@@ -440,6 +440,8 @@
name = "\improper Medical Central Hall"
/area/tether/surfacebase/medical/lowerhall
name = "\improper Medical Lower Hall"
/area/tether/surfacebase/medical/autoresleeving
name = "\improper Medical Auto Resleeving"
//North SurfMed3-2 Stairwell
/area/tether/surfacebase/medical/uppernorthstairwell
name = "\improper Medical Stairwell"
+4 -3
View File
@@ -1692,6 +1692,7 @@
#include "code\modules\admin\admin_tools.dm"
#include "code\modules\admin\admin_verb_lists_vr.dm"
#include "code\modules\admin\admin_verbs.dm"
#include "code\modules\admin\admin_verbs_vr.dm"
#include "code\modules\admin\admin_vr.dm"
#include "code\modules\admin\banjob.dm"
#include "code\modules\admin\ckey_vr.dm"
@@ -3619,7 +3620,6 @@
#include "code\modules\projectiles\guns\energy\netgun_vr.dm"
#include "code\modules\projectiles\guns\energy\netgun_yw.dm"
#include "code\modules\projectiles\guns\energy\nuclear.dm"
#include "code\modules\projectiles\guns\energy\nuclear_vr.dm"
#include "code\modules\projectiles\guns\energy\nuclear_yw.dm"
#include "code\modules\projectiles\guns\energy\particle.dm"
#include "code\modules\projectiles\guns\energy\phase.dm"
@@ -3662,7 +3662,6 @@
#include "code\modules\projectiles\guns\projectile\dartgun_vr.dm"
#include "code\modules\projectiles\guns\projectile\leveraction.dm"
#include "code\modules\projectiles\guns\projectile\pistol.dm"
#include "code\modules\projectiles\guns\projectile\pistol_vr.dm"
#include "code\modules\projectiles\guns\projectile\pistol_yw.dm"
#include "code\modules\projectiles\guns\projectile\revolver.dm"
#include "code\modules\projectiles\guns\projectile\revolver_vr.dm"
@@ -3836,6 +3835,7 @@
#include "code\modules\research\designs\circuits\circuits_vr.dm"
#include "code\modules\research\designs\circuits\circuits_yw.dm"
#include "code\modules\research\designs\circuits\disks.dm"
#include "code\modules\resleeving\autoresleever.dm"
#include "code\modules\resleeving\circuitboards.dm"
#include "code\modules\resleeving\computers.dm"
#include "code\modules\resleeving\designer.dm"
@@ -4076,6 +4076,7 @@
#include "code\modules\vore\eating\living_vr.dm"
#include "code\modules\vore\eating\silicon_vr.dm"
#include "code\modules\vore\eating\simple_animal_vr.dm"
#include "code\modules\vore\eating\slipvore_vr.dm"
#include "code\modules\vore\eating\transforming_vr.dm"
#include "code\modules\vore\eating\vore_vr.dm"
#include "code\modules\vore\eating\vorehooks_vr.dm"
@@ -4252,4 +4253,4 @@
#include "maps\yw\structures\closets\research.dm"
#include "maps\yw\structures\closets\security.dm"
#include "maps\~map_system\maps.dm"
// END_INCLUDE
// END_INCLUDE