Merge branch 'master' of https://github.com/VOREStation/VOREStation into vore-saving

This commit is contained in:
Arokha Sieyes
2016-05-08 18:22:23 -04:00
21 changed files with 1012 additions and 22 deletions
+17
View File
@@ -0,0 +1,17 @@
/*
/obj/machinery/bodyscanner/proc/get_occupant_data_vr(list/incoming = list(),mob/living/carbon/human/H)
incoming["Weight"] = H.weight
return
/obj/machinery/body_scanconsole/proc/med_info2(var/list/occ, var/dat = "<font color='blue'><b>Scan performed at [occ["stationtime"]]</b></font><br>")
dat += text("Body Weight (to scale): [occ["weight"]]lbs / [occ["weight"] / 2.20463]kg<br><HR>")
*/
//WIP sleeper code.
//attempt_vr(src,"get_occupant_data_vr",list(occupant_data,H)) //VOREStation Code
//attempt_vr(src,"med_info2",list(occupant_data,occ)) //VOREStation Code
@@ -0,0 +1,23 @@
/*
/obj/item/borg/upgrade/reset/action/proc/resetborg(var/mob/living/silicon/robot/R)
if(..()) return 0
R.uneq_all()
R.modtype = initial(R.modtype)
R.hands.icon_state = initial(R.hands.icon_state)
R.icon = 'icons/mob/robots.dmi'
R.pixel_x = initial(pixel_x)
R.pixel_y = initial(pixel_y)
R.notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, R.module.name)
R.module.Reset(R)
qdel(R.module)
R.module = null
R.updatename("Default")
*/
//Make it so reset module doesn't bug up borgs. Not a huge problem, but should be added in before launch.
//Could probably do
//if(attempt_vr(src,"resetborg(var/mob/living/silicon/robot/R)",args)) return //VOREStation Code
//or something like that
+4
View File
@@ -0,0 +1,4 @@
/hook/startup/proc/modules_vr()
robot_module_types += "Medihound"
robot_module_types += "K9"
return 1
@@ -43,8 +43,8 @@ datum/preferences/proc/set_biological_gender(var/gender)
/datum/category_item/player_setup_item/general/basic/content()
. = "<b>Name:</b> "
. += "<a href='?src=\ref[src];rename=1'><b>[pref.real_name]</b></a><br>"
. += "(<a href='?src=\ref[src];random_name=1'>Random Name</A>) "
. += "(<a href='?src=\ref[src];always_random_name=1'>Always Random Name: [pref.be_random_name ? "Yes" : "No"]</a>)"
. += "<a href='?src=\ref[src];random_name=1'>Randomize Name</A><br>"
. += "<a href='?src=\ref[src];always_random_name=1'>Always Random Name: [pref.be_random_name ? "Yes" : "No"]</a>"
. += "<br>"
. += "<b>Biological Gender:</b> <a href='?src=\ref[src];bio_gender=1'><b>[gender2text(pref.biological_gender)]</b></a><br>"
. += "<b>Gender Identity:</b> <a href='?src=\ref[src];id_gender=1'><b>[gender2text(pref.identifying_gender)]</b></a><br>"
@@ -105,15 +105,9 @@ var/list/gear_datums = list()
else
. += " |"
if(category == current_tab)
. += " [category] "
. += " <span class='linkOff'>[category]</span> "
else
var/datum/loadout_category/LC = loadout_categories[category]
var/tcolor = "#3366CC"
for(var/thing in LC.gear)
if(thing in pref.gear)
tcolor = "#E67300"
break
. += " <a href='?src=\ref[src];select_category=[category]'><font color = '[tcolor]'>[category]</font></a> "
. += " <a href='?src=\ref[src];select_category=[category]'>[category]</a> "
. += "</b></center></td></tr>"
var/datum/loadout_category/LC = loadout_categories[current_tab]
@@ -123,7 +117,7 @@ var/list/gear_datums = list()
for(var/gear_name in LC.gear)
var/datum/gear/G = LC.gear[gear_name]
var/ticked = (G.display_name in pref.gear)
. += "<tr style='vertical-align:top'><td width=25%><a href='?src=\ref[src];toggle_gear=[G.display_name]'><font color='[ticked ? "#E67300" : "#3366CC"]'>[G.display_name]</font></a></td>"
. += "<tr style='vertical-align:top;'><td width=25%><a style='white-space:normal;' [ticked ? "class='linkOff' " : ""]href='?src=\ref[src];toggle_gear=[G.display_name]'>[G.display_name]</a></td>"
. += "<td width = 10% style='vertical-align:top'>[G.cost]</td>"
. += "<td><font size=2><i>[G.description]</i></font></td></tr>"
if(ticked)
@@ -60,8 +60,8 @@
. += "<tt><center>"
. += "<b>Choose occupation chances</b><br>Unavailable occupations are crossed out.<br>"
. += "<table width='100%' cellpadding='1' cellspacing='0'><tr><td width='20%'>" // Table within a table for alignment, also allows you to easily add more colomns.
. += "<table width='100%' cellpadding='1' cellspacing='0'>"
. += "<table width='100%' cellpadding='1' cellspacing='0'><tr><td width='20%'>" // Table within a table for alignment, also allows you to easily add more columns.
. += "<table width='100%' cellpadding='1' cellspacing='0' style='color:black;'>"
var/index = -1
//The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows.
@@ -76,7 +76,7 @@
//the last job's selection color. Creating a rather nice effect.
for(var/i = 0, i < (limit - index), i += 1)
. += "<tr bgcolor='[lastJob.selection_color]'><td width='60%' align='right'><a>&nbsp</a></td><td><a>&nbsp</a></td></tr>"
. += "</table></td><td width='20%'><table width='100%' cellpadding='1' cellspacing='0'>"
. += "</table></td><td width='20%'><table width='100%' cellpadding='1' cellspacing='0' style='color:black;'>"
index = 0
. += "<tr bgcolor='[job.selection_color]'><td width='60%' align='right'>"
@@ -93,7 +93,7 @@
. += "<del>[rank]</del></td><td> \[MINIMUM CHARACTER AGE: [job.minimum_character_age]]</td></tr>"
continue
if((pref.job_civilian_low & ASSISTANT) && (rank != "Assistant"))
. += "<font color=orange>[rank]</font></td><td></td></tr>"
. += "<font color=grey>[rank]</font></td><td></td></tr>"
continue
if((rank in command_positions) || (rank == "AI"))//Bold head jobs
. += "<b>[rank]</b>"
@@ -132,11 +132,11 @@
switch(pref.alternate_option)
if(GET_RANDOM_JOB)
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=green>Get random job if preferences unavailable</font></a></u></center><br>"
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'>Get random job if preferences unavailable</a></u></center><br>"
if(BE_ASSISTANT)
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=red>Be assistant if preference unavailable</font></a></u></center><br>"
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'>Be assistant if preference unavailable</a></u></center><br>"
if(RETURN_TO_LOBBY)
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=purple>Return to lobby if preference unavailable</font></a></u></center><br>"
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'>Return to lobby if preference unavailable</a></u></center><br>"
. += "<center><a href='?src=\ref[src];reset_jobs=1'>\[Reset\]</a></center>"
. += "</tt>"
+4 -1
View File
@@ -211,7 +211,10 @@ datum/preferences
dat += player_setup.content(user)
dat += "</html></body>"
user << browse(dat, "window=preferences;size=635x736")
//user << browse(dat, "window=preferences;size=635x736")
var/datum/browser/popup = new(user, "Character Setup","Character Setup", 635, 736, src)
popup.set_content(dat)
popup.open()
/datum/preferences/proc/process_link(mob/user, list/href_list)
if(!user) return
+1
View File
@@ -0,0 +1 @@
//File isn't currently being used.
@@ -0,0 +1,284 @@
/obj/item/weapon/dogborg/jaws/big
name = "combat jaws"
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "jaws"
desc = "The jaws of the law."
flags = CONDUCT
force = 10
throwforce = 0
hitsound = 'sound/weapons/bite.ogg'
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
w_class = 3
/obj/item/weapon/dogborg/jaws/small
name = "puppy jaws"
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "smalljaws"
desc = "The jaws of a small dog."
flags = CONDUCT
force = 5
throwforce = 0
hitsound = 'sound/weapons/bite.ogg'
attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
w_class = 3
var/emagged = 0
/obj/item/weapon/dogborg/jaws/small/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
if(R.emagged)
emagged = !emagged
if(emagged)
name = "combat jaws"
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "jaws"
desc = "The jaws of the law."
flags = CONDUCT
force = 10
throwforce = 0
hitsound = 'sound/weapons/bite.ogg'
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
w_class = 3
else
name = "puppy jaws"
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "smalljaws"
desc = "The jaws of a small dog."
flags = CONDUCT
force = 5
throwforce = 0
hitsound = 'sound/weapons/bite.ogg'
attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
w_class = 3
update_icon()
//Boop //New and improved, now a simple reagent sniffer.
/obj/item/device/dogborg/boop_module
name = "boop module"
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "nose"
desc = "The BOOP module, a simple reagent and atmosphere sniffer."
flags = CONDUCT
force = 0
throwforce = 0
attack_verb = list("nuzzled", "nosed", "booped")
w_class = 1
/obj/item/device/dogborg/boop_module/New()
..()
flags |= NOBLUDGEON //No more attack messages
/obj/item/device/dogborg/boop_module/attack_self(mob/user)
if (!( istype(user.loc, /turf) ))
return
var/datum/gas_mixture/environment = user.loc.return_air()
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles
user.visible_message("<span class='notice'>[user] sniffs the air.</span>", "<span class='notice'>You sniff the air...</span>")
user << "\blue <B>Smells like:</B>"
if(abs(pressure - ONE_ATMOSPHERE) < 10)
user << "\blue Pressure: [round(pressure,0.1)] kPa"
else
user << "\red Pressure: [round(pressure,0.1)] kPa"
if(total_moles)
for(var/g in environment.gas)
user << "\blue [gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]%"
user << "\blue Temperature: [round(environment.temperature-T0C,0.1)]&deg;C ([round(environment.temperature,0.1)]K)"
/obj/item/device/dogborg/boop_module/afterattack(obj/O, mob/user as mob, proximity)
if(!proximity)
return
if (user.stat)
return
if(!istype(O))
return
user.visible_message("<span class='notice'>[user] sniffs at \the [O.name].</span>", "<span class='notice'>You sniff \the [O.name]...</span>")
if(!isnull(O.reagents))
var/dat = ""
if(O.reagents.reagent_list.len > 0)
for (var/datum/reagent/R in O.reagents.reagent_list)
dat += "\n \t \blue [R]"
if(dat)
user << "\blue Your BOOP module indicates: [dat]"
else
user << "\blue No active chemical agents smelled in [O]."
else
user << "\blue No significant chemical agents smelled in [O]."
return
//Delivery
/*
/obj/item/weapon/storage/bag/borgdelivery
name = "fetching storage"
desc = "Fetch the thing!"
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "dbag"
w_class = 5
max_w_class = 2
max_combined_w_class = 2
storage_slots = 1
collection_mode = 0
can_hold = list() // any
cant_hold = list(/obj/item/weapon/disk/nuclear)
*/
/obj/item/device/dogborg/dog_zapper //TODO
name = "paws of life"
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "defibpaddles0"
desc = "Zappy paws. For fixing cardiac arrest."
flags = CONDUCT
force = 0
throwforce = 0
hitsound = 'sound/weapons/bite.ogg'
attack_verb = list("batted", "pawed", "bopped", "whapped")
w_class = 1
var/charge = 0
var/charge_required = 1000
var/charge_per = 100
var/state = 0 //0 = Off, 1 = Charging, 2 = Ready
//[round(((world.realtime - src.disconnect_time) / 10) / 60)]
/obj/item/device/dogborg/dog_zapper/attack_self(mob/user)
switch(state)
if(0) // Was off when clicked
if(charge < charge_required) //Turned on and now charging
state = 1
//TODO Change Icon
//TODO Start charging
user << "<span class='notice'>[name] now charging.</span>"
else //Turned on and was already charged
state = 2
user << "<span class='notice'>[name] now READY.</span>"
if(1) // Was charging when clicked
state = 0
//TODO Change Icon
user << "<span class='notice'>[name] now turned off.</span>"
if(2) // Was ready when clicked
state = 0
//TODO Change Icon
user << "<span class='notice'>[name] now turned off (fully charged).</span>"
/*
/obj/item/device/dogborg/dog_zapper/proc/charge()
var/mob/living/silicon/robot.R = usr
do
R.cell.charge -= charge_per
charge += charge_per
sleep(1)
while(state = 1 && charge < charge_required && (R.cell.charge > (charge_required - charge)))
if(charge = charge_required)
usr << "<span class='notice'>[name] now READY.</span>"
/obj/item/device/dogborg/dog_zapper/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity)
*/
//Tongue stuff
/obj/item/device/dogborg/tongue
name = "synthetic tongue"
desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "synthtongue"
hitsound = 'sound/effects/attackblob.ogg'
var/emagged = 0
/obj/item/device/dogborg/tongue/New()
..()
flags |= NOBLUDGEON //No more attack messages
/obj/item/device/dogborg/tongue/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
if(R.emagged)
emagged = !emagged
if(emagged)
name = "hacked tongue of doom"
desc = "Your tongue has been upgraded successfully. Congratulations."
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "syndietongue"
else
name = "synthetic tongue"
desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "synthtongue"
update_icon()
/obj/item/device/dogborg/tongue/afterattack(atom/target, mob/user, proximity)
if(!proximity)
return
if(user.client && (target in user.client.screen))
user << "<span class='warning'>You need to take that [target.name] off before cleaning it!</span>"
else if(istype(target,/obj/effect/decal/cleanable))
user.visible_message("[user] begins to lick off \the [target.name].", "<span class='notice'>You begin to lick off \the [target.name]...</span>")
if(do_after (user, 50))
user << "<span class='notice'>You finish licking off \the [target.name].</span>"
del(target)
var/mob/living/silicon/robot.R = user
R.cell.charge = R.cell.charge + 50
else if(istype(target,/obj/item))
if(istype(target,/obj/item/trash))
user.visible_message("[user] nibbles away at \the [target.name].", "<span class='notice'>You begin to nibble away at \the [target.name]...</span>")
if(do_after (user, 50))
user.visible_message("[user] finishes eating \the [target.name].", "<span class='notice'>You finish eating \the [target.name].</span>")
user << "<span class='notice'>You finish off \the [target.name].</span>"
del(target)
var/mob/living/silicon/robot.R = user
R.cell.charge = R.cell.charge + 250
return
if(istype(target,/obj/item/weapon/cell))
user.visible_message("[user] begins cramming \the [target.name] down its throat.", "<span class='notice'>You begin cramming \the [target.name] down your throat...</span>")
if(do_after (user, 50))
user.visible_message("[user] finishes gulping down \the [target.name].", "<span class='notice'>You finish swallowing \the [target.name].</span>")
user << "<span class='notice'>You finish off \the [target.name], and gain some charge!</span>"
var/mob/living/silicon/robot.R = user
var/obj/item/weapon/cell.C = target
R.cell.charge = R.cell.charge + (C.maxcharge / 3)
del(target)
return
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after (user, 50))
user << "<span class='notice'>You clean \the [target.name].</span>"
var/obj/effect/decal/cleanable/C = locate() in target
del(C)
target.clean_blood()
else if(ishuman(target))
if(src.emagged)
var/mob/living/silicon/robot.R = user
var/mob/living/L = target
if(R.cell.charge <= 666)
return
L.Stun(4) // normal stunbaton is force 7 gimme a break good sir!
L.Weaken(4)
L.apply_effect(STUTTER, 4)
L.visible_message("<span class='danger'>[user] has shocked [L] with its tongue!</span>", \
"<span class='userdanger'>[user] has shocked you with its tongue! You can feel the betrayal.</span>")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
R.cell.charge = R.cell.charge - 666
else
user.visible_message("<span class='notice'>\the [user] affectionally licks all over \the [target]'s face!</span>", "<span class='notice'>You affectionally lick all over \the [target]'s face!</span>")
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
return
else if(istype(target, /obj/structure/window))
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after (user, 50))
user << "<span class='notice'>You clean \the [target.name].</span>"
target.color = initial(target.color)
//target.SetOpacity(initial(target.opacity)) //Apparantly this doesn't work?
else
user.visible_message("[user] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
if(do_after (user, 50))
user << "<span class='notice'>You clean \the [target.name].</span>"
var/obj/effect/decal/cleanable/C = locate() in target
del(C)
target.clean_blood()
return
@@ -0,0 +1,427 @@
//Sleeper
/obj/item/device/dogborg/sleeper
name = "Medbelly"
desc = "Equipment for medical hound. A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves."
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "sleeper"
w_class = 1
var/mob/living/carbon/patient = null
var/mob/living/silicon/robot/hound = null
var/inject_amount = 10
var/min_health = -100
var/cleaning = 0
var/patient_laststat = null
var/mob_energy = 30000 //Energy gained from digesting mobs (including PCs)
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()
/obj/item/device/dogborg/sleeper/New()
..()
flags |= NOBLUDGEON //No more attack messages
/obj/item/device/dogborg/sleeper/Exit(atom/movable/O)
return 0
/obj/item/device/dogborg/sleeper/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity)
hound = loc
if(!proximity)
return
if(!ishuman(target))
return
if(target.buckled)
user << "\red The user is buckled and can not be put into your [src.name]."
return
if(patient)
user << "\red Your [src.name] is already occupied."
return
user.visible_message("<span class='warning'>[hound.name] is ingesting [target.name] into their [src.name].</span>", "<span class='notice'>You start ingesting [target] into your [src]...</span>")
if(!patient && ishuman(target) && !target.buckled && do_after (user, 50))
if(!proximity) return //If they moved away, you can't eat them.
if(patient) return //If you try to eat two people at once, you can only eat one.
else //If you don't have someone in you, proceed.
target.forceMove(src)
target.reset_view(src)
update_patient()
processing_objects.Add(src)
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
/obj/item/device/dogborg/sleeper/proc/go_out(var/target)
hound = src.loc
if(length(contents) > 0)
hound.visible_message("<span class='warning'>[hound.name] empties out their contents via their [eject_port] port.</span>", "<span class='notice'>You empty your contents via your [eject_port] port.</span>")
if(target)
if(ishuman(target))
var/mob/living/carbon/human/person = target
person.forceMove(get_turf(src))
person.reset_view()
else
var/obj/T = target
T.loc = hound.loc
else
for(var/C in contents)
if(ishuman(C))
var/mob/living/carbon/human/person = C
person.forceMove(get_turf(src))
person.reset_view()
else
var/obj/T = C
T.loc = hound.loc
items_preserved.Cut()
cleaning = 0
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
update_patient()
else //You clicked eject with nothing in you, let's just reset stuff to be sure.
items_preserved.Cut()
cleaning = 0
update_patient()
/obj/item/device/dogborg/sleeper/proc/drain(var/amt = 3) //Slightly reduced cost (before, it was always injecting inaprov)
hound.cell.charge = hound.cell.charge - amt
/obj/item/device/dogborg/sleeper/attack_self(mob/user)
if(..())
return
sleeperUI(user)
/obj/item/device/dogborg/sleeper/proc/sleeperUI(mob/user)
var/dat
dat += "<h3>Injector</h3>"
if(patient && !(patient.stat & DEAD)) //Why inject dead people with innaprov? Dundonuffin in Bay.
dat += "<A href='?src=\ref[src];inject=inaprovaline'>Inject Inaprovaline</A>"
else
dat += "<span class='linkOff'>Inject Inaprovaline</span>"
if(patient && patient.health > min_health)
for(var/re in injection_chems)
var/datum/reagent/C = chemical_reagents_list[re]
if(C)
dat += "<BR><A href='?src=\ref[src];inject=[C.id]'>Inject [C.name]</A>"
else
for(var/re in injection_chems)
var/datum/reagent/C = chemical_reagents_list[re]
if(C)
dat += "<BR><span class='linkOff'>Inject [C.name]</span>"
dat += "<h3>Sleeper Status</h3>"
dat += "<A id='refbutton' href='?src=\ref[src];refresh=1'>Refresh</A>"
dat += "<A href='?src=\ref[src];eject=1'>Eject All</A>"
dat += "<A href='?src=\ref[src];port=1'>Eject port: [eject_port]</A>"
if(!cleaning)
dat += "<A href='?src=\ref[src];clean=1'>Self-Clean</A>"
else
dat += "<span class='linkOff'>Self-Clean</span>"
dat += "<div class='statusDisplay'>"
//Cleaning and there are still un-preserved items
if(cleaning && length(contents - items_preserved))
dat += "<font color='red'><B>Self-cleaning mode.</B> [length(contents - items_preserved)] object(s) remaining.</font><BR>"
//There are no items to be processed other than un-preserved items
else if(cleaning && length(items_preserved))
dat += "<font color='red'><B>Self-cleaning done. Eject remaining objects now.</B></font><BR>"
//Preserved items count when the list is populated
if(length(items_preserved))
dat += "<font color='red'>[length(items_preserved)] uncleanable object(s).</font><BR>"
if(!patient)
dat += "Sleeper Unoccupied"
else
dat += "[patient.name] => "
switch(patient.stat)
if(0)
dat += "<span class='good'>Conscious</span>"
if(1)
dat += "<span class='average'>Unconscious</span>"
else
dat += "<span class='bad'>DEAD</span>"
dat += text("[]\t-Pulse, bpm: []</FONT><BR>", (patient.pulse == PULSE_NONE || patient.pulse == PULSE_THREADY ? "<font color='red'>" : "<font color='white'>"), patient.get_pulse(GETPULSE_TOOL))
dat += text("[]\t-Overall Health %: []</FONT><BR>", (patient.health > 0 ? "<font color='white'>" : "<font color='red'>"), round(patient.health))
dat += text("[]\t-Brute Damage %: []</FONT><BR>", (patient.getBruteLoss() < 60 ? "<font color='gray'>" : "<font color='red'>"), patient.getBruteLoss())
dat += text("[]\t-Respiratory Damage %: []</FONT><BR>", (patient.getOxyLoss() < 60 ? "<font color='gray'>" : "<font color='red'>"), patient.getOxyLoss())
dat += text("[]\t-Toxin Content %: []</FONT><BR>", (patient.getToxLoss() < 60 ? "<font color='gray'>" : "<font color='red'>"), patient.getToxLoss())
dat += text("[]\t-Burn Severity %: []</FONT><BR>", (patient.getFireLoss() < 60 ? "<font color='gray'>" : "<font color='red'>"), patient.getFireLoss())
if(round(patient.paralysis / 4) >= 1)
dat += text("<HR>Patient paralyzed for: []<BR>", round(patient.paralysis / 4) >= 1 ? "[round(patient.paralysis / 4)] seconds" : "None")
if(patient.getBrainLoss())
dat += "<div class='line'><span class='average'>Significant brain damage detected.</span></div><br>"
if(patient.getCloneLoss())
dat += "<div class='line'><span class='average'>Patient may be improperly cloned.</span></div><br>"
if(patient.reagents.reagent_list.len)
for(var/datum/reagent/R in patient.reagents.reagent_list)
dat += "<div class='line'><div style='width: 170px;' class='statusLabel'>[R.name]:</div><div class='statusValue'>[round(R.volume, 0.1)] units</div></div><br>"
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_content(dat)
popup.open()
return
/obj/item/device/dogborg/sleeper/Topic(href, href_list)
if(..() || usr == patient)
return
usr.set_machine(src)
if(href_list["refresh"])
update_patient()
src.updateUsrDialog()
sleeperUI(usr)
return
if(href_list["eject"])
go_out()
sleeperUI(usr)
return
if(href_list["clean"])
if(!cleaning)
var/confirm = alert(usr, "You are about to engage self-cleaning mode. This will fill your [src] with caustic enzymes to remove any objects or biomatter, and convert them into energy. Are you sure?", "Confirmation", "Self-Clean", "Cancel")
if(confirm == "Self-Clean")
cleaning = 1
drain(500)
processing_objects.Add(src)
sleeperUI(usr)
if(patient)
patient << "<span class='danger'>[hound.name]'s [src.name] fills with caustic enzymes around you!</span>"
return
if(cleaning)
sleeperUI(usr)
return
if(href_list["port"])
switch(eject_port)
if("ingestion")
eject_port = "disposal"
if("disposal")
eject_port = "ingestion"
sleeperUI(usr)
return
if(patient && !(patient.stat & DEAD)) //What is bitwise NOT? ... Thought it was tilde.
if(href_list["inject"] == "inaprovaline" || patient.health > min_health)
inject_chem(usr, href_list["inject"])
else
usr << "<span class='notice'>ERROR: Subject is not in stable condition for injections.</span>"
else
usr << "<span class='notice'>ERROR: Subject cannot metabolise chemicals.</span>"
src.updateUsrDialog()
sleeperUI(usr) //Needs a callback to boop the page to refresh.
return
/obj/item/device/dogborg/sleeper/proc/inject_chem(mob/user, chem)
if(patient && patient.reagents)
if(chem in injection_chems + "inaprovaline")
if(hound.cell.charge < 800) //This is so borgs don't kill themselves with it.
hound << "<span class='notice'>You don't have enough power to synthesize fluids.</span>"
return
else if(patient.reagents.get_reagent_amount(chem) + 10 >= 20) //Preventing people from accidentally killing themselves by trying to inject too many chemicals!
hound << "<span class='notice'>Your stomach is currently too full of fluids to secrete more fluids of this kind.</span>"
else if(patient.reagents.get_reagent_amount(chem) + 10 <= 20) //No overdoses for you
patient.reagents.add_reagent(chem, inject_amount)
drain(750) //-750 charge per injection
var/units = round(patient.reagents.get_reagent_amount(chem))
hound << "<span class='notice'>Injecting [units] unit\s of [chemical_reagents_list[chem]] into occupant.</span>" //If they were immersed, the reagents wouldn't leave with them.
//For if the dogborg's existing patient uh, doesn't make it.
/obj/item/device/dogborg/sleeper/proc/update_patient()
//Well, we HAD one, what happened to them?
if(patient in contents)
if(patient_laststat != patient.stat)
if(patient.stat & DEAD)
hound.sleeper_r = 1
hound.sleeper_g = 0
patient_laststat = patient.stat
else
hound.sleeper_r = 0
hound.sleeper_g = 1
patient_laststat = patient.stat
//Update icon
hound.updateicon()
//Return original patient
return(patient)
//Check for a new patient
else
for(var/mob/living/carbon/human/C in contents)
patient = C
if(patient.stat & DEAD)
hound.sleeper_r = 1
hound.sleeper_g = 0
patient_laststat = patient.stat
else
hound.sleeper_r = 0
hound.sleeper_g = 1
patient_laststat = patient.stat
//Update icon and return new patient
hound.updateicon()
return(C)
//Cleaning looks better with red on, even with nobody in it
if(cleaning && !patient)
hound.sleeper_r = 1
hound.sleeper_g = 0
//Couldn't find anyone, and not cleaning
else if(!cleaning && !patient)
hound.sleeper_r = 0
hound.sleeper_g = 0
patient_laststat = null
patient = null
hound.updateicon()
return
//Gurgleborg process
/obj/item/device/dogborg/sleeper/proc/clean_cycle()
//Sanity? Maybe not required. More like if indigestible person OOC escapes.
for(var/I in items_preserved)
if(!(I in contents))
items_preserved -= I
var/list/touchable_items = contents - items_preserved
//Belly is entirely empty
if(!length(contents))
hound << "<span class='notice'>Your [src.name] is now clean. Ending self-cleaning cycle.</span>"
cleaning = 0
update_patient()
return
if(prob(10))
var/churnsound = pick(
'sound/vore/digest1.ogg',
'sound/vore/digest2.ogg',
'sound/vore/digest3.ogg',
'sound/vore/digest4.ogg',
'sound/vore/digest5.ogg',
'sound/vore/digest6.ogg',
'sound/vore/digest7.ogg',
'sound/vore/digest8.ogg',
'sound/vore/digest9.ogg',
'sound/vore/digest10.ogg',
'sound/vore/digest11.ogg',
'sound/vore/digest12.ogg')
for(var/mob/outhearer in range(1,hound))
outhearer << sound(churnsound)
for(var/mob/inhearer in contents)
inhearer << sound(churnsound)
//If the timing is right, and there are items to be touched
if(air_master.current_cycle%2==1 && length(touchable_items))
//Burn all the mobs or add them to the exclusion list
for(var/mob/living/carbon/human/T in (touchable_items))
if((T.status_flags & GODMODE) || !T.digestable)
src.items_preserved += T
else
T.adjustBruteLoss(2)
T.adjustFireLoss(3)
src.update_patient()
//Pick a random item to deal with (if there are any)
var/atom/target = pick(touchable_items)
//Handle the target being a mob
if(ishuman(target))
var/mob/living/carbon/human/T = target
//Mob is now dead
if(T.stat & DEAD)
message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[hound.x];Y=[hound.y];Z=[hound.z]'>JMP</a>" : "null"])")
hound << "<span class='notice'>You feel your belly slowly churn around [T], breaking them down into a soft slurry to be used as power for your systems.</span>"
T << "<span class='notice'>You feel [hound]'s belly slowly churn around your form, breaking you down into a soft slurry to be used as power for [hound]'s systems.</span>"
src.drain(-30000) //Fueeeeellll
var/deathsound = pick(
'sound/vore/death1.ogg',
'sound/vore/death2.ogg',
'sound/vore/death3.ogg',
'sound/vore/death4.ogg',
'sound/vore/death5.ogg',
'sound/vore/death6.ogg',
'sound/vore/death7.ogg',
'sound/vore/death8.ogg',
'sound/vore/death9.ogg',
'sound/vore/death10.ogg')
for(var/mob/hearer in range(1,src.hound))
hearer << deathsound
T << deathsound
//Spill(T) //TODOPOLARIS
T.Del()
src.update_patient()
//Handle the target being anything but a /mob/living/carbon/human
else
var/obj/T = target
//If the object is in the items_preserved global list //POLARISTODO
if(T.type in important_items)
src.items_preserved += T
//If the object is not one to preserve
else
//Special case for PDAs as they are dumb. TODO fix Del on PDAs to be less dumb.
if (istype(T, /obj/item/device/pda))
var/obj/item/device/pda/PDA = T
if (PDA.id)
PDA.id.loc = src
PDA.id = null
T.Del()
//Special case for IDs to make them digested
//else if (istype(T, /obj/item/weapon/card/id))
//var/obj/item/weapon/card/id/ID = T
//ID.digest() //Need the digest proc, first.
//Anything not perserved, PDA, or ID
else
//Spill(T) //Needs the spill proc to be added
T.Del()
src.update_patient()
src.hound.cell.charge += 10
return
/obj/item/device/dogborg/sleeper/process()
if(cleaning) //We're cleaning, return early after calling this as we don't care about the patient.
src.clean_cycle()
return
if(patient) //We're caring for the patient. Medical emergency! Or endo scene.
update_patient()
if(patient.health < 0)
patient.adjustOxyLoss(-1) //Heal some oxygen damage if they're in critical condition
patient.updatehealth()
patient.AdjustStunned(-4)
patient.AdjustWeakened(-4)
src.drain()
if((patient.reagents.get_reagent_amount("inaprovaline") < 5) && (patient.health < patient.maxHealth)) //Stop pumping full HP people full of drugs. Don't heal people you're digesting, meanie.
patient.reagents.add_reagent("inaprovaline", 5)
return
if(!patient && !cleaning) //We think we're done working.
if(!update_patient()) //One last try to find someone
processing_objects.Remove(src)
return
/mob/living/silicon/robot
var/sleeper_g
var/sleeper_r
/obj/item/device/dogborg/sleeper/K9 //The K9 portabrig
name = "Brig-Belly"
desc = "Equipment for a K9 unit. A mounted portable-brig that holds criminals."
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "sleeper"
inject_amount = 10
min_health = -100
injection_chems = null //So they don't have all the same chems as the medihound!
@@ -0,0 +1,71 @@
/hook/startup/proc/robot_modules_vr()
robot_modules["Medihound"] = /obj/item/weapon/robot_module/medihound
robot_modules["K9"] = /obj/item/weapon/robot_module/knine
return 1
/obj/item/weapon/robot_module/knine
name = "k9 robot module"
sprites = list("K9 hound" = "k9")
channels = list("Security" = 1)
networks = list(NETWORK_SECURITY)
can_be_pushed = 0
/obj/item/weapon/robot_module/knine/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/handcuffs/cyborg(src) //You need cuffs to be a proper sec borg!
src.modules += new /obj/item/weapon/dogborg/jaws/big(src) //In case there's some kind of hostile mob.
src.modules += new /obj/item/weapon/melee/baton/robot(src) //Since the pounce module refused to work, they get a stunbaton instead.
src.modules += new /obj/item/device/dogborg/boop_module(src) //Boop people on the nose.
src.modules += new /obj/item/device/dogborg/tongue(src) //This is so they can clean up bloody evidence after it's examined, and so they can lick crew.
src.modules += new /obj/item/taperoll/police(src) //Block out crime scenes.
src.modules += new /obj/item/device/dogborg/sleeper/K9(src) //Eat criminals. Bring them to the brig.
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) //They /are/ a security borg, after all.
src.modules += new /obj/item/borg/sight/hud/sec(src) //Security hud to see criminals.
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) //Emag. Not a big problem.
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.icon_state = "k9"
R.pixel_x = -16
..()
/obj/item/weapon/robot_module/knine/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/device/flash/F = locate() in src.modules
if(F.broken)
F.broken = 0
F.times_used = 0
F.icon_state = "flash"
else if(F.times_used)
F.times_used--
var/obj/item/weapon/gun/energy/taser/mounted/cyborg/T = locate() in src.modules
if(T.power_supply.charge < T.power_supply.maxcharge)
T.power_supply.give(T.charge_cost * amount)
T.update_icon()
else
T.charge_tick = 0
var/obj/item/weapon/melee/baton/robot/B = locate() in src.modules
if(B && B.bcell)
B.bcell.give(amount)
/obj/item/weapon/robot_module/medihound
name = "MediHound module"
channels = list("Medical" = 1)
networks = list(NETWORK_MEDICAL)
can_be_pushed = 0
sprites = list("Medical Hound" = "medihound")
/obj/item/weapon/robot_module/medihound/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/dogborg/jaws/small(src) //In case a patient is being attacked by carp.
src.modules += new /obj/item/device/dogborg/boop_module(src) //Boop the crew.
src.modules += new /obj/item/device/dogborg/tongue(src) //Clean up bloody items by licking them, and eat rubbish for minor energy.
src.modules += new /obj/item/device/healthanalyzer(src) // See who's hurt specificially.
src.modules += new /obj/item/device/dogborg/sleeper(src) //So they can nom people and heal them
src.modules += new /obj/item/borg/sight/hud/med(src) //See who's hurt generally.
src.modules += new /obj/item/weapon/extinguisher/mini(src) //So they can put burning patients out.
src.modules += new /obj/item/weapon/reagent_containers/syringe(src) //In case the chemist is nice!
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.icon_state = "medihound"
R.pixel_x = -16
..()
+1 -2
View File
@@ -25,7 +25,7 @@
/mob/new_player/proc/new_player_panel_proc()
var/output = "<div align='center'><B>New Player Options</B>"
var/output = "<div align='center'>"
output +="<hr>"
output += "<p><a href='byond://?src=\ref[src];show_preferences=1'>Setup Character</A></p>"
@@ -62,7 +62,6 @@
output += "</div>"
//src << browse(output,"window=playersetup;size=210x280;can_close=0")
panel = new(src, "New Player","New Player", 210, 280, src)
panel.set_window_options("can_close=0")
+3 -1
View File
@@ -4,7 +4,9 @@
var/datum/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
var/absorbed = 0 // If a mob is absorbed into another
var/weight = 100 // Weight for mobs for weightgain system
var/weight = 137 // Weight for mobs for weightgain system
var/weight_gain = 1 //How fast you gain weight
var/weight_loss = 0.5 //How fast you lose weight
//
// Hook for generic creation of stuff on new creatures
+2
View File
@@ -43,6 +43,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
//Actual preferences
var/digestable = 1
var/list/belly_prefs = list()
var/weight_gain = 1
var/weight_loss = 0.5
//Mechanically required
var/path
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -0,0 +1,154 @@
/obj/machinery/workout
name = "fitness lifter"
icon = 'code/modules/vore/weight/fit_vr.dmi'
icon_state = "fitnesslifter" //Sprites ripped from goon.
desc = "A utility often used to lose weight."
anchored = 1
use_power = 0
idle_power_usage = 0
active_power_usage = 0
/obj/machinery/workout/attackby(obj/item/W, var/mob/living/user)
if(istype(W, /obj/item/weapon/wrench))
src.add_fingerprint(user)
user.visible_message("<span class='warning'>[user] has [anchored ? "un" : ""]secured \the [src].</span>", "<span class='notice'>You [anchored ? "un" : ""]secure \the [src].</span>")
anchored = !anchored
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
return
/obj/machinery/workout/attack_hand(var/mob/living/user)
if(!anchored)
user << "<span class='notice'>For safety reasons, you are required to have this equipment wrenched down before using it!</span>"
return
if(user.loc != src.loc)
user << "<span class='notice'>For safety reasons, you need to be sitting in the fitness lifter for it to work!</span>"
return
if(user.nutrition > 70 && user.weight > 70) //If they have enough nutrition and body weight, they can exercise.
user.dir = src.dir
user.nutrition = user.nutrition - 20 //Working out burns a lot of calories!
user.weight = user.weight - 0.05 //Burn a bit of weight. Not much, but quite a bit. This can't be spammed, as they'll need nutrition to be able to work out.
icon_state = "fitnesslifter2"
user << "<span class='notice'>You lift some weights.</span>"
sleep(50)
icon_state = "fitnesslifter"
else if(user.nutrition < 70)
user << "<span class='notice'>You need more energy to workout on the mat!</span>"
else if(user.weight < 70)
user << "<span class='notice'>You're too skinny to risk losing any more weight!</span>"
else
user << "<span class='notice'>You're unable to use the fitness lifter.</span>"
return //Something went wrong. They shouldn't see this.
/obj/machinery/workout/shipped
anchored = 0 // For cargo.
/obj/machinery/punching_bag
name = "punching bag"
icon = 'code/modules/vore/weight/fit_vr.dmi'
icon_state = "punchingbag"
desc = "A bag often used to releive stress and burn fat."
anchored = 1
density = 1
use_power = 0
idle_power_usage = 0
active_power_usage = 0
/obj/machinery/punching_bag/attack_hand(var/mob/living/user)
if(user.nutrition > 35 && user.weight > 70) //If they have enough nutrition and body weight, they can exercise.
var/workout = rand(1,2)
user.nutrition = user.nutrition - 10 //A punching bag uses less calories.
user.weight = user.weight - 0.025 //And burns less weight.
icon_state = "punchingbag2"
switch(workout)
if(1)
user << "<span class='notice'>You slam your fist into the punching bag.</span>"
if(2)
user << "<span class='notice'>You jab the punching bag with your elbow.</span>"
playsound(src.loc, "punch", 50, 1)
sleep(50)
icon_state = "punchingbag"
else if(user.nutrition < 35)
user << "<span class='notice'>You need more energy to workout on the mat!</span>"
else if(user.weight < 70)
user << "<span class='notice'>You're too skinny to risk losing any more weight!</span>"
else
user << "<span class='notice'>You're unable to use the punching bag.</span>"
return //Something went wrong. They shouldn't see this.
/obj/machinery/punching_clown
name = "clown punching bag"
icon = 'code/modules/vore/weight/fit_vr.dmi'
icon_state = "bopbag"
desc = "A bag often used to releive stress and burn fat. It has a clown on the front of it."
anchored = 0
density = 1
use_power = 0
idle_power_usage = 0
active_power_usage = 0
/obj/machinery/punching_clown/attack_hand(var/mob/living/user)
if(user.nutrition > 35 && user.weight > 70) //If they have enough nutrition and body weight, they can exercise.
var/workout = rand(1,4)
user.nutrition = user.nutrition - 10
user.weight = user.weight - 0.025
icon_state = "bopbag2"
switch(workout)
if(1)
user << "<span class='notice'>You slam your fist into the punching bag.</span>"
if(2)
user << "<span class='notice'>You jab the punching bag with your elbow.</span>"
if(3)
user << "<span class='notice'>You hammer the clown right in it's face with your fist.</span>"
if(4)
user << "<span class='notice'>A honk emits from the punching bag as you hit it.</span>"
playsound(src.loc, "punch", 50, 1)
playsound(src.loc, "clownstep", 50, 1)
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
sleep(50)
icon_state = "bopbag"
else if(user.nutrition < 35)
user << "<span class='notice'>You need more energy to workout on the mat!</span>"
else if(user.weight < 70)
user << "<span class='notice'>You're too skinny to risk losing any more weight!</span>"
else
user << "<span class='notice'>You're unable to use the punching bag.</span>"
return //Something went wrong. They shouldn't see this.
/obj/machinery/scale
name = "scale"
icon = 'code/modules/vore/weight/fit_vr.dmi'
icon_state = "scale"
desc = "A scale used to measure ones weight relative to their size and species."
anchored = 1 // Set to 0 when we can construct or dismantle these.
use_power = 0
idle_power_usage = 0
active_power_usage = 0
var/kilograms
/obj/machinery/scale/attack_hand(var/mob/living/user)
if(user.loc != src.loc)
user << "<span class='notice'>You need to be standing on top of the scale for it to work!</span>"
return
if(user.weight) //Just in case.
kilograms = round(text2num(user.weight),4) / 2.20463
user << "<span class='notice'>Your relative weight is [user.weight]lb / [kilograms]kg.</span>"
user.visible_message("<span class='warning'>[user]'s relative weight is [user.weight]lb / [kilograms]kg.</span>")
+1
View File
@@ -23,6 +23,7 @@ a, a:link, a:visited, a:active, .linkOn, .linkOff
padding: 1px 4px 1px 4px;
margin: 0 2px 0 0;
cursor:default;
white-space:nowrap;
}
a:hover
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

+8
View File
@@ -13,6 +13,7 @@
#include "code\_macros.dm"
#include "code\_unit_tests.dm"
#include "code\global.dm"
#include "code\global_vr.dm"
#include "code\hub.dm"
#include "code\names.dm"
#include "code\stylesheet.dm"
@@ -373,6 +374,7 @@
#include "code\game\jobs\job\security.dm"
#include "code\game\jobs\job\silicon.dm"
#include "code\game\machinery\adv_med.dm"
#include "code\game\machinery\adv_med_vr.dm"
#include "code\game\machinery\ai_slipper.dm"
#include "code\game\machinery\alarm.dm"
#include "code\game\machinery\atmo_control.dm"
@@ -651,6 +653,7 @@
#include "code\game\objects\items\robot\robot_items.dm"
#include "code\game\objects\items\robot\robot_parts.dm"
#include "code\game\objects\items\robot\robot_upgrades.dm"
#include "code\game\objects\items\robot\robot_upgrades_vr.dm"
#include "code\game\objects\items\stacks\matter_synth.dm"
#include "code\game\objects\items\stacks\medical.dm"
#include "code\game\objects\items\stacks\nanopaste.dm"
@@ -988,6 +991,7 @@
#include "code\modules\client\preferences_savefile.dm"
#include "code\modules\client\preferences_spawnpoints.dm"
#include "code\modules\client\preferences_toggle_procs.dm"
#include "code\modules\client\preferences_vr.dm"
#include "code\modules\client\ui_style.dm"
#include "code\modules\client\preference_setup\preference_setup.dm"
#include "code\modules\client\preference_setup\antagonism\01_basic.dm"
@@ -1435,8 +1439,11 @@
#include "code\modules\mob\living\silicon\robot\robot_damage.dm"
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules_vr.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\syndicate.dm"
#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_vr.dm"
#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_vr.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm"
@@ -1884,6 +1891,7 @@
#include "code\modules\vore\eating\vore_vr.dm"
#include "code\modules\vore\eating\vorehooks_vr.dm"
#include "code\modules\vore\eating\vorepanel_vr.dm"
#include "code\modules\vore\weight\fitness_machines_vr.dm"
#include "code\modules\xgm\xgm_gas_data.dm"
#include "code\modules\xgm\xgm_gas_mixture.dm"
#include "code\unit_tests\loadout_tests.dm"