Merge remote-tracking branch 'upstream/master' into kk-maptweaks

This commit is contained in:
Killian
2024-07-06 20:57:48 +01:00
390 changed files with 15163 additions and 9648 deletions
+1
View File
@@ -3,5 +3,6 @@
#define PLANE_CH_STATUS_R 27 //Right-side status icon
#define PLANE_CH_BACKUP 28 //Backup implant
#define PLANE_CH_VANTAG 29 //Vore Antag hud
#define PLANE_CH_STOMACH -11 //Stomach Plane
#define PLANE_AUGMENTED 40 //Augmented-reality plane
+2 -1
View File
@@ -1,4 +1,5 @@
// More for our custom races
#define IS_CHIMERA 12
#define IS_SHADEKIN 13
#define IS_ALRAUNE 14
#define IS_ALRAUNE 14
#define IS_LLEILL 15
+1
View File
@@ -51,6 +51,7 @@
#define issilicon(A) istype(A, /mob/living/silicon)
#define isAI(A) istype(A, /mob/living/silicon/ai)
#define isrobot(A) istype(A, /mob/living/silicon/robot)
#define isshell(A) istype(A, /mob/living/silicon/robot/ai_shell)
#define ispAI(A) istype(A, /mob/living/silicon/pai)
#define isbot(A) istype(A, /mob/living/bot)
+4 -1
View File
@@ -7,7 +7,9 @@
#define VIS_AUGMENTED 32
#define VIS_COUNT 32
#define VIS_CH_STOMACH 33
#define VIS_COUNT 33
//Protean organs
#define O_ORCH "orchestrator"
@@ -33,6 +35,7 @@
#define SPECIES_ZORREN_HIGH "Zorren"
#define SPECIES_CUSTOM "Custom Species"
#define SPECIES_TAJARAN "Tajara"
#define SPECIES_LLEILL "Lleill"
//monkey species
#define SPECIES_MONKEY_AKULA "Sobaka"
#define SPECIES_MONKEY_NEVREAN "Sparra"
+1
View File
@@ -17,3 +17,4 @@
#define LANGUAGE_MOUSE "Mouse"
#define LANGUAGE_SHADEKIN "Shadekin Empathy"
#define LANGUAGE_LLEILL "Glamour Speak"
+1
View File
@@ -1580,6 +1580,7 @@ GLOBAL_REAL_VAR(list/stack_trace_storage)
. += new /obj/screen/plane_master{plane = PLANE_CH_HEALTH_VR} //Health bar but transparent at 100
. += new /obj/screen/plane_master{plane = PLANE_CH_BACKUP} //Backup implant status
. += new /obj/screen/plane_master{plane = PLANE_CH_VANTAG} //Vore Antags
. += new /obj/screen/plane_master{plane = PLANE_CH_STOMACH} //Stomachs
. += new /obj/screen/plane_master{plane = PLANE_AUGMENTED} //Augmented reality
//VOREStation Add End
/proc/CallAsync(datum/source, proctype, list/arguments)
+6 -4
View File
@@ -1015,6 +1015,12 @@ var/list/gamemode_cache = list()
if("asset_cdn_url")
config.asset_cdn_url = value
if("allow_robot_recolor")
config.allow_robot_recolor = TRUE
if("allow_simple_mob_recolor")
config.allow_simple_mob_recolor = TRUE
else
log_misc("Unknown setting in configuration: '[name]'")
@@ -1083,10 +1089,6 @@ var/list/gamemode_cache = list()
if("loadout_whitelist")
config.loadout_whitelist = text2num(value)
if("allow_robot_recolor")
config.allow_robot_recolor = 1
if("allow_simple_mob_recolor")
config.allow_simple_mob_recolor = 1
else
log_misc("Unknown setting in configuration: '[name]'")
-1
View File
@@ -486,7 +486,6 @@ var/global/list/PDA_Manifest = list()
R.fields["ma_crim"] = "None"
R.fields["ma_crim_d"] = "No major crime convictions."
R.fields["notes"] = "No notes."
R.fields["notes"] = "No notes."
if(hidden)
hidden_security += R
else
+5
View File
@@ -205,6 +205,11 @@
occupantData["bodyTempF"] = (((H.bodytemperature-T0C) * 1.8) + 32)
occupantData["hasBorer"] = H.has_brain_worms()
occupantData["colourblind"] = null
for(var/datum/modifier/M in H.modifiers)
if(!isnull(M.wire_colors_replace))
occupantData["colourblind"] = LAZYLEN(M.wire_colors_replace)
break
var/bloodData[0]
if(H.vessel)
+1 -1
View File
@@ -86,7 +86,7 @@
/obj/machinery/computer/cryopod/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "CryoStorageVr", storage_name) // VOREStation Edit - Use our own template for our custom data
ui = new(user, src, "CryoStorage", storage_name) // VOREStation Edit - Use our own template for our custom data
ui.open()
/obj/machinery/computer/cryopod/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
@@ -62,6 +62,7 @@
/obj/item/borg/upgrade/utility/rename/action(var/mob/living/silicon/robot/R)
if(..()) return 0
if(isshell(R)) return 0
R.notify_ai(ROBOT_NOTIFICATION_NEW_NAME, R.name, heldname)
R.name = heldname
R.custom_name = heldname
+2 -1
View File
@@ -112,7 +112,8 @@ something, make sure it's not in one of the other lists.*/
prob(2);/obj/item/toy/tennis/blue,
prob(2);/obj/item/toy/tennis/purple,
prob(1);/obj/item/toy/baseball,
prob(1);/obj/item/pizzavoucher
prob(1);/obj/item/pizzavoucher,
prob(2);/obj/item/weapon/cracker
/* VOREStation Edit End */
)
+9 -1
View File
@@ -1132,5 +1132,13 @@
prob(8);/obj/item/capture_crystal/random,
prob(10);/obj/item/weapon/bluespace_harpoon,
prob(10);/obj/item/weapon/bluespace_crystal,
prob(1);/obj/item/clothing/glasses/graviton
prob(1);/obj/item/clothing/glasses/graviton,
prob(10);/obj/item/weapon/cracker,
prob(1);/obj/item/weapon/cracker/shrinking,
prob(1);/obj/item/weapon/cracker/growing,
prob(1);/obj/item/weapon/cracker/invisibility,
prob(1);/obj/item/weapon/cracker/drugged,
prob(1);/obj/item/weapon/cracker/knockover,
prob(1);/obj/item/weapon/cracker/vore,
prob(1);/obj/item/weapon/cracker/money
)
+2 -4
View File
@@ -227,8 +227,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium)
if (!( A.anchored ))
A.forceMove(src)
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
//src.connected = null
qdel(src.connected)
qdel_null(connected)
else if (src.locked == 0)
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
src.connected = new /obj/structure/m_tray/c_tray( src.loc )
@@ -242,8 +241,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium)
A.forceMove(src.connected.loc)
src.connected.icon_state = "cremat"
else
//src.connected = null
qdel(src.connected)
qdel_null(connected)
src.add_fingerprint(user)
update()
@@ -80,3 +80,28 @@
/obj/structure/prop/rock/ice/small/alt
icon_state = "icesmall2"
// glamour things for whitespace
/obj/structure/prop/rock/glamour
name = "glamour"
icon = 'icons/obj/glamour.dmi'
icon_state = "pillar_1"
/obj/structure/prop/rock/glamour/double
icon_state = "pillar_3"
/obj/structure/prop/rock/glamour/triple
icon_state = "pillar_2"
/obj/structure/prop/rock/glamour/small
icon_state = "gems_1"
density = FALSE
/obj/structure/prop/rock/glamour/small/alt1
icon_state = "gems_2"
/obj/structure/prop/rock/glamour/small/alt2
icon_state = "gems_3"
/obj/structure/prop/rock/glamour/small/alt3
icon_state = "gems_4"
@@ -281,6 +281,7 @@
prob(4);/obj/item/weapon/gun/energy/sizegun,
prob(4);/obj/item/device/slow_sizegun,
prob(4);/obj/item/clothing/accessory/collar/shock/bluespace,
prob(3);/obj/item/weapon/cracker,
prob(3);/obj/item/weapon/material/butterfly,
prob(3);/obj/item/weapon/material/butterfly/switchblade,
prob(3);/obj/item/clothing/gloves/knuckledusters,
@@ -313,7 +314,8 @@
prob(1);/obj/item/device/perfect_tele/one_beacon,
prob(1);/obj/item/clothing/gloves/bluespace,
prob(1);/obj/item/weapon/gun/energy/mouseray,
prob(1);/obj/item/clothing/accessory/collar/shock/bluespace/modified)
prob(1);/obj/item/clothing/accessory/collar/shock/bluespace/modified,
prob(1);/obj/item/weapon/gun/energy/sizegun/backfire)
var/obj/item/I = new path()
return I
+11
View File
@@ -263,3 +263,14 @@ var/list/shoreline_icon_cache = list()
to_chat(L, "<span class='warning'>You get drenched in blood from entering \the [src]!</span>")
AM.water_act(5)
..()
/turf/simulated/floor/water/glamour
name = "glamour"
desc = "A body of glamour. It seems shallow enough to walk through, if needed."
icon = 'icons/turf/flooring/glamour.dmi'
icon_state = "water"
water_icon = 'icons/turf/flooring/glamour.dmi'
water_state = "water"
under_state = "glamour"
reagent_type = "water"
@@ -155,17 +155,17 @@ var/list/gear_datums = list()
. += "<tr><td colspan=3><hr></td></tr>"
for(var/gear_name in LC.gear)
var/datum/gear/G = LC.gear[gear_name]
//VOREStation Edit Start
if(preference_mob && preference_mob.client)
if(G.ckeywhitelist && !(preference_mob.ckey in G.ckeywhitelist))
continue
if(G.character_name && !(preference_mob.client.prefs.real_name in G.character_name))
continue
//VOREStation Edit End
var/ticked = (G.display_name in pref.gear)
. += "<tr style='vertical-align:top;'><td width=25%><a style='white-space:normal;' [ticked ? "class='linkOn' " : ""]href='?src=\ref[src];toggle_gear=[html_encode(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(G.show_roles && G.allowed_roles)
. += "<td colspan=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Restricted to: [list2text(G.allowed_roles,", ")]</td>"
if(ticked)
. += "<tr><td colspan=3>"
for(var/datum/gear_tweak/tweak in G.gear_tweaks)
@@ -252,6 +252,7 @@ var/list/gear_datums = list()
var/cost = 1 //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points.
var/slot //Slot to equip to.
var/list/allowed_roles //Roles that can spawn with this item.
var/show_roles = TRUE //Show the role restrictions on this item?
var/whitelisted //Term to check the whitelist for..
var/sort_category = "General"
var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned.
@@ -75,7 +75,7 @@
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(wcoats))
/datum/gear/accessory/holster
display_name = "holster selection (Security, CD, HoP)"
display_name = "holster selection"
path = /obj/item/clothing/accessory/holster
allowed_roles = list("Site Manager", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective")
@@ -57,35 +57,35 @@
path = /obj/item/clothing/accessory/collar/holo/indigestible
/datum/gear/accessory/holster
display_name = "holster selection (Security, SM, HoP)"
display_name = "holster selection"
allowed_roles = list("Site Manager", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Talon Captain","Talon Guard")
/datum/gear/accessory/brown_vest
display_name = "webbing, brown (Eng, Sec, Med, Miner)"
display_name = "webbing, brown"
allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Talon Miner")
/datum/gear/accessory/black_vest
display_name = "webbing, black (Eng, Sec, Med, Miner)"
display_name = "webbing, black"
allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Talon Miner")
/datum/gear/accessory/white_vest
display_name = "webbing, white (Medical)"
display_name = "webbing, white"
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Talon Doctor")
/datum/gear/accessory/brown_drop_pouches
display_name = "drop pouches, brown (Eng, Sec, Med, Miner)"
display_name = "drop pouches, brown"
allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Talon Miner")
/datum/gear/accessory/black_drop_pouches
display_name = "drop pouches, black (Eng, Sec, Med, Miner)"
display_name = "drop pouches, black"
allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Talon Miner")
/datum/gear/accessory/white_drop_pouches
display_name = "drop pouches, white (Medical)"
display_name = "drop pouches, white"
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Talon Doctor")
/datum/gear/accessory/bluespace
display_name = "bluespace badge (Eng, Sec, Med, Miner, Pilot)"
display_name = "bluespace badge"
path = /obj/item/clothing/accessory/storage/bluespace
allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard","Talon Miner","Pilot")
cost = 2
@@ -68,76 +68,76 @@
path = /obj/item/clothing/glasses/science
/datum/gear/eyes/security
display_name = "Security HUD (Security)"
display_name = "Security HUD"
path = /obj/item/clothing/glasses/hud/security
allowed_roles = list("Security Officer","Head of Security","Warden", "Detective")
/datum/gear/eyes/security/prescriptionsec
display_name = "Security HUD, prescription (Security)"
display_name = "Security HUD, prescription"
path = /obj/item/clothing/glasses/hud/security/prescription
/datum/gear/eyes/security/sunglasshud
display_name = "Security HUD, sunglasses (Security)"
display_name = "Security HUD, sunglasses"
path = /obj/item/clothing/glasses/sunglasses/sechud
/datum/gear/eyes/security/aviator
display_name = "Security HUD Aviators (Security)"
display_name = "Security HUD Aviators"
path = /obj/item/clothing/glasses/sunglasses/sechud/aviator
/datum/gear/eyes/security/aviator/prescription
display_name = "Security HUD Aviators, prescription (Security)"
display_name = "Security HUD Aviators, prescription"
path = /obj/item/clothing/glasses/sunglasses/sechud/aviator/prescription
/datum/gear/eyes/medical
display_name = "Medical HUD (Medical)"
display_name = "Medical HUD"
path = /obj/item/clothing/glasses/hud/health
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Search and Rescue")
/datum/gear/eyes/medical/prescriptionmed
display_name = "Medical HUD, prescription (Medical)"
display_name = "Medical HUD, prescription"
path = /obj/item/clothing/glasses/hud/health/prescription
/datum/gear/eyes/medical/aviator
display_name = "Medical HUD Aviators (Medical)"
display_name = "Medical HUD Aviators"
path = /obj/item/clothing/glasses/hud/health/aviator
/datum/gear/eyes/medical/aviator/prescription
display_name = "Medical HUD Aviators, prescription (Medical)"
display_name = "Medical HUD Aviators, prescription"
path = /obj/item/clothing/glasses/hud/health/aviator/prescription
/datum/gear/eyes/janitor
display_name = "Contaminant HUD (Janitor)"
display_name = "Contaminant HUD"
path = /obj/item/clothing/glasses/hud/janitor
allowed_roles = list("Janitor")
/datum/gear/eyes/janitor/prescriptionjan
display_name = "Contaminant HUD, prescription (Janitor)"
display_name = "Contaminant HUD, prescription"
path = /obj/item/clothing/glasses/hud/janitor/prescription
/datum/gear/eyes/meson
display_name = "Optical Meson Scanners (Engineering, Science, Mining)"
display_name = "Optical Meson Scanners"
path = /obj/item/clothing/glasses/meson
allowed_roles = list("Engineer","Chief Engineer","Atmospheric Technician", "Scientist", "Research Director", "Shaft Miner")
/datum/gear/eyes/meson/prescription
display_name = "Optical Meson Scanners, prescription (Engineering, Science, Mining)"
display_name = "Optical Meson Scanners, prescription"
path = /obj/item/clothing/glasses/meson/prescription
/datum/gear/eyes/material
display_name = "Optical Material Scanners (Mining)"
display_name = "Optical Material Scanners"
path = /obj/item/clothing/glasses/material
allowed_roles = list("Shaft Miner","Quartermaster")
/datum/gear/eyes/material/prescription
display_name = "Prescription Optical Material Scanners (Mining)"
display_name = "Prescription Optical Material Scanners"
path = /obj/item/clothing/glasses/material/prescription
/datum/gear/eyes/meson/aviator
display_name = "Optical Meson Aviators, (Engineering, Science, Mining)"
display_name = "Optical Meson Aviators"
path = /obj/item/clothing/glasses/meson/aviator
/datum/gear/eyes/meson/aviator/prescription
display_name = "Optical Meson Aviators, prescription (Engineering, Science, Mining)"
display_name = "Optical Meson Aviators, prescription"
path = /obj/item/clothing/glasses/meson/aviator/prescription
/datum/gear/eyes/glasses/fakesun
@@ -149,16 +149,16 @@
path = /obj/item/clothing/glasses/fakesunglasses/aviator
/datum/gear/eyes/sun
display_name = "Sunglasses (Security/Command)"
display_name = "sunglasses (Security/Command)"
path = /obj/item/clothing/glasses/sunglasses
allowed_roles = list("Security Officer","Head of Security","Warden","Site Manager","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective")
/datum/gear/eyes/sun/shades
display_name = "Sunglasses, fat (Security/Command)"
display_name = "sunglasses, fat (Security/Command)"
path = /obj/item/clothing/glasses/sunglasses/big
/datum/gear/eyes/sun/aviators
display_name = "Sunglasses, aviators (Security/Command)"
display_name = "sunglasses, aviators (Security/Command)"
path = /obj/item/clothing/glasses/sunglasses/aviator
/datum/gear/eyes/sun/prescriptionsun
@@ -170,17 +170,17 @@
path = /obj/item/clothing/glasses/circuitry
/datum/gear/eyes/glasses/rimless
display_name = "Glasses, rimless"
display_name = "glasses, rimless"
path = /obj/item/clothing/glasses/rimless
/datum/gear/eyes/glasses/prescriptionrimless
display_name = "Glasses, prescription rimless"
display_name = "glasses, prescription rimless"
path = /obj/item/clothing/glasses/regular/rimless
/datum/gear/eyes/glasses/thin
display_name = "Glasses, thin frame"
display_name = "glasses, thin frame"
path = /obj/item/clothing/glasses/thin
/datum/gear/eyes/glasses/prescriptionthin
display_name = "Glasses, prescription thin frame"
display_name = "glasses, prescription thin frame"
path = /obj/item/clothing/glasses/regular/thin
@@ -21,27 +21,27 @@
path = /obj/item/clothing/glasses/omnihud/prescription
/datum/gear/eyes/arglasses/sec
display_name = "AR-S glasses (Sec)"
display_name = "AR-Security glasses"
path = /obj/item/clothing/glasses/omnihud/sec
allowed_roles = list("Security Officer","Head of Security","Warden","Detective")
/datum/gear/eyes/arglasses/sci
display_name = "AR-R glasses (Sci)"
display_name = "AR-Research glasses"
path = /obj/item/clothing/glasses/omnihud/rnd
allowed_roles = list("Research Director","Scientist","Xenobiologist","Xenobotanist","Roboticist")
/datum/gear/eyes/arglasses/eng
display_name = "AR-E glasses (Eng)"
display_name = "AR-Engineering glasses"
path = /obj/item/clothing/glasses/omnihud/eng
allowed_roles = list("Engineer","Chief Engineer","Atmospheric Technician")
/datum/gear/eyes/arglasses/med
display_name = "AR-M glasses (Medical)"
display_name = "AR-Medical glasses"
path = /obj/item/clothing/glasses/omnihud/med
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
/datum/gear/eyes/arglasses/all
display_name = "AR-B glasses (SM, HoP)"
display_name = "AR-Command glasses"
path = /obj/item/clothing/glasses/omnihud/all
cost = 2
allowed_roles = list("Site Manager","Head of Personnel")
@@ -55,7 +55,7 @@
path = /obj/item/clothing/glasses/fluff/science_proper
/datum/gear/eyes/meson/retinal
display_name = "retinal projector, meson (Eng, Sci, Explo)"
display_name = "retinal projector, meson"
path = /obj/item/clothing/glasses/omnihud/eng/meson
/datum/gear/eyes/security/secpatch
@@ -67,7 +67,7 @@
path = /obj/item/clothing/glasses/hud/security/eyepatch2
/datum/gear/eyes/security/tac_sec_visor
display_name = "Tactical AR visor (Security)"
display_name = "Tactical AR visor"
path = /obj/item/clothing/glasses/sunglasses/sechud/tactical_sec_vis
/datum/gear/eyes/medical/medpatch
@@ -10,16 +10,16 @@
ckeywhitelist = list("This entry should never be choosable with this variable set.") //If it does, then that means somebody fucked up the whitelist system pretty hard
character_name = list("This entry should never be choosable with this variable set.")
cost = 0
/*
/datum/gear/fluff/testhorn
path = /obj/item/weapon/bikehorn
display_name = "Airhorn - Example Item"
description = "An example item that you probably shouldn't see!"
ckeywhitelist = list("mewchild")
ckeywhitelist = list("your_ckey_here")
allowed_roles = list("Engineer")
*/
/datum/gear/fluff/collar //Use this as a base path for collars if you'd like to set tags in loadout. Make sure you don't use apostrophes in the display name or this breaks!
slot = slot_tie
@@ -52,7 +52,7 @@
cost = 3
/datum/gear/gloves/forensic
display_name = "gloves, forensic (Detective)"
display_name = "gloves, forensic"
path = /obj/item/clothing/gloves/forensic
allowed_roles = list("Detective")
@@ -144,6 +144,7 @@
display_name = "labcoat selection, cmo"
path = /obj/item/clothing/suit/storage/toggle/labcoat/cmo
allowed_roles = list("Chief Medical Officer")
show_roles = FALSE
/datum/gear/suit/labcoat_cmo/New()
..()
@@ -163,6 +164,7 @@
display_name = "labcoat, research director"
path = /obj/item/clothing/suit/storage/toggle/labcoat/rd
allowed_roles = list("Research Director")
show_roles = FALSE
/datum/gear/suit/miscellaneous/labcoat
display_name = "plague doctor's coat"
@@ -254,42 +256,49 @@
display_name = "cloak, head of security"
path = /obj/item/clothing/accessory/poncho/roles/cloak/hos
allowed_roles = list("Head of Security")
show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_cmo
display_name = "cloak, chief medical officer"
path = /obj/item/clothing/accessory/poncho/roles/cloak/cmo
allowed_roles = list("Chief Medical Officer")
show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_ce
display_name = "cloak, chief engineer"
path = /obj/item/clothing/accessory/poncho/roles/cloak/ce
allowed_roles = list("Chief Engineer")
show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_rd
display_name = "cloak, research director"
path = /obj/item/clothing/accessory/poncho/roles/cloak/rd
allowed_roles = list("Research Director")
show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_qm
display_name = "cloak, quartermaster"
path = /obj/item/clothing/accessory/poncho/roles/cloak/qm
allowed_roles = list("Quartermaster")
show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_captain
display_name = "cloak, site manager"
path = /obj/item/clothing/accessory/poncho/roles/cloak/captain
allowed_roles = list("Site Manager")
show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_hop
display_name = "cloak, head of personnel"
path = /obj/item/clothing/accessory/poncho/roles/cloak/hop
allowed_roles = list("Head of Personnel")
show_roles = FALSE
cost = 1
/datum/gear/suit/cloak_custom //A colorable cloak
@@ -344,7 +353,7 @@
path = /obj/item/clothing/suit/suspenders
/datum/gear/suit/forensics
display_name = "forensics uniform selection (Detective)"
display_name = "forensics uniform selection"
path = /obj/item/clothing/suit/storage/forensics/red/long
allowed_roles = list("Detective")
@@ -362,11 +371,13 @@
display_name = "coat, quartermaster"
path = /obj/item/clothing/suit/storage/qm
allowed_roles = list("Quartermaster")
show_roles = FALSE
/datum/gear/suit/cargo_coat
display_name = "coat, cargo tech"
path = /obj/item/clothing/suit/storage/cargo
allowed_roles = list("Quartermaster","Shaft Miner","Cargo Technician","Head of Personnel")
show_roles = FALSE
// winter coats go here
/datum/gear/suit/wintercoat
@@ -377,116 +388,139 @@
display_name = "winter coat, site manager"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/captain
allowed_roles = list("Site Manager")
show_roles = FALSE
/datum/gear/suit/wintercoat/hop
display_name = "winter coat, head of personnel"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/hop
allowed_roles = list("Head of Personnel")
show_roles = FALSE
/datum/gear/suit/wintercoat/security
display_name = "winter coat, security"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/security
allowed_roles = list("Security Officer", "Head of Security", "Warden", "Detective")
show_roles = FALSE
/datum/gear/suit/wintercoat/security/hos
display_name = "winter coat, head of security"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/security/hos
allowed_roles = list("Head of Security")
show_roles = FALSE
/datum/gear/suit/wintercoat/medical
display_name = "winter coat, medical"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
show_roles = FALSE
/datum/gear/suit/wintercoat/medical/alt
display_name = "winter coat, medical alt"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/alt
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
show_roles = FALSE
/datum/gear/suit/wintercoat/medical/viro
display_name = "winter coat, virologist"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/viro
allowed_roles = list("Medical Doctor","Chief Medical Officer")
show_roles = FALSE
/datum/gear/suit/wintercoat/medical/para
display_name = "winter coat, paramedic"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/para
allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic")
show_roles = FALSE
/datum/gear/suit/wintercoat/medical/chemist
display_name = "winter coat, chemist"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/chemist
allowed_roles = list("Chief Medical Officer","Chemist")
show_roles = FALSE
/datum/gear/suit/wintercoat/medical/cmo
display_name = "winter coat, chief medical officer"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/cmo
allowed_roles = list("Chief Medical Officer")
show_roles = FALSE
/datum/gear/suit/wintercoat/medical/sar
display_name = "winter coat, search and rescue"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar
allowed_roles = list("Chief Medical Officer","Paramedic")
show_roles = FALSE
/datum/gear/suit/wintercoat/science
display_name = "winter coat, science"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/science
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist", "Xenobotanist")
show_roles = FALSE
/datum/gear/suit/wintercoat/science/robotics
display_name = "winter coat, robotics"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/science/robotics
allowed_roles = list("Research Director", "Roboticist")
show_roles = FALSE
/datum/gear/suit/wintercoat/science/rd
display_name = "winter coat, research director"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/science/rd
allowed_roles = list("Research Director")
show_roles = FALSE
/datum/gear/suit/wintercoat/engineering
display_name = "winter coat, engineering"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/engineering
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Engineer")
show_roles = FALSE
/datum/gear/suit/wintercoat/engineering/atmos
display_name = "winter coat, atmospherics"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos
allowed_roles = list("Chief Engineer", "Atmospheric Technician")
show_roles = FALSE
/datum/gear/suit/wintercoat/engineering/ce
display_name = "winter coat, chief engineer"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/ce
allowed_roles = list("Chief Engineer")
show_roles = FALSE
/datum/gear/suit/wintercoat/hydro
display_name = "winter coat, hydroponics"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/hydro
allowed_roles = list("Botanist", "Xenobotanist")
show_roles = FALSE
/datum/gear/suit/wintercoat/cargo
display_name = "winter coat, cargo"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/cargo
allowed_roles = list("Quartermaster","Cargo Technician")
show_roles = FALSE
/datum/gear/suit/wintercoat/miner
display_name = "winter coat, mining"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/miner
allowed_roles = list("Shaft Miner")
show_roles = FALSE
/datum/gear/suit/wintercoat/cargo/qm
display_name = "winter coat, quartermaster"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/cargo/qm
allowed_roles = list("Quartermaster")
show_roles = FALSE
/datum/gear/suit/wintercoat/bar
display_name = "winter coat, bartender"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/bar
allowed_roles = list("Bartender")
show_roles = FALSE
/datum/gear/suit/wintercoat/janitor
display_name = "winter coat, janitor"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/janitor
allowed_roles = list("Janitor")
show_roles = FALSE
/datum/gear/suit/wintercoat/aformal
display_name = "winter coat, assistant formal"
@@ -613,31 +647,37 @@
display_name = "snowsuit, command"
path = /obj/item/clothing/suit/storage/snowsuit/command
allowed_roles = list("Site Manager","Research Director","Head of Personnel","Head of Security","Chief Engineer","Command Secretary")
show_roles = FALSE
/datum/gear/suit/snowsuit/security
display_name = "snowsuit, security"
path = /obj/item/clothing/suit/storage/snowsuit/security
allowed_roles = list("Security Officer", "Head of Security", "Warden", "Detective")
show_roles = FALSE
/datum/gear/suit/snowsuit/medical
display_name = "snowsuit, medical"
path = /obj/item/clothing/suit/storage/snowsuit/medical
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Search and Rescue")
show_roles = FALSE
/datum/gear/suit/snowsuit/science
display_name = "snowsuit, science"
path = /obj/item/clothing/suit/storage/snowsuit/science
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
show_roles = FALSE
/datum/gear/suit/snowsuit/engineering
display_name = "snowsuit, engineering"
path = /obj/item/clothing/suit/storage/snowsuit/engineering
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Engineer")
show_roles = FALSE
/datum/gear/suit/snowsuit/cargo
display_name = "snowsuit, supply"
path = /obj/item/clothing/suit/storage/snowsuit/cargo
allowed_roles = list("Quartermaster","Shaft Miner","Cargo Technician","Head of Personnel")
show_roles = FALSE
/datum/gear/suit/miscellaneous/cardigan
display_name = "cardigan, colorable"
@@ -651,6 +691,7 @@
display_name = "command dress jacket"
path = /obj/item/clothing/suit/storage/toggle/cmddressjacket
allowed_roles = list("Site Manager", "Head of Personnel", "Command Secretary")
show_roles = FALSE
/datum/gear/suit/miscellaneous/kimono
display_name = "traditional kimono, colorable"
@@ -55,7 +55,7 @@
//Detective alternative
/datum/gear/suit/detective_alt
display_name = "sleek modern coat selection, detective"
display_name = "sleek modern coat selection"
path = /obj/item/clothing/suit/storage/det_trench/alt
allowed_roles = list("Head of Security", "Detective")
@@ -112,7 +112,7 @@ Talon winter coat
/datum/gear/suit/armor/combat/crusader_explo
display_name = "knight, explo"
path = /obj/item/clothing/suit/armor/combat/crusader_explo
allowed_roles = list("Explorer","Pathfinder")
//allowed_roles = list("Explorer","Pathfinder")
/datum/gear/suit/armor/combat/crusader_explo/FM
display_name = "knight, Field Medic"
@@ -232,11 +232,13 @@ Talon winter coat
display_name = "boat cloak, site manager"
path = /obj/item/clothing/accessory/poncho/roles/cloak/boat/cap
allowed_roles = list("Site Manager")
show_roles = FALSE
/datum/gear/suit/roles/hopboatcloak
display_name = "boat cloak, head of personnel"
path = /obj/item/clothing/accessory/poncho/roles/cloak/boat/hop
allowed_roles = list("Head of Personnel")
show_roles = FALSE
/datum/gear/suit/roles/boatcloaks
display_name = "boat cloak selection"
@@ -268,11 +270,13 @@ Talon winter coat
display_name = "shroud, site manager"
path = /obj/item/clothing/accessory/poncho/roles/cloak/shroud/cap
allowed_roles = list("Site Manager")
show_roles = FALSE
/datum/gear/suit/roles/hopshroud
display_name = "shroud, head of personnel"
path = /obj/item/clothing/accessory/poncho/roles/cloak/shroud/hop
allowed_roles = list("Head of Personnel")
show_roles = FALSE
/datum/gear/suit/roles/shrouds
display_name = "shroud selection"
@@ -5,6 +5,7 @@
display_name = "DEPT - BLANK's Uniforms"
description = "Select from a range of outfits available to all BLANK personnel."
allowed_roles = list("")
show_roles = FALSE
path =
slot = slot_w_uniform
sort_category = "Uniforms"
@@ -23,6 +24,7 @@
display_name = "Command - Site Manager's Uniforms"
description = "Select from a range of outfits available to all Site Managers."
allowed_roles = list("Site Manager")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_captain
sort_category = "Uniforms"
cost = 1
@@ -52,6 +54,7 @@
display_name = "Command - Head of Personnel's Uniforms"
description = "Select from a range of outfits available to all Heads of Personnel."
allowed_roles = list("Head of Personnel")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_hop
sort_category = "Uniforms"
cost = 1
@@ -83,6 +86,7 @@
display_name = "Civilian - Pilot's Uniforms"
description = "Select from a range of outfits available to all Pilots."
allowed_roles = list("Pilot")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_pilot
sort_category = "Uniforms"
cost = 1
@@ -101,6 +105,7 @@
display_name = "Civilian - Janitor's Uniforms"
description = "Select from a range of outfits available to all Janitorial personnel."
allowed_roles = list("Janitor")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_janitor
sort_category = "Uniforms"
cost = 1
@@ -184,6 +189,7 @@
display_name = "Security - Basic Uniforms"
description = "Select from a range of outfits available to all Security personnel."
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
show_roles = FALSE
path = /obj/item/clothing/under/rank/security/corp
sort_category = "Uniforms"
cost = 1
@@ -229,6 +235,7 @@
display_name = "Security - Warden's Uniforms"
description = "Select from a range of outfits available to Wardens."
allowed_roles = list("Head of Security","Warden")
show_roles = FALSE
path = /obj/item/clothing/under/rank/warden/corp
sort_category = "Uniforms"
cost = 1
@@ -250,6 +257,7 @@
display_name = "Security - Detective's Uniforms"
description = "Select from a range of outfits available to all Detectives."
allowed_roles = list("Head of Security","Detective")
show_roles = FALSE
path = /obj/item/clothing/under/det/corporate
sort_category = "Uniforms"
cost = 1
@@ -266,6 +274,7 @@
display_name = "Security - Head's Uniforms"
description = "Select from a range of outfits available to all Heads of Security."
allowed_roles = list("Head of Security")
show_roles = FALSE
path = /obj/item/clothing/under/rank/head_of_security/corp
sort_category = "Uniforms"
cost = 1
@@ -305,6 +314,7 @@
display_name = "Cargo - Quartermaster's Uniforms"
description = "Select from a range of outfits available to all Quartermasters."
allowed_roles = list("Quartermaster")
show_roles = FALSE
path = /obj/item/clothing/under/rank/cargo/jeans
sort_category = "Uniforms"
cost = 1
@@ -336,6 +346,7 @@
display_name = "Cargo - Basic Uniforms"
description = "Select from a range of outfits available to all Cargo personnel."
allowed_roles = list("Cargo Technician","Shaft Miner","Quartermaster")
show_roles = FALSE
path = /obj/item/clothing/under/rank/cargotech/jeans
sort_category = "Uniforms"
cost = 1
@@ -364,6 +375,7 @@
display_name = "Cargo - Miner's Uniforms"
description = "Select from a range of outfits available to all Mining personnel."
allowed_roles = list("Shaft Miner","Quartermaster")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_miner
sort_category = "Uniforms"
cost = 1
@@ -382,6 +394,7 @@
display_name = "Engineering - Chief Engineer's Uniforms"
description = "Select from a range of outfits available to all Chief Engineers."
allowed_roles = list("Chief Engineer")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_chiefengi
sort_category = "Uniforms"
cost = 1
@@ -406,6 +419,7 @@
display_name = "Engineering - Basic Uniforms"
description = "Select from a range of outfits available to all Engineering personnel."
allowed_roles = list("Chief Engineer","Engineer","Atmospheric Technician")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_engi
sort_category = "Uniforms"
cost = 1
@@ -433,6 +447,7 @@
display_name = "Engineering - Atmos Tech's Uniforms"
description = "Select from a range of outfits available to all Atmospherics Technicians."
allowed_roles = list("Chief Engineer","Atmospheric Technician")
show_roles = FALSE
path = /obj/item/clothing/under/rank/atmospheric_technician/skirt
sort_category = "Uniforms"
cost = 1
@@ -452,6 +467,7 @@
display_name = "Medical - Basic Uniforms"
description = "Select from a range of outfits available to all Medical personnel."
allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_med
sort_category = "Uniforms"
cost = 1
@@ -484,6 +500,7 @@
display_name = "Medical - Chemist's Uniforms"
description = "Select from a range of outfits available to all Chemists."
allowed_roles = list("Chief Medical Officer","Chemist")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_chem
sort_category = "Uniforms"
cost = 1
@@ -503,6 +520,7 @@
display_name = "Medical - Paramedic's Uniforms"
description = "Select from a range of outfits available to all Paramedics."
allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic")
show_roles = FALSE
path = /obj/item/clothing/under/rank/paramedunidark
sort_category = "Uniforms"
cost = 1
@@ -525,6 +543,7 @@
display_name = "Medical - Chief Medical Officer's Uniforms"
description = "Select from a range of outfits available to all Chief Medical Officers."
allowed_roles = list("Chief Medical Officer")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_cmo
sort_category = "Uniforms"
cost = 2
@@ -553,6 +572,7 @@
display_name = "Science - Research Director's Uniforms"
description = "Select from a range of outfits available to all Research Directors."
allowed_roles = list("Research Director")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_rd_suit
sort_category = "Uniforms"
cost = 1
@@ -578,6 +598,7 @@
display_name = "Science - Basic Uniforms"
description = "Select from a range of outfits available to all Science personnel."
allowed_roles = list("Scientist","Research Director","Roboticist","Xenobiologist","Xenobotanist")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_science
sort_category = "Uniforms"
cost = 1
@@ -602,6 +623,7 @@
display_name = "Science - Roboticist's Uniforms"
description = "Select from a range of outfits available to all Roboticists."
allowed_roles = list("Research Director","Roboticist")
show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_robo
sort_category = "Uniforms"
cost = 1
@@ -554,16 +554,19 @@
display_name = "warden belted cloak (Teshari)"
path = /obj/item/clothing/suit/storage/teshari/beltcloak/jobs/wrdn
allowed_roles = list("Head of Security","Warden")
sort_category = "Xenowear"
/datum/gear/suit/dept/beltcloak/jani
display_name = "janitor belted cloak (Teshari)"
path = /obj/item/clothing/suit/storage/teshari/beltcloak/jobs/jani
allowed_roles = list("Janitor")
sort_category = "Xenowear"
/datum/gear/suit/dept/beltcloak/cmd
display_name = "command belted cloak (Teshari)"
path = /obj/item/clothing/suit/storage/teshari/beltcloak/jobs/command
allowed_roles = list("Site Manager","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer","Research Director")
sort_category = "Xenowear"
/datum/gear/suit/cloak_hood
display_name = "hooded cloak selection (Teshari)"
@@ -11,6 +11,7 @@
S["capture_crystal"] >> pref.capture_crystal
S["auto_backup_implant"] >> pref.auto_backup_implant
S["borg_petting"] >> pref.borg_petting
S["stomach_vision"] >> pref.stomach_vision
/datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S)
S["show_in_directory"] << pref.show_in_directory
@@ -21,12 +22,21 @@
S["capture_crystal"] << pref.capture_crystal
S["auto_backup_implant"] << pref.auto_backup_implant
S["borg_petting"] << pref.borg_petting
S["stomach_vision"] << pref.stomach_vision
/datum/category_item/player_setup_item/vore/misc/copy_to_mob(var/mob/living/carbon/human/character)
if(pref.sensorpref > 5 || pref.sensorpref < 1)
pref.sensorpref = 5
character.sensorpref = pref.sensorpref
character.capture_crystal = pref.capture_crystal
//Vore Stomach Sprite Preference
character.stomach_vision = pref.stomach_vision
if((character && !istype(character,/mob/living/carbon/human/dummy)) && character.stomach_vision && !(VIS_CH_STOMACH in character.vis_enabled))
character.plane_holder.set_vis(VIS_CH_STOMACH,TRUE)
character.vis_enabled += VIS_CH_STOMACH
else if((character && !istype(character,/mob/living/carbon/human/dummy)) && !character.stomach_vision && (VIS_CH_STOMACH in character.vis_enabled))
character.plane_holder.set_vis(VIS_CH_STOMACH,FALSE)
character.vis_enabled -= VIS_CH_STOMACH
/datum/category_item/player_setup_item/vore/misc/sanitize_character()
pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory))
@@ -36,6 +46,7 @@
pref.capture_crystal = sanitize_integer(pref.capture_crystal, 0, 1, initial(pref.capture_crystal))
pref.auto_backup_implant = sanitize_integer(pref.auto_backup_implant, 0, 1, initial(pref.auto_backup_implant))
pref.borg_petting = sanitize_integer(pref.borg_petting, 0, 1, initial(pref.borg_petting))
pref.stomach_vision = sanitize_integer(pref.stomach_vision, 0, 1, initial(pref.stomach_vision))
/datum/category_item/player_setup_item/vore/misc/content(var/mob/user)
. += "<br>"
@@ -47,6 +58,7 @@
. += "<b>Capture Crystal Preference:</b> <a [pref.capture_crystal ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_capture_crystal=1'><b>[pref.capture_crystal ? "Yes" : "No"]</b></a><br>"
. += "<b>Spawn With Backup Implant:</b> <a [pref.auto_backup_implant ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_implant=1'><b>[pref.auto_backup_implant ? "Yes" : "No"]</b></a><br>"
. += "<b>Allow petting as robot:</b> <a [pref.borg_petting ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_borg_petting=1'><b>[pref.borg_petting ? "Yes" : "No"]</b></a><br>"
. += "<b>Enable Stomach Sprites:</b> <a [pref.stomach_vision ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_stomach_vision=1'><b>[pref.stomach_vision ? "Yes" : "No"]</b></a><br>"
/datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user)
if(href_list["toggle_show_in_directory"])
@@ -84,4 +96,7 @@
else if(href_list["toggle_borg_petting"])
pref.borg_petting = pref.borg_petting ? 0 : 1;
return TOPIC_REFRESH
else if(href_list["toggle_stomach_vision"])
pref.stomach_vision = pref.stomach_vision ? 0 : 1;
return TOPIC_REFRESH
return ..();
+1
View File
@@ -7,6 +7,7 @@
var/capture_crystal = 1 //Whether or not someone is able to be caught with capture crystals
var/auto_backup_implant = FALSE //Whether someone starts with a backup implant or not.
var/borg_petting = TRUE //Whether someone can be petted as a borg or not.
var/stomach_vision = TRUE //Whether or not someone can view stomach sprites
var/job_talon_high = 0
var/job_talon_med = 0
@@ -210,6 +210,13 @@
if(Adjacent(user) && src.loc == user)
. += "<span class='notice'>You are currently facing [dir2text(user.dir)]. The micro beacon is [gps.tracking ? "on" : "off"].</span>"
var/TB = src.loc.loc
if(istype(TB, /turf/)) //no point returning light level if we're not on a turf (might be *in* someone!)
var/turf/TL = TB
var/light_level = TL.get_lumcount()
if(light_level)
. += "<span class='notice'>Light Level: [TL.get_lumcount()]</span>"
else
. += "<span class='notice'>It's too dark to see the light level!</span>"
if(istype(TB, /turf/simulated)) //no point returning atmospheric data from unsimulated tiles (they don't track pressure anyway, only temperature)
var/turf/simulated/T = TB
var/datum/gas_mixture/env = T.return_air()
@@ -171,6 +171,7 @@
sprite_sheets = list(
SPECIES_HUMAN = 'icons/inventory/suit/mob_vr.dmi',
SPECIES_TAJ = 'icons/inventory/suit/mob_vr_tajaran.dmi',
SPECIES_LLEILL = 'icons/inventory/suit/mob_vr_tajaran.dmi',
SPECIES_SKRELL = 'icons/inventory/suit/mob_vr_skrell.dmi',
SPECIES_UNATHI = 'icons/inventory/suit/mob_vr_unathi.dmi',
SPECIES_XENOHYBRID = 'icons/inventory/suit/mob_vr_unathi.dmi',
@@ -201,13 +202,15 @@
SPECIES_NEVREAN = 'icons/inventory/suit/item_vr.dmi',
SPECIES_RAPALA = 'icons/inventory/suit/item_vr.dmi',
SPECIES_ALRAUNE = 'icons/inventory/suit/item_vr.dmi',
SPECIES_ZADDAT = 'icons/inventory/suit/item_vr.dmi'
SPECIES_ZADDAT = 'icons/inventory/suit/item_vr.dmi',
SPECIES_LLEILL = 'icons/inventory/suit/item_vr.dmi'
)
/obj/item/clothing/head/helmet/space/void/responseteam
sprite_sheets = list(
SPECIES_HUMAN = 'icons/inventory/head/mob_vr.dmi',
SPECIES_TAJ = 'icons/inventory/head/mob_vr_tajaran.dmi',
SPECIES_LLEILL = 'icons/inventory/suit/mob_vr_tajaran.dmi',
SPECIES_SKRELL = 'icons/inventory/head/mob_vr_skrell.dmi',
SPECIES_UNATHI = 'icons/inventory/head/mob_vr_unathi.dmi',
SPECIES_XENOHYBRID = 'icons/inventory/head/mob_vr_unathi.dmi',
@@ -238,5 +241,6 @@
SPECIES_NEVREAN = 'icons/inventory/head/item_vr.dmi',
SPECIES_RAPALA = 'icons/inventory/head/item_vr.dmi',
SPECIES_ALRAUNE = 'icons/inventory/head/item_vr.dmi',
SPECIES_ZADDAT = 'icons/inventory/head/item_vr.dmi'
SPECIES_ZADDAT = 'icons/inventory/head/item_vr.dmi',
SPECIES_LLEILL = 'icons/inventory/suit/item_vr.dmi'
)
+8 -19
View File
@@ -43,7 +43,6 @@
else
return "It's difficult to tell how much it'll influence your speed."
/obj/item/clothing/get_description_info()
var/armor_stats = description_info + "\
<br>"
@@ -70,28 +69,18 @@
if(flags & AIRTIGHT)
armor_stats += "It is airtight. \n"
if(min_pressure_protection == 0 && max_pressure_protection >= WARNING_HIGH_PRESSURE) //0 to 325
armor_stats += "Wearing this will protect you from the vacuum of space and from high pressures. \n"
else if(min_pressure_protection <= WARNING_LOW_PRESSURE && max_pressure_protection >= WARNING_HIGH_PRESSURE) //50 to 325
armor_stats += "Wearing this will protect you from both low and high pressures, but not the vacuum of space. \n"
else if(min_pressure_protection == 0)
armor_stats += "Wearing this will protect you from the vacuum of space. \n"
else if(min_pressure_protection <= WARNING_LOW_PRESSURE) //50 or below
armor_stats += "Wearing this will protect you from low pressures, but not the vacuum of space. \n"
else if(max_pressure_protection >= WARNING_HIGH_PRESSURE) //325 or higher
armor_stats += "Wearing this will protect you from high pressures. \n"
if(min_pressure_protection != null)
armor_stats += "It is rated for pressures as low as [min_pressure_protection] kPa. \n"
if(max_pressure_protection)
armor_stats += "It is rated for pressures as high as [max_pressure_protection] kPa. \n"
if(flags & THICKMATERIAL) //stops syringes
armor_stats += "The material is exceptionally thick. \n"
if(max_heat_protection_temperature >= FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE && min_cold_protection_temperature <= SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE) //30000 or higher and as low as 2
armor_stats += "It provides exceptional protection from extremely high and low temperatures alike. \n"
else if(max_heat_protection_temperature >= SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE && min_cold_protection_temperature <= SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE) //5000 or above, but less than 30000
armor_stats += "It provides very good protection against hazardous temperatures at both extremes, but may not be sufficient for very high-intensity situations. \n"
else if(max_heat_protection_temperature >= FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE) //30000 or above
armor_stats += "It provides exceptional protection from extremely high temperatures. \n"
else if(min_cold_protection_temperature <= SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE) //2 or less
armor_stats += "It provides exceptional protection against very low temperatures. \n"
if(min_cold_protection_temperature)
armor_stats += "It is rated for temperatures as low as [min_cold_protection_temperature] Kelvin. \n"
if(max_heat_protection_temperature)
armor_stats += "It is rated for temperatures as high as [max_heat_protection_temperature] Kelvin. \n"
var/list/covers = list()
var/list/slots = list()
+10 -1
View File
@@ -179,7 +179,16 @@
return ..()
/obj/item/weapon/reagent_containers/food/drinks/self_feed_message(var/mob/user)
to_chat(user, "<span class='notice'>You swallow a gulp from \the [src].</span>")
if(amount_per_transfer_from_this == volume) //I wanted to use a switch, but switch statements can't use vars and the maximum volume of containers varies
to_chat(user, "<span class='notice'>You knock back the entire [src] in one go!</span>")
else if(amount_per_transfer_from_this <= 4) //below the standard 5
to_chat(user, "<span class='notice'>You take a modest sip from \the [src].</span>")
else if(amount_per_transfer_from_this <= 10) //the standard five to a bit more
to_chat(user, "<span class='notice'>You swallow a gulp from \the [src].</span>")
else if(amount_per_transfer_from_this <= 30)
to_chat(user, "<span class='notice'>You take a long drag from \the [src].</span>")
else //default message as a fallback
to_chat(user, "<span class='notice'>You swallow a gulp from \the [src].</span>")
/obj/item/weapon/reagent_containers/food/drinks/feed_sound(var/mob/user)
playsound(src, 'sound/items/drink.ogg', rand(10, 50), 1)
+19
View File
@@ -180,6 +180,25 @@
var/obj/item/weapon/broken_bottle/B = smash(target.loc, target)
user.put_in_active_hand(B)
/obj/item/weapon/reagent_containers/food/drinks/bottle/verb/spin_bottle()
set name = "Spin The Bottle"
set category = "Object"
set src in view(1)
if(isobserver(usr) || usr.stat)
return
if(!isturf(src.loc))
to_chat(usr, "<span class='notice'>\The [src] needs to be on the floor to spin.</span>")
return
var/spin_rotation = (rand(0,359))
usr.visible_message("<span class='warning'>\The [usr] spins \the [src]!</span>","<span class='notice'>You spin \the [src]!</span>")
SpinAnimation(3,10)
spawn(30)
icon_rotation = spin_rotation
update_transform()
//Keeping this here for now, I'll ask if I should keep it here.
/obj/item/weapon/broken_bottle
name = "Broken Bottle"
@@ -65,7 +65,7 @@
set_trait(TRAIT_MATURATION,7)
set_trait(TRAIT_PRODUCTION,5)
set_trait(TRAIT_YIELD,5)
set_trait(TRAIT_PRODUCT_ICON,"lavender")
set_trait(TRAIT_PRODUCT_ICON,"flower6")
set_trait(TRAIT_PRODUCT_COLOUR,"#B57EDC")
set_trait(TRAIT_PLANT_COLOUR,"#6B8C5E")
set_trait(TRAIT_PLANT_ICON,"flower4")
+1 -1
View File
@@ -191,7 +191,7 @@
stop_playing()
else if(href_list["setlinearfalloff"])
var/amount = tgui_input_number(usr, "Set linear sustain duration in seconds", "Linear Sustain Duration")
var/amount = tgui_input_number(usr, "Set linear sustain duration in seconds", "Linear Sustain Duration", round_value=FALSE)
if(!isnull(amount))
set_linear_falloff_duration(round(amount * 10, world.tick_lag))
+1 -1
View File
@@ -59,7 +59,7 @@
set_new_volume(usr)
/client/proc/set_new_volume(var/mob/user)
if(!QDELETED(src.media) || !istype(src.media))
if(QDELETED(src.media) || !istype(src.media))
to_chat(user, "<span class='warning'>You have no media datum to change, if you're not in the lobby tell an admin.</span>")
return
var/value = input(usr, "Choose your Jukebox volume.", "Jukebox volume", media.volume)
+15
View File
@@ -143,6 +143,21 @@
/datum/language/echosong/scramble(var/input, var/list/known_languages)
return stars(input)
/datum/language/lleill
name = LANGUAGE_LLEILL
desc = "An ancient, gutteral language involving a lot of spitting."
speech_verb = "speaks"
ask_verb = "ponders"
exclaim_verb = "calls"
colour = "echosong"
key = "L"
syllables = list(
"llyn", "bren", "gwyn", "gwyr", "ddys", "dath", "llio", "cym", "ddrai", "ffyr", "lle", "dy", "eto", "uno", "dydno", "llego", "bryth", "ffair",
"ynys", "ed", "fore", "oe", "hen", "wladd", "ty", "nha", "dwy", "mae", "dros", "pob", "ia", "wyll", "gwdd", "fi"
)
machine_understands = FALSE
flags = WHITELISTED
/datum/language/echosong/broadcast(var/mob/living/speaker, var/message, var/speaker_mask)
log_say("(INAUDIBLE) [message]", speaker)
speaker.say_signlang(format_message(message), pick(signlang_verb), pick(signlang_verb_understood), src, 2)
+7 -1
View File
@@ -15,6 +15,7 @@
var/cleaning = 0
var/wet_floors = 0
var/spray_blood = 0
var/blood = 1
var/list/target_types = list()
/mob/living/bot/cleanbot/New()
@@ -138,7 +139,8 @@
if(prob(20))
custom_emote(2, "begins to clean up \the [loc]")
if(do_after(src, cleantime * cTimeMult))
clean_blood()
if(blood)
clean_blood()
if(istype(loc, /turf/simulated))
var/turf/simulated/T = loc
T.dirt = 0
@@ -186,6 +188,7 @@
data["on"] = on
data["open"] = open
data["locked"] = locked
data["blood"] = blood
data["patrol"] = will_patrol
data["vocal"] = vocal
@@ -207,6 +210,9 @@
else
turn_on()
. = TRUE
if("blood")
blood = !blood
. = TRUE
if("patrol")
will_patrol = !will_patrol
patrol_path = null
+1 -1
View File
@@ -213,4 +213,4 @@
user.drop_item()
qdel(W)
user.drop_from_inventory(src)
qdel(src)
qdel(src)
@@ -7,6 +7,17 @@
has_huds = TRUE //We do have HUDs (like health, wanted, status, not inventory slots)
var/vore_capacity = 3
var/vore_capacity_ex = list("stomach" = 3, "taur belly" = 3)
var/vore_fullness_ex = list("stomach" = 0, "taur belly" = 0)
var/vore_icon_bellies = list("stomach", "taur belly")
var/struggle_anim_stomach = FALSE
var/struggle_anim_taur = FALSE
var/vore_sprite_color = list("stomach" = "#FFFFFF", "taur belly" = "#FFFFFF")
var/vore_sprite_multiply = list("stomach" = TRUE, "taur belly" = TRUE)
var/vore_fullness = 0
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
var/last_push_time //For human_attackhand.dm, keeps track of the last use of disarm
@@ -19,6 +30,7 @@
var/can_defib = 1 //Horrible damage (like beheadings) will prevent defibbing organics.
var/active_regen = FALSE //Used for the regenerate proc in human_powers.dm
var/active_regen_delay = 300
var/list/teleporters = list() //Used for lleill abilities
/mob/living/carbon/human/Initialize(mapload, var/new_species = null)
if(!dna)
@@ -1777,3 +1789,19 @@
/mob/living/carbon/human/get_mob_riding_slots()
return list(back, head, wear_suit)
/mob/living/carbon/human/proc/update_fullness()
var/list/new_fullness = list()
vore_fullness = 0
for(var/belly_class in vore_icon_bellies)
new_fullness[belly_class] = 0
for(var/obj/belly/B as anything in vore_organs)
new_fullness[B.belly_sprite_to_affect] += B.GetFullnessFromBelly()
for(var/belly_class in vore_icon_bellies)
new_fullness[belly_class] /= size_multiplier //Divided by pred's size so a macro mob won't get macro belly from a regular prey.
new_fullness[belly_class] = round(new_fullness[belly_class], 1) // Because intervals of 0.25 are going to make sprite artists cry.
vore_fullness_ex[belly_class] = min(vore_capacity_ex[belly_class], new_fullness[belly_class])
vore_fullness += new_fullness[belly_class]
vore_fullness = min(vore_capacity, vore_fullness)
update_vore_belly_sprite()
update_vore_tail_sprite()
@@ -192,6 +192,15 @@
compiled_vis |= VIS_CH_VANTAG
//VOREStation Add End
//Vore Stomach addition start. This goes here.
if(stomach_vision && !(VIS_CH_STOMACH in vis_enabled))
plane_holder.set_vis(VIS_CH_STOMACH,TRUE)
compiled_vis += VIS_CH_STOMACH
else if(!stomach_vision && (VIS_CH_STOMACH in vis_enabled))
plane_holder.set_vis(VIS_CH_STOMACH,FALSE)
compiled_vis -= VIS_CH_STOMACH
//Vore Stomach addition end
if(!compiled_vis.len && !vis_enabled.len)
return //Nothin' doin'.
@@ -31,3 +31,6 @@
/mob/living/carbon/human/altevian/New(var/new_loc)
..(new_loc, SPECIES_ALTEVIAN)
/mob/living/carbon/human/lleill/New(var/new_loc)
..(new_loc, SPECIES_LLEILL)
@@ -0,0 +1,178 @@
/datum/species/lleill
name = SPECIES_LLEILL
name_plural = "Lleill"
icobase = 'icons/mob/human_races/r_lleill.dmi'
deform = 'icons/mob/human_races/r_lleill.dmi'
color_mult = 1
tail = "tail"
icobase_tail = 1
blurb = "A species that appears to originate somewhere in redspace. Their forms are not consistent, \
they do not care for consistency, and are working under a constant never-ending drive to improve themselves \
and the world around them. With little care for whether the world itself wants to change." //PLACEHOLDER
blood_color = "#FFFFFF"
blood_name = "glamour"
flesh_color = "#FFFFFF"
reagent_tag = IS_LLEILL
num_alternate_languages = 3
species_language = LANGUAGE_LLEILL
language = LANGUAGE_LLEILL
name_language = LANGUAGE_LLEILL
flags = NO_SCAN | NO_MINOR_CUT | NO_INFECT | NO_HALLUCINATION
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_UNDERWEAR
max_age = 200
economic_modifier = 15
digi_allowed = TRUE
//Specific abilities
darksight = 10 //Can see in dark
burn_mod = 0.25 //Very resistant to fire
pain_mod = 0.25 //Whilst not resistant to brute or stunning, they are quite resistant to pain, making them tanky in their own way.
warning_low_pressure = 50
hazard_low_pressure = -1
warning_high_pressure = 300
hazard_high_pressure = 10000 //Can be killed by pressure but you're going to need a hell of a lot
cold_level_1 = -1 //Safe in space
cold_level_2 = -1
cold_level_3 = -1
heat_level_1 = 1500 //Very resiliant to heat
heat_level_2 = 2500
heat_level_3 = 5000
can_space_freemove = TRUE //Have no issue moving through space.
can_zero_g_move = TRUE
chem_strength_alcohol = 0 //Can't get drunk
oxy_mod = 0.25 //Suffocates very slowly, but does ultimately need to breathe, will outpace heal most oxygen damage.
poison_type = null //Not harmed by phoron.
water_breather = TRUE
var/list/valid_transform_species = list(
"Human", "Unathi", "Tajara", "Skrell",
"Diona", "Teshari", "Monkey","Sergal",
"Akula","Nevrean","Zorren",
"Fennec", "Vulpkanin", "Vasilissan",
"Rapala", "Neaera", "Stok", "Farwa", "Sobaka",
"Wolpin", "Saru", "Sparra", "Lleill")
// Looks like a lot but the majority of these are just to change their appearance.
inherent_verbs = list(
/mob/living/carbon/human/proc/lleill_select_colour,
/mob/living/carbon/human/proc/lleill_select_shape,
/mob/living/carbon/human/proc/shapeshifter_select_hair,
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
/mob/living/carbon/human/proc/shapeshifter_select_gender,
/mob/living/carbon/human/proc/shapeshifter_select_wings,
/mob/living/carbon/human/proc/shapeshifter_select_tail,
/mob/living/carbon/human/proc/shapeshifter_select_ears,
/mob/living/proc/set_size,
/mob/living/carbon/human/proc/lleill_invisibility,
/mob/living/carbon/human/proc/lleill_transmute,
/mob/living/carbon/human/proc/lleill_rings)
//organs, going with just the basics for now
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
O_APPENDIX = /obj/item/organ/internal/appendix,
O_SPLEEN = /obj/item/organ/internal/spleen,
O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
)
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/lleill),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
base_species = SPECIES_LLEILL
// Shapeshifters have some behaviour that doesn't play well with this species so I have taken the main parts needed for here.
/datum/species/lleill/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
return valid_transform_species
/datum/species/lleill/get_icobase(var/mob/living/carbon/human/H, var/get_deform)
if(!H) return ..(null, get_deform)
var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
if(!S || S.type == src.type) return ..(H, get_deform)
return S.get_icobase(H,get_deform)
/datum/species/lleill/get_race_key(var/mob/living/carbon/human/H)
return "[..()]-[wrapped_species_by_ref["\ref[H]"]]"
/datum/species/lleill/get_bodytype(var/mob/living/carbon/human/H)
var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
if(!H || !S) return ..()
if(S.type == src.type) return ..(H)
return S.get_bodytype(H)
/datum/species/lleill/get_blood_mask(var/mob/living/carbon/human/H)
if(!H) return ..()
var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
if(!S || S.name == src.name)
return ..()
return S?.get_blood_mask(H)
/datum/species/lleill/get_damage_mask(var/mob/living/carbon/human/H)
if(!H) return ..()
var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
if(!S || S.name == src.name)
return ..()
return S?.get_damage_mask(H)
/datum/species/lleill/get_damage_overlays(var/mob/living/carbon/human/H)
if(!H) return ..()
var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
if(!S || S.name == src.name)
return ..()
return S?.get_damage_overlays(H)
/datum/species/lleill/get_tail(var/mob/living/carbon/human/H)
if(!H) return ..()
var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
if(!S || S.name == src.name)
return ..()
return S?.get_tail(H)
/datum/species/lleill/get_tail_animation(var/mob/living/carbon/human/H)
if(!H) return ..()
var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
if(!S || S.name == src.name)
return ..()
return S?.get_tail_animation(H)
/datum/species/lleill/get_tail_hair(var/mob/living/carbon/human/H)
if(!H) return ..()
var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
if(!S || S.name == src.name)
return ..()
return S?.get_tail_hair(H)
@@ -0,0 +1,179 @@
/datum/power/lleill
// Simple ability to become invisible. Does not phase you out of the world, you can still interact with things and can not pass through walls.
// Essentially the same as traitor cloaking, using the same proc for it.
/datum/power/lleill/invisibility
name = "Invisibility"
desc = "Change your appearance to match your surroundings, becoming completely invisible to the naked eye."
verbpath = /mob/living/carbon/human/proc/lleill_invisibility
/mob/living/carbon/human/proc/lleill_invisibility()
set name = "Invisibility"
set desc = "Change your appearance to match your surroundings, becoming completely invisible to the naked eye."
set category = "Abilities"
if(stat)
to_chat(src, "<span class='warning'>You can't go invisible when weakened like this.</span>")
return
if(!cloaked)
cloak()
to_chat(src, "<span class='warning'>Your fur shimmers and shifts around you, hiding you from the naked eye.</span>")
else
uncloak()
to_chat(src, "<span class='warning'>The brustling of your fur settles down and you become visible once again.</span>")
/mob/living/carbon/human/proc/lleill_select_shape()
set name = "Select Body Shape"
set category = "Abilities"
if(stat || world.time < last_special)
return
last_special = world.time + 50
var/new_species = null
new_species = tgui_input_list(usr, "Please select a species to emulate.", "Shapeshifter Body", species.get_valid_shapeshifter_forms(src))
if(!new_species || !GLOB.all_species[new_species] || wrapped_species_by_ref["\ref[src]"] == new_species)
return
lleill_change_shape(new_species)
/mob/living/carbon/human/proc/lleill_change_shape(var/new_species = null)
if(!new_species)
return
wrapped_species_by_ref["\ref[src]"] = new_species
dna.base_species = new_species
species.base_species = new_species
visible_message("<b>\The [src]</b> shifts and contorts, taking the form of \a [new_species]!")
regenerate_icons()
/mob/living/carbon/human/proc/lleill_select_colour()
set name = "Select Body Colour"
set category = "Abilities"
if(stat || world.time < last_special)
return
last_special = world.time + 50
var/new_skin = input(usr, "Please select a new body color.", "Shapeshifter Colour", rgb(r_skin, g_skin, b_skin)) as null|color
if(!new_skin)
return
lleill_set_colour(new_skin)
/mob/living/carbon/human/proc/lleill_set_colour(var/new_skin)
r_skin = hex2num(copytext(new_skin, 2, 4))
g_skin = hex2num(copytext(new_skin, 4, 6))
b_skin = hex2num(copytext(new_skin, 6, 8))
r_synth = r_skin
g_synth = g_skin
b_synth = b_skin
for(var/obj/item/organ/external/E in organs)
E.sync_colour_to_human(src)
regenerate_icons()
/mob/living/carbon/human/proc/lleill_transmute()
set name = "Transmute Object"
set desc = "Convert an object into a piece of glamour."
set category = "Abilities"
var/list/transmute_list = list(
/obj/item/weapon/potion_material/glamour_transparent,
/obj/item/weapon/potion_material/glamour_shrinking,
/obj/item/weapon/potion_material/glamour_twinkling,
/obj/item/weapon/potion_material/glamour_shard,
/obj/item/capture_crystal/glamour,
/obj/item/glamour_face,
/obj/item/device/universal_translator/glamour
)
if(stat)
to_chat(src, "<span class='warning'>You can't go do that when weakened like this.</span>")
return
var/obj/item/I = get_active_hand()
if(!I)
to_chat(src, "<span class='warning'>You have no item in your active hand.</span>")
return
var/obj/item/transmute_product = tgui_input_list(src, "Choose an glamour to transmute the item into:", "Transmutation", transmute_list)
if(!get_active_hand(I))
to_chat(src, "<span class='warning'>The item is no longer in your hands.</span>")
return
else
visible_message("<b>\The [src]</b> begins to change the form of \the [I].")
if(!do_after(usr, 10 SECONDS, I, exclusive = TASK_USER_EXCLUSIVE))
visible_message("<b>\The [src]</b> leaves \the [I] in its original form.")
return 0
visible_message("<b>\The [src]</b> transmutes \the [I] into a \the [transmute_product.name].")
drop_item(I)
qdel(I)
var/spawnloc = get_turf(usr)
var/obj/item/N = new transmute_product(spawnloc)
put_in_active_hand(N)
/mob/living/carbon/human/proc/lleill_rings()
set name = "Place/Use Rings"
set desc = "Place or teleport to a glamour ring."
set category = "Abilities"
if(stat)
to_chat(src, "<span class='warning'>You can't go do that when weakened like this.</span>")
return
if(buckled)
to_chat(src,"<span class='warning'>You can't do that when restrained.</span>")
var/r_action = tgui_alert(src, "What would you like to do with your rings?", "Actions", list("Spawn New Ring", "Teleport to Ring", "Cancel"))
if(r_action == "Cancel")
return
if(r_action == "Spawn New Ring")
if(!do_after(src, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
src.visible_message("<b>\The [src]</b> begins to form white rings on the ground.")
return 0
to_chat(src, "<span class='warning'>You place a new glamour ring at your feet.</span>")
var/spawnloc = get_turf(src)
var/obj/structure/glamour_ring/R = new(spawnloc)
src.teleporters |= R
if(r_action == "Teleport to Ring")
if(!src.teleporters.len)
to_chat(src, "<span class='warning'>You need to place rings to teleport to them.</span>")
return
else
var/obj/structure/glamour_ring/R = tgui_input_list(src, "Where do you wish to teleport?", "Teleport", src.teleporters)
var/datum/effect/effect/system/spark_spread/spk
spk = new(src)
var/T = get_turf(src)
spk.set_up(5, 0, src)
spk.attach(src)
playsound(T, "sparks", 50, 1)
anim(T,src,'icons/mob/mob.dmi',,"phaseout",,src.dir)
var/S = get_turf(R)
src.forceMove(S)
spk.start()
playsound(S, 'sound/effects/phasein.ogg', 25, 1)
playsound(S, 'sound/effects/sparks2.ogg', 50, 1)
anim(S,src,'icons/mob/mob.dmi',,"phasein",,src.dir)
spk.set_up(5, 0, src)
spk.attach(src)
//Would be fun to eat people standing on your ring...
if(can_be_drop_pred && vore_selected)
var/list/target_list = src.living_mobs(0)
if(target_list.len)
for(var/mob/living/M in target_list)
if(M.devourable && M.can_be_drop_prey)
M.forceMove(vore_selected)
to_chat(M,"<span class='vwarning'>In a bright flash of white light, you suddenly find yourself trapped in \the [src]'s [vore_selected.name]!</span>")
@@ -0,0 +1,198 @@
//Transparent Glamour (invisibility potion)
/obj/item/weapon/potion_material/glamour_transparent
name = "transparent glamour"
desc = "A shard of hardened white crystal that is clearly translucent."
icon = 'icons/obj/glamour.dmi'
icon_state = "transparent"
base_reagent = /obj/item/weapon/potion_base/aqua_regia
product_potion = /obj/item/weapon/reagent_containers/glass/bottle/potion/invisibility
/obj/item/weapon/reagent_containers/glass/bottle/potion/invisibility
name = "transparent potion"
desc = "A small white potion, the clear liquid inside can barely be seen at all."
prefill = list("transparent glamour" = 1)
/datum/reagent/glamour_transparent
name = "Clear Glamour"
id = "transparent glamour"
description = "This material is from somewhere else, it can barely be seen by the naked eye."
taste_description = "nothingness"
reagent_state = LIQUID
color = "#ffffff"
scannable = 1
/datum/reagent/glamour_transparent/affect_blood(var/mob/living/carbon/target, var/removed)
if(!target.cloaked)
target.visible_message("<b>\The [target]</b> vanishes from sight.")
target.cloak()
target.bloodstr.clear_reagents() //instantly clears reagents afterwards
target.ingested.clear_reagents()
target.touching.clear_reagents()
spawn(600)
if(target.cloaked)
target.uncloak()
target.visible_message("<b>\The [target]</b> appears as if from thin air.")
//Shrinking Glamour (scaling potion)
/obj/item/weapon/potion_material/glamour_shrinking
name = "shrinking glamour"
desc = "A soft clump of white material that seems to shrink at your touch."
icon = 'icons/obj/glamour.dmi'
icon_state = "shrinking"
base_reagent = /obj/item/weapon/potion_base/aqua_regia
product_potion = /obj/item/weapon/reagent_containers/glass/bottle/potion/scaling
/obj/item/weapon/reagent_containers/glass/bottle/potion/scaling
name = "scaling potion"
desc = "A small white potion, the clear liquid inside can barely be seen at all."
prefill = list("scaling glamour" = 1)
/datum/reagent/glamour_scaling
name = "Scaling Glamour"
id = "scaling glamour"
description = "This material is from somewhere else, it appears to change volumes readily at a glance."
taste_description = "difficult to discern"
reagent_state = LIQUID
color = "#ffffff"
scannable = 1
/datum/reagent/glamour_scaling/affect_blood(var/mob/living/carbon/target, var/removed)
if(!(/mob/living/proc/set_size in target.verbs))
to_chat(target, "<span class='warning'>You feel as though you could change size at any moment.</span>")
target.verbs |= /mob/living/proc/set_size
target.bloodstr.clear_reagents() //instantly clears reagents afterwards
target.ingested.clear_reagents()
target.touching.clear_reagents()
//Twinkling Glamour (Sparkling potion - Gives darksight)
/obj/item/weapon/potion_material/glamour_twinkling
name = "twinkling glamour"
desc = "A sheet of white material that twinkles on its own accord."
icon = 'icons/obj/glamour.dmi'
icon_state = "twinkling"
base_reagent = /obj/item/weapon/potion_base/aqua_regia
product_potion = /obj/item/weapon/reagent_containers/glass/bottle/potion/darksight
/obj/item/weapon/reagent_containers/glass/bottle/potion/darksight
name = "twinling potion"
desc = "A small white potion, the thin white liquid inside twinkles brightly."
prefill = list("twinkling glamour" = 1)
/datum/reagent/glamour_twinkling
name = "Twinkling Glamour"
id = "twinkling glamour"
description = "This material is from somewhere else, it appears to be twinkling."
taste_description = "bright"
reagent_state = LIQUID
color = "#ffffff"
scannable = 1
/datum/reagent/glamour_twinkling/affect_blood(var/mob/living/carbon/human/target, var/removed)
if(target.species.darksight < 10)
to_chat(target, "<span class='warning'>You can suddenly see much better than before.</span>")
target.species.darksight = 10
if(target.disabilities & NEARSIGHTED)
target.disabilities &= ~NEARSIGHTED
to_chat(target, "<span class='warning'>Everything is much less blurry.</span>")
target.bloodstr.clear_reagents() //instantly clears reagents afterwards
target.ingested.clear_reagents()
target.touching.clear_reagents()
//Glamour Cell (variant of capture crystal)
/obj/item/capture_crystal/glamour
name = "glamour cell"
desc = "A large but light round ball of glamour that glows from somewhere within."
icon = 'icons/obj/glamour.dmi'
/obj/item/capture_crystal/glamour/animate_action(atom/thing)
var/image/coolanimation = image('icons/obj/glamour.dmi', null, "animation")
coolanimation.plane = PLANE_LIGHTING_ABOVE
thing.overlays += coolanimation
sleep(14)
thing.overlays -= coolanimation
//Face of Glamour (creates a clone of a target)
/obj/item/glamour_face
name = "face of glamour"
desc = "A piece of glamour that is formed vaguely into the shape of a face."
icon = 'icons/obj/glamour.dmi'
icon_state = "face"
var/mob/living/homunculus = 0
/obj/item/glamour_face/attack_self(var/mob/user)
if(!homunculus)
var/list/targets = list()
for(var/mob/living/carbon/human/M in mob_list)
if(M.z != user.z || get_dist(user,M) > 10)
continue
if(istype(M) && M.resleeve_lock && M.ckey != M.resleeve_lock)
continue
targets |= M
if(!targets)
to_chat(user, "<span class='warning'>There are no appropriate targets in range.</span>")
return
var/mob/living/carbon/human/chosen_target = tgui_input_list(user, "Which target do you wish to create a homunculus of?", "homunculus", targets)
var/spawnloc = get_turf(user)
var/mob/living/simple_mob/homunculus/H = new(spawnloc)
H.name = chosen_target.name
H.desc = chosen_target.desc
H.icon = chosen_target.icon
H.icon_state = chosen_target.icon_state
H.copy_overlays(chosen_target, TRUE)
H.resize(chosen_target.size_multiplier, ignore_prefs = TRUE)
homunculus = H
H.owner = src
return
if(homunculus)
var/mob/living/simple_mob/homunculus/H = homunculus
var/h_action = tgui_alert(user, "What would you like to do with your homunculus?", "Actions", list("Recall", "Speak Through", "Cancel"))
if(h_action == "Cancel")
return
if(h_action == "Recall")
H.visible_message("<b>\The [H]</b> returns to the face.")
qdel(H)
homunculus = 0
return
if(h_action == "Speak Through")
var/words_to_say = tgui_input_text(user, "What should the homunculus say:", "Speak Through")
H.say(words_to_say)
return
//Speaking Glamour (universal translator)
/obj/item/device/universal_translator/glamour
name = "speaking glamour"
desc = "A shard of glamour that translates all known language for the user."
icon = 'icons/obj/glamour.dmi'
icon_state = "translator"
//Teleporter ring
/obj/structure/glamour_ring
name = "glamour ring"
desc = "A ring of glowing white, oddly reflective material."
icon = 'icons/obj/glamour.dmi'
icon_state = "ring"
density = 0
anchored = 1
var/connected_mob
var/area_name
/obj/structure/glamour_ring/Initialize()
. = ..()
var/area/A = get_area(src)
area_name = A.name
name = "[area_name] glamour ring"
//Glamour Floor
//Glamour Wall
@@ -108,7 +108,7 @@
var/chem_strength_heal = 1 // Multiplier to most beneficial chem strength
var/chem_strength_pain = 1 // Multiplier to painkiller strength (could be used in a negative trait to simulate long-term addiction reducing effects, etc.)
var/chem_strength_tox = 1 // Multiplier to toxic chem strength (inc. chloral/sopo/mindbreaker/etc. thresholds)
var/chem_strength_alcohol = 1 // Multiplier to alcohol strength; 0.5 = half, 0 = no effect at all, 2 = double, etc.
var/chem_strength_alcohol = 1 // Multiplier to alcohol effect thresholds; higher means more is needed to reach a given effect tier
var/chemOD_threshold = 1 // Multiplier to overdose threshold; lower = easier overdosing
var/chemOD_mod = 1 // Damage modifier for overdose; higher = more damage from ODs
@@ -222,6 +222,8 @@
var/rarity_value = 1 // Relative rarity/collector value for this species.
var/economic_modifier = 2 // How much money this species makes
var/vore_belly_default_variant = "H"
// Determines the organs that the species spawns with and
var/list/has_organ = list( // which required-organ checks are conducted.
O_HEART = /obj/item/organ/internal/heart,
@@ -61,7 +61,7 @@ var/datum/species/shapeshifter/promethean/prometheans
item_slowdown_mod = 1.33
throwforce_absorb_threshold = 10
chem_strength_alcohol = 2
chem_strength_alcohol = 0.5
cloning_modifier = /datum/modifier/cloning_sickness/promethean
@@ -71,7 +71,7 @@
name_language = LANGUAGE_UNATHI
species_language = LANGUAGE_UNATHI
health_hud_intensity = 2.5
chem_strength_alcohol = 0.75
chem_strength_alcohol = 1.25
throwforce_absorb_threshold = 10
digi_allowed = TRUE
@@ -198,7 +198,7 @@
name_language = LANGUAGE_SIIK
species_language = LANGUAGE_SIIK
health_hud_intensity = 2.5
chem_strength_alcohol = 1.25
chem_strength_alcohol = 0.75
digi_allowed = TRUE
min_age = 17
@@ -303,7 +303,7 @@
species_language = LANGUAGE_SKRELLIAN
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN)
health_hud_intensity = 2
chem_strength_alcohol = 5
chem_strength_alcohol = 0.2
water_movement = -3
@@ -522,7 +522,7 @@
show_ssd = "completely quiescent"
health_hud_intensity = 2.5
item_slowdown_mod = 0.1
chem_strength_alcohol = 0
chem_strength_alcohol = 10000 //a little hacky, maybe? but whatever. nobody plays diona anyway.
throwforce_absorb_threshold = 5
num_alternate_languages = 3
@@ -1529,3 +1529,145 @@
if(Adjacent(target)) //We leapt at them but we didn't manage to hit them, let's see if we're next to them
target.Weaken(2) //get knocked down, idiot
/mob/living/proc/injection() // Allows the user to inject reagents into others somehow, like stinging, or biting.
set name = "Injection"
set category = "Abilities"
set desc = "Inject another being with something!"
if(stat || paralysis || weakened || stunned || world.time < last_special) //Epic copypasta from tongue grabbing.
to_chat(src, "<span class='warning'>You can't do that in your current state.</span>")
return
last_special = world.time + 10 //Anti-spam.
var/list/choices = list("Inject")
if(trait_injection_reagents.len > 1) //Should never happen, but who knows!
choices += "Change reagent"
else if(!trait_injection_selected)
trait_injection_selected = trait_injection_reagents[1]
choices += "Change amount"
choices += "Change verb"
choices += "Chemical Refresher"
var/choice = tgui_alert(src, "Do you wish to inject somebody, or adjust settings?", "Selection List", choices)
if(choice == "Change reagent")
var/reagent_choice = tgui_input_list(usr, "Choose which reagent to inject!", "Select reagent", trait_injection_reagents)
if(reagent_choice)
trait_injection_selected = reagent_choice
to_chat(src, "<span class='notice'>You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."]</span>")
return
if(choice == "Change amount")
var/amount_choice = tgui_input_number(usr, "How much of the reagent do you want to inject? (Up to 5 units) (Can select 0 for a bite that doesn't inject venom!)", "How much?", trait_injection_amount, 5, 0)
if(amount_choice >= 0)
trait_injection_amount = amount_choice
to_chat(src, "<span class='notice'>You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."]</span>")
return
if(choice == "Change verb")
var/verb_choice = tgui_input_text(usr, "Choose the percieved manner of injection, such as 'bites' or 'stings', don't be misleading or abusive. This will show up in game as ('X' 'Verb' 'Y'. Example: X bites Y.)", "How are you injecting?", trait_injection_verb, max_length = 60) //Whoaa there cowboy don't put a novel in there.
if(verb_choice)
trait_injection_verb = verb_choice
to_chat(src, "<span class='notice'>You will [trait_injection_verb] your targets.</span>")
return
if(choice == "Chemical Refresher")
var/output = {"<B>Chemical Refresher!</B><HR>
<B>Options for venoms</B><BR>
<BR>
<B>Size Chemicals</B><BR>
Microcillin: Will make someone shrink. <br>
Macrocillin: Will make someone grow. <br>
Normalcillin: Will make someone normal size. <br>
Note: 1 unit = 100% size diff. 0.01 unit = 1% size diff. <br>
Note: Normacillin stops at 100% size. <br>
<br>
<B>Gender Chemicals</B><BR>
Androrovir: Will transform someone's sex to male. <br>
Gynorovir: Will transform someone's sex to female. <br>
Androgynorovir: Will transform someone's sex to plural. <br>
<br>
<B>Special Chemicals</B><BR>
Stoxin: Will make someone drowsy. <br>
Rainbow Toxin: Will make someone see rainbows. <br>
Paralysis Toxin: Will make someone paralyzed. <br>
Numbing Enzyme: Will make someone unable to feel pain. <br>
Pain Enzyme: Will make someone feel amplified pain. <br>
<br>
<B>Side Notes</B><BR>
You can select a value of 0 to inject nothing! <br>
Overdose threshold for most chemicals is 30 units. <br>
Exceptions to OD is: (Numbing Enzyme:20)<br>
You can also bite synthetics, but due to how synths work, they won't have anything injected into them.
<br>
"}
usr << browse(output,"window=chemicalrefresher")
return
else
var/list/targets = list() //IF IT IS NOT BROKEN. DO NOT FIX IT. AND KEEP COPYPASTING IT (Pointing Rick Dalton: "That's my code!" ~CL)
for(var/mob/living/carbon/L in living_mobs(1, TRUE)) //Noncarbons don't even process reagents so don't bother listing others.
if(!istype(L, /mob/living/carbon))
continue
if(L == src) //no getting high off your own supply, get a nif or something, nerd.
continue
if(!L.resizable && (trait_injection_selected == "macrocillin" || trait_injection_selected == "microcillin" || trait_injection_selected == "normalcillin")) // If you're using a size reagent, ignore those with pref conflicts.
continue
if(!L.allow_spontaneous_tf && (trait_injection_selected == "androrovir" || trait_injection_selected == "gynorovir" || trait_injection_selected == "androgynorovir")) // If you're using a TF reagent, ignore those with pref conflicts.
continue
targets += L
if(!(targets.len))
to_chat(src, "<span class='notice'>No eligible targets found.</span>")
return
var/mob/living/target = tgui_input_list(src, "Please select a target.", "Victim", targets)
if(!target)
return
if(!istype(target, /mob/living/carbon)) //Safety.
to_chat(src, "<span class='warning'>That won't work on that kind of creature! (Only works on crew/monkeys)</span>")
return
var/synth = 0
if(target.isSynthetic())
synth = 1
if(!trait_injection_selected)
to_chat(src, "<span class='notice'>You need to select a reagent.</span>")
return
if(!trait_injection_verb)
to_chat(src, "<span class='notice'>Somehow, you forgot your means of injecting. (Select a verb!)</span>")
return
if(do_after(src, 50, target)) //A decent enough timer.
add_attack_logs(src,target,"Injection trait ([trait_injection_selected], [trait_injection_amount])")
if(target.reagents && (trait_injection_amount > 0) && !synth)
target.reagents.add_reagent(trait_injection_selected, trait_injection_amount)
var/ourmsg = "<span class='warning'>[usr] [trait_injection_verb] [target] "
switch(zone_sel.selecting)
if(BP_HEAD)
ourmsg += "on the head!"
if(BP_TORSO)
ourmsg += "on the chest!"
if(BP_GROIN)
ourmsg += "on the groin!"
if(BP_R_ARM, BP_L_ARM)
ourmsg += "on the arm!"
if(BP_R_HAND, BP_L_HAND)
ourmsg += "on the hand!"
if(BP_R_LEG, BP_L_LEG)
ourmsg += "on the leg!"
if(BP_R_FOOT, BP_L_FOOT)
ourmsg += "on the foot!"
if("mouth")
ourmsg += "on the mouth!"
if("eyes")
ourmsg += "on the eyes!"
ourmsg += "</span>"
visible_message(ourmsg)
@@ -143,6 +143,45 @@
H.verbs |= /mob/living/carbon/human/proc/succubus_drain_finalize
H.verbs |= /mob/living/carbon/human/proc/succubus_drain_lethal
/datum/trait/neutral/venom_bite
name = "Venomous Injection"
desc = "Allows for injecting prey through one method or another to inject them with a variety of chemicals with varying effects!"
tutorial = "This trait allows you to bite prey with varying effects! <br> \
Options for venoms: <br> \
=====Size Chemicals ===== <br> \
Microcillin: Will make someone shrink. (This is 1% per 0.01 units. So 1 unit = 100% size change) <br> \
Macrocillin: Will make someone grow. (This is 1% per 0.01 units. So 1 unit = 100% size change) <br> \
Normalcillin: Will make someone normal size. (This is 1% per 0.01 units. So 1 unit = 100% size change) Stops at 100% size. <br> \
===== Gender Chemicals ===== <br> \
Androrovir: Will transform someone's sex to male. <br> \
Gynorovir: Will transform someone's sex to female. <br> \
Androgynorovir: Will transform someone's sex to pleural. <br> \
===== Special Chemicals ===== <br> \
Stoxin: Will make someone drowsy. <br> \
Rainbow Toxin: Will make someone see rainbows. <br> \
Paralysis Toxin: Will make someone paralyzed. <br> \
Numbing Enzyme: Will make someone unable to feel pain. <br> \
Pain Enzyme: Will make someone feel pain, amplifieed <br> \
===== Side Notes ===== <br> \
You aren't required to inject anything if you prefer to just use it as a normal bite!"
cost = 0
custom_only = FALSE
/datum/trait/neutral/venom_bite/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..()
H.verbs |= /mob/living/proc/injection
H.trait_injection_reagents += "microcillin" // get small
H.trait_injection_reagents += "macrocillin" // get BIG
H.trait_injection_reagents += "normalcillin" // normal
H.trait_injection_reagents += "numbenzyme" // no feelings
H.trait_injection_reagents += "androrovir" // -> MALE
H.trait_injection_reagents += "gynorovir" // -> FEMALE
H.trait_injection_reagents += "androgynorovir" // -> PLURAL
H.trait_injection_reagents += "stoxin" // night night chem
H.trait_injection_reagents += "rainbowtoxin" // Funny flashing lights.
H.trait_injection_reagents += "paralysistoxin" // Paralysis!
H.trait_injection_reagents += "painenzyme" // Pain INCREASER
/datum/trait/neutral/long_vore
name = "Long Predatorial Reach"
desc = "Makes you able to use an unspecified appendage to grab creatures."
@@ -482,21 +521,21 @@
desc = "The only way you can hold a drink is if it's in your own two hands, and even then you'd best not inhale too deeply near it. Alcohol hits you three times as hard as they do other people."
cost = 0
custom_only = FALSE
var_changes = list("chem_strength_alcohol" = 3)
var_changes = list("chem_strength_alcohol" = 0.33)
/datum/trait/neutral/alcohol_intolerance_basic
name = "Liver of Lilies"
desc = "You have a hard time with alcohol. Maybe you just never took to it, or maybe it doesn't agree with your system... either way, alcohol hits you twice as hard."
cost = 0
custom_only = FALSE
var_changes = list("chem_strength_alcohol" = 2)
var_changes = list("chem_strength_alcohol" = 0.5)
/datum/trait/neutral/alcohol_intolerance_slight
name = "Liver of Tulips"
desc = "You are what some might call 'a bit of a lightweight', but you can still keep your drinks down... most of the time. Alcohol hits you fifty percent harder."
cost = 0
custom_only = FALSE
var_changes = list("chem_strength_alcohol" = 1.5)
var_changes = list("chem_strength_alcohol" = 0.75)
/datum/trait/neutral/alcohol_tolerance_reset
name = "Liver of Unremarkableness"
@@ -511,21 +550,21 @@
desc = "You can hold drinks much better than those lily-livered land-lubbers! Arr! Alcohol's effects on you are reduced by about a quarter."
cost = 0
custom_only = FALSE
var_changes = list("chem_strength_alcohol" = 0.75)
var_changes = list("chem_strength_alcohol" = 1.25)
/datum/trait/neutral/alcohol_tolerance_advanced
name = "Liver of Steel"
desc = "Drinks tremble before your might! You can hold your alcohol twice as well as those blue-bellied barnacle boilers! Alcohol has just half the effect on you as it does on others."
cost = 0
custom_only = FALSE
var_changes = list("chem_strength_alcohol" = 0.5)
var_changes = list("chem_strength_alcohol" = 2)
/datum/trait/neutral/alcohol_immunity
name = "Liver of Durasteel"
desc = "You've drunk so much that most booze doesn't even faze you. It takes something like a Pan-Galactic or a pint of Deathbell for you to even get slightly buzzed."
cost = 0
custom_only = FALSE
var_changes = list("chem_strength_alcohol" = 0.25)
var_changes = list("chem_strength_alcohol" = 4)
// Alcohol Traits End Here.
/datum/trait/neutral/colorblind/mono
@@ -97,7 +97,10 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
#define FIRE_LAYER 35 //'Mob on fire' overlay layer
// # define MOB_WATER_LAYER 36 //'Mob submerged' overlay layer // Moved to global defines
#define TARGETED_LAYER 37 //'Aimed at' overlay layer
#define TOTAL_LAYERS 37 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
#define VORE_BELLY_LAYER 38
#define VORE_TAIL_LAYER 39
#define TOTAL_LAYERS 39 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
//////////////////////////////////
/mob/living/carbon/human
@@ -421,6 +424,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//tail
update_tail_showing()
update_wing_showing()
update_vore_belly_sprite()
update_vore_tail_sprite()
/mob/living/carbon/human/proc/update_skin()
if(QDESTROYING(src))
@@ -1060,7 +1065,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
apply_layer(tail_layer)
return
var/species_tail = species.get_tail(src) // Species tail icon_state prefix.
var/species_tail = species?.get_tail(src) // Species tail icon_state prefix.
//This one is actually not that bad I guess.
if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
@@ -1393,6 +1398,74 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if((. = ..()))
update_wing_showing()
/mob/living/carbon/human/proc/update_vore_belly_sprite()
if(QDESTROYING(src))
return
remove_layer(VORE_BELLY_LAYER)
var/image/vore_belly_image = get_vore_belly_image()
if(vore_belly_image)
vore_belly_image.layer = BODY_LAYER+VORE_BELLY_LAYER
overlays_standing[VORE_BELLY_LAYER] = vore_belly_image
vore_belly_image.plane = PLANE_CH_STOMACH //This one line of code. This ONE LINE OF CODE TOOK 6 HOURS TO FIGURE OUT. THANK YOU REDCAT.
apply_layer(VORE_BELLY_LAYER)
/mob/living/carbon/human/proc/get_vore_belly_image()
if(!(wear_suit && wear_suit.flags_inv & HIDETAIL))
var/vs_fullness = vore_fullness_ex["stomach"]
var/icon/vorebelly_s = new/icon(icon = 'icons/mob/vore/Bellies.dmi', icon_state = "[species.vore_belly_default_variant]Belly[vs_fullness][struggle_anim_stomach ? "" : " idle"]")
vorebelly_s.Blend(vore_sprite_color["stomach"], vore_sprite_multiply["stomach"] ? ICON_MULTIPLY : ICON_ADD)
var/image/working = image(vorebelly_s)
working.overlays += em_block_image_generic(working)
return working
return null
/mob/living/carbon/human/proc/vore_belly_animation()
if(!struggle_anim_stomach)
struggle_anim_stomach = TRUE
update_vore_belly_sprite()
spawn(12)
struggle_anim_stomach = FALSE
update_vore_belly_sprite()
/mob/living/carbon/human/proc/update_vore_tail_sprite()
if(QDESTROYING(src))
return
remove_layer(VORE_TAIL_LAYER)
var/image/vore_tail_image = get_vore_tail_image()
if(vore_tail_image)
vore_tail_image.layer = BODY_LAYER+VORE_TAIL_LAYER
overlays_standing[VORE_TAIL_LAYER] = vore_tail_image
vore_tail_image.plane = PLANE_CH_STOMACH //This one line of code. This ONE LINE OF CODE TOOK 6 HOURS TO FIGURE OUT. THANK YOU REDCAT.
apply_layer(VORE_TAIL_LAYER)
/mob/living/carbon/human/proc/get_vore_tail_image()
if(tail_style && istaurtail(tail_style) && tail_style:vore_tail_sprite_variant)
var/vs_fullness = vore_fullness_ex["taur belly"]
var/loaf_alt = lying && tail_style:belly_variant_when_loaf
var/fullness_icons = min(tail_style.fullness_icons, vs_fullness)
var/icon/vorebelly_s = new/icon(icon = tail_style.bellies_icon_path, icon_state = "Taur[tail_style:vore_tail_sprite_variant]-Belly-[fullness_icons][loaf_alt ? " loaf" : (struggle_anim_taur ? "" : " idle")]")
vorebelly_s.Blend(vore_sprite_color["taur belly"], vore_sprite_multiply["taur belly"] ? ICON_MULTIPLY : ICON_ADD)
var/image/working = image(vorebelly_s)
working.pixel_x = -16
if(tail_style.em_block)
working.overlays += em_block_image_generic(working)
return working
return null
/mob/living/carbon/human/proc/vore_tail_animation()
if(tail_style.struggle_anim && !struggle_anim_taur)
struggle_anim_taur = TRUE
update_vore_tail_sprite()
spawn(12)
struggle_anim_taur = FALSE
update_vore_tail_sprite()
//Human Overlays Indexes/////////
#undef MUTATIONS_LAYER
#undef SKIN_LAYER
@@ -56,8 +56,8 @@
user.show_message("\t Damage Specifics: [span_orange("[BU]")] - [span_red("[BR]")]")
if(M.tod && M.stat == DEAD)
user.show_message(span_blue("Time of Disable: [M.tod]"))
var/mob/living/silicon/robot/H = M
var/obj/item/weapon/cell/cell = H.get_cell()
var/mob/living/silicon/robot/R = M
var/obj/item/weapon/cell/cell = R.get_cell()
if(cell)
var/cell_charge = round(cell.percent())
var/cell_text
@@ -72,7 +72,7 @@
else
cell_text = span_red("<b>[cell_charge]</b>")
user.show_message("\t Power Cell Status: [span_blue("[capitalize(cell.name)]")] at [cell_text]% charge")
var/list/damaged = H.get_damaged_components(1,1,1)
var/list/damaged = R.get_damaged_components(1,1,1)
user.show_message(span_blue("Localized Damage:"),1)
if(length(damaged)>0)
for(var/datum/robot_component/org in damaged)
@@ -85,12 +85,12 @@
(org.powered) ? "Power ON" : "[span_red("Power OFF")]")),1)
else
user.show_message(span_blue("\t Components are OK."),1)
if(H.emagged && prob(5))
if(R.emagged && prob(5))
user.show_message(span_red("\t ERROR: INTERNAL SYSTEMS COMPROMISED"),1)
user.show_message(span_blue("Operating Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)"), 1)
else
var/mob/living/silicon/robot/H = M
var/obj/item/weapon/cell/cell = H.get_cell()
var/mob/living/silicon/robot/R = M
var/obj/item/weapon/cell/cell = R.get_cell()
user.show_message(span_blue("Upgrade Analyzing Results for [M]:"))
if(cell)
user.show_message("\t Power Cell Details: [span_blue("[capitalize(cell.name)]")] with a capacity of [cell.maxcharge] at [round(cell.percent())]% charge")
@@ -98,12 +98,12 @@
for(var/datum/design/item/prosfab/robot_upgrade/utility/upgrade)
var/obj/item/borg/upgrade/utility/upgrade_type = initial(upgrade.build_path)
var/needs_module = initial(upgrade_type.require_module)
if((!H.module && needs_module) || !initial(upgrade.name) || (H.stat != DEAD && initial(upgrade.name) == "Emergency Restart Module"))
if((!R.module && needs_module) || !initial(upgrade.name) || (R.stat != DEAD && (upgrade_type == /obj/item/borg/upgrade/utility/restart)) || (isshell(R) && (upgrade_type == /obj/item/borg/upgrade/utility/rename)))
continue
if(show_title)
user.show_message("\t Utility Modules, used for modifying purposes:")
show_title = FALSE
if(H.stat == DEAD)
if(R.stat == DEAD)
if(initial(upgrade.name) == "Emergency Restart Module")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_green("Usable")]"))
else
@@ -112,55 +112,55 @@
for(var/datum/design/item/prosfab/robot_upgrade/basic/upgrade)
var/obj/item/borg/upgrade/basic/upgrade_type = initial(upgrade.build_path)
var/needs_module = initial(upgrade_type.require_module)
if((!H.module && needs_module) || !initial(upgrade.name) || H.stat == DEAD)
if((!R.module && needs_module) || !initial(upgrade.name) || R.stat == DEAD)
continue
if(show_title)
user.show_message("\t Basic Modules, used for direct upgrade purposes:")
show_title = FALSE
if(H.has_basic_upgrade(initial(upgrade.build_path)) == "")
if(R.has_basic_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("<b>ERROR</b>")]"))
else
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_basic_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [R.has_basic_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
show_title = TRUE
for(var/datum/design/item/prosfab/robot_upgrade/advanced/upgrade)
var/obj/item/borg/upgrade/advanced/upgrade_type = initial(upgrade.build_path)
var/needs_module = initial(upgrade_type.require_module)
if((!H.module && needs_module) || !initial(upgrade.name) || H.stat == DEAD)
if((!R.module && needs_module) || !initial(upgrade.name) || R.stat == DEAD)
continue
if(show_title)
user.show_message("\t Advanced Modules, used for module upgrade purposes:")
show_title = FALSE
if(H.has_advanced_upgrade(initial(upgrade.build_path)) == "")
if(R.has_advanced_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("<b>ERROR</b>")]"))
else
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_advanced_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [R.has_advanced_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
show_title = TRUE
for(var/datum/design/item/prosfab/robot_upgrade/restricted/upgrade)
var/obj/item/borg/upgrade/restricted/upgrade_type = initial(upgrade.build_path)
var/needs_module = initial(upgrade_type.require_module)
if((!H.module && needs_module) || !initial(upgrade.name) || !H.supports_upgrade(initial(upgrade.build_path)) || H.stat == DEAD)
if((!R.module && needs_module) || !initial(upgrade.name) || !R.supports_upgrade(initial(upgrade.build_path)) || R.stat == DEAD)
continue
if(show_title)
user.show_message("\t Restricted Modules, used for module upgrade purposes on specific chassis:")
show_title = FALSE
if(H.has_restricted_upgrade(initial(upgrade.build_path)) == "")
if(R.has_restricted_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("<b>ERROR</b>")]"))
else
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_restricted_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [R.has_restricted_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
show_title = TRUE
for(var/datum/design/item/prosfab/robot_upgrade/no_prod/upgrade)
var/obj/item/borg/upgrade/no_prod/upgrade_type = initial(upgrade.build_path)
var/needs_module = initial(upgrade_type.require_module)
var/hidden = initial(upgrade_type.hidden_from_scan)
if((!H.module && needs_module) || !initial(upgrade.name) || hidden || H.stat == DEAD)
if((!R.module && needs_module) || !initial(upgrade.name) || hidden || R.stat == DEAD)
continue
if(show_title)
user.show_message("\t Special Modules, used for recreation purposes:")
show_title = FALSE
if(H.has_no_prod_upgrade(initial(upgrade.build_path)) == "")
if(R.has_no_prod_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("<b>ERROR</b>")]"))
else
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_no_prod_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [R.has_no_prod_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
if("prosthetics")
@@ -42,7 +42,7 @@
//VOREStation Edit - multiz lol
if(D.foreign_droid)
continue
drones.Add(list(list(
"name" = D.real_name,
"active" = D.stat != 2,
@@ -56,7 +56,10 @@
data["fabricator"] = dronefab
data["fabPower"] = dronefab?.produce_drones
data["areas"] = GLOB.tagger_locations
var/list/areas = list()
for(var/area in GLOB.tagger_locations)
areas += area
data["areas"] = areas
data["selected_area"] = "[drone_call_area]"
return data
@@ -427,7 +427,7 @@
set category = "Robot Commands"
if(custom_name)
to_chat(usr, "You can't pick another custom name. Go ask for a name change.")
to_chat(usr, "You can't pick another custom name. [isshell(src) ? "" : "Go ask for a name change."]")
return 0
spawn(0)
@@ -0,0 +1,35 @@
/mob/living/simple_mob/homunculus
name = "homunculus"
desc = "A strange misshapen humanoid creature made purely from glamour!"
icon_dead = "homunculus"
icon_living = "homunculus"
icon_state = "homunculus"
icon = 'icons/mob/vore.dmi'
ai_holder_type = /datum/ai_holder/simple_mob/passive
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
var/owner
/mob/living/simple_mob/homunculus/death()
if(owner)
var/obj/item/glamour_face/O = owner
O.homunculus = 0
qdel(src)
/mob/living/simple_mob/homunculus/update_icon()
return
/mob/living/simple_mob/homunculus/update_icons()
return
+1
View File
@@ -1,5 +1,6 @@
/mob
var/vantag_hud = 0 // Do I have the HUD enabled?
var/stomach_vision = 1 // By default, you will see stomachs.
var/mob/temporary_form // For holding onto a temporary form
var/disconnect_time = null //Time of client loss, set by Logout(), for timekeeping
+38
View File
@@ -1,5 +1,13 @@
/mob/recalculate_vis()
. = ..()
if(stomach_vision && !(VIS_CH_STOMACH in vis_enabled))
plane_holder.set_vis(VIS_CH_STOMACH,TRUE)
vis_enabled += VIS_CH_STOMACH
else if(!stomach_vision && (VIS_CH_STOMACH in vis_enabled))
plane_holder.set_vis(VIS_CH_STOMACH,FALSE)
vis_enabled -= VIS_CH_STOMACH
if(!plane_holder || !vis_enabled)
return
@@ -12,3 +20,33 @@
plane_holder.set_vis(VIS_CH_VANTAG,FALSE)
vis_enabled -= VIS_CH_VANTAG
return
/mob/verb/toggle_stomach_vision()
set name = "Toggle Stomach Sprites"
set category = "Preferences"
set desc = "Toggle the ability to see stomachs or not"
var/toggle
toggle = tgui_alert(src, "Would you like to see visible stomachs?", "Visible Tummy?", list("Yes", "No"))
if(toggle =="Yes")
stomach_vision = 1 //Simple! Easy!
if(!(VIS_CH_STOMACH in vis_enabled))
plane_holder.set_vis(VIS_CH_STOMACH,TRUE)
vis_enabled += VIS_CH_STOMACH
to_chat("You can now see stomachs!")
else
stomach_vision = 0
if(VIS_CH_STOMACH in vis_enabled)
plane_holder.set_vis(VIS_CH_STOMACH,FALSE)
vis_enabled -= VIS_CH_STOMACH
to_chat("You will no longer see stomachs!")
/* //Leaving this in as an example of 'how to properly enable a plane to hide/show itself' for future PRs.
if(stomach_vision && !(VIS_CH_STOMACH in vis_enabled))
plane_holder.set_vis(VIS_CH_STOMACH,TRUE)
vis_enabled += VIS_CH_STOMACH
else if(!stomach_vision && (VIS_CH_STOMACH in vis_enabled))
plane_holder.set_vis(VIS_CH_STOMACH,FALSE)
vis_enabled -= VIS_CH_STOMACH
*/
+1
View File
@@ -4,6 +4,7 @@
plane_masters[VIS_CH_HEALTH_VR] = new /obj/screen/plane_master{plane = PLANE_CH_HEALTH_VR} //Health bar but transparent at 100
plane_masters[VIS_CH_BACKUP] = new /obj/screen/plane_master{plane = PLANE_CH_BACKUP} //Backup implant status
plane_masters[VIS_CH_VANTAG] = new /obj/screen/plane_master{plane = PLANE_CH_VANTAG} //Vore Antags
plane_masters[VIS_CH_STOMACH] = new /obj/screen/plane_master{plane = PLANE_CH_STOMACH} //Stomach
plane_masters[VIS_AUGMENTED] = new /obj/screen/plane_master/augmented(M = my_mob) //Augmented reality
..()
@@ -9,7 +9,7 @@
name = "You should not see this..."
icon = 'icons/mob/vore/ears_vr.dmi'
do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use
color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
// Species-unique ears
@@ -30,6 +30,17 @@
do_colouration = 1
extra_overlay = "shadekin-round-inner"
/datum/sprite_accessory/ears/lleill
name = "Lleill Ears, colorable"
desc = ""
icon = 'icons/mob/vore/ears_32x64.dmi'
icon_state = "lleill"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
extra_overlay = "lleill-antlers"
species_allowed = list(SPECIES_LLEILL)
// Ears avaliable to anyone
/datum/sprite_accessory/ears/alien_slug
@@ -1058,3 +1058,12 @@
extra_overlay2 = "zorgoia_fluff_top"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/tail/lleill
name = "Lleill tail"
desc = ""
icon = 'icons/mob/species/lleill/tail.dmi'
icon_state = "tail"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
extra_overlay = "tail_marking"
@@ -13,7 +13,7 @@
var/mob_offset_x = 0
var/mob_offset_y = 0
do_colouration = 0 //Set to 1 to enable coloration using the tail color.
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use
var/list/lower_layer_dirs = list(SOUTH)
var/icon_loaf = null
@@ -1,3 +1,10 @@
/datum/sprite_accessory/tail
var/vore_tail_sprite_variant = ""
var/belly_variant_when_loaf = FALSE
var/fullness_icons = 0
var/struggle_anim = FALSE
var/bellies_icon_path = 'icons/mob/vore/Taur_Bellies.dmi'
/datum/riding/taur
keytype = /obj/item/weapon/material/twohanded/riding_crop // Crack!
nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs.
@@ -355,4 +362,70 @@
/datum/sprite_accessory/tail/taur/zorgoia/fat
name = "Zorgoia (Fat Taur)"
extra_overlay = "zorgoia_fat"
extra_overlay = "zorgoia_fat"
/datum/sprite_accessory/tail/taur/wolf
vore_tail_sprite_variant = "N"
fullness_icons = 3
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/naga/naga_2c
vore_tail_sprite_variant = "Naga"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/horse
vore_tail_sprite_variant = "Horse"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/cow
vore_tail_sprite_variant = "Cow"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/lizard
vore_tail_sprite_variant = "Lizard"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/lizard/synthlizard
vore_tail_sprite_variant = "SynthLiz"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/feline
vore_tail_sprite_variant = "Feline"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/slug
vore_tail_sprite_variant = "Slug"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/drake
vore_tail_sprite_variant = "Drake"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/otie
vore_tail_sprite_variant = "Otie"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/deer
vore_tail_sprite_variant = "Deer"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/skunk
vore_tail_sprite_variant = "Skunk"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
@@ -60,6 +60,9 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 4
vore_tail_sprite_variant = "N"
fullness_icons = 3
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/wolf/fatwolf
name = "Fat Wolf (Taur)"
@@ -131,6 +134,10 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 3
vore_tail_sprite_variant = "Skunk" //Sadly there appears to be no sprites... For now!
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/naga
name = "Naga (Taur)"
@@ -165,34 +172,43 @@
msg_prey_stepunder = "You jump over %prey's thick tail."
msg_owner_stepunder = "%owner bounds over your tail."
/datum/sprite_accessory/tail/taur/naga/naga_2c
/datum/sprite_accessory/tail/taur/naga/vore_compatable
name = "Naga (Taur) (Vore Compatable)"
vore_tail_sprite_variant = "Naga"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/naga/vore_compatable/naga_2c
name = "Naga dual-color (Taur)"
icon_state = "naga_s"
extra_overlay = "naga_markings"
//icon_sprite_tag = "naga2c"
vore_tail_sprite_variant = "Naga"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/naga/alt_2c
/datum/sprite_accessory/tail/taur/naga/vore_compatable/alt_2c
name = "Naga alt style dual-color (Taur)"
suit_sprites = 'icons/mob/taursuits_naga_alt_vr.dmi'
icon_state = "altnaga_s"
extra_overlay = "altnaga_markings"
//icon_sprite_tag = "altnaga2c"
/datum/sprite_accessory/tail/taur/naga/alt_3c
/datum/sprite_accessory/tail/taur/naga/vore_compatable/alt_3c
name = "Naga alt style tri-color (Taur)"
suit_sprites = 'icons/mob/taursuits_naga_alt_vr.dmi'
icon_state = "altnaga_s"
extra_overlay = "altnaga_markings"
extra_overlay2 = "altnaga_stripes"
/datum/sprite_accessory/tail/taur/naga/alt_3c_rattler
/datum/sprite_accessory/tail/taur/naga/vore_compatable/alt_3c_rattler
name = "Naga alt style tri-color, rattler (Taur)"
suit_sprites = 'icons/mob/taursuits_naga_alt_vr.dmi'
icon_state = "altnaga_s"
extra_overlay = "altnaga_markings"
extra_overlay2 = "altnaga_rattler"
/datum/sprite_accessory/tail/taur/naga/alt_3c_tailmaw
/datum/sprite_accessory/tail/taur/naga/vore_compatable/alt_3c_tailmaw
name = "Naga alt style tri-color, tailmaw (Taur)"
suit_sprites = 'icons/mob/taursuits_naga_alt_vr.dmi'
icon_state = "altnagatailmaw_s"
@@ -208,6 +224,9 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 4
vore_tail_sprite_variant = "Horse"
fullness_icons = 1
struggle_anim = TRUE
msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!"
msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!"
@@ -242,6 +261,9 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 3
vore_tail_sprite_variant = "Cow"
fullness_icons = 1
struggle_anim = TRUE
msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!"
msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!"
@@ -267,6 +289,10 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 7
vore_tail_sprite_variant = "Deer"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!"
msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!"
@@ -303,6 +329,9 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 5
vore_tail_sprite_variant = "Lizard"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/lizard/fatlizard
name = "Fat Lizard (Taur)"
@@ -349,6 +378,9 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 3
vore_tail_sprite_variant = "SynthLiz"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/lizard/fatsynthlizard
name = "Fat SynthLizard dual-color (Taur)"
@@ -424,6 +456,10 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 5
vore_tail_sprite_variant = "Feline"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/fatfeline
name = "Fat Feline (Taur)"
@@ -529,6 +565,9 @@
icon_state = "slug_s"
suit_sprites = 'icons/mob/taursuits_slug_vr.dmi'
icon_sprite_tag = "slug"
vore_tail_sprite_variant = "Slug"
fullness_icons = 1
struggle_anim = TRUE
msg_owner_help_walk = "You carefully slither around %prey."
msg_prey_help_walk = "%owner's huge tail slithers past beside you!"
@@ -599,6 +638,10 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 6
vore_tail_sprite_variant = "Drake"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/drake/fat
name = "Fat Drake (Taur)"
@@ -626,6 +669,10 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 5
vore_tail_sprite_variant = "Otie"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/alraune/alraune_2c
name = "Alraune (dual color)"
@@ -1071,4 +1118,4 @@
offset_x = -32
offset_y = -11
mob_offset_y = 11
*/
*/
@@ -6,7 +6,7 @@
/datum/sprite_accessory/hair
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use the default hairstyles.
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use the default hairstyles.
/datum/sprite_accessory/hair/astolfo
name = "Astolfo"
@@ -485,20 +485,20 @@
/datum/sprite_accessory/facial_hair
icon = 'icons/mob/human_face_or_vr.dmi'
color_blend_mode = ICON_MULTIPLY
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use the facial hair styles.
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use the facial hair styles.
/datum/sprite_accessory/facial_hair/shaved
name = "Shaved"
icon_state = "bald"
gender = NEUTER
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This needed to be manually defined, apparantly.
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This needed to be manually defined, apparantly.
/datum/sprite_accessory/facial_hair/neck_fluff
name = "Neck Fluff"
icon = 'icons/mob/human_face_or_vr.dmi'
icon_state = "facial_neckfluff"
gender = NEUTER
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN)
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL)
/datum/sprite_accessory/facial_hair/vulp_none
name = "None"
@@ -9,7 +9,7 @@
name = "You should not see this..."
icon = 'icons/mob/vore/wings_vr.dmi'
do_colouration = 0 //Set to 1 to enable coloration using the tail color.
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use
color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
var/wing_offset = 0
var/multi_dir = FALSE // Does it use different sprites at different layers? _front will be added for sprites on low layer, _back to high layer
+3 -1
View File
@@ -93,7 +93,7 @@
if(portal_type == "Weird Green")
portal_icon_selection = "type-b-portal"
if(portal_type == "Pulsing")
var/portal_subtype = tgui_alert(user, "Which subtype would you prefer?", "Subtype Selection", list("Blue","Red","Blue/Red Mix", "Yellow"))
var/portal_subtype = tgui_alert(user, "Which subtype would you prefer?", "Subtype Selection", list("Blue","Red","Blue/Red Mix", "Yellow", "White"))
if(portal_subtype == "Blue")
portal_icon_selection = "type-c-blue-portal"
if(portal_subtype == "Red")
@@ -102,6 +102,8 @@
portal_icon_selection = "type-c-mix-portal"
if(portal_subtype == "Yellow")
portal_icon_selection = "type-c-yellow-portal"
if(portal_subtype == "White")
portal_icon_selection = "type-c-white-portal"
return portal_icon_selection
/obj/structure/portal_event/proc/teleport(atom/movable/M as mob|obj)
+1 -1
View File
@@ -293,7 +293,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
notify("Adjoining optic [human.isSynthetic() ? "interface" : "nerve"], please be patient.",TRUE)
else
notify("You are not an authorized user for this device. Please contact [owner].",TRUE)
unimplant()
unimplant(human)
stat = NIF_TEMPFAIL
return FALSE
+3
View File
@@ -0,0 +1,3 @@
/obj/item/organ/external/head/lleill
eye_icon_location = 'icons/mob/human_face_vr.dmi'
eye_icon = "eyes_lleill"
+1 -1
View File
@@ -229,7 +229,7 @@
for(var/datum/supply_order/SO as anything in SSsupply.shoppinglist)
supplyOrderCount++
supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.ordered_by, "Comment" = html_encode(SO.comment))
supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.approved_by, "Comment" = html_encode(SO.comment))
supplyData["approved"] = supplyOrderData
supplyData["approved_count"] = supplyOrderCount
+4 -1
View File
@@ -314,7 +314,9 @@
// Compile all the newscasts
for(var/datum/feed_channel/channel in news_network.network_channels)
if(!channel.censored)
var/index = 0
for(var/datum/feed_message/FM in channel.messages)
index++
var/body = replacetext(FM.body, "\n", "<br>")
news[++news.len] = list(
"channel" = channel.channel_name,
@@ -324,7 +326,8 @@
"time_stamp" = FM.time_stamp,
"has_image" = (FM.img != null),
"caption" = FM.caption,
"time" = FM.post_time
"time" = FM.post_time,
"index" = index
)
// Cut out all but the youngest three
+1 -1
View File
@@ -805,7 +805,7 @@ GLOBAL_LIST_EMPTY(apcs)
"emagged" = emagged,
"isOperating" = operating,
"externalPower" = main_status,
"powerCellStatus" = cell ? cell.percent() : null,
"powerCellStatus" = cell ? cell.percent() : 0,
"chargeMode" = chargemode,
"chargingStatus" = charging,
"totalLoad" = round(lastused_total),
@@ -152,7 +152,7 @@
var/chemicals[0]
for(var/label in cartridges)
var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = cartridges[label]
chemicals.Add(list(list("title" = label, "id" = label, "amount" = C.reagents.total_volume))) // list in a list because Byond merges the first list...
chemicals.Add(list(list("name" = label, "id" = label, "volume" = C.reagents.total_volume))) // list in a list because Byond merges the first list...
data["chemicals"] = chemicals
return data
@@ -40,7 +40,7 @@
to_chat(H, "<span class='notice'>\The [src] is placed on your [affecting].</span>")
M.drop_from_inventory(src) //icon update
if(reagents.total_volume)
reagents.trans_to_mob(M, reagents.total_volume, CHEM_TOUCH)
reagents.trans_to_mob(M, reagents.total_volume, CHEM_BLOOD) //CHEM_TOUCH
qdel(src)
return 1
@@ -74,7 +74,7 @@
M.drop_from_inventory(src) //icon update
if(reagents.total_volume)
reagents.trans_to_mob(M, reagents.total_volume, CHEM_TOUCH)
reagents.trans_to_mob(M, reagents.total_volume, CHEM_BLOOD) //CHEM_TOUCH
qdel(src)
return 1
+16 -16
View File
@@ -113,7 +113,7 @@
if(issmall(M))
removed *= 2
var/strength_mod = 3 * M.species.chem_strength_alcohol //Alcohol is 3x stronger when injected into the veins.
var/strength_mod = 3 //Alcohol is 3x stronger when injected into the veins.
if(!strength_mod)
return
@@ -121,19 +121,19 @@
M.add_chemical_effect(CE_ALCOHOL, 1)
var/effective_dose = dose * strength_mod * (1 + volume/60) //drinking a LOT will make you go down faster
if(effective_dose >= strength) // Early warning
if(effective_dose >= (strength * M.species.chem_strength_alcohol)) // Early warning
M.make_dizzy(18) // It is decreased at the speed of 3 per tick
if(effective_dose >= strength * 2) // Slurring
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 2) // Slurring
M.slurring = max(M.slurring, 90)
if(effective_dose >= strength * 3) // Confusion - walking in random directions
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 3) // Confusion - walking in random directions
M.Confuse(60)
if(effective_dose >= strength * 4) // Blurry vision
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 4) // Blurry vision
M.eye_blurry = max(M.eye_blurry, 30)
if(effective_dose >= strength * 5) // Drowsyness - periodically falling asleep
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 5) // Drowsyness - periodically falling asleep
M.drowsyness = max(M.drowsyness, 60)
if(effective_dose >= strength * 6) // Toxic dose
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 6) // Toxic dose
M.add_chemical_effect(CE_ALCOHOL_TOXIC, toxicity*3)
if(effective_dose >= strength * 7) // Pass out
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 7) // Pass out
M.Paralyse(60)
M.Sleeping(90)
@@ -160,26 +160,26 @@
if(M.isSynthetic() && M.nutrition < 500 && M.species.robo_ethanol_proc)
M.adjust_nutrition(round(max(0,ep_base_power - strength) * removed)/ep_final_mod) //the stronger it is, the more juice you gain
var/effective_dose = dose * M.species.chem_strength_alcohol
var/effective_dose = dose
if(!effective_dose)
return
if(M.species.robo_ethanol_drunk || !(M.isSynthetic()))
M.add_chemical_effect(CE_ALCOHOL, 1)
if(effective_dose >= strength) // Early warning
if(effective_dose >= (strength * M.species.chem_strength_alcohol)) // Early warning
M.make_dizzy(6) // It is decreased at the speed of 3 per tick
if(effective_dose >= strength * 2) // Slurring
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 2) // Slurring
M.slurring = max(M.slurring, 30)
if(effective_dose >= strength * 3) // Confusion - walking in random directions
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 3) // Confusion - walking in random directions
M.Confuse(20)
if(effective_dose >= strength * 4) // Blurry vision
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 4) // Blurry vision
M.eye_blurry = max(M.eye_blurry, 10)
if(effective_dose >= strength * 5) // Drowsyness - periodically falling asleep
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 5) // Drowsyness - periodically falling asleep
M.drowsyness = max(M.drowsyness, 20)
if(effective_dose >= strength * 6) // Toxic dose
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 6) // Toxic dose
M.add_chemical_effect(CE_ALCOHOL_TOXIC, toxicity)
if(effective_dose >= strength * 7) // Pass out
if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 7) // Pass out
M.Paralyse(20)
M.Sleeping(30)
+56
View File
@@ -186,3 +186,59 @@
H.change_gender_identity(PLURAL)
H.visible_message("<span class='notice'>[H] suddenly twitches as some of their features seem to contort and reshape, adjusting... In the end, it seems they are now of mixed gender.</span>",
"<span class='warning'>Your body suddenly contorts, feeling very different in various ways... By the time the rushing feeling is over it seems you just became of mixed gender.</span>")
////////////////////////// Misc Drugs //////////////////////////
/datum/reagent/drugs/rainbow_toxin /// Replaces Space Drugs.
name = "Rainbow Toxin"
id = "rainbowtoxin"
description = "Known for providing a euphoric high, this psychoactive drug is often injected into unknowing prey by serpents and other fanged beasts. Highly valuable and frequently sought after by hypno-enthusiasts and party-goers."
taste_description = "mixed euphoria"
taste_mult = 0.8 //You ARE going to taste this!
scannable = 1 //Sure! If you manage to milk a snake for some of this, go ahead and scan it and mass produce it. Your local club will love you!
/datum/reagent/drugs/rainbow_toxin/affect_blood(mob/living/carbon/M, var/alien, var/removed)
..()
var/drug_strength = 20
M.druggy = max(M.druggy, drug_strength)
/datum/reagent/drugs/bliss/overdose(var/mob/living/M as mob)
if(prob_proc == TRUE && prob(20))
M.hallucination = max(M.hallucination, 5)
prob_proc = FALSE
M.adjustBrainLoss(0.25*REM) //Too much isn't good for your long term health...
M.adjustToxLoss(0.01*REM) //Enough that it'll make your HUD dummy update, but not enough that you'll vomit mid scene. (Sorry emetophiliacs!)
..()
/datum/reagent/paralysis_toxin
name = "Tetrodotoxin"
id = "paralysistoxin"
description = "A potent toxin commonly found in a plethora of species. When exposed to the toxin, causes extreme, paralysis for a prolonged period, with only essential functions of the body being unhindered. Commonly used by covert operatives and used as a crowd control tool."
taste_description = "bitterness"
reagent_state = LIQUID
color = "#37007f"
metabolism = REM * 0.25
overdose = REAGENTS_OVERDOSE
scannable = 0 //YOU ARE NOT SCANNING THE FUNNY PARALYSIS TOXIN. NO. BAD. STAY AWAY.
/datum/reagent/paralysis_toxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(M.weakened < 50) //Let's not leave them PERMA stuck, after all.
M.AdjustWeakened(5) //Stand in for paralyze so you can still talk/emote/see
/datum/reagent/pain_enzyme
name = "Pain Enzyme"
id = "painenzyme"
description = "An enzyme found in a variety of species. When exposed to the toxin, will cause severe, agonizing pain. The effects can last for hours depending on the dose. Only known cure is an equally strong painkiller or dialysis."
taste_description = "sourness"
reagent_state = LIQUID
color = "#04b8fa" //Light blue in honor of Perry.
metabolism = 0.1 //Lasts up to 50 seconds if you give 5 units.
mrate_static = TRUE
overdose = 100 //There is no OD. You already are taking the worst of it.
scannable = 0 //Let's not have medical mechs able to make an extremely strong 'I hit you you fall down in agony' chem.
/datum/reagent/pain_enzyme/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
M.add_chemical_effect(CE_PAINKILLER, -200)
if(prob(0.01)) //1 in 10000 chance per tick. Extremely rare.
to_chat(M,"<span class='warning'>Your body feels as though it's on fire!</span>")
+2 -2
View File
@@ -1265,7 +1265,7 @@
/obj/structure/disposalpipe/tagger/New()
. = ..()
dpdir = dir | turn(dir, 180)
if(sort_tag) GLOB.tagger_locations |= sort_tag
if(sort_tag) GLOB.tagger_locations |= list("[sort_tag]" = get_z(src))
updatename()
updatedesc()
update()
@@ -1331,7 +1331,7 @@
/obj/structure/disposalpipe/sortjunction/New()
. = ..()
if(sortType) GLOB.tagger_locations |= sortType
if(sortType) GLOB.tagger_locations |= list("[sortType]" = get_z(src))
updatedir()
updatename()
+13 -1
View File
@@ -348,11 +348,23 @@
ui = new(user, src, "DestinationTagger", name)
ui.open()
/obj/item/device/destTagger/tgui_static_data(mob/user)
var/list/data = ..()
var/list/taggers = list()
var/list/tagger_levels = list()
for(var/tag in GLOB.tagger_locations)
var/z_level = GLOB.tagger_locations[tag]
taggers += list(list("tag" = tag, "level" = z_level))
tagger_levels += list(list("z" = z_level, "location" = using_map.get_zlevel_name(z_level)))
data["taggerLevels"] = tagger_levels
data["taggerLocs"] = taggers
return data
/obj/item/device/destTagger/tgui_data(mob/user, datum/tgui/ui)
var/list/data = ..()
data["currTag"] = currTag
data["taggerLocs"] = GLOB.tagger_locations
return data
+3 -3
View File
@@ -55,9 +55,9 @@
. = list(
"docking_status" = docking_program.get_docking_status(),
"override_enabled" = docking_program.override_enabled,
"exterior_status" = docking_program.memory["door_status"],
"can_force" = pod.can_force() || (emergency_shuttle.departed && pod.can_launch()), //allow players to manually launch ahead of time if the shuttle leaves
"armed" = pod.arming_controller.armed,
"exterior_status" = docking_program.memory["door_status"], // TGUI DATA fails silently when there's no linked pod, leading to UI crashes
"can_force" = pod?.can_force() || (emergency_shuttle.departed && pod?.can_launch()), //allow players to manually launch ahead of time if the shuttle leaves
"armed" = pod?.arming_controller.armed,
"internalTemplateName" = "EscapePodConsole",
)
+15 -13
View File
@@ -1,4 +1,3 @@
/datum/tgui_module/appearance_changer
name = "Appearance Editor"
tgui_id = "AppearanceChanger"
@@ -63,6 +62,9 @@
cam_background.del_on_map_removal = FALSE
update_active_camera_screen()
if(customize_usr)
if(ishuman(usr))
H = usr
owner = H
if(owner)
owner.AddComponent(/datum/component/recursive_move)
@@ -184,8 +186,8 @@
instance = null
if(!istype(instance) && !params["clear"])
return FALSE
owner.ear_style = instance
owner.update_hair()
target.ear_style = instance
target.update_hair()
update_dna()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE)
return TRUE
@@ -197,7 +199,7 @@
target.g_ears = hex2num(copytext(new_hair, 4, 6))
target.b_ears = hex2num(copytext(new_hair, 6, 8))
update_dna()
owner.update_hair()
target.update_hair()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("ears2_color")
@@ -208,7 +210,7 @@
target.g_ears2 = hex2num(copytext(new_hair, 4, 6))
target.b_ears2 = hex2num(copytext(new_hair, 6, 8))
update_dna()
owner.update_hair()
target.update_hair()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("tail")
@@ -218,8 +220,8 @@
instance = null
if(!istype(instance) && !params["clear"])
return FALSE
owner.tail_style = instance
owner.update_tail_showing()
target.tail_style = instance
target.update_tail_showing()
update_dna()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE)
return TRUE
@@ -231,7 +233,7 @@
target.g_tail = hex2num(copytext(new_hair, 4, 6))
target.b_tail = hex2num(copytext(new_hair, 6, 8))
update_dna()
owner.update_tail_showing()
target.update_tail_showing()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("tail2_color")
@@ -242,7 +244,7 @@
target.g_tail2 = hex2num(copytext(new_hair, 4, 6))
target.b_tail2 = hex2num(copytext(new_hair, 6, 8))
update_dna()
owner.update_tail_showing()
target.update_tail_showing()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("wing")
@@ -252,8 +254,8 @@
instance = null
if(!istype(instance) && !params["clear"])
return FALSE
owner.wing_style = instance
owner.update_wing_showing()
target.wing_style = instance
target.update_wing_showing()
update_dna()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE)
return TRUE
@@ -265,7 +267,7 @@
target.g_wing = hex2num(copytext(new_hair, 4, 6))
target.b_wing = hex2num(copytext(new_hair, 6, 8))
update_dna()
owner.update_wing_showing()
target.update_wing_showing()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("wing2_color")
@@ -276,7 +278,7 @@
target.g_wing2 = hex2num(copytext(new_hair, 4, 6))
target.b_wing2 = hex2num(copytext(new_hair, 6, 8))
update_dna()
owner.update_wing_showing()
target.update_wing_showing()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("marking")
+1 -1
View File
@@ -48,13 +48,13 @@
assets = list(
get_asset_datum(/datum/asset/simple/tgui_panel),
))
window.reinitialize() // Workaround for an early init fail...
window.send_asset(get_asset_datum(/datum/asset/simple/namespaced/fontawesome))
window.send_asset(get_asset_datum(/datum/asset/simple/namespaced/tgfont))
window.send_asset(get_asset_datum(/datum/asset/spritesheet/chat))
// Other setup
request_telemetry()
addtimer(CALLBACK(src, PROC_REF(on_initialize_timed_out)), 5 SECONDS)
window.send_message("testTelemetryCommand")
/**
* private
+1 -2
View File
@@ -82,7 +82,7 @@
if(dish.growth >= 50)
var/list/effects[0]
for (var/datum/disease2/effectholder/e in dish.virus2.effects)
effects.Add(list(list("name" = (dish.analysed ? e.effect.name : "Unknown"), "stage" = (e.stage), "reference" = "\ref[e]")))
effects.Add(list(list("name" = (dish.analysed ? e.effect.name : "Unknown"), "stage" = (e.stage), "reference" = "\ref[e]"), "badness" = e.effect.badness))
data["effects"] = effects
else
data["info"] = "Insufficient cell growth for gene splicing."
@@ -191,4 +191,3 @@
if("disk")
burning = 10
. = TRUE
+91
View File
@@ -8,6 +8,12 @@
//
// Parent type of all the various "belly" varieties.
//
#define DM_FLAG_VORESPRITE_TAIL 0x2
#define DM_FLAG_VORESPRITE_MARKING 0x4
#define DM_FLAG_VORESPRITE_ARTICLE 0x8
/obj/belly
name = "belly" // Name of this location
desc = "It's a belly! You're in it!" // Flavor text description of inside sight/sound/smells/feels.
@@ -60,6 +66,30 @@
var/belly_item_mult = 1 //Multiplier for how filling items are in borg borg bellies. Items are also weighted on item size
var/belly_overall_mult = 1 //Multiplier applied ontop of any other specific multipliers
var/vore_sprite_flags = DM_FLAG_VORESPRITE_ARTICLE
var/tmp/static/list/vore_sprite_flag_list= list(
"Normal Belly Sprite" = DM_FLAG_VORESPRITE_ARTICLE,
//"Tail adjustment" = DM_FLAG_VORESPRITE_TAIL,
//"Marking addition" = DM_FLAG_VORESPRITE_MARKING
)
var/affects_vore_sprites = FALSE
var/count_absorbed_prey_for_sprite = TRUE
var/absorbed_multiplier = 1
var/count_liquid_for_sprite = FALSE
var/liquid_multiplier = 1
var/count_items_for_sprite = FALSE
var/item_multiplier = 1
var/health_impacts_size = TRUE
var/resist_triggers_animation = TRUE
var/size_factor_for_sprite = 1
var/belly_sprite_to_affect = "stomach"
var/datum/sprite_accessory/tail/tail_to_change_to = FALSE
var/tail_colouration = FALSE
var/tail_extra_overlay = FALSE
var/tail_extra_overlay2 = FALSE
var/undergarment_chosen = "Underwear, bottom"
// Generally just used by AI
var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
var/autotransferwait = 10 // Time between trying to transfer.
@@ -345,6 +375,15 @@
"belly_item_mult",
"belly_overall_mult",
"drainmode",
"vore_sprite_flags",
"affects_vore_sprites",
"count_absorbed_prey_for_sprite",
"resist_triggers_animation",
"size_factor_for_sprite",
"belly_sprite_to_affect",
"health_impacts_size",
"count_items_for_sprite",
"item_multiplier"
)
if (save_digest_mode == 1)
@@ -426,6 +465,10 @@
if(M.ai_holder)
M.ai_holder.handle_eaten()
if (istype(owner, /mob/living/carbon/human))
var/mob/living/carbon/human/hum = owner
hum.update_fullness()
// Intended for simple mobs
if(!owner.client && autotransferlocation && autotransferchance > 0)
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/belly, check_autotransfer), thing, autotransferlocation), autotransferwait)
@@ -444,6 +487,10 @@
L.toggle_hud_vis()
if((L.stat != DEAD) && L.ai_holder)
L.ai_holder.go_wake()
if (istype(owner, /mob/living/carbon/human))
var/mob/living/carbon/human/hum = owner
hum.update_fullness()
/obj/belly/proc/vore_fx(mob/living/L)
if(!istype(L))
@@ -1757,6 +1804,15 @@
dupe.belly_mob_mult = belly_mob_mult
dupe.belly_item_mult = belly_item_mult
dupe.belly_overall_mult = belly_overall_mult
dupe.vore_sprite_flags = vore_sprite_flags
dupe.affects_vore_sprites = affects_vore_sprites
dupe.count_absorbed_prey_for_sprite = count_absorbed_prey_for_sprite
dupe.resist_triggers_animation = resist_triggers_animation
dupe.size_factor_for_sprite = size_factor_for_sprite
dupe.belly_sprite_to_affect = belly_sprite_to_affect
dupe.health_impacts_size = health_impacts_size
dupe.count_items_for_sprite = count_items_for_sprite
dupe.item_multiplier = item_multiplier
//// Object-holding variables
//struggle_messages_outside - strings
@@ -1955,3 +2011,38 @@
/obj/belly/container_resist(mob/M)
return relay_resist(M)
/obj/belly/proc/GetFullnessFromBelly()
if(!affects_vore_sprites)
return 0
var/belly_fullness = 0
for(var/mob/living/M in src)
if(count_absorbed_prey_for_sprite || !M.absorbed)
var/fullness_to_add = M.size_multiplier
fullness_to_add *= M.mob_size / 20
if(M.absorbed)
fullness_to_add *= absorbed_multiplier
if(health_impacts_size)
fullness_to_add *= M.health / M.getMaxHealth()
belly_fullness += fullness_to_add
if(count_liquid_for_sprite)
belly_fullness += (reagents.total_volume / 100) * liquid_multiplier
if(count_items_for_sprite)
for(var/obj/item/I in src)
var/fullness_to_add = 0
if(I.w_class == ITEMSIZE_TINY)
fullness_to_add = ITEMSIZE_COST_TINY
else if(I.w_class == ITEMSIZE_SMALL)
fullness_to_add = ITEMSIZE_COST_SMALL
else if(I.w_class == ITEMSIZE_NORMAL)
fullness_to_add = ITEMSIZE_COST_NORMAL
else if(I.w_class == ITEMSIZE_LARGE)
fullness_to_add = ITEMSIZE_COST_LARGE
else if(I.w_class == ITEMSIZE_HUGE)
fullness_to_add = ITEMSIZE_COST_HUGE
else
fullness_to_add = ITEMSIZE_COST_NO_CONTAINER
fullness_to_add /= 32
belly_fullness += fullness_to_add * item_multiplier
belly_fullness *= size_factor_for_sprite
return belly_fullness
@@ -35,6 +35,10 @@ GLOBAL_LIST_INIT(digest_modes, list())
else
SEND_SOUND(L, sound(get_sfx("fancy_death_prey")))
B.handle_digestion_death(L)
if(!L)
if (istype(B.owner, /mob/living/carbon/human))
var/mob/living/carbon/human/howner = B.owner
howner.update_fullness()
if(!B.fancy_vore)
return list("to_update" = TRUE, "soundToPlay" = sound(get_sfx("classic_death_sounds")))
return list("to_update" = TRUE, "soundToPlay" = sound(get_sfx("fancy_death_pred")))
@@ -61,6 +65,11 @@ GLOBAL_LIST_INIT(digest_modes, list())
var/offset = (1 + ((L.weight - 137) / 137)) // 130 pounds = .95 140 pounds = 1.02
var/difference = B.owner.size_multiplier / L.size_multiplier
if(B.health_impacts_size)
if (istype(B.owner, /mob/living/carbon/human))
var/mob/living/carbon/human/howner = B.owner
howner.update_fullness()
consider_healthbar(L, old_health, B.owner)
if(isrobot(B.owner))
+10
View File
@@ -34,6 +34,10 @@
'sound/effects/mob_effects/xenochimera/regen_5.ogg'
)
var/trash_catching = FALSE //Toggle for trash throw vore from chompstation
var/list/trait_injection_reagents = list() //List of all the reagents allowed to be used for injection via venom bite
var/trait_injection_selected = null //RSEdit: What trait reagent you're injecting.
var/trait_injection_amount = 5 //RSEdit: How much you're injecting with traits.
var/trait_injection_verb = "bites" //RSEdit: Which fluffy manner you're doing the injecting.
//
// Hook for generic creation of stuff on new creatures
@@ -256,6 +260,8 @@
P.weight_message_visible = src.weight_message_visible
P.weight_messages = src.weight_messages
P.vore_sprite_color = istype(src, /mob/living/carbon/human) ? src:vore_sprite_color : null
var/list/serialized = list()
for(var/obj/belly/B as anything in src.vore_organs)
serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks.
@@ -306,6 +312,10 @@
weight_message_visible = P.weight_message_visible
weight_messages = P.weight_messages
if (istype(src, /mob/living/carbon/human))
src:vore_sprite_color = P.vore_sprite_color
if(bellies)
if(isliving(src))
var/mob/living/L = src
+6 -1
View File
@@ -69,6 +69,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/step_mechanics_pref = FALSE
var/pickup_pref = TRUE
var/vore_sprite_color = list("stomach" = "#000", "taur belly" = "#000")
var/list/belly_prefs = list()
var/vore_taste = "nothing in particular"
var/vore_smell = "nothing in particular"
@@ -193,6 +195,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
weight_message_visible = json_from_file["weight_message_visible"]
weight_messages = json_from_file["weight_messages"]
eating_privacy_global = json_from_file["eating_privacy_global"]
vore_sprite_color = json_from_file["vore_sprite_color"]
//Quick sanitize
if(isnull(digestable))
@@ -279,7 +282,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
else if(weight_messages.len < 10)
while(weight_messages.len < 10)
weight_messages.Add("")
if(isnull(vore_sprite_color))
vore_sprite_color = list("stomach" = "#000", "taur belly" = "#000")
return TRUE
/datum/vore_preferences/proc/save_vore()
@@ -320,6 +324,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"weight_message_visible" = weight_message_visible,
"weight_messages" = weight_messages,
"eating_privacy_global" = eating_privacy_global,
"vore_sprite_color" = vore_sprite_color,
)
//List to JSON
+131 -2
View File
@@ -227,7 +227,23 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
"belly_item_mult" = selected.belly_item_mult,
"belly_overall_mult" = selected.belly_overall_mult,
"drainmode" = selected.drainmode,
"affects_voresprite" = selected.affects_vore_sprites,
"absorbed_voresprite" = selected.count_absorbed_prey_for_sprite,
"absorbed_multiplier" = selected.absorbed_multiplier,
"liquid_voresprite" = selected.count_liquid_for_sprite,
"liquid_multiplier" = selected.liquid_multiplier,
"item_voresprite" = selected.count_items_for_sprite,
"item_multiplier" = selected.item_multiplier,
"health_voresprite" = selected.health_impacts_size,
"resist_animation" = selected.resist_triggers_animation,
"voresprite_size_factor" = selected.size_factor_for_sprite,
"belly_sprite_to_affect" = selected.belly_sprite_to_affect,
"belly_sprite_option_shown" = istype(host, /mob/living/carbon/human) ? (LAZYLEN(host:vore_icon_bellies) >= 1 ? TRUE : FALSE) : FALSE, // TODO: FIX THIS (It won't be fixed)
"tail_option_shown" = istype(host, /mob/living/carbon/human),
"tail_to_change_to" = selected.tail_to_change_to,
"tail_colouration" = selected.tail_colouration,
"tail_extra_overlay" = selected.tail_extra_overlay,
"tail_extra_overlay2" = selected.tail_extra_overlay2
)
var/list/addons = list()
@@ -236,6 +252,13 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
addons.Add(flag_name)
selected_list["addons"] = addons
var/list/vs_flags = list()
for(var/flag_name in selected.vore_sprite_flag_list)
if(selected.vore_sprite_flags & selected.vore_sprite_flag_list[flag_name])
vs_flags.Add(flag_name)
selected_list["vore_sprite_flags"] = vs_flags
selected_list["egg_type"] = selected.egg_type
selected_list["contaminates"] = selected.contaminates
selected_list["contaminate_flavor"] = null
@@ -609,6 +632,20 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
host.weight_message_visible = !host.weight_message_visible
unsaved_changes = TRUE
return TRUE
if("set_vs_color")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
var/belly_choice = tgui_input_list(usr, "Which vore sprite are you going to edit the color of?", "Vore Sprite Color", hhost.vore_icon_bellies)
var/newcolor = input(usr, "Choose a color.", "", hhost.vore_sprite_color[belly_choice]) as color|null
if(newcolor)
hhost.vore_sprite_color[belly_choice] = newcolor
var/multiply = tgui_input_list(usr, "Set the color to be applied multiplicatively or additively? Currently in [hhost.vore_sprite_multiply[belly_choice] ? "Multiply" : "Add"]", "Vore Sprite Color", list("Multiply", "Add"))
if(multiply == "Multiply")
hhost.vore_sprite_multiply[belly_choice] = TRUE
else if(multiply == "Add")
hhost.vore_sprite_multiply[belly_choice] = FALSE
hhost.update_icons_body()
return TRUE
/datum/vore_look/proc/pick_from_inside(mob/user, params)
var/atom/movable/target = locate(params["pick"])
@@ -1680,6 +1717,98 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
qdel(host.vore_selected)
host.vore_selected = host.vore_organs[1]
. = TRUE
if("b_belly_sprite_to_affect")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
var/belly_choice = tgui_input_list(usr, "Which belly sprite do you want your [lowertext(hhost.vore_selected.name)] to affect?","Select Region", hhost.vore_icon_bellies)
if(!belly_choice) //They cancelled, no changes
return FALSE
else
hhost.vore_selected.belly_sprite_to_affect = belly_choice
hhost.update_fullness()
. = TRUE
if("b_affects_vore_sprites")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
hhost.vore_selected.affects_vore_sprites = !hhost.vore_selected.affects_vore_sprites
hhost.update_fullness()
. = TRUE
if("b_count_absorbed_prey_for_sprites")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
hhost.vore_selected.count_absorbed_prey_for_sprite = !hhost.vore_selected.count_absorbed_prey_for_sprite
hhost.update_fullness()
. = TRUE
if("b_absorbed_multiplier")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
var/absorbed_multiplier_input = input(user, "Set the impact absorbed prey's size have on your vore sprite. 1 means no scaling, 0.5 means absorbed prey count half as much, 2 means absorbed prey count double. (Range from 0.1 - 3)", "Absorbed Multiplier") as num|null
if(!isnull(absorbed_multiplier_input))
hhost.vore_selected.absorbed_multiplier = CLAMP(absorbed_multiplier_input, 0.1, 3)
hhost.update_fullness()
. = TRUE
if("b_count_items_for_sprites")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
hhost.vore_selected.count_items_for_sprite = !hhost.vore_selected.count_items_for_sprite
hhost.update_fullness()
. = TRUE
if("b_item_multiplier")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
var/item_multiplier_input = input(user, "Set the impact items will have on your vore sprite. 1 means a belly with 8 normal-sized items will count as 1 normal sized prey-thing's worth, 0.5 means items count half as much, 2 means items count double. (Range from 0.1 - 10)", "Item Multiplier") as num|null
if(!isnull(item_multiplier_input))
hhost.vore_selected.item_multiplier = CLAMP(item_multiplier_input, 0.1, 10)
hhost.update_fullness()
. = TRUE
if("b_health_impacts_size")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
hhost.vore_selected.health_impacts_size = !hhost.vore_selected.health_impacts_size
hhost.update_fullness()
. = TRUE
if("b_resist_animation")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
hhost.vore_selected.resist_triggers_animation = !hhost.vore_selected.resist_triggers_animation
. = TRUE
if("b_size_factor_sprites")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
var/size_factor_input = input(user, "Set the impact all belly content's collective size has on your vore sprite. 1 means no scaling, 0.5 means content counts half as much, 2 means contents count double. (Range from 0.1 - 3)", "Size Factor") as num|null
if(!isnull(size_factor_input))
hhost.vore_selected.size_factor_for_sprite = CLAMP(size_factor_input, 0.1, 3)
hhost.update_fullness()
. = TRUE
if("b_tail_to_change_to")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
var/tail_choice = tgui_input_list(usr, "Which tail sprite do you want to use when your [lowertext(host.vore_selected.name)] is filled?","Select Sprite", global.tail_styles_list)
if(!tail_choice) //They cancelled, no changes
return FALSE
else
hhost.vore_selected.tail_to_change_to = tail_choice
. = TRUE
if("b_tail_color")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
var/newcolor = input(usr, "Choose tail color.", "", hhost.vore_selected.tail_colouration) as color|null
if(newcolor)
hhost.vore_selected.tail_colouration = newcolor
. = TRUE
if("b_tail_color2")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
var/newcolor = input(usr, "Choose tail secondary color.", "", hhost.vore_selected.tail_extra_overlay) as color|null
if(newcolor)
hhost.vore_selected.tail_extra_overlay = newcolor
. = TRUE
if("b_tail_color3")
if (istype(host, /mob/living/carbon/human))
var/mob/living/carbon/human/hhost = host
var/newcolor = input(usr, "Choose tail tertiary color.", "", hhost.vore_selected.tail_extra_overlay2) as color|null
if(newcolor)
hhost.vore_selected.tail_extra_overlay2 = newcolor
. = TRUE
if(.)
unsaved_changes = TRUE
+177
View File
@@ -0,0 +1,177 @@
//A bluespace cracker item that can be pulled between two characters.
//The winner of the pull has an effect applied to them.
//Crackers do already exist, but these ones are a more memey scene item.
/obj/item/weapon/cracker
name = "bluespace cracker" //I have no idea why this was called shrink ray when this increased and decreased size.
desc = "A celebratory little game with a bluespace twist! Pull it between two people until it snaps, and the person who recieves the larger end gets a prize!"
icon = 'icons/obj/crackers.dmi'
icon_state = "blue"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_cracker.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_cracker.dmi',
)
item_state = "blue"
var/rigged = 0 //So that they can be rigged by varedits to go one way or the other. positive values mean holder always wins, negative values mean target always wins.
var/list/prizes = list("shrinking","growing","drugged","invisibility","knocked over","teleport","wealth")
var/list/jokes = list(
"When is a boat just like snow? When its adrift.",
"What happens to naughty elves? Santa gives them the sack.",
"What do you call an old snowman? Water.",
"Why has Santa been banned from sooty chimneys? Carbon footprints.",
"What goes down but doesn't come up? A yo.",
"What's green and fuzzy, has four legs and would kill you if it fell from a tree? A pool table.",
"Why did the blind man fall into the well? Because he couldn't see that well.",
"What did the pirate get on his report card? Seven Cs",
"What do you call a fish with no eyes? Fsh",
"How do you make an egg roll? You push it.",
"What do you call a deer with no eyes? NO EYED DEER!",
"What's red, and smells like blue paint? Red paint.",
"Where do cows go to dance? A meat ball.",
"What do you call a person who steals all your toenail clippings? A cliptoemaniac.",
"Whats brown and sticky? A stick.",
"What's the best way to kill a circus? Go for the juggler.",
"What do you call a cow with no legs? Ground Beef.",
"Why'd the scarecrow win the Nobel prize? He was outstanding in his field.")
/obj/item/weapon/cracker/attack(atom/A, mob/living/user, adjacent, params)
var/mob/living/carbon/human/target = A
if(!istype(target))
return
if(target.stat)
return
if(target == user)
to_chat(user, "<span class='notice'>You can't pull \the [src] by yourself, that would just be sad!</span>")
return
var/check_pull = tgui_alert(target, "\The [user] is offering to pull \the [src] with you, do you want to pull it?", "Pull Cracker", list("Yes", "No"))
if(check_pull == "No")
to_chat(user, "<span class='notice'>\The [target] chose not to pull \the [src]!</span>")
return
if(!adjacent)
to_chat(user, "<span class='notice'>\The [target] is not standing close enough to pull \the [src]!</span>")
return
var/prize = pick(prizes)
var/joke = pick(jokes)
var/mob/living/carbon/human/winner
var/mob/living/carbon/human/loser
if(!rigged)
if(prob(50))
winner = user
loser = target
else
winner = target
loser = user
else
if(rigged > 0)
winner = user
loser = target
else
winner = target
loser = user
var/spawnloc = get_turf(winner)
winner.visible_message("<span class='notice'>\The [winner] wins the cracker prize!</span>","<span class='notice'>You win the cracker prize!</span>")
if(prize == "shrinking")
winner.resize(0.25)
winner.visible_message("<b>\The [winner]</b> shrinks suddenly!")
if(prize == "growing")
winner.resize(2)
winner.visible_message("<b>\The [winner]</b> grows in height suddenly.")
if(prize == "drugged")
winner.druggy = max(winner.druggy, 50)
if(prize == "invisibility")
if(!winner.cloaked)
winner.visible_message("<b>\The [winner]</b> vanishes from sight.")
winner.cloak()
spawn(600)
if(winner.cloaked)
winner.uncloak()
winner.visible_message("<b>\The [winner]</b> appears as if from thin air.")
if(prize == "knocked over")
winner.visible_message("<b>\The [winner]</b> is suddenly knocked to the ground.")
winner.weakened = max(winner.weakened,50)
if(prize == "teleport")
if(loser.can_be_drop_pred && loser.vore_selected)
if(winner.devourable && winner.can_be_drop_prey)
winner.visible_message("<b>\The [winner]</b> is teleported to somewhere nearby...")
var/datum/effect/effect/system/spark_spread/spk
spk = new(winner)
var/T = get_turf(winner)
spk.set_up(5, 0, winner)
spk.attach(winner)
playsound(T, "sparks", 50, 1)
anim(T,winner,'icons/mob/mob.dmi',,"phaseout",,winner.dir)
winner.forceMove(loser.vore_selected)
if(prize == "wealth")
new /obj/random/cash/huge(spawnloc)
new /obj/random/cash/huge(spawnloc)
winner.visible_message("<b>\The [winner]</b> has a whole load of cash fall at their feet!")
playsound(user, 'sound/effects/snap.ogg', 50, 1)
user.drop_item(src)
new /obj/random/toy(spawnloc)
new /obj/item/clothing/head/paper_crown(spawnloc)
var/obj/item/weapon/paper/cracker_joke/J = new(spawnloc)
J.info = joke
qdel(src)
/obj/item/weapon/cracker/Initialize()
var/list/styles = list("blue","green","yellow","red","heart","hazard")
var/style = pick(styles)
icon_state = style
item_state = style
..()
/obj/item/weapon/cracker/shrinking
name = "shrinking bluespace cracker"
prizes = list("shrinking")
/obj/item/weapon/cracker/growing
name = "growing bluespace cracker"
prizes = list("growing")
/obj/item/weapon/cracker/invisibility
name = "cloaking bluespace cracker"
prizes = list("invisibility")
/obj/item/weapon/cracker/drugged
name = "psychedelic bluespace cracker"
prizes = list("drugged")
/obj/item/weapon/cracker/knockover
name = "forceful bluespace cracker"
prizes = list("knocked over")
/obj/item/weapon/cracker/vore
name = "teleporting bluespace cracker"
prizes = list("teleport")
/obj/item/weapon/cracker/money
name = "fortuitous bluespace cracker"
prizes = list("wealth")
/obj/item/clothing/head/paper_crown
name = "paper crown"
icon_state = "paper_crown_blue"
item_state = "paper_crown_blue"
item_icons = list(slot_head_str = 'icons/inventory/head/mob.dmi')
desc = "A paper crown so thin that you can see through it."
flags_inv = 0
body_parts_covered = 0
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/head/paper_crown/Initialize()
var/list/styles = list("paper_crown_blue","paper_crown_green","paper_crown_yellow","paper_crown_red","paper_crown_pink")
var/style = pick(styles)
icon_state = style
item_state = style
..()
/obj/item/weapon/paper/cracker_joke
name = "joke"
icon_state = "joke"
/obj/item/weapon/paper/cracker_joke/update_icon()
return
+49
View File
@@ -15,6 +15,7 @@
origin_tech = list(TECH_BLUESPACE = 4)
modifystate = "sizegun-shrink"
battery_lock = 1
var/backfire = 0
var/size_set_to = 1
firemodes = list(
list(mode_name = "select size",
@@ -133,6 +134,54 @@
size_set_to = clamp((size_select/100), 0, 1000) //eheh
to_chat(usr, "<span class='notice'>You set the size to [size_select]%</span>")
/obj/item/weapon/gun/energy/sizegun/afterattack(atom/A, mob/living/user, adjacent, params)
if(adjacent) return //A is adjacent, is the user, or is on the user's person
if(backfire)
if(prob(50))
to_chat(user, "<span class='notice'>\The [src] backfires and consumes its entire charge!</span>")
Fire(user, user)
power_supply.charge = 0
var/mob/living/M = loc // TGMC Ammo HUD
if(istype(M)) // TGMC Ammo HUD
M?.hud_used.update_ammo_hud(M, src)
return
else
return ..()
else
return ..()
/obj/item/weapon/gun/energy/sizegun/attack(atom/A, mob/living/user, adjacent, params)
if(backfire)
if(prob(50))
to_chat(user, "<span class='notice'>\The [src] backfires and consumes its entire charge!</span>")
Fire(user, user)
power_supply.charge = 0
var/mob/living/M = loc // TGMC Ammo HUD
if(istype(M)) // TGMC Ammo HUD
M?.hud_used.update_ammo_hud(M, src)
return
else
return ..()
else
return ..()
/obj/item/weapon/gun/energy/sizegun/attackby(var/obj/item/A as obj, mob/user as mob)
if(A.has_tool_quality(TOOL_WIRECUTTER))
if(backfire)
to_chat(user, "<span class='warning'>You repair the damage to the \the [src].</span>")
backfire = 0
name = "size gun"
else
to_chat(user, "<span class='warning'>You snip a wire on \the [src], making it less reliable.</span>")
backfire = 1
name = "unstable size gun"
..()
/obj/item/weapon/gun/energy/sizegun/backfire
name = "unstable size gun"
backfire = 1
/obj/item/weapon/gun/energy/sizegun/mounted
name = "mounted size gun"
@@ -46,6 +46,7 @@
..()
//Is missing a tgui interface?
/obj/machinery/computer/xenobio2/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
return
Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 KiB

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 428 KiB

After

Width:  |  Height:  |  Size: 429 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Some files were not shown because too many files have changed in this diff Show More