Merge remote-tracking branch 'upstream/master' into kk-maptweaks
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -17,3 +17,4 @@
|
||||
#define LANGUAGE_MOUSE "Mouse"
|
||||
|
||||
#define LANGUAGE_SHADEKIN "Shadekin Empathy"
|
||||
#define LANGUAGE_LLEILL "Glamour Speak"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]'")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
|
||||
@@ -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> 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 ..();
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]°C ([M.bodytemperature*1.8-459.67]°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,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
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
/obj/item/organ/external/head/lleill
|
||||
eye_icon_location = 'icons/mob/human_face_vr.dmi'
|
||||
eye_icon = "eyes_lleill"
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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",
|
||||
)
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 it’s 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.",
|
||||
"What’s 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
|
||||
@@ -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
|
||||
|
||||
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 267 KiB After Width: | Height: | Size: 267 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 603 B |
|
After Width: | Height: | Size: 564 B |
|
After Width: | Height: | Size: 395 B |
|
Before Width: | Height: | Size: 428 KiB After Width: | Height: | Size: 429 KiB |
|
After Width: | Height: | Size: 6.8 KiB |