Merge remote-tracking branch 'upstream/master'
@@ -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
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
// More for our custom races
|
||||
#define IS_CHIMERA 12
|
||||
#define IS_SHADEKIN 13
|
||||
@@ -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"
|
||||
|
||||
1
code/_helpers/_global_objects_vr.dm
Normal file
@@ -0,0 +1 @@
|
||||
var/datum/gear_tweak/collar_tag/gear_tweak_collar_tag = new()
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
2
code/_onclick/hud/_defines_vr.dm
Normal 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"
|
||||
@@ -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////////////
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>")
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
2
code/game/objects/effects/spiders_vr.dm
Normal 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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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...\
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)),
|
||||
|
||||
@@ -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),
|
||||
))
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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--
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
61
code/modules/library/hardcode_library/_library.dm
Normal 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"
|
||||
*/
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
*/
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
health = 30
|
||||
movement_cooldown = 0
|
||||
|
||||
see_in_dark = 10
|
||||
seedarkness = FALSE
|
||||
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
5
code/modules/organs/subtypes/shadekin.dm
Normal file
@@ -0,0 +1,5 @@
|
||||
/obj/item/organ/internal/brain/shadekin
|
||||
can_assist = FALSE
|
||||
|
||||
var/dark_energy = 100
|
||||
var/max_dark_energy = 100
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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~
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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'
|
||||
|
||||
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
BIN
icons/mob/human_races/r_shadekin_vr.dmi
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB |
BIN
icons/mob/species/shadekin/tail.dmi
Normal file
|
After Width: | Height: | Size: 758 B |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 89 KiB |