Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Hawk_v3
2019-11-17 12:42:55 +00:00
135 changed files with 193190 additions and 151466 deletions

View File

@@ -107,7 +107,7 @@ obj/var/contaminated = 0
updatehealth()
//Burn eyes if exposed.
if(vsc.plc.EYE_BURNS && (species.breath_type != "phoron"))
if(vsc.plc.EYE_BURNS && species.breath_type && (species.breath_type != "phoron")) //VOREStation Edit: those who don't breathe
var/burn_eyes = 1
//Check for protective glasses

View File

@@ -1,2 +1,3 @@
// More for our custom races
#define IS_CHIMERA 12
#define IS_SHADEKIN 13

View File

@@ -35,4 +35,6 @@
#define SPECIES_MONKEY_NEVREAN "Sparra"
#define SPECIES_MONKEY_SERGAL "Saru"
#define SPECIES_MONKEY_VULPKANIN "Wolpin"
#define SPECIES_WEREBEAST "Werebeast"
#define SPECIES_SHADEKIN "Shadekin"

View File

@@ -0,0 +1 @@
var/datum/gear_tweak/collar_tag/gear_tweak_collar_tag = new()

View File

@@ -407,7 +407,7 @@ var/global/list/contamination_colors = list("green",
"beige",
"pink")
//For the mechanic of leaving remains. Ones listed below are basically ones that got no bones.
//For the mechanic of leaving remains. Ones listed below are basically ones that got no bones or leave no trace after death.
var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
SPECIES_DIONA,
SPECIES_ALRAUNE,
@@ -426,7 +426,8 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
SPECIES_XENO_SENTINEL,
SPECIES_XENO_QUEEN,
SPECIES_SHADOW,
SPECIES_GOLEM) //Some special species that may or may not be ever used in event too
SPECIES_GOLEM, //Some special species that may or may not be ever used in event too,
SPECIES_SHADEKIN) //Shadefluffers just poof away
/hook/startup/proc/init_vore_datum_ref_lists()
var/paths

View File

@@ -134,6 +134,12 @@
// A is a turf or is on a turf, or in something on a turf (pen in a box); but not something in something on a turf (pen in a box in a backpack)
sdepth = A.storage_depth_turf()
if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1))
//VOREStation Edit begin: SHADEKIN
var/mob/SK = src
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(A.Adjacent(src) || (W && W.attack_can_reach(src, A, W.reach)) ) // see adjacent.dm
if(W)
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)

View File

@@ -0,0 +1,2 @@
#define ui_shadekin_dark_display "EAST-1:28,CENTER-3:15"
#define ui_shadekin_energy_display "EAST-1:28,CENTER-4:15"

View File

@@ -180,6 +180,7 @@
/mob/New()
..()
if(!ability_master) //VOREStation Edit: S H A D E K I N
ability_master = new /obj/screen/movable/ability_master(src)
///////////ACTUAL ABILITIES////////////

View File

@@ -293,6 +293,18 @@
mymob.nutrition_icon.screen_loc = ui_nutrition
hud_elements |= mymob.nutrition_icon
//VOREStation Addition begin
mymob.shadekin_dark_display = new /obj/screen/shadekin/darkness()
mymob.shadekin_dark_display.screen_loc = ui_shadekin_dark_display
mymob.shadekin_dark_display.icon_state = "dark"
hud_elements |= mymob.shadekin_dark_display
mymob.shadekin_energy_display = new /obj/screen/shadekin/energy()
mymob.shadekin_energy_display.screen_loc = ui_shadekin_energy_display
mymob.shadekin_energy_display.icon_state = "energy0"
hud_elements |= mymob.shadekin_energy_display
//VOREStation Addition end
mymob.ling_chem_display = new /obj/screen/ling/chems()
mymob.ling_chem_display.screen_loc = ui_ling_chemical_display
mymob.ling_chem_display.icon_state = "ling_chems"

View File

@@ -1,16 +1,19 @@
/obj/screen/proc/Click_vr(location, control, params) //VORESTATION AI TEMPORARY REMOVAL
/obj/screen/proc/Click_vr(location, control, params)
if(!usr) return 1
switch(name)
//Shadekin
if("darkness")
var/mob/living/simple_mob/shadekin/sk = usr
var/turf/T = get_turf(sk)
var/turf/T = get_turf(usr)
var/darkness = round(1 - T.get_lumcount(),0.1)
to_chat(usr,"<span class='notice'><b>Darkness:</b> [darkness]</span>")
if("energy")
var/mob/living/simple_mob/shadekin/sk = usr
to_chat(usr,"<span class='notice'><b>Energy:</b> [sk.energy] ([sk.dark_gains])</span>")
var/mob/living/simple_mob/shadekin/SK = usr
if(istype(SK))
to_chat(usr,"<span class='notice'><b>Energy:</b> [SK.energy] ([SK.dark_gains])</span>")
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/shadekin))
to_chat(usr,"<span class='notice'><b>Energy:</b> [H.shadekin_get_energy(H)]</span>")

View File

@@ -138,6 +138,12 @@
return
/obj/effect/ebeam/deadly/Crossed(atom/A)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = A
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
..()
A.ex_act(1)
@@ -157,6 +163,12 @@
on_contact(A)
/obj/effect/ebeam/reactive/Crossed(atom/A)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = A
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
..()
on_contact(A)

View File

@@ -51,7 +51,7 @@
start_sound = 'sound/machines/air_pump/airpumpstart.ogg'
start_length = 10
mid_sounds = list('sound/machines/air_pump/airpumpidle.ogg' = 1)
mid_length = 10
mid_length = 4
end_sound = 'sound/machines/air_pump/airpumpshutdown.ogg'
volume = 20
volume = 15
pref_check = /datum/client_preference/air_pump_noise

View File

@@ -116,6 +116,12 @@
return
/obj/effect/gateway/Crossed(AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
spawn(0)
return
return
@@ -148,6 +154,12 @@
qdel(src)
/obj/effect/gateway/active/Crossed(var/atom/A)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = A
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(!istype(A, /mob/living))
return

File diff suppressed because it is too large Load Diff

View File

@@ -74,6 +74,12 @@
qdel(src)
/obj/effect/effect/foam/Crossed(var/atom/movable/AM)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(metal)
return
if(istype(AM, /mob/living))

View File

@@ -70,6 +70,12 @@ var/global/list/image/splatter_cache=list()
desc = initial(desc)
/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = perp
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if (!istype(perp))
return
if(amount < 1)

View File

@@ -185,6 +185,12 @@ steam.start() -- spawns the effect
qdel(src)
/obj/effect/effect/smoke/Crossed(mob/living/carbon/M as mob )
//VOREStation Edit begin: SHADEKIN
var/mob/SK = M
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
..()
if(istype(M))
affect(M)

View File

@@ -36,6 +36,12 @@
..()
/obj/effect/mine/Crossed(AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
Bumped(AM)
/obj/effect/mine/Bumped(mob/M as mob|obj)

View File

@@ -21,6 +21,12 @@ GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal)
return
/obj/effect/portal/Crossed(AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(istype(AM,/mob) && !(istype(AM,/mob/living)))
return //do not send ghosts, zshadows, ai eyes, etc
spawn(0)

View File

@@ -0,0 +1,2 @@
/obj/effect/spider/spiderling/virgo
grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter)

View File

@@ -13,6 +13,12 @@
return 0
/obj/effect/step_trigger/Crossed(H as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = H
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
..()
if(!H)
return

View File

@@ -1456,6 +1456,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
return ..()
/obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery.
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if (istype(AM, /mob/living))
var/mob/living/M = AM

View File

@@ -322,6 +322,12 @@
qdel(src)
/obj/item/toy/snappop/Crossed(H as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = H
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if((ishuman(H))) //i guess carp and shit shouldn't set them off
var/mob/living/carbon/M = H
if(M.m_intent == "run")

View File

@@ -9,6 +9,12 @@
* Banana Peals
*/
/obj/item/weapon/bananapeel/Crossed(AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if (istype(AM, /mob/living))
var/mob/living/M = AM
M.slip("the [src.name]",4)
@@ -24,6 +30,12 @@
reagents.add_reagent("cleaner", 5)
/obj/item/weapon/soap/Crossed(AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if (istype(AM, /mob/living))
var/mob/living/M = AM
M.slip("the [src.name]",3)

View File

@@ -108,6 +108,12 @@
/obj/item/weapon/material/shard/Crossed(AM as mob|obj)
..()
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(isliving(AM))
var/mob/M = AM

View File

@@ -33,7 +33,7 @@
starts_with = list(/obj/item/device/encryptionkey/headset_com = 7)
/obj/item/weapon/storage/box/servicekeys
name = "box of command keys"
name = "box of service keys"
desc = "A box full of service keys, for the HoP to give out as necessary."
starts_with = list(/obj/item/device/encryptionkey/headset_service = 7)

View File

@@ -106,6 +106,12 @@
can_buckle = initial(can_buckle)
/obj/item/weapon/beartrap/Crossed(AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(deployed && isliving(AM))
var/mob/living/L = AM
if(L.m_intent == "run")

View File

@@ -87,6 +87,12 @@
return ..()
/obj/structure/catwalk/Crossed()
//VOREStation Edit begin: SHADEKIN
var/mob/SK = usr
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
. = ..()
if(isliving(usr))
playsound(src, pick('sound/effects/footstep/catwalk1.ogg', 'sound/effects/footstep/catwalk2.ogg', 'sound/effects/footstep/catwalk3.ogg', 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 25, 1)

View File

@@ -57,7 +57,7 @@
populate_robolimb_list()
//Must be done now, otherwise ZAS zones and lighting overlays need to be recreated.
createRandomZlevel()
//createRandomZlevel() //VOREStation Removal: Deprecated
processScheduler = new
master_controller = new /datum/controller/game_controller()

View File

@@ -4,7 +4,7 @@
set name = "Set CKey"
set desc = "Mob to teleport"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/list/keys = list()

View File

@@ -104,6 +104,12 @@
/obj/item/device/assembly_holder/Crossed(atom/movable/AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(a_left)
a_left.Crossed(AM)
if(a_right)

View File

@@ -242,6 +242,12 @@
return
/obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(istype(AM, /obj/effect/beam))
return
spawn(0)

View File

@@ -83,6 +83,12 @@
/obj/item/device/assembly/mousetrap/Crossed(AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(armed)
if(ishuman(AM))
var/mob/living/carbon/H = AM

View File

@@ -168,6 +168,7 @@ obj/machinery/gateway/centerstation/process()
update_icon()
stationgate = locate(/obj/machinery/gateway/centerstation)
. = ..()
density = 1 //VOREStation Add
/obj/machinery/gateway/centeraway/update_icon()

View File

@@ -60,6 +60,11 @@
desc = ""
value = CATALOGUER_REWARD_TRIVIAL
/datum/category_item/catalogue/fauna/shadekin
name = "Sapients - Shadekin"
desc = ""
value = CATALOGUER_REWARD_EASY
/datum/category_item/catalogue/fauna/custom_species
name = "Sapients - Other"
desc = "Remote frontiers require people of all sorts of life...\

View File

@@ -0,0 +1,14 @@
/datum/gear_tweak/collar_tag/get_contents(var/metadata)
return "Tag: [metadata]"
/datum/gear_tweak/collar_tag/get_default()
return ""
/datum/gear_tweak/collar_tag/get_metadata(var/user, var/metadata)
return sanitize( input(user, "Choose the tag text", "Character Preference", metadata) as text , MAX_NAME_LEN )
/datum/gear_tweak/collar_tag/tweak_item(var/obj/item/clothing/accessory/collar/C, var/metadata)
if(metadata == "")
return
else
C.initialize_tag(metadata)

View File

@@ -6,6 +6,10 @@
slot = slot_tie
sort_category = "Accessories"
/datum/gear/collar/New()
..()
gear_tweaks = list(gear_tweak_collar_tag)
/datum/gear/collar/golden
display_name = "collar, golden"
path = /obj/item/clothing/accessory/collar/gold

View File

@@ -34,6 +34,12 @@
ckeywhitelist = list("aegisoa")
character_name = list("Xander Bevin")
/datum/gear/fluff/xander_medal
path = /obj/item/clothing/accessory/medal/conduct
display_name = "Xander's Conduct Medal"
ckeywhitelist = list("aegisoa")
character_name = list("Xander Bevin")
/datum/gear/fluff/lynn_penlight
path = /obj/item/device/flashlight/pen/fluff/lynn
display_name = "Lynn's Penlight"
@@ -85,6 +91,12 @@
ckeywhitelist = list("beyondmylife")
character_name = list("Ne'tra Ky'ram")
/datum/gear/fluff/nolan_medal
path = /obj/item/clothing/accessory/medal/silver/unity
display_name = "Nolan's Unity Medal"
ckeywhitelist = list("blakeryan")
character_name = list("Nolan Conaway")
/datum/gear/fluff/xin_sovietuniform
path = /obj/item/clothing/under/soviet
display_name = "Xin's Soviet Uniform"
@@ -98,6 +110,24 @@
ckeywhitelist = list("bwoincognito")
character_name = list("Tasald Corlethian")
/datum/gear/fluff/tasald_cartographer_jumpsuit
path = /obj/item/clothing/under/solgov/utility/sifguard/officer/exploration
display_name = "Tasald's Cartographer's uniform - jumpsuit"
ckeywhitelist = list("bwoincognito")
character_name = list("Tasald Corlethian")
/datum/gear/fluff/tasald_cartographer_jacket
path = /obj/item/clothing/suit/storage/service/sifguard/command
display_name = "Tasald's Cartographer's uniform - jacket"
ckeywhitelist = list("bwoincognito")
character_name = list("Tasald Corlethian")
/datum/gear/fluff/tasald_cartographer_beret
path = /obj/item/clothing/head/beret/sol/expedition/command
display_name = "Tasald's Cartographer's uniform - beret"
ckeywhitelist = list("bwoincognito")
character_name = list("Tasald Corlethian")
/datum/gear/fluff/octavius_box
path = /obj/item/weapon/storage/box/fluff/octavious
display_name = "Octavious' Box"
@@ -210,6 +240,12 @@
ckeywhitelist = list("epigraphzero")
character_name = list("Verd Woodrow")
/datum/gear/fluff/erik_medal
path = /obj/item/clothing/accessory/medal/silver/unity
display_name = "Erik's Unity Medal"
ckeywhitelist = list("erikthedog")
character_name = list("Erik Ramadwood")
// F CKEYS
// G CKEYS
@@ -708,6 +744,12 @@
ckeywhitelist = list("techtypes")
character_name = list("Lasshseeki Korss")
/datum/gear/fluff/nick_medal
path = /obj/item/clothing/accessory/medal/conduct
display_name = "Nick's Conduct Medal"
ckeywhitelist = list("thedavestdave")
character_name = list("Nick Sloan")
/datum/gear/fluff/konor_medal
path = /obj/item/clothing/accessory/medal/silver/unity
display_name = "Konor's Unity Medal"
@@ -897,3 +939,9 @@
display_name = "Nehi's Radio"
ckeywhitelist = list("zodiacshadow")
character_name = list("Nehi Maximus")
/datum/gear/fluff/star_sweater
path = /obj/item/clothing/accessory/sweater/fluff/star
display_name = "Star Sweater"
ckeywhitelist = list("bacon12366")
character_name = list("Elly Brown")

View File

@@ -89,10 +89,19 @@
pref.b_wing = sanitize_integer(pref.b_wing, 0, 255, initial(pref.b_wing))
if(pref.ear_style)
pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style))
var/datum/sprite_accessory/temp_ear_style = ear_styles_list[pref.ear_style]
if(temp_ear_style.apply_restrictions && (!(pref.species in temp_ear_style.species_allowed)))
pref.ear_style = initial(pref.ear_style)
if(pref.tail_style)
pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style))
var/datum/sprite_accessory/temp_tail_style = tail_styles_list[pref.tail_style]
if(temp_tail_style.apply_restrictions && (!(pref.species in temp_tail_style.species_allowed)))
pref.tail_style = initial(pref.tail_style)
if(pref.wing_style)
pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, initial(pref.wing_style))
var/datum/sprite_accessory/temp_wing_style = wing_styles_list[pref.wing_style]
if(temp_wing_style.apply_restrictions && (!(pref.species in temp_wing_style.species_allowed)))
pref.wing_style = initial(pref.wing_style)
/datum/category_item/player_setup_item/vore/ears/copy_to_mob(var/mob/living/carbon/human/character)
character.ear_style = ear_styles_list[pref.ear_style]
@@ -182,7 +191,7 @@
var/list/pretty_ear_styles = list("Normal" = null)
for(var/path in ear_styles_list)
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
if((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed))
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)))
pretty_ear_styles[instance.name] = path
// Present choice to user
@@ -215,7 +224,7 @@
var/list/pretty_tail_styles = list("Normal" = null)
for(var/path in tail_styles_list)
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
if((!instance.ckeys_allowed) || (user.ckey in instance.ckeys_allowed))
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)))
pretty_tail_styles[instance.name] = path
// Present choice to user
@@ -248,7 +257,7 @@
var/list/pretty_wing_styles = list("Normal" = null)
for(var/path in wing_styles_list)
var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
if((!instance.ckeys_allowed) || (user.ckey in instance.ckeys_allowed))
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)))
pretty_wing_styles[instance.name] = path
// Present choice to user

View File

@@ -203,7 +203,7 @@
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear jukebox music."
to_chat(src, "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear jukebox music.")
SScharacter_setup.queue_preferences_save(prefs)

View File

@@ -13,7 +13,7 @@ datum/preferences
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear eating related vore noises."
to_chat(src, "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear eating related vore noises.")
SScharacter_setup.queue_preferences_save(prefs)
@@ -29,7 +29,7 @@ datum/preferences
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear digestion related vore noises."
to_chat(src, "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear digestion related vore noises.")
SScharacter_setup.queue_preferences_save(prefs)

View File

@@ -211,13 +211,17 @@
desc = initial(desc)
else
to_chat(user,"<span class='notice'>You set the [name]'s tag to '[str]'.</span>")
name = initial(name) + " ([str])"
if(istype(src,/obj/item/clothing/accessory/collar/holo))
desc = initial(desc) + " The tag says \"[str]\"."
else
desc = initial(desc) + " \"[str]\" has been engraved on the tag."
initialize_tag(str)
/obj/item/clothing/accessory/collar/proc/initialize_tag(var/tag)
name = initial(name) + " ([tag])"
desc = initial(desc) + " \"[tag]\" has been engraved on the tag."
writtenon = 1
/obj/item/clothing/accessory/collar/holo/initialize_tag(var/tag)
..()
desc = initial(desc) + " The tag says \"[tag]\"."
/obj/item/clothing/accessory/collar/attackby(obj/item/I, mob/user)
if(istype(src,/obj/item/clothing/accessory/collar/holo))
return

View File

@@ -142,7 +142,6 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 60, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
//new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 50), //VORESTATION AI TEMPORARY REMOVAL
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)),

View File

@@ -28,36 +28,38 @@
/datum/event_container/mundane/New()
available_events = list(
// Severity level, event name, even type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 200),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 400),
// Bluescreens APCs, but they still work
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "APC Damage", /datum/event/apc_damage, 20, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence,20, list(ASSIGNMENT_JANITOR = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Canister Leak", /datum/event/canister_leak, 10, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300),
//new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 1, list(), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15),
//new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 1, 25, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400),
// Spawns mice, lizards, or dud spiderlings
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100), 1),
// Rot only weakens walls, not destroy them
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 1, list(), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
))
/datum/event_container/moderate/New()
available_events = list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 800),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 1600),
// Leaks gas into an unoccupied room.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Atmos Leak", /datum/event/atmos_leak, 30, list(ASSIGNMENT_ENGINEER = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 30), 1),
// Just disables comms for a short while.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 500, list(ASSIGNMENT_AI = 150, ASSIGNMENT_SECURITY = 120), 1),
// Just blows out a few lights
@@ -71,37 +73,36 @@
// Opens doors in brig. So just RP fun
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 10, list(ASSIGNMENT_SECURITY = 100), 1),
// Radiation, but only in space.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 0, list(ASSIGNMENT_SECURITY = 20), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Solar Storm", /datum/event/solar_storm, 30, list(ASSIGNMENT_ENGINEER = 40, ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 0, list(ASSIGNMENT_SECURITY = 20, ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 30, list(ASSIGNMENT_SECURITY = 30), 1),
//Evil grubs that drain station power slightly
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 0, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_ENGINEER = 30), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 100, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 20)),
// Not bad (dorms are shielded) but inconvenient
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 50, list(ASSIGNMENT_MEDICAL = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Random Antagonist", /datum/event/random_antag, 2.5, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 20, list(ASSIGNMENT_SECURITY = 60)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 80, list(ASSIGNMENT_ENGINEER = 30)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 40), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
))
/datum/event_container/major/New()
available_events = list(
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 900),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 3600),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Atmos Leak", /datum/event/atmos_leak, 30, list(ASSIGNMENT_ENGINEER = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15) ,1)
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 20, list(ASSIGNMENT_ENGINEER = 7), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0, list(ASSIGNMENT_ANY = 5), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 10, list(ASSIGNMENT_ENGINEER = 60), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0,list(ASSIGNMENT_ANY = 5)),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 20, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
))

View File

@@ -23,7 +23,7 @@
for(var/i = 0, i < 3, i++)
var/turf/target = get_step(T, pick(alldirs))
if(target && istype(target, /turf/simulated/floor))
var/mob/living/simple_mob/corgi/Ian/doge = new(target)
var/mob/living/simple_mob/animal/passive/dog/corgi/Ian/doge = new(target)
doge.name = "Ian " + pick("Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi",
"Gamma", "Eta", "Iota", "Kappa", "Lambda", "Omicron", "Theta",
"Rho", "Sigma", "Tau", "Upsilon", "Omega", "Psi", "Zeta")

View File

@@ -23,6 +23,6 @@
while((spawncount >= 1) && vents.len)
var/obj/vent = pick(vents)
new /obj/effect/spider/spiderling(vent.loc)
new /obj/effect/spider/spiderling/virgo(vent.loc) //VOREStation Edit - No nurses
vents -= vent
spawncount--

View File

@@ -24,6 +24,9 @@
if(planttype)
plantname = planttype
/obj/item/weapon/reagent_containers/food/snacks/grown/Initialize()
..()
spawn()
if(!plantname)
return
@@ -49,9 +52,6 @@
potency = seed.get_trait(TRAIT_POTENCY)
/obj/item/weapon/reagent_containers/food/snacks/grown/Initialize()
..()
for(var/rid in seed.chems)
var/list/reagent_data = seed.chems[rid]
if(reagent_data && reagent_data.len)
@@ -157,6 +157,12 @@
overlays |= plant_icon
/obj/item/weapon/reagent_containers/food/snacks/grown/Crossed(var/mob/living/M)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = M
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(seed && seed.get_trait(TRAIT_JUICY) == 2)
if(istype(M))

View File

@@ -20,6 +20,12 @@
manual_unbuckle(user)
/obj/effect/plant/Crossed(atom/movable/O)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = O
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(isliving(O))
trodden_on(O)

View File

@@ -0,0 +1,61 @@
/*
* Home of the New (NOV 1st, 2019) library books.
*/
/obj/item/weapon/book/custom_library
name = "Book"
desc = "A hardbound book."
description_info = "This book is printed from the custom repo. If you can see this, something went wrong."
icon = 'icons/obj/custom_books.dmi'
icon_state = "book"
// This is the ckey of the book's author.
var/origkey = null
author = "UNKNOWN"
/obj/item/weapon/book/custom_library/fiction
libcategory = "Fiction"
/obj/item/weapon/book/custom_library/nonfiction
libcategory = "Non-Fiction"
/obj/item/weapon/book/custom_library/reference
libcategory = "Reference"
/obj/item/weapon/book/custom_library/religious
libcategory = "Religious"
/*
/obj/item/weapon/book/custom_library/adult
libcategory = "Adult"
*/
/obj/item/weapon/book/bundle/custom_library
name = "Book"
desc = "A hardbound book."
description_info = "This book is printed from the custom repo. If you can see this, something went wrong."
icon = 'icons/obj/custom_books.dmi'
icon_state = "book"
// This is the ckey of the book's author.
var/origkey = null
author = "UNKNOWN"
page = 1 //current page
pages = list() //the contents of each page
/obj/item/weapon/book/bundle/custom_library/fiction
libcategory = "Fiction"
/obj/item/weapon/book/bundle/custom_library/nonfiction
libcategory = "Non-Fiction"
/obj/item/weapon/book/bundle/custom_library/reference
libcategory = "Reference"
/obj/item/weapon/book/bundle/custom_library/religious
libcategory = "Religious"
/*
/obj/item/weapon/book/bundle/custom_library/adult
libcategory = "Adult"
*/

View File

@@ -147,6 +147,7 @@
var/dat // Actual page content
var/due_date = 0 // Game time in 1/10th seconds
var/author // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
var/libcategory = "Miscellaneous" // The library category this book sits in. "Fiction", "Non-Fiction", "Adult", "Reference", "Religion"
var/unique = 0 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified
var/title // The real name of the book.
var/carved = 0 // Has the book been hollowed out for use as a secret storage item?
@@ -260,6 +261,74 @@
M << browse("<TT><I>Penned by [author].</I></TT> <BR>" + "[dat]", "window=book")
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam
/*
* Book Bundle (Multi-page book)
*/
/obj/item/weapon/book/bundle
var/page = 1 //current page
var/list/pages = list() //the contents of each page
/obj/item/weapon/book/bundle/proc/show_content(mob/user as mob)
var/dat
var/obj/item/weapon/W = pages[page]
// first
if(page == 1)
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'><A href='?src=\ref[src];prev_page=1'>Front</A></DIV>"
dat+= "<DIV STYLE='float:right; text-align:right; width:33.33333%'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV><BR><HR>"
// last
else if(page == pages.len)
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV>"
dat+= "<DIV STYLE='float:right; text-align:right; with:33.33333%'><A href='?src=\ref[src];next_page=1'>Back</A></DIV><BR><HR>"
// middle pages
else
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV>"
dat+= "<DIV STYLE='float:right; text-align:right; width:33.33333%'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV><BR><HR>"
if(istype(pages[page], /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = W
if(!(istype(usr, /mob/living/carbon/human) || isobserver(usr) || istype(usr, /mob/living/silicon)))
dat += "<HTML><HEAD><TITLE>[P.name]</TITLE></HEAD><BODY>[stars(P.info)][P.stamps]</BODY></HTML>"
else
dat += "<HTML><HEAD><TITLE>[P.name]</TITLE></HEAD><BODY>[P.info][P.stamps]</BODY></HTML>"
user << browse(dat, "window=[name]")
else if(istype(pages[page], /obj/item/weapon/photo))
var/obj/item/weapon/photo/P = W
user << browse_rsc(P.img, "tmp_photo.png")
user << browse(dat + "<html><head><title>[P.name]</title></head>" \
+ "<body style='overflow:hidden'>" \
+ "<div> <img src='tmp_photo.png' width = '180'" \
+ "[P.scribble ? "<div> Written on the back:<br><i>[P.scribble]</i>" : ]"\
+ "</body></html>", "window=[name]")
else if(!isnull(pages[page]))
if(!(istype(usr, /mob/living/carbon/human) || isobserver(usr) || istype(usr, /mob/living/silicon)))
dat += "<HTML><HEAD><TITLE>Page [page]</TITLE></HEAD><BODY>[stars(pages[page])]</BODY></HTML>"
else
dat += "<HTML><HEAD><TITLE>Page [page]</TITLE></HEAD><BODY>[pages[page]]</BODY></HTML>"
user << browse(dat, "window=[name]")
/obj/item/weapon/book/bundle/attack_self(mob/user as mob)
src.show_content(user)
add_fingerprint(usr)
update_icon()
return
/obj/item/weapon/book/bundle/Topic(href, href_list)
if(..())
return 1
if((src in usr.contents) || (istype(src.loc, /obj/item/weapon/folder) && (src.loc in usr.contents)))
usr.set_machine(src)
if(href_list["next_page"])
if(page != pages.len)
page++
playsound(src.loc, "pageturn", 50, 1)
if(href_list["prev_page"])
if(page > 1)
page--
playsound(src.loc, "pageturn", 50, 1)
src.attack_self(usr)
updateUsrDialog()
else
to_chat(usr, "<span class='notice'>You need to hold it in your hands!</span>")
/*
* Barcode Scanner

View File

@@ -113,7 +113,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
* Library Computer
*/
// TODO: Make this an actual /obj/machinery/computer that can be crafted from circuit boards and such
// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it.
// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it. // Nov 2019. Nope.
/obj/machinery/librarycomp
name = "Check-In/Out Computer"
icon = 'icons/obj/library.dmi'
@@ -133,6 +133,40 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
var/bibledelay = 0 // LOL NO SPAM (1 minute delay) -- Doohl
var/static/list/all_books
var/static/list/base_genre_books
/obj/machinery/librarycomp/Initialize()
..()
if(!base_genre_books || !base_genre_books.len)
base_genre_books = list(
/obj/item/weapon/book/custom_library/fiction,
/obj/item/weapon/book/custom_library/nonfiction,
/obj/item/weapon/book/custom_library/reference,
/obj/item/weapon/book/custom_library/religious,
/obj/item/weapon/book/bundle/custom_library/fiction,
/obj/item/weapon/book/bundle/custom_library/nonfiction,
/obj/item/weapon/book/bundle/custom_library/reference,
/obj/item/weapon/book/bundle/custom_library/religious
)
if(!all_books || !all_books.len)
all_books = list()
for(var/path in subtypesof(/obj/item/weapon/book/codex/lore))
var/obj/item/weapon/book/C = new path(null)
all_books[C.name] = C
for(var/path in subtypesof(/obj/item/weapon/book/custom_library) - base_genre_books)
var/obj/item/weapon/book/B = new path(null)
all_books[B.title] = B
for(var/path in subtypesof(/obj/item/weapon/book/bundle/custom_library) - base_genre_books)
var/obj/item/weapon/book/M = new path(null)
all_books[M.title] = M
/obj/machinery/librarycomp/attack_hand(var/mob/user as mob)
usr.set_machine(src)
var/dat = "<HEAD><TITLE>Book Inventory Management</TITLE></HEAD><BODY>\n" // <META HTTP-EQUIV='Refresh' CONTENT='10'>
@@ -144,7 +178,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
<A href='?src=\ref[src];switchscreen=3'>3. Check out a Book</A><BR>
<A href='?src=\ref[src];switchscreen=4'>4. Connect to External Archive</A><BR>
<A href='?src=\ref[src];switchscreen=5'>5. Upload New Title to Archive</A><BR>
<A href='?src=\ref[src];switchscreen=6'>6. Print a Bible</A><BR>"}
<A href='?src=\ref[src];switchscreen=6'>6. Print a Bible</A><BR>
<A href='?src=\ref[src];switchscreen=8'>8. Access NT Internal Archive</A><BR>"}
if(src.emagged)
dat += "<A href='?src=\ref[src];switchscreen=7'>7. Access the Forbidden Lore Vault</A><BR>"
if(src.arcanecheckout)
@@ -190,8 +225,11 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
<A href='?src=\ref[src];checkout=1'>(Commit Entry)</A><BR>
<A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"}
if(4)
dat += "<h3>External Archive</h3>"
dat += "<h3>External Archive</h3>" //VOREStation Edit
establish_old_db_connection()
dat += "<h3><font color=red>Warning: System Administrator has slated this archive for removal. Personal uploads should be taken to the NT board of internal literature.</font></h3>"
if(!dbcon_old.IsConnected())
dat += "<font color=red><b>ERROR</b>: Unable to contact External Archive. Please contact your system administrator for assistance.</font>"
else
@@ -210,6 +248,10 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
dat += "</table>"
dat += "<BR><A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"
if(5)
//dat += "<H3>ERROR</H3>" //VOREStation Removal
//dat+= "<FONT color=red>Library Database is in Secure Management Mode.</FONT><BR>\ //VOREStation Removal
//Contact a System Administrator for more information.<BR>" //VOREStation Removal
//VOREstation Edit Start
dat += "<H3>Upload a New Title</H3>"
if(!scanner)
for(var/obj/machinery/libraryscanner/S in range(9))
@@ -227,12 +269,30 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
dat += {"<TT>Author: </TT><A href='?src=\ref[src];setauthor=1'>[scanner.cache.author]</A><BR>
<TT>Category: </TT><A href='?src=\ref[src];setcategory=1'>[upload_category]</A><BR>
<A href='?src=\ref[src];upload=1'>\[Upload\]</A><BR>"}
//VOREStation Edit End
dat += "<A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"
if(7)
dat += {"<h3>Accessing Forbidden Lore Vault v 1.3</h3>
Are you absolutely sure you want to proceed? EldritchTomes Inc. takes no responsibilities for loss of sanity resulting from this action.<p>
<A href='?src=\ref[src];arccheckout=1'>Yes.</A><BR>
<A href='?src=\ref[src];switchscreen=0'>No.</A><BR>"}
if(8)
dat += "<h3>NT Internal Archive</h3>"
if(!all_books || !all_books.len)
dat += "<font color=red><b>ERROR</b> Something has gone seriously wrong. Contact System Administrator for more information.</font>"
else
dat += {"<table>
<tr><td><A href='?src=\ref[src];sort=author>AUTHOR</A></td><td><A href='?src=\ref[src];sort=title>TITLE</A></td><td><A href='?src=\ref[src];sort=category>CATEGORY</A></td><td></td></tr>"}
for(var/name in all_books)
var/obj/item/weapon/book/masterbook = all_books[name]
var/id = masterbook.type
var/author = masterbook.author
var/title = masterbook.name
var/category = masterbook.libcategory
dat += "<tr><td>[author]</td><td>[title]</td><td>[category]</td><td><A href='?src=\ref[src];hardprint=[id]'>\[Order\]</A></td></tr>"
dat += "</table>"
dat += "<BR><A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"
//dat += "<A HREF='?src=\ref[user];mach_close=library'>Close</A><br><br>"
user << browse(dat, "window=library")
@@ -293,6 +353,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
if("7")
screenstate = 7
if("8")
screenstate = 8
if(href_list["arccheckout"])
if(src.emagged)
src.arcanecheckout = 1
@@ -328,6 +390,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
var/newcategory = input("Choose a category: ") in list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion")
if(newcategory)
upload_category = newcategory
//VOREStation Edit Start
if(href_list["upload"])
if(scanner)
if(scanner.cache)
@@ -356,6 +420,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
else
log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs")
alert("Upload Complete.")
//VOREStation Edit End
if(href_list["targetid"])
var/sqlid = sanitizeSQL(href_list["targetid"])
@@ -392,6 +457,10 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
spawn() src.Topic(nhref, params2list(nhref), src)
if(href_list["sort"] in list("author", "title", "category"))
sortby = href_list["sort"]
if(href_list["hardprint"])
var/newpath = href_list["hardprint"]
var/obj/item/weapon/book/NewBook = new newpath(get_turf(src))
NewBook.name = "Book: [NewBook.name]"
src.add_fingerprint(usr)
src.updateUsrDialog()
return

View File

@@ -24,13 +24,14 @@
has the words 'Don't Panic' in small, friendly letters on the cover."
icon_state = "codex"
root_type = /datum/lore/codex/category/main_virgo_lore
libcategory = "Reference"
/obj/item/weapon/book/codex/lore/robutt
name = "A Buyer's Guide to Artificial Bodies"
desc = "Recommended reading for the newly cyborgified, new positronics, and the upwardly-mobile FBP."
icon_state = "codex_robutt"
root_type = /datum/lore/codex/category/main_robutts
libcategory = "Reference"
/obj/item/weapon/book/codex/lore/news
name = "Daedalus Pocket Newscaster"
@@ -38,6 +39,7 @@
icon_state = "newscodex"
w_class = ITEMSIZE_SMALL
root_type = /datum/lore/codex/category/main_news
libcategory = "Reference"
/* //VORESTATION REMOVAL
// Combines SOP/Regs/Law
@@ -48,4 +50,5 @@
icon_state = "corp_regs"
root_type = /datum/lore/codex/category/main_corp_regs
throwforce = 5 // Throw the book at 'em.
libcategory = "Reference"
*/

View File

@@ -69,7 +69,7 @@
colour = "enochian" //So fancy
key = "i"
syllables = list("salve","sum","loqui","operatur","iusta","et","permittit","facere","effercio","pluribus","enim","hoc",
"mihi","wan","six","salve","tartu")
"mihi","wan","six","tartu")
machine_understands = FALSE
/datum/language/tajsign
@@ -92,6 +92,17 @@
"uhk","zir","sc'orth","sc'er","thc'yek","th'zirk","th'esk","k'ayek","ka'mil","sc'","ik'yir","yol","kig","k'zit","'","'","zrk","krg","isk'yet","na'k",
"sc'azz","th'sc","nil","n'ahk","sc'yeth","aur'sk","iy'it","azzg","a'","i'","o'","u'","a","i","o","u","zz","kr","ak","nrk","tzzk","bz","xic'","k'lax'","histh")
/datum/language/shadekin
name = LANGUAGE_SHADEKIN
desc = "Shadekin seem to always know what the others are thinking. This is probably why."
speech_verb = "mars"
ask_verb = "mars"
exclaim_verb = "mars"
colour = "changeling"
key = "m"
machine_understands = FALSE
flags = WHITELISTED | HIVEMIND
/datum/language/human/slavic
name = LANGUAGE_SLAVIC
desc = "The official language of the Independent Colonial Confederation of Gilgamesh, originally established in 2122 by the short-lived United Slavic Confederation on Earth."

View File

@@ -44,7 +44,7 @@
//Check if they are physically capable
if(src.sleeping || src.resting || src.buckled || src.weakened || src.restrained() || involved_parts.len < 2)
src << "<span class='warning'>You can't *flip in your current state!</span>"
to_chat(src, "<span class='warning'>You can't *flip in your current state!</span>")
return 1
else
src.SpinAnimation(7,1)
@@ -78,7 +78,7 @@
/mob/living/carbon/human/proc/toggle_tail_vr(var/setting,var/message = 0)
if(!tail_style || !tail_style.ani_state)
if(message)
src << "<span class='warning'>You don't have a tail that supports this.</span>"
to_chat(src, "<span class='warning'>You don't have a tail that supports this.</span>")
return 0
var/new_wagging = isnull(setting) ? !wagging : setting
@@ -90,7 +90,7 @@
/mob/living/carbon/human/proc/toggle_wing_vr(var/setting,var/message = 0)
if(!wing_style || !wing_style.ani_state)
if(message)
src << "<span class='warning'>You don't have a tail that supports this.</span>"
to_chat(src, "<span class='warning'>You don't have a tail that supports this.</span>")
return 0
var/new_flapping = isnull(setting) ? !flapping : setting

View File

@@ -243,6 +243,12 @@
// this handles mulebots and vehicles
// and now mobs on fire
/mob/living/carbon/human/Crossed(var/atom/movable/AM)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(istype(AM, /mob/living/bot/mulebot))
var/mob/living/bot/mulebot/MB = AM
MB.runOver(src)
@@ -709,7 +715,7 @@
/mob/living/carbon/human/IsAdvancedToolUser(var/silent)
// VOREstation start
if(feral)
src << "<span class='warning'>Your primitive mind can't grasp the concept of that thing.</span>"
to_chat(src, "<span class='warning'>Your primitive mind can't grasp the concept of that thing.</span>")
return 0
// VOREstation end
if(species.has_fine_manipulation)

View File

@@ -7,6 +7,46 @@
var/flapping = 0
var/vantag_pref = VANTAG_NONE //What's my status?
var/impersonate_bodytype //For impersonating a bodytype
var/ability_flags = 0 //Shadekin abilities/potentially other species-based?
var/sensorpref = 5 //Suit sensor loadout pref
//TFF 5/8/19 - add and set suit sensor setting define to 5 for random setting
var/sensorpref = 5
/mob/living/carbon/human/proc/shadekin_get_energy()
var/datum/species/shadekin/SK = species
if(!istype(SK))
return 0
return SK.get_energy(src)
/mob/living/carbon/human/proc/shadekin_get_max_energy()
var/datum/species/shadekin/SK = species
if(!istype(SK))
return 0
return SK.get_max_energy(src)
/mob/living/carbon/human/proc/shadekin_set_energy(var/new_energy)
var/datum/species/shadekin/SK = species
if(!istype(SK))
return 0
SK.set_energy(src, new_energy)
/mob/living/carbon/human/proc/shadekin_set_max_energy(var/new_max_energy)
var/datum/species/shadekin/SK = species
if(!istype(SK))
return 0
SK.set_max_energy(src, new_max_energy)
/mob/living/carbon/human/proc/shadekin_adjust_energy(var/amount)
var/datum/species/shadekin/SK = species
if(!istype(SK))
return 0
var/new_amount = SK.get_energy(src) + amount
SK.set_energy(src, new_amount)

View File

@@ -224,6 +224,10 @@
// Handle footstep sounds
/mob/living/carbon/human/handle_footstep(var/turf/T)
//VOREStation Edit begin: SHADEKIN
if(shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(!config.footstep_volume || !T.footstep_sounds || !T.footstep_sounds.len)
return
// Future Upgrades - Multi species support

View File

@@ -26,6 +26,8 @@
/mob/living/carbon/human/protean/New(var/new_loc)
..(new_loc, "Protean")
/mob/living/carbon/human/alraune/New(var/new_loc)
..(new_loc, "Alraune")
/mob/living/carbon/human/shadekin/New(var/new_loc)
..(new_loc, SPECIES_SHADEKIN)

View File

@@ -283,6 +283,12 @@
if(core)
return
//VOREStation Addition start: shadekin
var/obj/item/organ/internal/brain/shadekin/s_brain = locate() in internal_organs
if(s_brain)
return
//VOREStation Addition end: shadekin
var/damage = 0
radiation -= 1 * RADIATION_SPEED_COEFFICIENT
if(prob(25))
@@ -612,6 +618,11 @@
//Stuff like the xenomorph's plasma regen happens here.
species.handle_environment_special(src)
//VOREStation Edit begin: SHADEKIN
if(shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
//Moved pressure calculations here for use in skip-processing check.
var/pressure = environment.return_pressure()
var/adjusted_pressure = calculate_affecting_pressure(pressure)
@@ -876,7 +887,7 @@
for(var/obj/item/I in src)
if(I.contaminated)
if(check_belly(I)) continue //VOREStation Edit
if(src.species && src.species.get_bodytype() != "Vox")
if(src.species && src.species.get_bodytype() != "Vox" && src.species.get_bodytype() != "Shadekin") //VOREStation Edit: shadekin
// This is hacky, I'm so sorry.
if(I != l_hand && I != r_hand) //If the item isn't in your hands, you're probably wearing it. Full damage for you.
total_phoronloss += vsc.plc.CONTAMINATION_LOSS

View File

@@ -0,0 +1,6 @@
#define NOT_WHILE_SHIFTED 1
#define ONLY_WHILE_SHIFTED 2
#define SHIFTED_OR_NOT 3
#define AB_PHASE_SHIFTED 0x1
#define AB_SHADE_REGEN 0x2

View File

@@ -0,0 +1,245 @@
/datum/species/shadekin
name = SPECIES_SHADEKIN
name_plural = "Shadekin"
icobase = 'icons/mob/human_races/r_shadekin_vr.dmi'
deform = 'icons/mob/human_races/r_shadekin_vr.dmi'
tail = "tail"
icobase_tail = 1
blurb = "Very little is known about these creatures. They appear to be largely mammalian in appearance. \
Seemingly very rare to encounter, there have been widespread myths of these creatures the galaxy over, \
but next to no verifiable evidence to their existence. However, they have recently been more verifiably \
documented in the Virgo system, following a mining bombardment of Virgo 3. The crew of NSB Adephagia have \
taken to calling these creatures 'Shadekin', and the name has generally stuck and spread. " //TODO: Something that's not wiki copypaste
wikilink = "https://wiki.vore-station.net/Shadekin"
catalogue_data = list(/datum/category_item/catalogue/fauna/shadekin)
language = LANGUAGE_SHADEKIN
assisted_langs = list()
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin)
rarity_value = 15 //INTERDIMENSIONAL FLUFFERS
siemens_coefficient = 0
darksight = 10
slowdown = -0.5
item_slowdown_mod = 0.5
brute_mod = 0.7 // Naturally sturdy.
burn_mod = 1.2 // Furry
warning_low_pressure = 50
hazard_low_pressure = -1
warning_high_pressure = 300
hazard_high_pressure = INFINITY
cold_level_1 = -1 //Immune to cold
cold_level_2 = -1
cold_level_3 = -1
heat_level_1 = 850 //Resistant to heat
heat_level_2 = 1000
heat_level_3 = 1150
flags = NO_SCAN | NO_MINOR_CUT | NO_INFECT
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
reagent_tag = IS_SHADEKIN // for shadekin-unqiue chem interactions
flesh_color = "#FFC896"
blood_color = "#A10808"
base_color = "#f0f0f0"
color_mult = 1
has_glowing_eyes = TRUE
death_message = "phases to somewhere far away!"
male_cough_sounds = null
female_cough_sounds = null
male_sneeze_sound = null
female_sneeze_sound = null
speech_bubble_appearance = "ghost"
genders = list(PLURAL, NEUTER) //no sexual dymorphism
ambiguous_genders = TRUE //but just in case
virus_immune = 1
breath_type = null
poison_type = null
vision_flags = SEE_SELF|SEE_MOBS
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_UNDERWEAR
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
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/shadekin,
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/vr/shadekin),
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)
)
//SHADEKIN-UNIQUE STUFF GOES HERE
var/list/shadekin_abilities = list(/datum/power/shadekin/phase_shift,
/datum/power/shadekin/regenerate_other,
/datum/power/shadekin/create_shade)
var/list/shadekin_ability_datums = list()
/datum/species/shadekin/New()
..()
for(var/power in shadekin_abilities)
var/datum/power/shadekin/SKP = new power(src)
shadekin_ability_datums.Add(SKP)
/datum/species/shadekin/handle_death(var/mob/living/carbon/human/H)
spawn(1)
for(var/obj/item/W in H)
H.drop_from_inventory(W)
qdel(H)
/datum/species/shadekin/get_bodytype()
return SPECIES_SHADEKIN
/datum/species/shadekin/get_random_name()
return "shadekin"
/datum/species/shadekin/handle_environment_special(var/mob/living/carbon/human/H)
handle_shade(H)
/datum/species/shadekin/can_breathe_water()
return TRUE //they dont quite breathe
/datum/species/shadekin/add_inherent_verbs(var/mob/living/carbon/human/H)
..()
add_shadekin_abilities(H)
/datum/species/shadekin/proc/add_shadekin_abilities(var/mob/living/carbon/human/H)
if(!H.ability_master || !istype(H.ability_master, /obj/screen/movable/ability_master/shadekin))
H.ability_master = null
H.ability_master = new /obj/screen/movable/ability_master/shadekin(H)
for(var/datum/power/shadekin/P in shadekin_ability_datums)
if(!(P.verbpath in H.verbs))
H.verbs += P.verbpath
H.ability_master.add_shadekin_ability(
object_given = H,
verb_given = P.verbpath,
name_given = P.name,
ability_icon_given = P.ability_icon_state,
arguments = list()
)
/datum/species/shadekin/proc/handle_shade(var/mob/living/carbon/human/H)
//Shifted kin don't gain/lose energy (and save time if we're at the cap)
var/darkness = 1
var/dark_gains = 0
var/turf/T = get_turf(H)
if(!T)
dark_gains = 0
return
var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
darkness = 1-brightness //Invert
if(H.ability_flags & AB_PHASE_SHIFTED)
dark_gains = 0
else
//Heal (very) slowly in good darkness
if(darkness >= 0.75)
H.adjustFireLoss(-0.05)
H.adjustBruteLoss(-0.05)
H.adjustToxLoss(-0.05)
dark_gains = 0.75
else
dark_gains = 0.25
set_energy(H, get_energy(H) + dark_gains)
//Update huds
update_shadekin_hud(H)
/datum/species/shadekin/proc/get_energy(var/mob/living/carbon/human/H)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return 0
return shade_organ.dark_energy
/datum/species/shadekin/proc/get_max_energy(var/mob/living/carbon/human/H)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return 0
return shade_organ.max_dark_energy
/datum/species/shadekin/proc/set_energy(var/mob/living/carbon/human/H, var/new_energy)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return
shade_organ.dark_energy = CLAMP(new_energy, 0, get_max_energy(H))
/datum/species/shadekin/proc/set_max_energy(var/mob/living/carbon/human/H, var/new_max_energy)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return 0
shade_organ.max_dark_energy = new_max_energy
/datum/species/shadekin/proc/update_shadekin_hud(var/mob/living/carbon/human/H)
var/turf/T = get_turf(H)
if(!T)
return
if(H.shadekin_energy_display)
H.shadekin_energy_display.invisibility = 0
switch(get_energy(H))
if(80 to INFINITY)
H.shadekin_energy_display.icon_state = "energy0"
if(60 to 80)
H.shadekin_energy_display.icon_state = "energy1"
if(40 to 60)
H.shadekin_energy_display.icon_state = "energy2"
if(20 to 40)
H.shadekin_energy_display.icon_state = "energy3"
if(0 to 20)
H.shadekin_energy_display.icon_state = "energy4"
if(H.shadekin_dark_display)
H.shadekin_dark_display.invisibility = 0
var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
var/darkness = 1-brightness //Invert
switch(darkness)
if(0.80 to 1.00)
H.shadekin_dark_display.icon_state = "dark2"
if(0.60 to 0.80)
H.shadekin_dark_display.icon_state = "dark1"
if(0.40 to 0.60)
H.shadekin_dark_display.icon_state = "dark"
if(0.20 to 0.40)
H.shadekin_dark_display.icon_state = "dark-1"
if(0.00 to 0.20)
H.shadekin_dark_display.icon_state = "dark-2"
return

View File

@@ -0,0 +1,307 @@
/datum/power/shadekin
/////////////////////
/// PHASE SHIFT ///
/////////////////////
//Visual effect for phase in/out
/obj/effect/temp_visual/shadekin
randomdir = FALSE
duration = 5
icon = 'icons/mob/vore_shadekin.dmi'
/obj/effect/temp_visual/shadekin/phase_in
icon_state = "tp_in"
/obj/effect/temp_visual/shadekin/phase_out
icon_state = "tp_out"
/datum/power/shadekin/phase_shift
name = "Phase Shift (100)"
desc = "Shift yourself out of alignment with realspace to travel quickly areas."
verbpath = /mob/living/carbon/human/proc/phase_shift
ability_icon_state = "tech_passwall"
/mob/living/carbon/human/proc/phase_shift()
set name = "Phase Shift (100)"
set desc = "Shift yourself out of alignment with realspace to travel quickly areas."
set category = "Shadekin"
var/ability_cost = 100
var/datum/species/shadekin/SK = species
if(!istype(SK))
to_chat(src, "<span class='warning'>Only a shadekin can use that!</span>")
return FALSE
else if(stat)
to_chat(src, "<span class='warning'>Can't use that ability in your state!</span>")
return FALSE
else if(shadekin_get_energy() < ability_cost && !(ability_flags & AB_PHASE_SHIFTED))
to_chat(src, "<span class='warning'>Not enough energy for that ability!</span>")
return FALSE
if(!(ability_flags & AB_PHASE_SHIFTED))
shadekin_adjust_energy(-ability_cost)
playsound(src, 'sound/effects/stealthoff.ogg', 75, 1)
var/turf/T = get_turf(src)
if(!T.CanPass(src,T) || loc != T)
to_chat(src,"<span class='warning'>You can't use that here!</span>")
return FALSE
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
canmove = FALSE
//Shifting in
if(ability_flags & AB_PHASE_SHIFTED)
ability_flags &= ~AB_PHASE_SHIFTED
name = real_name
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = initial(B.escapable)
//overlays.Cut()
invisibility = initial(invisibility)
see_invisible = initial(see_invisible)
incorporeal_move = initial(incorporeal_move)
density = initial(density)
force_max_speed = initial(force_max_speed)
update_icon()
//Cosmetics mostly
var/obj/effect/temp_visual/shadekin/phase_in/phaseanim = new /obj/effect/temp_visual/shadekin/phase_in(src.loc)
phaseanim.dir = dir
alpha = 0
custom_emote(1,"phases in!")
sleep(5) //The duration of the TP animation
canmove = original_canmove
alpha = initial(alpha)
//Potential phase-in vore
if(can_be_drop_pred) //Toggleable in vore panel
var/list/potentials = living_mobs(0)
if(potentials.len)
var/mob/living/target = pick(potentials)
if(istype(target) && vore_selected)
target.forceMove(vore_selected)
to_chat(target,"<span class='warning'>\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
//Affect nearby lights
var/destroy_lights = 0
for(var/obj/machinery/light/L in machines)
if(L.z != z || get_dist(src,L) > 10)
continue
if(prob(destroy_lights))
spawn(rand(5,25))
L.broken()
else
L.flicker(10)
//Shifting out
else
ability_flags |= AB_PHASE_SHIFTED
custom_emote(1,"phases out!")
name = "Something"
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = FALSE
var/obj/effect/temp_visual/shadekin/phase_out/phaseanim = new /obj/effect/temp_visual/shadekin/phase_out(src.loc)
phaseanim.dir = dir
alpha = 0
sleep(5)
invisibility = INVISIBILITY_LEVEL_TWO
see_invisible = INVISIBILITY_LEVEL_TWO
//overlays.Cut()
update_icon()
alpha = 127
canmove = original_canmove
incorporeal_move = TRUE
density = FALSE
force_max_speed = TRUE
/mob/living/carbon/human/UnarmedAttack()
if(shadekin_phasing_check())
return FALSE //Nope.
. = ..()
/mob/living/carbon/human/can_fall()
if(shadekin_phasing_check())
return FALSE //Nope!
return ..()
/mob/living/carbon/human/zMove(direction)
if(shadekin_phasing_check())
var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src)
if(destination)
forceMove(destination)
return TRUE //Yup.
return ..()
/mob/proc/shadekin_phasing_check()
var/mob/living/simple_mob/shadekin/s_SK = src
if(istype(s_SK))
if(s_SK.ability_flags & AB_PHASE_SHIFTED)
return TRUE
var/mob/living/carbon/human/h_SK = src
if(istype(h_SK))
if(h_SK.ability_flags & AB_PHASE_SHIFTED)
return TRUE
return FALSE
/*
/mob/living/carbon/human/MouseDrop_T(atom/dropping, mob/user)
if(ability_flags & AB_PHASE_SHIFTED)
return FALSE //Nope!
return ..()
*/
//////////////////////////
/// REGENERATE OTHER ///
//////////////////////////
/datum/power/shadekin/regenerate_other
name = "Regenerate Other (50)"
desc = "Spend energy to heal physical wounds in another creature."
verbpath = /mob/living/carbon/human/proc/regenerate_other
ability_icon_state = "tech_biomedaura"
/mob/living/carbon/human/proc/regenerate_other()
set name = "Regenerate Other (50)"
set desc = "Spend energy to heal physical wounds in another creature."
set category = "Shadekin"
var/ability_cost = 50
var/datum/species/shadekin/SK = species
if(!istype(SK))
to_chat(src, "<span class='warning'>Only a shadekin can use that!</span>")
return FALSE
else if(stat)
to_chat(src, "<span class='warning'>Can't use that ability in your state!</span>")
return FALSE
else if(shadekin_get_energy() < ability_cost)
to_chat(src, "<span class='warning'>Not enough energy for that ability!</span>")
return FALSE
else if(ability_flags & AB_PHASE_SHIFTED)
to_chat(src, "<span class='warning'>You can't use that while phase shifted!</span>")
return FALSE
var/list/viewed = oview(1)
var/list/targets = list()
for(var/mob/living/L in viewed)
targets += L
if(!targets.len)
to_chat(src,"<span class='warning'>Nobody nearby to mend!</span>")
return FALSE
var/mob/living/target = input(src,"Pick someone to mend:","Mend Other") as null|anything in targets
if(!target)
return FALSE
target.add_modifier(/datum/modifier/shadekin/heal_boop,1 MINUTE)
playsound(src, 'sound/effects/EMPulse.ogg', 75, 1)
shadekin_adjust_energy(-ability_cost)
visible_message("<span class='notice'>\The [src] gently places a hand on \the [target]...</span>")
face_atom(target)
return TRUE
/datum/modifier/shadekin/heal_boop
name = "Shadekin Regen"
desc = "You feel serene and well rested."
mob_overlay_state = "green_sparkles"
on_created_text = "<span class='notice'>Sparkles begin to appear around you, and all your ills seem to fade away.</span>"
on_expired_text = "<span class='notice'>The sparkles have faded, although you feel much healthier than before.</span>"
stacks = MODIFIER_STACK_EXTEND
/datum/modifier/shadekin/heal_boop/tick()
if(!holder.getBruteLoss() && !holder.getFireLoss() && !holder.getToxLoss() && !holder.getOxyLoss() && !holder.getCloneLoss()) // No point existing if the spell can't heal.
expire()
return
holder.adjustBruteLoss(-2)
holder.adjustFireLoss(-2)
holder.adjustToxLoss(-2)
holder.adjustOxyLoss(-2)
holder.adjustCloneLoss(-2)
//////////////////////
/// CREATE SHADE ///
//////////////////////
/datum/power/shadekin/create_shade
name = "Create Shade (25)"
desc = "Create a field of darkness that follows you."
verbpath = /mob/living/carbon/human/proc/create_shade
ability_icon_state = "tech_dispelold"
/mob/living/carbon/human/proc/create_shade()
set name = "Create Shade (25)"
set desc = "Create a field of darkness that follows you."
set category = "Shadekin"
var/ability_cost = 25
var/datum/species/shadekin/SK = species
if(!istype(SK))
to_chat(src, "<span class='warning'>Only a shadekin can use that!</span>")
return FALSE
else if(stat)
to_chat(src, "<span class='warning'>Can't use that ability in your state!</span>")
return FALSE
else if(shadekin_get_energy() < ability_cost)
to_chat(src, "<span class='warning'>Not enough energy for that ability!</span>")
return FALSE
else if(ability_flags & AB_PHASE_SHIFTED)
to_chat(src, "<span class='warning'>You can't use that while phase shifted!</span>")
return FALSE
playsound(src, 'sound/effects/bamf.ogg', 75, 1)
add_modifier(/datum/modifier/shadekin/create_shade,20 SECONDS)
shadekin_adjust_energy(-ability_cost)
return TRUE
/datum/modifier/shadekin/create_shade
name = "Shadekin Shadegen"
desc = "Darkness envelops you."
mob_overlay_state = ""
on_created_text = "<span class='notice'>You drag part of The Dark into realspace, enveloping yourself.</span>"
on_expired_text = "<span class='warning'>You lose your grasp on The Dark and realspace reasserts itself.</span>"
stacks = MODIFIER_STACK_EXTEND
var/mob/living/simple_mob/shadekin/my_kin
/datum/modifier/shadekin/create_shade/tick()
if(my_kin.ability_flags & AB_PHASE_SHIFTED)
expire()
/datum/modifier/shadekin/create_shade/on_applied()
my_kin = holder
holder.glow_toggle = TRUE
holder.glow_range = 8
holder.glow_intensity = -10
holder.glow_color = "#FFFFFF"
holder.set_light(8, -10, "#FFFFFF")
/datum/modifier/shadekin/create_shade/on_expire()
holder.glow_toggle = initial(holder.glow_toggle)
holder.glow_range = initial(holder.glow_range)
holder.glow_intensity = initial(holder.glow_intensity)
holder.glow_color = initial(holder.glow_color)
holder.set_light(0)
my_kin = null

View File

@@ -0,0 +1,59 @@
/obj/screen/shadekin
icon = 'icons/mob/shadekin_hud.dmi'
invisibility = 101
/obj/screen/shadekin/darkness
name = "darkness"
icon_state = "dark"
alpha = 150
/obj/screen/shadekin/energy
name = "energy"
icon_state = "energy0"
alpha = 150
/obj/screen/movable/ability_master/shadekin
name = "Shadekin Abilities"
icon = 'icons/mob/screen_spells.dmi'
icon_state = "grey_spell_ready"
ability_objects = list()
showing = 0
open_state = "master_open"
closed_state = "master_closed"
screen_loc = ui_spell_master
/obj/screen/movable/ability_master/shadekin/update_abilities(forced = 0, mob/user) //Different proc to prevent indexing
update_icon()
if(user && user.client)
if(!(src in user.client.screen))
user.client.screen += src
for(var/obj/screen/ability/ability in ability_objects)
ability.update_icon(forced)
/obj/screen/ability/verb_based/shadekin
icon_state = "grey_spell_base"
background_base_state = "grey"
/obj/screen/movable/ability_master/proc/add_shadekin_ability(var/object_given, var/verb_given, var/name_given, var/ability_icon_given, var/arguments)
if(!object_given)
message_admins("ERROR: add_shadekin_ability() was not given an object in its arguments.")
if(!verb_given)
message_admins("ERROR: add_shadekin_ability() was not given a verb/proc in its arguments.")
if(get_ability_by_proc_ref(verb_given))
return // Duplicate
var/obj/screen/ability/verb_based/shadekin/A = new /obj/screen/ability/verb_based/shadekin()
A.ability_master = src
A.object_used = object_given
A.verb_to_call = verb_given
A.ability_icon_state = ability_icon_given
A.name = name_given
if(arguments)
A.arguments_to_use = arguments
ability_objects.Add(A)
if(my_mob.client)
toggle_open(2) //forces the icons to refresh on screen

View File

@@ -47,3 +47,17 @@
user.visible_message("<span class='danger'>[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!</span>")
to_chat(target, "<font color='red'><b>Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!</b></font>")
target.bloodstr.add_reagent("numbenzyme",attack_damage)
/datum/unarmed_attack/claws/shadekin
var/energy_gain = 3
/datum/unarmed_attack/claws/shadekin/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
user.shadekin_adjust_energy(energy_gain)
/datum/unarmed_attack/bite/sharp/shadekin
var/energy_gain = 3
/datum/unarmed_attack/bite/sharp/shadekin/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
user.shadekin_adjust_energy(energy_gain)

View File

@@ -33,7 +33,7 @@
flesh_color = "#5F7BB0"
base_color = "#001144"
tail = "seromitail"
//tail_hair = "feathers" //TESHARI TEMPORARY REMOVAL
//tail_hair = "feathers" //VORESTATION TESHARI TEMPORARY REMOVAL
reagent_tag = IS_TESHARI
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw

View File

@@ -167,13 +167,13 @@
switch(halpick)
if(0 to 15) //15% chance
//Screwy HUD
//src << "Screwy HUD"
//to_chat(src, "Screwy HUD")
hal_screwyhud = pick(1,2,3,3,4,4)
spawn(rand(100,250))
hal_screwyhud = 0
if(16 to 25) //10% chance
//Strange items
//src << "Traitor Items"
//to_chat(src, "Traitor Items")
if(!halitem)
halitem = new
var/list/slots_free = list(ui_lhand,ui_rhand)
@@ -221,7 +221,7 @@
halitem = null
if(26 to 35) //10% chance
//Flashes of danger
//src << "Danger Flash"
//to_chat(src, "Danger Flash")
if(!halimage)
var/list/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
@@ -231,13 +231,13 @@
switch(rand(1,3))
if(1)
//src << "Space"
//to_chat(src, "Space")
halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
if(2)
//src << "Fire"
//to_chat(src, "Fire")
halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
if(3)
//src << "C4"
//to_chat(src, "C4")
halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
@@ -248,7 +248,7 @@
if(36 to 55) //20% chance
//Strange audio
//src << "Strange Audio"
//to_chat(src, "Strange Audio")
switch(rand(1,12))
if(1) src << 'sound/machines/airlock.ogg'
if(2)
@@ -282,7 +282,7 @@
src << pick(creepyasssounds)
if(56 to 60) //5% chance
//Flashes of danger
//src << "Danger Flash"
//to_chat(src, "Danger Flash")
if(!halbody)
var/list/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
@@ -358,7 +358,7 @@
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
src << "You cannot bite anyone in your current state!"
to_chat(src, "You cannot bite anyone in your current state!")
return
var/list/choices = list()
@@ -376,10 +376,10 @@
if(last_special > world.time) return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
src << "You cannot bite in your current state."
to_chat(src, "You cannot bite in your current state.")
return
if(B.vessel.total_volume <= 0 || B.isSynthetic()) //Do they have any blood in the first place, and are they synthetic?
src << "<font color='red'>There appears to be no blood in this prey...</font>"
to_chat(src, "<font color='red'>There appears to be no blood in this prey...</font>")
return
last_special = world.time + 600

View File

@@ -13,7 +13,7 @@
if ( ! (istype(src, /mob/living/carbon/human) || \
istype(src, /mob/living/silicon)) )
src << "<span class='warning'>If you even have a tongue, it doesn't work that way.</span>"
to_chat(src, "<span class='warning'>If you even have a tongue, it doesn't work that way.</span>")
return
if (istype(M, /mob/living/carbon/human))

View File

@@ -55,6 +55,12 @@
desc = "A small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
/mob/living/simple_mob/animal/passive/mouse/Crossed(AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if( ishuman(AM) )
if(!stat)
var/mob/M = AM

View File

@@ -13,6 +13,9 @@
health = 30
movement_cooldown = 0
see_in_dark = 10
seedarkness = FALSE
min_oxy = 0
max_oxy = 0
min_tox = 0

View File

@@ -91,7 +91,7 @@
return
if(!my_kin.mend_other())
my_kin.energy += cost //Refund due to abort
/*
/datum/modifier/shadekin/heal_boop
name = "Shadekin Regen"
desc = "You feel serene and well rested."
@@ -110,6 +110,7 @@
holder.adjustToxLoss(-2)
holder.adjustOxyLoss(-2)
holder.adjustCloneLoss(-2)
*/
/////////////////////////////////////////////////////////////////
/obj/effect/shadekin_ability/create_shade
ability_name = "Create Shade"
@@ -122,6 +123,7 @@
if(!..())
return
my_kin.add_modifier(/datum/modifier/shadekin/create_shade,20 SECONDS)
/*
/datum/modifier/shadekin/create_shade
name = "Shadekin Shadegen"
desc = "Darkness envelops you."
@@ -151,6 +153,7 @@
holder.glow_color = initial(holder.glow_color)
holder.set_light(0)
my_kin = null
*/
/*
/////////////////////////////////////////////////////////////////
/obj/effect/shadekin_ability/energy_feast

View File

@@ -1,8 +1,3 @@
/datum/category_item/catalogue/fauna/shadekin //TODO: VIRGO_LORE_WRITING_WIP
name = "Sapients - Shadekin"
desc = ""
value = CATALOGUER_REWARD_EASY
/mob/living/simple_mob/shadekin //Spawning the prototype spawns a random one, see initialize()
name = "shadekin"
desc = "Some sort of fluffer. Big ears, long tail."
@@ -449,14 +444,3 @@
say_maybe_target = list("...mar?")
say_got_target = list("MAR!!!")
//reactions = list("Mar?" = "Marrr!", "Mar!" = "Marrr???", "Mar." = "Marrr.")
/datum/language/shadekin
name = "Shadekin Empathy"
desc = "Shadekin seem to always know what the others are thinking. This is probably why."
colour = "changeling"
speech_verb = "mars"
ask_verb = "mars"
exclaim_verb = "mars"
key = "m"
machine_understands = 0
flags = WHITELISTED | HIVEMIND

View File

@@ -4,3 +4,6 @@
var/mob/temporary_form // For holding onto a temporary form
var/disconnect_time = null //Time of client loss, set by Logout(), for timekeeping
var/obj/screen/shadekin/darkness/shadekin_dark_display = null
var/obj/screen/shadekin/energy/shadekin_energy_display = null

View File

@@ -385,6 +385,11 @@
///Return 1 for movement 0 for none
/mob/proc/Process_Spacemove(var/check_drift = 0)
//VOREStation Edit begin: SHADEKIN
if(shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(!Check_Dense_Object()) //Nothing to push off of so end here
update_floating(0)
return 0

View File

@@ -8,7 +8,7 @@
//var/icon_add = 'icons/mob/human_face.dmi' //Already defined in sprite_accessories.dm line 49.
var/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_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //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_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN) //This lets all races use the default hairstyles.
astolfo
name = "Astolfo"
@@ -474,6 +474,41 @@
species_allowed = list(SPECIES_XENOHYBRID)
gender = NEUTER
// Shadekin stuffs
shadekin_hair_short
name = "Shadekin Short Hair"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "shadekin_short"
species_allowed = list(SPECIES_SHADEKIN)
gender = NEUTER
shadekin_hair_poofy
name = "Shadekin Poofy Hair"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "shadekin_poofy"
species_allowed = list(SPECIES_SHADEKIN)
gender = NEUTER
shadekin_hair_long
name = "Shadekin Long Hair"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "shadekin_long"
species_allowed = list(SPECIES_SHADEKIN)
gender = NEUTER
shadekin_hair_rivyr
name = "Rivyr Hair"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "shadekin_rivyr"
ckeys_allowed = list("verysoft")
species_allowed = list(SPECIES_SHADEKIN)
gender = NEUTER
/datum/sprite_accessory/facial_hair
icon = 'icons/mob/human_face_or_vr.dmi'
var/color_blend_mode = ICON_MULTIPLY
@@ -485,6 +520,12 @@
gender = NEUTER
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This needed to be manually defined, apparantly.
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_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST)
vulp_none
name = "None"
@@ -549,15 +590,6 @@
species_allowed = list(SPECIES_VULPKANIN)
gender = NEUTER
//Special hairstyles
/datum/sprite_accessory/ears/inkling
name = "colorable mature inkling hair"
desc = ""
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "inkling-colorable"
color_blend_mode = ICON_MULTIPLY
do_colouration = 1
//VOREStation Body Markings and Overrides
//Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD
@@ -1064,7 +1096,7 @@
name = "Heterochromia"
icon_state = "heterochromia"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This lets all races use the default hairstyles.
species_allowed = list(SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN) //This lets all races use the default hairstyles.
werewolf_nose
name = "Werewolf nose"
@@ -1097,3 +1129,10 @@
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
species_allowed = list(SPECIES_WEREBEAST)
shadekin_snoot
name = "Shadekin Snoot"
icon_state = "shadekin-snoot"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_SHADEKIN)

View File

@@ -23,7 +23,7 @@
/mob/proc/custom_emote_vr(var/m_type=1,var/message = null) //This would normally go in emote.dm
if(stat || !use_me && usr == src)
src << "You are unable to emote."
to_chat(src, "You are unable to emote.")
return
var/muzzled = is_muzzled()

View File

@@ -369,7 +369,7 @@
return
if (src.client)
if (client.prefs.muted & MUTE_IC)
src << "<span class='warning'>You cannot send IC messages (muted).</span>"
to_chat(src, "<span class='warning'>You cannot send IC messages (muted).</span>")
return
if (stat)
return

View File

@@ -0,0 +1,5 @@
/obj/item/organ/internal/brain/shadekin
can_assist = FALSE
var/dark_energy = 100
var/max_dark_energy = 100

View File

@@ -46,7 +46,6 @@
if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3)
hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY)
overlays |= image(hair_s, "pixel_y" = head_offset)
return mob_icon
/obj/item/organ/external/head/vr
@@ -62,3 +61,10 @@
eye_icons_vr = 'icons/mob/werebeast_face_vr.dmi'
eye_icon_vr = "werebeast_eyes"
head_offset = 6
/obj/item/organ/external/head/vr/shadekin
cannot_gib = 1
cannot_amputate = 1
eye_icons_vr = 'icons/mob/human_face_vr.dmi'
eye_icon_vr = "eyes_shadekin"

View File

@@ -219,6 +219,12 @@
Range()
/obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it.
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
..()
if(isliving(AM) && !(pass_flags & PASSMOB))
var/mob/living/L = AM

View File

@@ -68,16 +68,15 @@
switch(alien)
if(IS_SKRELL)
M.adjustToxLoss(0.5 * removed)
return
if(IS_TESHARI)
..(M, alien, removed*1.2) // Teshari get a bit more nutrition from meat.
return
if(IS_UNATHI)
..(M, alien, removed*2.25) //Unathi get most of their nutrition from meat.
//VOREStation Edit Start
if(IS_CHIMERA)
..(M, alien, removed*4) //Xenochimera are obligate carnivores.
//VOREStation Edit End
else
..()
/datum/reagent/nutriment/protein/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)

View File

@@ -37,6 +37,8 @@
strength = 50
color = "#d3785d"
metabolism = REM * 2.5 // about right for mixing nutriment and ethanol.
var/alt_nutriment_factor = 5 //half as much as protein since it's half protein.
//using a new variable instead of nutriment_factor so we can call ..() without that adding nutrition for us without taking factors for protein into account
glass_name = "Monster Tamer"
glass_desc = "This looks like a vaguely-alcoholic slurry of meat. Gross."
@@ -45,7 +47,18 @@
..()
if(M.species.gets_food_nutrition) //it's still food!
M.nutrition += (nutriment_factor * removed)/2 // For hunger and fatness
switch(alien)
if(IS_DIONA) //Diona don't get any nutrition from nutriment or protein.
if(IS_SKRELL)
M.adjustToxLoss(0.25 * removed) //Equivalent to half as much protein, since it's half protein.
if(IS_TESHARI)
M.nutrition += (alt_nutriment_factor * 1.2 * removed) //Give them the same nutrition they would get from protein.
if(IS_UNATHI)
M.nutrition += (alt_nutriment_factor * 1.125 * removed) //Give them the same nutrition they would get from protein.
//Takes into account the 0.5 factor for all nutriment which is applied on top of the 2.25 factor for protein.
//Chimera don't need their own case here since their factors for nutriment and protein cancel out.
else
M.nutrition += (alt_nutriment_factor * removed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.feral > 0 && H.nutrition > 100 && H.traumatic_shock < min(60, H.nutrition/10) && H.jitteriness < 100) // same check as feral triggers to stop them immediately re-feralling
@@ -54,3 +67,11 @@
H.feral = 0
H << "<span class='info'>Your mind starts to clear, soothed into a state of clarity as your senses return.</span>"
log_and_message_admins("is no longer feral.", H)
/datum/reagent/ethanol/monstertamer/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
..()
if(alien == IS_SKRELL)
M.adjustToxLoss(removed) //Equivalent to half as much protein, since it's half protein.
if(M.species.gets_food_nutrition)
if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein
M.nutrition += (alt_nutriment_factor * removed)

View File

@@ -154,7 +154,7 @@ var/list/infomorph_emotions = list(
// 20% chance to kill
src.silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes
src << "<font color=green><b>Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.</b></font>"
to_chat(src, "<font color=green><b>Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.</b></font>")
if(prob(20))
var/turf/T = get_turf_or_move(src.loc)
for (var/mob/M in viewers(T))
@@ -337,7 +337,7 @@ var/list/infomorph_emotions = list(
resting = !resting
icon_state = resting ? "[chassis]_rest" : "[chassis]"
src << "<span class='notice'>You are now [resting ? "resting" : "getting up"]</span>"
to_chat(src, "<span class='notice'>You are now [resting ? "resting" : "getting up"]</span>")
canmove = !resting
@@ -384,11 +384,11 @@ var/list/infomorph_emotions = list(
if(idaccessible == 0)
idaccessible = 1
src << "<span class='notice'>You allow access modifications.</span>"
to_chat(src, "<span class='notice'>You allow access modifications.</span>")
else
idaccessible = 0
src << "<span class='notice'>You block access modfications.</span>"
to_chat(src, "<span class='notice'>You block access modfications.</span>")
/mob/living/silicon/infomorph/verb/wipe_software()
set name = "Suspend Self"
@@ -423,7 +423,7 @@ var/list/infomorph_emotions = list(
/mob/living/silicon/infomorph/say(var/msg)
if(silence_time)
src << "<font color=green>Communication circuits remain uninitialized.</font>"
to_chat(src, "<font color=green>Communication circuits remain uninitialized.</font>")
else
..(msg)
@@ -594,7 +594,7 @@ var/global/list/default_infomorph_software = list()
if(silence_time)
if(world.timeofday >= silence_time)
silence_time = null
src << "<font color=green>Communication circuit reinitialized. Speech and messaging functionality restored.</font>"
to_chat(src, "<font color=green>Communication circuit reinitialized. Speech and messaging functionality restored.</font>")
handle_statuses()

View File

@@ -30,7 +30,7 @@ mob/proc/weaveWeb()
spawn(30) //3 seconds to form
new /obj/effect/spider/stickyweb(src.loc)
else
src << "You do not have enough nutrition to create webbing!"
to_chat(src, "You do not have enough nutrition to create webbing!")
*/
/mob/proc/weaveWebBindings()
@@ -43,4 +43,4 @@ mob/proc/weaveWeb()
var/obj/item/clothing/suit/straight_jacket/web_bindings/bindings = new() //This sprite is amazing, I must say.
src.put_in_hands(bindings)
else
src << "You do not have enough nutrition to create webbing!" //CK~
to_chat(src, "You do not have enough nutrition to create webbing!") //CK~

View File

@@ -157,14 +157,27 @@
clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi'
clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms.
/datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 32x64 so it wouldn't fit in tails.dmi, and having it as a tail bugs up the sprite.
name = "Long Lizard Tail (Roiz Lizden)"
icon_state = "roiz_tail_s"
do_colouration = 0
ckeys_allowed = list("spoopylizz")
// Species-unique long tails/taurhalves
/datum/sprite_accessory/tail/taur/shadekin_tail
name = "Shadekin Tail (Shadekin)"
icon_state = "shadekin_s"
can_ride = 0
hide_body_parts = null
clip_mask_icon = null
clip_mask_state = null
apply_restrictions = TRUE
species_allowed = list(SPECIES_SHADEKIN)
/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_2c
name = "Shadekin Tail dual-color (Shadekin)"
extra_overlay = "shadekin_markings"
/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_long
name = "Shadekin Long Tail (Shadekin)"
icon_state = "shadekin_long_s"
// Tails/taurhalves for everyone
/datum/sprite_accessory/tail/taur/wolf
name = "Wolf (Taur)"
@@ -402,6 +415,49 @@
icon_state = "otie_s"
extra_overlay = "otie_markings"
/datum/sprite_accessory/tail/taur/alraune/alraune_2c
name = "Alraune (dual color)"
icon_state = "alraunecolor_s"
ani_state = "alraunecolor_closed_s"
ckeys_allowed = null
do_colouration = 1
extra_overlay = "alraunecolor_markings"
extra_overlay_w = "alraunecolor_closed_markings"
clip_mask_state = "taur_clip_mask_alraune"
/datum/sprite_accessory/tail/taur/wasp
name = "Wasp (dual color)"
icon_state = "wasp_s"
extra_overlay = "wasp_markings"
clip_mask_state = "taur_clip_mask_wasp"
msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!"
msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!"
msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!"
msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!"
msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor!"
msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor!"
msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!"
msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!"
msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!"
msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!"
// Special snowflake tails/taurhalves
//spoopylizz: Roiz Lizden
/datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 32x64 so it wouldn't fit in tails.dmi, and having it as a tail bugs up the sprite.
name = "Long Lizard Tail (Roiz Lizden)"
icon_state = "roiz_tail_s"
do_colouration = 0
ckeys_allowed = list("spoopylizz")
hide_body_parts = null
clip_mask_icon = null
clip_mask_state = null
//wickedtemp: Chakat Tempest
/datum/sprite_accessory/tail/taur/feline/tempest
name = "Feline (wickedtemp) (Taur)"
@@ -436,7 +492,7 @@
msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!"
msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!"
//liquidfirefly: Ariana Scol
//natje:
/datum/sprite_accessory/tail/taur/alraune
name = "Alraune (natje) (Taur)"
icon_state = "alraune_s"
@@ -467,34 +523,3 @@
msg_owner_grab_fail = "You step down onto %prey with one of your vines, forcing them onto the ground!"
msg_prey_grab_fail = "%owner steps down onto you with one of their vines, squishing you and forcing you onto the ground!"
/datum/sprite_accessory/tail/taur/alraune/alraune_2c
name = "Alraune (dual color)"
icon_state = "alraunecolor_s"
ani_state = "alraunecolor_closed_s"
ckeys_allowed = null
do_colouration = 1
extra_overlay = "alraunecolor_markings"
extra_overlay_w = "alraunecolor_closed_markings"
clip_mask_state = "taur_clip_mask_alraune"
/datum/sprite_accessory/tail/taur/wasp
name = "Wasp (dual color)"
icon_state = "wasp_s"
extra_overlay = "wasp_markings"
clip_mask_state = "taur_clip_mask_wasp"
msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!"
msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!"
msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!"
msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!"
msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor!"
msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor!"
msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!"
msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!"
msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!"
msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!"

View File

@@ -12,6 +12,7 @@
/datum/sprite_accessory
// Ckey of person allowed to use this, if defined.
var/list/ckeys_allowed = null
var/apply_restrictions = FALSE //whether to apply restrictions for specific tails/ears/wings
/*
////////////////////////////
@@ -29,6 +30,17 @@
var/extra_overlay // Icon state of an additional overlay to blend in.
var/desc = "You should not see this..."
// Species-unique ears
/datum/sprite_accessory/ears/shadekin
name = "Shadekin Ears, colorable"
desc = ""
icon_state = "shadekin"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
apply_restrictions = TRUE
species_allowed = list(SPECIES_SHADEKIN)
// Ears avaliable to anyone
/datum/sprite_accessory/ears/squirrel_orange
@@ -386,6 +398,14 @@
color_blend_mode = ICON_MULTIPLY
extra_overlay = "tesharilowinner"
/datum/sprite_accessory/ears/inkling
name = "colorable mature inkling hair"
desc = ""
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "inkling-colorable"
color_blend_mode = ICON_MULTIPLY
do_colouration = 1
// Special snowflake ears go below here.
@@ -657,6 +677,19 @@
var/icon/clip_mask_icon = null //Icon file used for clip mask.
var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits.
// Species-unique tails
/datum/sprite_accessory/tail/shadekin_short
name = "Shadekin Short Tail, colorable"
desc = ""
icon_state = "shadekin-short"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
apply_restrictions = TRUE
species_allowed = list(SPECIES_SHADEKIN)
// Everyone tails
/datum/sprite_accessory/tail/invisible
name = "hide species-sprite tail"
icon = null

View File

@@ -186,6 +186,8 @@
digestion_death(M)
if(!ishuman(owner))
owner.update_icons()
if(compensation == 0) //Slightly sloppy way at making sure certain mobs don't give ZERO nutrition (fish and so on)
compensation = 21 //This reads as 20*4.5 due to the calculations afterward, making the backup nutrition value 94.5 per mob. Not op compared to regular prey.
if(compensation > 0)
if(isrobot(owner))
var/mob/living/silicon/robot/R = owner

View File

@@ -78,7 +78,7 @@
return
hologram.visible_message("[hologram] starts engulfing [prey] in hardlight holograms!")
src << "<span class='notice'>You begin engulfing [prey] in hardlight holograms.</span>" //Can't be part of the above, because the above is from the hologram.
to_chat(src, "<span class='notice'>You begin engulfing [prey] in hardlight holograms.</span>") //Can't be part of the above, because the above is from the hologram.
if(do_after(user=eyeobj,delay=50,target=prey,needhand=0) && holo && hologram && !hologram.bellied) //Didn't move and still projecting and effect exists and no other bellied people
hologram.get_prey(prey)

View File

@@ -60,9 +60,7 @@
desc = "A kit containing Tasald's equipment."
has_items = list(
/obj/item/clothing/suit/storage/det_suit/fluff/tasald,
/obj/item/clothing/suit/storage/det_suit/fluff/tas_coat,
/obj/item/clothing/under/det/fluff/tasald,
/obj/item/weapon/implanter/loyalty)
/obj/item/clothing/under/det/fluff/tasald)
//bwoincognito:Octavious Ward
/obj/item/weapon/storage/box/fluff/octavious

View File

@@ -502,22 +502,6 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0)
// bwoincognito:Tasald Corlethian
/obj/item/clothing/suit/storage/det_suit/fluff/tas_coat
name = "Armored Colony coat"
desc = "Dark green and grey colored sleeveless long coat with two thick metal shoulder pads. has seen some wear and tear, with noticeable patches in the fabric, scratches on the shoulder pads, but with a clean patch on the left upper chest. It has a red NT marked on the right shoulder pad and red Security on the left. "
allowed = list(/obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/flashlight/maglight,/obj/item/clothing/head/helmet)
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "tasaldcoat"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "tasaldcoat_mob"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
//Event Costumes Below
/obj/item/clothing/head/helmet/fluff/freddy
name = "Animatronic Suit Helmet"
@@ -1917,3 +1901,19 @@ Departamental Swimsuits, for general use
/obj/item/clothing/under/fluff/slime_skeleton/digest_act(var/atom/movable/item_storage = null)
return FALSE //Indigestible
//Bacon12366:Elly Brown
/obj/item/clothing/accessory/sweater/fluff/star
name = "Star Sweater"
desc = "It's a white long sweater with a big yellow star at the chest. It seems like it's made of a soft material."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "star_sweater"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "star_sweater"
slot_flags = SLOT_OCLOTHING | SLOT_TIE
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
w_class = ITEMSIZE_NORMAL
slot = ACCESSORY_SLOT_OVER

View File

@@ -249,7 +249,7 @@
name = "Mouse Plushie"
desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend."
slot_flags = SLOT_HEAD
icon_state = "mouse_brown"
icon_state = "mouse_brown" //TFF 12/11/19 - Change sprite to not look dead. Heck you for that choice! >:C
item_state = "mouse_brown_head"
icon = 'icons/vore/custom_items_vr.dmi'
icon_override = 'icons/vore/custom_items_vr.dmi'

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 89 KiB

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