mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-10 22:55:22 +01:00
Merge remote-tracking branch 'refs/remotes/origin/master' into oties-and-wild-removed
This commit is contained in:
@@ -31,9 +31,100 @@
|
||||
/obj/item/clothing/accessory/collar/shock
|
||||
name = "Shock collar"
|
||||
desc = "A collar used to ease hungry predators."
|
||||
icon_state = "collar_shk"
|
||||
icon_state = "collar_shk0"
|
||||
item_state = "collar_shk_overlay"
|
||||
overlay_state = "collar_shk_overlay"
|
||||
// How about some copypasta?
|
||||
var/on = 0 // 0 for off, 1 for on, starts off to encourage people to set non-default frequencies and codes.
|
||||
var/frequency = 1449
|
||||
var/code = 2
|
||||
var/datum/radio_frequency/radio_connection
|
||||
var/list/datum/radio_frequency/secure_radio_connections = new
|
||||
proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
|
||||
|
||||
/obj/item/clothing/accessory/collar/shock/New()
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) // Makes it so you don't need to change the frequency off of default for it to work.
|
||||
|
||||
/obj/item/clothing/accessory/collar/shock/Topic(href, href_list)
|
||||
if(usr.stat || usr.restrained())
|
||||
return
|
||||
if(((istype(usr, /mob/living/carbon/human) && ((!( ticker ) || (ticker && ticker.mode != "monkey")) && usr.contents.Find(src))) || (usr.contents.Find(master) || (in_range(src, usr) && istype(loc, /turf)))))
|
||||
usr.set_machine(src)
|
||||
if(href_list["freq"])
|
||||
var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"]))
|
||||
set_frequency(new_frequency)
|
||||
else
|
||||
if(href_list["code"])
|
||||
code += text2num(href_list["code"])
|
||||
code = round(code)
|
||||
code = min(100, code)
|
||||
code = max(1, code)
|
||||
else
|
||||
if(href_list["power"])
|
||||
on = !( on )
|
||||
icon_state = "collar_shk[on]" // And apparently this works, too?!
|
||||
if(!( master ))
|
||||
if(istype(loc, /mob))
|
||||
attack_self(loc)
|
||||
else
|
||||
for(var/mob/M in viewers(1, src))
|
||||
if(M.client)
|
||||
attack_self(M)
|
||||
else
|
||||
if(istype(master.loc, /mob))
|
||||
attack_self(master.loc)
|
||||
else
|
||||
for(var/mob/M in viewers(1, master))
|
||||
if(M.client)
|
||||
attack_self(M)
|
||||
else
|
||||
usr << browse(null, "window=radio")
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/clothing/accessory/collar/shock/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption != code)
|
||||
return
|
||||
|
||||
if(on)
|
||||
var/mob/M = null
|
||||
if(ismob(loc))
|
||||
M = loc
|
||||
if(ismob(loc.loc))
|
||||
M = loc.loc // This is about as terse as I can make my solution to the whole 'collar won't work when attached as accessory' thing.
|
||||
M << "<span class='danger'>You feel a sharp shock!</span>"
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, M)
|
||||
s.start()
|
||||
M.Weaken(10)
|
||||
return
|
||||
|
||||
/obj/item/clothing/accessory/collar/shock/attack_self(mob/user as mob, flag1)
|
||||
if(!istype(user, /mob/living/carbon/human))
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = {"<TT>
|
||||
<A href='?src=\ref[src];power=1'>Turn [on ? "Off" : "On"]</A><BR>
|
||||
<B>Frequency/Code</B> for collar:<BR>
|
||||
Frequency:
|
||||
<A href='byond://?src=\ref[src];freq=-10'>-</A>
|
||||
<A href='byond://?src=\ref[src];freq=-2'>-</A> [format_frequency(frequency)]
|
||||
<A href='byond://?src=\ref[src];freq=2'>+</A>
|
||||
<A href='byond://?src=\ref[src];freq=10'>+</A><BR>
|
||||
|
||||
Code:
|
||||
<A href='byond://?src=\ref[src];code=-5'>-</A>
|
||||
<A href='byond://?src=\ref[src];code=-1'>-</A> [code]
|
||||
<A href='byond://?src=\ref[src];code=1'>+</A>
|
||||
<A href='byond://?src=\ref[src];code=5'>+</A><BR>
|
||||
</TT>"}
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
return
|
||||
|
||||
|
||||
/obj/item/clothing/accessory/collar/spike
|
||||
name = "Spiked collar"
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
/mob/living/death()
|
||||
clear_fullscreens()
|
||||
//VOREStation Edit - Mob spawner stuff
|
||||
if(source_spawner)
|
||||
source_spawner.get_death_report(src)
|
||||
source_spawner = null
|
||||
//VOREStation Edit End
|
||||
. = ..()
|
||||
@@ -1,2 +1,3 @@
|
||||
/mob/living
|
||||
var/ooc_notes = null
|
||||
var/ooc_notes = null
|
||||
var/obj/structure/mob_spawner/source_spawner = null
|
||||
@@ -15,6 +15,7 @@
|
||||
var/list/injection_chems = list("dexalin", "bicaridine", "kelotane","anti_toxin", "alkysine", "imidazoline", "spaceacillin", "paracetamol") //The borg is able to heal every damage type. As a nerf, they use 750 charge per injection.
|
||||
var/eject_port = "ingestion"
|
||||
var/list/items_preserved = list()
|
||||
var/UI_open = 0
|
||||
|
||||
/obj/item/device/dogborg/sleeper/New()
|
||||
..()
|
||||
@@ -50,6 +51,8 @@
|
||||
user.visible_message("<span class='warning'>[hound.name]'s medical pod lights up as [target.name] slips inside into their [src.name].</span>", "<span class='notice'>Your medical pod lights up as [target] slips into your [src]. Life support functions engaged.</span>")
|
||||
message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[hound.x];Y=[hound.y];Z=[hound.z]'>JMP</a>" : "null"])")
|
||||
playsound(hound, 'sound/vore/gulp.ogg', 100, 1) //POLARISTODO
|
||||
if(UI_open == 1)
|
||||
sleeperUI(usr)
|
||||
|
||||
/obj/item/device/dogborg/sleeper/proc/go_out(var/target)
|
||||
hound = src.loc
|
||||
@@ -88,6 +91,7 @@
|
||||
if(..())
|
||||
return
|
||||
sleeperUI(user)
|
||||
UI_open = 1
|
||||
|
||||
/obj/item/device/dogborg/sleeper/proc/sleeperUI(mob/user)
|
||||
var/dat
|
||||
@@ -174,9 +178,11 @@
|
||||
dat += "</div>"
|
||||
|
||||
var/datum/browser/popup = new(user, "sleeper", "Sleeper Console", 520, 540) //Set up the popup browser window
|
||||
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
|
||||
//popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) //I have no idea what this is, but it feels irrelevant and causes runtimes idk.
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
onclose(user, "sleeper")
|
||||
UI_open = 0
|
||||
return
|
||||
|
||||
/obj/item/device/dogborg/sleeper/Topic(href, href_list)
|
||||
@@ -292,6 +298,8 @@
|
||||
patient_laststat = null
|
||||
patient = null
|
||||
hound.updateicon()
|
||||
if(UI_open == 1)
|
||||
sleeperUI(usr)
|
||||
return
|
||||
|
||||
//Gurgleborg process
|
||||
@@ -390,6 +398,8 @@
|
||||
T.drop_from_inventory(I, src)
|
||||
qdel(T)
|
||||
src.update_patient()
|
||||
if(UI_open == 1)
|
||||
sleeperUI(hound)
|
||||
|
||||
//Handle the target being anything but a /mob/living/carbon/human
|
||||
else
|
||||
@@ -438,6 +448,9 @@
|
||||
contents -= T
|
||||
qdel(T)
|
||||
src.update_patient()
|
||||
if(UI_open == 1)
|
||||
sleeperUI(hound)
|
||||
|
||||
return
|
||||
|
||||
/obj/item/device/dogborg/sleeper/process()
|
||||
@@ -514,6 +527,8 @@
|
||||
if(length(contents) > 11) //grow that tum after a certain junk amount
|
||||
hound.sleeper_r = 1
|
||||
hound.updateicon()
|
||||
if(UI_open == 1)
|
||||
sleeperUI(usr)
|
||||
return
|
||||
|
||||
if(istype(target, /mob/living/simple_animal/mouse)) //Edible mice, dead or alive whatever. Mostly for carcass picking you cruel bastard :v
|
||||
@@ -527,6 +542,8 @@
|
||||
if(length(contents) > 11) //grow that tum after a certain junk amount
|
||||
hound.sleeper_r = 1
|
||||
hound.updateicon()
|
||||
if(UI_open == 1)
|
||||
sleeperUI(usr)
|
||||
return
|
||||
|
||||
else if(ishuman(target))
|
||||
@@ -547,6 +564,8 @@
|
||||
playsound(hound, 'sound/vore/gulp.ogg', 80, 1)
|
||||
hound.sleeper_r = 1
|
||||
hound.updateicon()
|
||||
if(UI_open == 1)
|
||||
sleeperUI(usr)
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
if(mannequin.wing_style.do_colouration)
|
||||
temp["color"] = MOB_HEX_COLOR(mannequin, wing)
|
||||
temp["colorHref"] = "wing_color"
|
||||
styles["Tail"] = temp
|
||||
styles["Wing"] = temp
|
||||
|
||||
temp = list("styleHref" = "hair_style", "style" = mannequin.h_style)
|
||||
if(mannequin.species && (mannequin.species.appearance_flags & HAS_HAIR_COLOR))
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
|
||||
if(process_longjump(departing, destination)) //VOREStation Edit - To hook custom shuttle code in
|
||||
return //VOREStation Edit - It handled it for us (shuttle crash or such)
|
||||
/*
|
||||
|
||||
var/last_progress_sound = 0
|
||||
while (world.time < arrive_time)
|
||||
// Make the shuttle make sounds every four seconds, since the sound file is five seconds.
|
||||
@@ -91,7 +91,6 @@
|
||||
make_sounds(interim, HYPERSPACE_PROGRESS)
|
||||
last_progress_sound = world.time
|
||||
sleep(5)
|
||||
*/ //VOREStation Edit. Polaris code in this commented out part, but line 84 takes care of it as far as I cna see.
|
||||
|
||||
move(interim, destination, direction)
|
||||
moving_status = SHUTTLE_IDLE
|
||||
|
||||
@@ -175,6 +175,9 @@
|
||||
|
||||
prey.forceMove(owner)
|
||||
internal_contents |= prey
|
||||
owner.updateVRPanel()
|
||||
for(var/mob/living/M in internal_contents)
|
||||
M.updateVRPanel()
|
||||
|
||||
if(inside_flavor)
|
||||
prey << "<span class='notice'><B>[inside_flavor]</B></span>"
|
||||
@@ -519,7 +522,10 @@
|
||||
to_chat(owner, "<span class='notice'>[M] tastes of [M.get_taste_message(0)].</span>")
|
||||
if(!silent)
|
||||
for(var/mob/hearer in range(1,owner))
|
||||
hearer << sound('sound/vore/squish2.ogg',volume=80)
|
||||
hearer << sound(target.vore_sound,volume=80)
|
||||
owner.updateVRPanel()
|
||||
for(var/mob/living/M in internal_contents)
|
||||
M.updateVRPanel()
|
||||
|
||||
// Belly copies and then returns the copy
|
||||
// Needs to be updated for any var changes
|
||||
|
||||
@@ -84,6 +84,7 @@
|
||||
owner.nutrition += offset*(10/difference) // 9.5 nutrition per digestion tick if they're 130 pounds and it's same size. 10.2 per digestion tick if they're 140 and it's same size. Etc etc.
|
||||
else
|
||||
owner.nutrition += (10/difference)
|
||||
M.updateVRPanel()
|
||||
|
||||
if(digest_mode == DM_ITEMWEAK)
|
||||
var/obj/item/T = pick(touchable_items)
|
||||
@@ -189,6 +190,7 @@
|
||||
else
|
||||
return
|
||||
|
||||
owner.updateVRPanel()
|
||||
return
|
||||
|
||||
//////////////////////////// DM_STRIPDIGEST ////////////////////////////
|
||||
@@ -255,6 +257,8 @@
|
||||
s_owner.cell.charge += (50 * T.w_class)
|
||||
internal_contents -= T
|
||||
qdel(T)
|
||||
for(var/mob/living/carbon/human/M in internal_contents)
|
||||
M.updateVRPanel()
|
||||
|
||||
for(var/mob/living/carbon/human/M in internal_contents)
|
||||
if(!M)
|
||||
@@ -289,7 +293,7 @@
|
||||
for(var/stashslot in stash)
|
||||
var/obj/item/SL = M.get_equipped_item(stashslot)
|
||||
if(SL)
|
||||
SL.forceMove(owner)
|
||||
M.remove_from_mob(SL,owner)
|
||||
internal_contents += SL
|
||||
M.remove_from_mob(I,owner)
|
||||
internal_contents += I
|
||||
@@ -298,7 +302,9 @@
|
||||
if(!(istype(I,/obj/item/organ) || istype(I,/obj/item/weapon/storage/internal) || istype(I,/obj/screen)))
|
||||
M.remove_from_mob(I,owner)
|
||||
internal_contents += I
|
||||
M.updateVRPanel()
|
||||
|
||||
owner.updateVRPanel()
|
||||
return
|
||||
|
||||
//////////////////////////// DM_ABSORB ////////////////////////////
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
var/metabolism = 0.0015
|
||||
var/vore_taste = null // What the character tastes like
|
||||
var/no_vore = 0 // If the character/mob can vore.
|
||||
var/openpanel = 0 // Is the vore panel open?
|
||||
|
||||
//
|
||||
// Hook for generic creation of stuff on new creatures
|
||||
|
||||
@@ -21,6 +21,19 @@
|
||||
picker_holder.popup = new(src, "insidePanel","Inside!", 400, 600, picker_holder)
|
||||
picker_holder.popup.set_content(dat)
|
||||
picker_holder.popup.open()
|
||||
src.openpanel = 1
|
||||
|
||||
/mob/living/proc/updateVRPanel() //Panel popup update call from belly évents.
|
||||
if(src.openpanel == 1)
|
||||
var/datum/vore_look/picker_holder = new()
|
||||
picker_holder.loop = picker_holder
|
||||
picker_holder.selected = vore_organs[vore_selected]
|
||||
|
||||
var/dat = picker_holder.gen_ui(src)
|
||||
|
||||
picker_holder.popup = new(src, "insidePanel","Inside!", 400, 600, picker_holder)
|
||||
picker_holder.popup.set_content(dat)
|
||||
picker_holder.popup.open()
|
||||
|
||||
//
|
||||
// Callback Handler for the Inside form
|
||||
@@ -253,6 +266,7 @@
|
||||
|
||||
if(href_list["close"])
|
||||
qdel(src) // Cleanup
|
||||
user.openpanel = 0
|
||||
return
|
||||
|
||||
if(href_list["show_int"])
|
||||
|
||||
@@ -1342,3 +1342,14 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
|
||||
user.visible_message("<span class='notice'>[user] displays their [src.name].\nIt reads: [stored_name], [badge_string].</span>","<span class='notice'>You display your [src.name].\nIt reads: [stored_name], [badge_string].</span>")
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] displays their [src.name].\nIt reads: [badge_string].</span>","<span class='notice'>You display your [src.name]. It reads: [badge_string].</span>")
|
||||
|
||||
/obj/item/weapon/card/id/fluff/xennith
|
||||
name = "\improper Amy Lessen's Central Command ID (Xenobiology Director)"
|
||||
desc = "This ID card identifies Dr. Amelie Lessen as the founder and director of the NanoTrasen Xenobiology Research Department, circa 2553."
|
||||
icon_state = "centcom"
|
||||
registered_name = "Amy Lessen"
|
||||
assignment = "Xenobiology Director"
|
||||
access = list(access_cent_general,access_cent_thunder,access_cent_medical,access_cent_living,access_cent_storage,access_cent_teleporter,access_research,access_xenobiology,access_maint_tunnels,access_xenoarch,access_robotics,access_tox_storage,access_tox) //Yes, this looks awful. I tried calling both central and resarch access but it didn't work.
|
||||
age = 39
|
||||
blood_type = "O-"
|
||||
sex = "Female"
|
||||
Reference in New Issue
Block a user