mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-09 16:12:17 +00:00
[MIRROR] VR pod rewrite (#10484)
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
This commit is contained in:
committed by
GitHub
parent
07e5012dd2
commit
ddebf29f35
@@ -117,11 +117,9 @@
|
||||
#define AREA_BLOCK_GHOST_SIGHT 0x2000 // If an area blocks sight for ghosts
|
||||
// The 0x800000 is blocked by INITIALIZED, do NOT use it!
|
||||
|
||||
// CHOMPAdd Start/area
|
||||
#define PHASE_SHIELDED 0x100000 // A less rough way to prevent phase shifting without blocking access
|
||||
#define AREA_LIMIT_DARK_RESPITE 0x200000// Shadekin will die normally in those areas
|
||||
#define AREA_ALLOW_CLOCKOUT 0x400000 //The PDA timeclock app can only be used in these areas
|
||||
// CHOMPAdd End
|
||||
#define PHASE_SHIELDED 0x100000 // A less rough way to prevent phase shifting without blocking access //VOREStation Note: Not implemented on VS. Used downstream.
|
||||
#define AREA_LIMIT_DARK_RESPITE 0x200000 // Shadekin will die normally in those areas //VOREStation Note: Not implemented on VS. Used downstream.
|
||||
#define AREA_ALLOW_CLOCKOUT 0x400000 // The PDA timeclock app can only be used in these areas //VOREStation Note: Not implemented on VS. Used downstream.
|
||||
|
||||
// OnTopic return values
|
||||
#define TOPIC_NOACTION 0
|
||||
@@ -215,9 +213,10 @@
|
||||
#define DEPARTMENT_RESEARCH "Research"
|
||||
#define DEPARTMENT_CARGO "Cargo"
|
||||
#define DEPARTMENT_CIVILIAN "Civilian"
|
||||
#define DEPARTMENT_PLANET "Exploration" //VOREStation Edit // I hate having this be here and not in a SC file. Hopefully someday the manifest can be rewritten to be map-agnostic.
|
||||
#define DEPARTMENT_PLANET "Exploration" // I hate having this be here and not in a SC file. Hopefully someday the manifest can be rewritten to be map-agnostic.
|
||||
#define DEPARTMENT_SYNTHETIC "Synthetic"
|
||||
|
||||
#define DEPARTMENT_NONCREW "Non crew"
|
||||
// These are mostly for the department guessing code and event system.
|
||||
#define DEPARTMENT_UNKNOWN "Unknown"
|
||||
#define DEPARTMENT_EVERYONE "Everyone"
|
||||
@@ -341,6 +340,11 @@ GLOBAL_LIST_EMPTY(##LIST_NAME);\
|
||||
#define JOB_SILICON_AI 0x4
|
||||
#define JOB_SILICON 0x6 // 2|4, probably don't set jobs to this, but good for checking
|
||||
|
||||
//Job defines
|
||||
#define JOB_OUTSIDER "Outsider" //VOREStation Note: Not implemented on VS. Used downstream.
|
||||
#define JOB_ANOMALY "Anomaly" //VOREStation Note: Not implemented on VS. Used downstream.
|
||||
#define JOB_VR "VR Avatar"
|
||||
|
||||
#define DEFAULT_OVERMAP_RANGE 0 // Makes general computers and devices be able to connect to other overmap z-levels on the same tile.
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
//Department defines
|
||||
#define DEPARTMENT_NONCREW "Non crew"
|
||||
|
||||
//Job defines
|
||||
#define JOB_OUTSIDER "Outsider"
|
||||
#define JOB_ANOMALY "Anomaly"
|
||||
#define JOB_VR "VR Avatar"
|
||||
|
||||
//Material defines
|
||||
#define MAT_CARPET "red carpet"
|
||||
#define MAT_CARPET_TEAL "teal carpet"
|
||||
|
||||
@@ -403,3 +403,164 @@ var/global/list/item_digestion_blacklist = list(
|
||||
/obj/item/rig/protean)
|
||||
|
||||
var/global/list/item_tf_spawnpoints = list() // Global variable tracking which items are item tf spawnpoints
|
||||
|
||||
// Options for transforming into a different mob in virtual reality.
|
||||
var/global/list/vr_mob_tf_options = list(
|
||||
"Borg" = /mob/living/silicon/robot,
|
||||
"Cortical borer" = /mob/living/simple_mob/animal/borer/non_antag,
|
||||
"Hyena" = /mob/living/simple_mob/animal/hyena, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Giant spider" = /mob/living/simple_mob/animal/giant_spider/thermic,
|
||||
"Armadillo" = /mob/living/simple_mob/animal/passive/armadillo, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Parrot" = /mob/living/simple_mob/animal/passive/bird/parrot,
|
||||
"Cat" = /mob/living/simple_mob/animal/passive/cat,
|
||||
"Corgi" = /mob/living/simple_mob/animal/passive/dog/corgi,
|
||||
"Squirrel" = /mob/living/simple_mob/vore/squirrel,
|
||||
"Frog" = /mob/living/simple_mob/vore/aggressive/frog,
|
||||
"Seagull" =/mob/living/simple_mob/vore/seagull,
|
||||
"Fox" = /mob/living/simple_mob/animal/passive/fox,
|
||||
"Racoon" = /mob/living/simple_mob/animal/passive/raccoon_ch, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Shantak" = /mob/living/simple_mob/animal/sif/shantak,
|
||||
"Goose" = /mob/living/simple_mob/animal/space/goose,
|
||||
"Space shark" = /mob/living/simple_mob/animal/space/shark,
|
||||
"Synx" = /mob/living/simple_mob/animal/synx, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Dire wolf" = /mob/living/simple_mob/vore/wolf/direwolf,
|
||||
"Construct Artificer" = /mob/living/simple_mob/construct/artificer,
|
||||
"Tech golem" = /mob/living/simple_mob/mechanical/technomancer_golem,
|
||||
"Metroid" = /mob/living/simple_mob/metroid/juvenile/baby, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Otie" = /mob/living/simple_mob/vore/otie/cotie/chubby,
|
||||
"Red-eyed Shadekin" = /mob/living/simple_mob/shadekin/red,
|
||||
"Blue-eyed Shadekin" = /mob/living/simple_mob/shadekin/blue,
|
||||
"Purple-eyed Shadekin" = /mob/living/simple_mob/shadekin/purple,
|
||||
"Green-eyed Shadekin" = /mob/living/simple_mob/shadekin/green,
|
||||
"Yellow-eyed Shadekin" = /mob/living/simple_mob/shadekin/yellow,
|
||||
"Slime" = /mob/living/simple_mob/slime/xenobio/metal,
|
||||
"Corrupt hound" = /mob/living/simple_mob/vore/aggressive/corrupthound,
|
||||
"Deathclaw" = /mob/living/simple_mob/vore/aggressive/deathclaw/den, //Downstream uses /den variant here. //CHOMPStation Enable
|
||||
"Weretiger" = /mob/living/simple_mob/vore/weretiger,
|
||||
"Mimic" = /mob/living/simple_mob/vore/aggressive/mimic/floor/plating, //Downstream uses /floor/plating variant here //CHOMPStation Enable
|
||||
"Giant rat" = /mob/living/simple_mob/vore/aggressive/rat,
|
||||
"Catslug" = /mob/living/simple_mob/vore/alienanimals/catslug,
|
||||
"Dust jumper" = /mob/living/simple_mob/vore/alienanimals/dustjumper,
|
||||
"Space ghost" = /mob/living/simple_mob/vore/alienanimals/spooky_ghost,
|
||||
"Teppi" = /mob/living/simple_mob/vore/alienanimals/teppi,
|
||||
"Bee" = /mob/living/simple_mob/vore/bee,
|
||||
"Dragon" = /mob/living/simple_mob/vore/bigdragon/friendly,
|
||||
"Riftwalker" = /mob/living/simple_mob/vore/demon/wendigo, //Downstream uses /wendigo variant here //CHOMPStation Enable
|
||||
"Horse" = /mob/living/simple_mob/vore/horse/big,
|
||||
"Morph" = /mob/living/simple_mob/vore/morph,
|
||||
"Leopardmander" = /mob/living/simple_mob/vore/leopardmander,
|
||||
"Rabbit" = /mob/living/simple_mob/vore/rabbit,
|
||||
"Red panda" = /mob/living/simple_mob/vore/redpanda,
|
||||
"Sect drone" = /mob/living/simple_mob/vore/sect_drone,
|
||||
"Armalis vox" = /mob/living/simple_mob/vox/armalis, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Xeno hunter" = /mob/living/simple_mob/xeno_ch/hunter, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Xeno queen" = /mob/living/simple_mob/xeno_ch/queen/maid, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Xeno sentinel" = /mob/living/simple_mob/xeno_ch/sentinel, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Space carp" = /mob/living/simple_mob/animal/space/carp,
|
||||
"Jelly blob" = /mob/living/simple_mob/vore/jelly,
|
||||
"SWOOPIE XL" = /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Abyss lurker" = /mob/living/simple_mob/vore/vore_hostile/abyss_lurker,
|
||||
"Abyss leaper" = /mob/living/simple_mob/vore/vore_hostile/leaper,
|
||||
"Gelatinous cube" = /mob/living/simple_mob/vore/vore_hostile/gelatinous_cube,
|
||||
"Gryphon" = /mob/living/simple_mob/vore/gryphon //TODO: Port from Downstream //CHOMPStation Enable
|
||||
)
|
||||
|
||||
var/global/list/vr_mob_spawner_options = list(
|
||||
"Parrot" = /mob/living/simple_mob/animal/passive/bird/parrot,
|
||||
"Rabbit" = /mob/living/simple_mob/vore/rabbit,
|
||||
"Cat" = /mob/living/simple_mob/animal/passive/cat,
|
||||
"Fox" = /mob/living/simple_mob/animal/passive/fox,
|
||||
"Cow" = /mob/living/simple_mob/animal/passive/cow,
|
||||
"Dog" = /mob/living/simple_mob/vore/woof,
|
||||
"Horse" = /mob/living/simple_mob/vore/horse/big,
|
||||
"Hippo" = /mob/living/simple_mob/vore/hippo,
|
||||
"Sheep" = /mob/living/simple_mob/vore/sheep,
|
||||
"Squirrel" = /mob/living/simple_mob/vore/squirrel,
|
||||
"Red panda" = /mob/living/simple_mob/vore/redpanda,
|
||||
"Fennec" = /mob/living/simple_mob/vore/fennec,
|
||||
"Seagull" =/mob/living/simple_mob/vore/seagull,
|
||||
"Corgi" = /mob/living/simple_mob/animal/passive/dog/corgi,
|
||||
"Armadillo" = /mob/living/simple_mob/animal/passive/armadillo, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Racoon" = /mob/living/simple_mob/animal/passive/raccoon_ch, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Goose" = /mob/living/simple_mob/animal/space/goose,
|
||||
"Frog" = /mob/living/simple_mob/vore/aggressive/frog,
|
||||
"Dust jumper" = /mob/living/simple_mob/vore/alienanimals/dustjumper,
|
||||
"Dire wolf" = /mob/living/simple_mob/vore/wolf/direwolf,
|
||||
"Space bumblebee" = /mob/living/simple_mob/vore/bee,
|
||||
"Space bear" = /mob/living/simple_mob/animal/space/bear,
|
||||
"Otie" = /mob/living/simple_mob/vore/otie,
|
||||
"Mutated otie" =/mob/living/simple_mob/vore/otie/feral,
|
||||
"Red otie" = /mob/living/simple_mob/vore/otie/red,
|
||||
"Giant rat" = /mob/living/simple_mob/vore/aggressive/rat,
|
||||
"Giant snake" = /mob/living/simple_mob/vore/aggressive/giant_snake,
|
||||
"Hyena" = /mob/living/simple_mob/animal/hyena, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Space shark" = /mob/living/simple_mob/animal/space/shark,
|
||||
"Shantak" = /mob/living/simple_mob/animal/sif/shantak,
|
||||
"Kururak" = /mob/living/simple_mob/animal/sif/kururak,
|
||||
"Teppi" = /mob/living/simple_mob/vore/alienanimals/teppi,
|
||||
"Slug" = /mob/living/simple_mob/vore/slug, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Catslug" = /mob/living/simple_mob/vore/alienanimals/catslug,
|
||||
"Weretiger" = /mob/living/simple_mob/vore/weretiger,
|
||||
"Dust jumper" = /mob/living/simple_mob/vore/alienanimals/dustjumper,
|
||||
"Star treader" = /mob/living/simple_mob/vore/alienanimals/startreader,
|
||||
"Space ghost" = /mob/living/simple_mob/vore/alienanimals/spooky_ghost,
|
||||
"Space carp" = /mob/living/simple_mob/animal/space/carp,
|
||||
"Space jelly fish" = /mob/living/simple_mob/vore/alienanimals/space_jellyfish,
|
||||
"Abyss lurker" = /mob/living/simple_mob/vore/vore_hostile/abyss_lurker,
|
||||
"Abyss leaper" = /mob/living/simple_mob/vore/vore_hostile/leaper,
|
||||
"Gelatinous cube" = /mob/living/simple_mob/vore/vore_hostile/gelatinous_cube,
|
||||
"Panther" = /mob/living/simple_mob/vore/aggressive/panther,
|
||||
"Lizard man" = /mob/living/simple_mob/vore/aggressive/lizardman, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Pakkun" = /mob/living/simple_mob/vore/pakkun,
|
||||
"Synx" = /mob/living/simple_mob/animal/synx, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Jelly blob" = /mob/living/simple_mob/vore/jelly,
|
||||
"Voracious lizard" = /mob/living/simple_mob/vore/aggressive/dino,
|
||||
"Baby metroid" = /mob/living/simple_mob/metroid/juvenile/baby, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Super metroid" = /mob/living/simple_mob/metroid/juvenile/super, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Alpha metroid" = /mob/living/simple_mob/metroid/juvenile/alpha, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Gamma metroid" = /mob/living/simple_mob/metroid/juvenile/gamma, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Zeta metroid" = /mob/living/simple_mob/metroid/juvenile/zeta, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Omega metroid" = /mob/living/simple_mob/metroid/juvenile/omega, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Queen metroid" = /mob/living/simple_mob/metroid/juvenile/queen, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Xeno hunter" = /mob/living/simple_mob/animal/space/alien,
|
||||
"Xeno sentinel" = /mob/living/simple_mob/animal/space/alien/sentinel,
|
||||
"Xeno Praetorian" = /mob/living/simple_mob/animal/space/alien/sentinel/praetorian,
|
||||
"Xeno queen" = /mob/living/simple_mob/animal/space/alien/queen,
|
||||
"Xeno Empress" = /mob/living/simple_mob/animal/space/alien/queen/empress,
|
||||
"Xeno Queen Mother" = /mob/living/simple_mob/animal/space/alien/queen/empress/mother,
|
||||
"Defanged xeno" = /mob/living/simple_mob/vore/xeno_defanged,
|
||||
"Sect drone" = /mob/living/simple_mob/vore/sect_drone,
|
||||
"Sect queen" = /mob/living/simple_mob/vore/sect_queen,
|
||||
"Deathclaw" = /mob/living/simple_mob/vore/aggressive/deathclaw,
|
||||
"Great White Wolf" = /mob/living/simple_mob/vore/greatwolf,
|
||||
"Great Black Wolf" = /mob/living/simple_mob/vore/greatwolf/black,
|
||||
"Solar grub" = /mob/living/simple_mob/vore/solargrub,
|
||||
"Pitcher plant" = /mob/living/simple_mob/vore/pitcher_plant, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Red gummy kobold" = /mob/living/simple_mob/vore/candy/redcabold, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Blue gummy kobold" = /mob/living/simple_mob/vore/candy/bluecabold, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Yellow gummy kobold" = /mob/living/simple_mob/vore/candy/yellowcabold, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Marshmellow serpent" = /mob/living/simple_mob/vore/candy/marshmellowserpent, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Riftwalker" = /mob/living/simple_mob/vore/demon,
|
||||
"Wendigo" = /mob/living/simple_mob/vore/demon/wendigo, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Shadekin" = /mob/living/simple_mob/shadekin,
|
||||
"Catgirl" = /mob/living/simple_mob/vore/catgirl,
|
||||
"Wolfgirl" = /mob/living/simple_mob/vore/wolfgirl,
|
||||
"Wolftaur" = /mob/living/simple_mob/vore/wolftaur,
|
||||
"Lamia" = /mob/living/simple_mob/vore/lamia,
|
||||
"Corrupt hound" = /mob/living/simple_mob/vore/aggressive/corrupthound,
|
||||
"Corrupt corrupt hound" = /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi,
|
||||
"SWOOPIE XL" = /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Cultist Teshari" = /mob/living/simple_mob/humanoid/cultist/tesh, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Burning Mage" = /mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Converted" = /mob/living/simple_mob/humanoid/cultist/noodle, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Cultist Teshari Mage" = /mob/living/simple_mob/humanoid/cultist/castertesh, //TODO: Port from Downstream //CHOMPStation Enable
|
||||
"Monkey" = /mob/living/carbon/human/monkey,
|
||||
"Wolpin" = /mob/living/carbon/human/wolpin,
|
||||
"Sparra" = /mob/living/carbon/human/sparram,
|
||||
"Saru" = /mob/living/carbon/human/sergallingm,
|
||||
"Sobaka" = /mob/living/carbon/human/sharkm,
|
||||
"Farwa" = /mob/living/carbon/human/farwa,
|
||||
"Neaera" = /mob/living/carbon/human/neaera,
|
||||
"Stok" = /mob/living/carbon/human/stok,
|
||||
//"Gryphon" = /mob/living/simple_mob/vore/gryphon // Disabled until tested
|
||||
)
|
||||
|
||||
@@ -1,160 +0,0 @@
|
||||
// Options for transforming into a different mob in virtual reality.
|
||||
var/global/list/vr_mob_tf_options = list(
|
||||
"Borg" = /mob/living/silicon/robot,
|
||||
"Cortical borer" = /mob/living/simple_mob/animal/borer/non_antag,
|
||||
"Hyena" = /mob/living/simple_mob/animal/hyena,
|
||||
"Giant spider" = /mob/living/simple_mob/animal/giant_spider/thermic,
|
||||
"Armadillo" = /mob/living/simple_mob/animal/passive/armadillo,
|
||||
"Parrot" = /mob/living/simple_mob/animal/passive/bird/parrot,
|
||||
"Cat" = /mob/living/simple_mob/animal/passive/cat,
|
||||
"Corgi" = /mob/living/simple_mob/animal/passive/dog/corgi,
|
||||
"Squirrel" = /mob/living/simple_mob/vore/squirrel,
|
||||
"Frog" = /mob/living/simple_mob/vore/aggressive/frog,
|
||||
"Seagull" =/mob/living/simple_mob/vore/seagull,
|
||||
"Fox" = /mob/living/simple_mob/animal/passive/fox,
|
||||
"Racoon" = /mob/living/simple_mob/animal/passive/raccoon_ch,
|
||||
"Shantak" = /mob/living/simple_mob/animal/sif/shantak,
|
||||
"Goose" = /mob/living/simple_mob/animal/space/goose,
|
||||
"Space shark" = /mob/living/simple_mob/animal/space/shark,
|
||||
"Synx" = /mob/living/simple_mob/animal/synx,
|
||||
"Dire wolf" = /mob/living/simple_mob/vore/wolf/direwolf,
|
||||
"Construct Artificer" = /mob/living/simple_mob/construct/artificer,
|
||||
"Tech golem" = /mob/living/simple_mob/mechanical/technomancer_golem,
|
||||
"Metroid" = /mob/living/simple_mob/metroid/juvenile/baby,
|
||||
"Otie" = /mob/living/simple_mob/vore/otie/cotie/chubby,
|
||||
"Red-eyed Shadekin" = /mob/living/simple_mob/shadekin/red,
|
||||
"Blue-eyed Shadekin" = /mob/living/simple_mob/shadekin/blue,
|
||||
"Purple-eyed Shadekin" = /mob/living/simple_mob/shadekin/purple,
|
||||
"Green-eyed Shadekin" = /mob/living/simple_mob/shadekin/green,
|
||||
"Yellow-eyed Shadekin" = /mob/living/simple_mob/shadekin/yellow,
|
||||
"Slime" = /mob/living/simple_mob/slime/xenobio/metal,
|
||||
"Corrupt hound" = /mob/living/simple_mob/vore/aggressive/corrupthound,
|
||||
"Deathclaw" = /mob/living/simple_mob/vore/aggressive/deathclaw/den,
|
||||
"Weretiger" = /mob/living/simple_mob/vore/weretiger,
|
||||
"Mimic" = /mob/living/simple_mob/vore/aggressive/mimic/floor/plating,
|
||||
"Giant rat" = /mob/living/simple_mob/vore/aggressive/rat,
|
||||
"Catslug" = /mob/living/simple_mob/vore/alienanimals/catslug,
|
||||
"Dust jumper" = /mob/living/simple_mob/vore/alienanimals/dustjumper,
|
||||
"Space ghost" = /mob/living/simple_mob/vore/alienanimals/spooky_ghost,
|
||||
"Teppi" = /mob/living/simple_mob/vore/alienanimals/teppi,
|
||||
"Bee" = /mob/living/simple_mob/vore/bee,
|
||||
"Dragon" = /mob/living/simple_mob/vore/bigdragon/friendly,
|
||||
"Riftwalker" = /mob/living/simple_mob/vore/demon/wendigo,
|
||||
"Horse" = /mob/living/simple_mob/vore/horse/big,
|
||||
"Morph" = /mob/living/simple_mob/vore/morph,
|
||||
"Leopardmander" = /mob/living/simple_mob/vore/leopardmander,
|
||||
"Rabbit" = /mob/living/simple_mob/vore/rabbit,
|
||||
"Red panda" = /mob/living/simple_mob/vore/redpanda,
|
||||
"Sect drone" = /mob/living/simple_mob/vore/sect_drone,
|
||||
"Armalis vox" = /mob/living/simple_mob/vox/armalis,
|
||||
"Xeno hunter" = /mob/living/simple_mob/xeno_ch/hunter,
|
||||
"Xeno queen" = /mob/living/simple_mob/xeno_ch/queen/maid,
|
||||
"Xeno sentinel" = /mob/living/simple_mob/xeno_ch/sentinel,
|
||||
"Space carp" = /mob/living/simple_mob/animal/space/carp,
|
||||
"Jelly blob" = /mob/living/simple_mob/vore/jelly,
|
||||
"SWOOPIE XL" = /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie,
|
||||
"Abyss lurker" = /mob/living/simple_mob/vore/vore_hostile/abyss_lurker,
|
||||
"Abyss leaper" = /mob/living/simple_mob/vore/vore_hostile/leaper,
|
||||
"Gelatinous cube" = /mob/living/simple_mob/vore/vore_hostile/gelatinous_cube,
|
||||
"Gryphon" = /mob/living/simple_mob/vore/gryphon
|
||||
)
|
||||
|
||||
var/global/list/vr_mob_spawner_options = list(
|
||||
"Parrot" = /mob/living/simple_mob/animal/passive/bird/parrot,
|
||||
"Rabbit" = /mob/living/simple_mob/vore/rabbit,
|
||||
"Cat" = /mob/living/simple_mob/animal/passive/cat,
|
||||
"Fox" = /mob/living/simple_mob/animal/passive/fox,
|
||||
"Cow" = /mob/living/simple_mob/animal/passive/cow,
|
||||
"Dog" = /mob/living/simple_mob/vore/woof,
|
||||
"Horse" = /mob/living/simple_mob/vore/horse/big,
|
||||
"Hippo" = /mob/living/simple_mob/vore/hippo,
|
||||
"Sheep" = /mob/living/simple_mob/vore/sheep,
|
||||
"Squirrel" = /mob/living/simple_mob/vore/squirrel,
|
||||
"Red panda" = /mob/living/simple_mob/vore/redpanda,
|
||||
"Fennec" = /mob/living/simple_mob/vore/fennec,
|
||||
"Seagull" =/mob/living/simple_mob/vore/seagull,
|
||||
"Corgi" = /mob/living/simple_mob/animal/passive/dog/corgi,
|
||||
"Armadillo" = /mob/living/simple_mob/animal/passive/armadillo,
|
||||
"Racoon" = /mob/living/simple_mob/animal/passive/raccoon_ch,
|
||||
"Goose" = /mob/living/simple_mob/animal/space/goose,
|
||||
"Frog" = /mob/living/simple_mob/vore/aggressive/frog,
|
||||
"Dust jumper" = /mob/living/simple_mob/vore/alienanimals/dustjumper,
|
||||
"Dire wolf" = /mob/living/simple_mob/vore/wolf/direwolf,
|
||||
"Space bumblebee" = /mob/living/simple_mob/vore/bee,
|
||||
"Space bear" = /mob/living/simple_mob/animal/space/bear,
|
||||
"Otie" = /mob/living/simple_mob/vore/otie,
|
||||
"Mutated otie" =/mob/living/simple_mob/vore/otie/feral,
|
||||
"Red otie" = /mob/living/simple_mob/vore/otie/red,
|
||||
"Giant rat" = /mob/living/simple_mob/vore/aggressive/rat,
|
||||
"Giant snake" = /mob/living/simple_mob/vore/aggressive/giant_snake,
|
||||
"Hyena" = /mob/living/simple_mob/animal/hyena,
|
||||
"Space shark" = /mob/living/simple_mob/animal/space/shark,
|
||||
"Shantak" = /mob/living/simple_mob/animal/sif/shantak,
|
||||
"Kururak" = /mob/living/simple_mob/animal/sif/kururak,
|
||||
"Teppi" = /mob/living/simple_mob/vore/alienanimals/teppi,
|
||||
"Slug" = /mob/living/simple_mob/vore/slug,
|
||||
"Catslug" = /mob/living/simple_mob/vore/alienanimals/catslug,
|
||||
"Weretiger" = /mob/living/simple_mob/vore/weretiger,
|
||||
"Dust jumper" = /mob/living/simple_mob/vore/alienanimals/dustjumper,
|
||||
"Star treader" = /mob/living/simple_mob/vore/alienanimals/startreader,
|
||||
"Space ghost" = /mob/living/simple_mob/vore/alienanimals/spooky_ghost,
|
||||
"Space carp" = /mob/living/simple_mob/animal/space/carp,
|
||||
"Space jelly fish" = /mob/living/simple_mob/vore/alienanimals/space_jellyfish,
|
||||
"Abyss lurker" = /mob/living/simple_mob/vore/vore_hostile/abyss_lurker,
|
||||
"Abyss leaper" = /mob/living/simple_mob/vore/vore_hostile/leaper,
|
||||
"Gelatinous cube" = /mob/living/simple_mob/vore/vore_hostile/gelatinous_cube,
|
||||
"Panther" = /mob/living/simple_mob/vore/aggressive/panther,
|
||||
"Lizard man" = /mob/living/simple_mob/vore/aggressive/lizardman,
|
||||
"Pakkun" = /mob/living/simple_mob/vore/pakkun,
|
||||
"Synx" = /mob/living/simple_mob/animal/synx,
|
||||
"Jelly blob" = /mob/living/simple_mob/vore/jelly,
|
||||
"Voracious lizard" = /mob/living/simple_mob/vore/aggressive/dino,
|
||||
"Baby metroid" = /mob/living/simple_mob/metroid/juvenile/baby,
|
||||
"Super metroid" = /mob/living/simple_mob/metroid/juvenile/super,
|
||||
"Alpha metroid" = /mob/living/simple_mob/metroid/juvenile/alpha,
|
||||
"Gamma metroid" = /mob/living/simple_mob/metroid/juvenile/gamma,
|
||||
"Zeta metroid" = /mob/living/simple_mob/metroid/juvenile/zeta,
|
||||
"Omega metroid" = /mob/living/simple_mob/metroid/juvenile/omega,
|
||||
"Queen metroid" = /mob/living/simple_mob/metroid/juvenile/queen,
|
||||
"Xeno hunter" = /mob/living/simple_mob/animal/space/alien,
|
||||
"Xeno sentinel" = /mob/living/simple_mob/animal/space/alien/sentinel,
|
||||
"Xeno Praetorian" = /mob/living/simple_mob/animal/space/alien/sentinel/praetorian,
|
||||
"Xeno queen" = /mob/living/simple_mob/animal/space/alien/queen,
|
||||
"Xeno Empress" = /mob/living/simple_mob/animal/space/alien/queen/empress,
|
||||
"Xeno Queen Mother" = /mob/living/simple_mob/animal/space/alien/queen/empress/mother,
|
||||
"Defanged xeno" = /mob/living/simple_mob/vore/xeno_defanged,
|
||||
"Sect drone" = /mob/living/simple_mob/vore/sect_drone,
|
||||
"Sect queen" = /mob/living/simple_mob/vore/sect_queen,
|
||||
"Deathclaw" = /mob/living/simple_mob/vore/aggressive/deathclaw,
|
||||
"Great White Wolf" = /mob/living/simple_mob/vore/greatwolf,
|
||||
"Great Black Wolf" = /mob/living/simple_mob/vore/greatwolf/black,
|
||||
"Solar grub" = /mob/living/simple_mob/vore/solargrub,
|
||||
"Pitcher plant" = /mob/living/simple_mob/vore/pitcher_plant,
|
||||
"Red gummy kobold" = /mob/living/simple_mob/vore/candy/redcabold,
|
||||
"Blue gummy kobold" = /mob/living/simple_mob/vore/candy/bluecabold,
|
||||
"Yellow gummy kobold" = /mob/living/simple_mob/vore/candy/yellowcabold,
|
||||
"Marshmellow serpent" = /mob/living/simple_mob/vore/candy/marshmellowserpent,
|
||||
"Riftwalker" = /mob/living/simple_mob/vore/demon,
|
||||
"Wendigo" = /mob/living/simple_mob/vore/demon/wendigo,
|
||||
"Shadekin" = /mob/living/simple_mob/shadekin,
|
||||
"Catgirl" = /mob/living/simple_mob/vore/catgirl,
|
||||
"Wolfgirl" = /mob/living/simple_mob/vore/wolfgirl,
|
||||
"Wolftaur" = /mob/living/simple_mob/vore/wolftaur,
|
||||
"Lamia" = /mob/living/simple_mob/vore/lamia,
|
||||
"Corrupt hound" = /mob/living/simple_mob/vore/aggressive/corrupthound,
|
||||
"Corrupt corrupt hound" = /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi,
|
||||
"SWOOPIE XL" = /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie,
|
||||
"Cultist Teshari" = /mob/living/simple_mob/humanoid/cultist/tesh,
|
||||
"Burning Mage" = /mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball,
|
||||
"Converted" = /mob/living/simple_mob/humanoid/cultist/noodle,
|
||||
"Cultist Teshari Mage" = /mob/living/simple_mob/humanoid/cultist/castertesh,
|
||||
"Monkey" = /mob/living/carbon/human/monkey,
|
||||
"Wolpin" = /mob/living/carbon/human/wolpin,
|
||||
"Sparra" = /mob/living/carbon/human/sparram,
|
||||
"Saru" = /mob/living/carbon/human/sergallingm,
|
||||
"Sobaka" = /mob/living/carbon/human/sharkm,
|
||||
"Farwa" = /mob/living/carbon/human/farwa,
|
||||
"Neaera" = /mob/living/carbon/human/neaera,
|
||||
"Stok" = /mob/living/carbon/human/stok,
|
||||
//"Gryphon" = /mob/living/simple_mob/vore/gryphon // Disabled until tested
|
||||
)
|
||||
@@ -1073,7 +1073,7 @@ var/global/list/SPECIALS = list(
|
||||
/area/submap/virgo2,
|
||||
/area/submap/event,
|
||||
/area/submap/casino_event,
|
||||
/area/vr //CHOMPedit
|
||||
/area/vr
|
||||
// /area/derelict //commented out, all hail derelict-rebuilders!
|
||||
)
|
||||
|
||||
|
||||
@@ -91,18 +91,16 @@
|
||||
var/mob/observer/dead/G = usr
|
||||
G.zMove(DOWN)
|
||||
|
||||
// CHOMPedit start
|
||||
/obj/screen/ghost/vr
|
||||
name = "Enter VR"
|
||||
desc = "Enter virtual reality."
|
||||
icon = 'modular_chomp/icons/mob/screen_ghost.dmi'
|
||||
icon = 'icons/mob/screen_ghost.dmi'
|
||||
icon_state = "entervr"
|
||||
|
||||
/obj/screen/ghost/vr/Click()
|
||||
..()
|
||||
var/mob/observer/dead/G = usr
|
||||
G.fake_enter_vr()
|
||||
// CHOMPedit end
|
||||
|
||||
/mob/observer/dead/create_mob_hud(datum/hud/HUD, apply_to_client = TRUE)
|
||||
..()
|
||||
@@ -151,12 +149,10 @@
|
||||
using.hud = src
|
||||
adding += using
|
||||
|
||||
//CHOMPedit start
|
||||
using = new /obj/screen/ghost/vr()
|
||||
using.screen_loc = ui_ghost_vr
|
||||
using.hud = src
|
||||
adding += using
|
||||
//CHOMPedit end
|
||||
|
||||
/*
|
||||
using = new /obj/screen/language_menu
|
||||
|
||||
@@ -9,3 +9,27 @@
|
||||
/decl/hierarchy/outfit/job/silicon/cyborg
|
||||
name = OUTFIT_JOB_NAME(JOB_CYBORG)
|
||||
suit = /obj/item/clothing/suit/cardborg
|
||||
|
||||
/datum/job/vr_avatar //So VR avatars dont spawn with PDAs and flood the servers
|
||||
title = JOB_VR
|
||||
disallow_jobhop = TRUE
|
||||
total_positions = 99
|
||||
spawn_positions = 5
|
||||
latejoin_only = 1
|
||||
supervisors = "The VR world"
|
||||
|
||||
flag = NONCREW
|
||||
departments = list(DEPARTMENT_NONCREW)
|
||||
department_flag = OTHER
|
||||
faction = "Station"
|
||||
assignable = FALSE
|
||||
account_allowed = 0
|
||||
offmap_spawn = TRUE
|
||||
outfit_type = /decl/hierarchy/outfit/noncrew/vr_avatar
|
||||
|
||||
/decl/hierarchy/outfit/noncrew/vr_avatar
|
||||
pda_slot = null
|
||||
id_slot = null
|
||||
r_pocket = null
|
||||
l_pocket = null
|
||||
flags = OUTFIT_HAS_BACKPACK
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
/obj/effect/temporary_effect/pulse/soothing_sphere
|
||||
name = "soothing sphere"
|
||||
desc = "A portal to some hellish place. Its screams wrack your body with pain."
|
||||
icon = 'icons/effects/effects_ch.dmi'
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "blue_static_sphere"
|
||||
time_to_die = null
|
||||
light_range = 4
|
||||
|
||||
@@ -54,9 +54,9 @@ var/const/BRIDGE =(1<<12)
|
||||
var/const/ENTERTAINER =(1<<14)
|
||||
var/const/ENTREPRENEUR =(1<<15)
|
||||
|
||||
var/const/OTHER =(1<<10) //CHOMPStation Add
|
||||
var/const/NONCREW =(1<<0) //CHOMPStation Add
|
||||
var/const/ANOMALY =(1<<0) //CHOMPstation Add
|
||||
var/const/OTHER =(1<<10) //VOREStation Note: Unused on VS. Used downstream.
|
||||
var/const/NONCREW =(1<<0)
|
||||
var/const/ANOMALY =(1<<0) //VOREStation Note: Unused on VS. Used downstream.
|
||||
/* // CHOMPedit: Comment out Talon positions, we don't have that here.
|
||||
//VOREStation Add
|
||||
var/const/TALON =(1<<3)
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
var/produce_species = SPECIES_REPLICANT // The default species produced. Will be overridden if randomize_species is true.
|
||||
var/randomize_species = FALSE
|
||||
var/list/possible_species // Do we make the newly produced body a random species?
|
||||
perfect_replica = TRUE //All alien VR sleepers make perfect replicas.
|
||||
spawn_with_clothing = FALSE //alien VR sleepers do not spawn with clothing.
|
||||
|
||||
/obj/machinery/vr_sleeper/alien/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -57,15 +59,19 @@
|
||||
if(!occupant)
|
||||
return
|
||||
|
||||
if(!forced && avatar && avatar.stat != DEAD && tgui_alert(avatar, "Someone wants to remove you from virtual reality. Do you want to leave?", "Leave VR?", list("Yes", "No")) != "Yes")
|
||||
if(!forced && avatar)
|
||||
if(tgui_alert(avatar, "Someone wants to remove you from virtual reality. Do you want to leave?", "Leave VR?", list("Yes", "No")) != "Yes")
|
||||
return
|
||||
|
||||
|
||||
avatar.exit_vr() //We don't poof! We're a actual, living entity that isn't restrained by VR zones!
|
||||
if(!occupant) //This whole thing needs cleaned up later, but this works for now.
|
||||
return
|
||||
|
||||
avatar.exit_vr()
|
||||
|
||||
if(occupant && occupant.client)
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
occupant.loc = src.loc
|
||||
occupant.forceMove(get_turf(src))
|
||||
occupant.vr_link = null //The machine remembers the avatar. 1 avatar per machine. So the vr_link isn't needed anymore.
|
||||
occupant = null
|
||||
for(var/atom/movable/A in src) // In case an object was dropped inside or something
|
||||
if(A == circuit)
|
||||
@@ -78,30 +84,58 @@
|
||||
|
||||
/obj/machinery/vr_sleeper/alien/enter_vr()
|
||||
|
||||
// No mob to transfer a mind from
|
||||
if(!occupant)
|
||||
return
|
||||
|
||||
// No mind to transfer
|
||||
if(!occupant.mind)
|
||||
return
|
||||
|
||||
// Mob doesn't have an active consciousness to send/receive from
|
||||
if(occupant.stat == DEAD && !occupant.client)
|
||||
return
|
||||
|
||||
if(QDELETED(avatar)) //This REALLY needs to be changed to weakrefs
|
||||
avatar = null
|
||||
|
||||
if(avatar && !occupant.stat)
|
||||
to_chat(occupant,span_alien("\The [src] begins to [pick("whir","hum","pulse")] as a screen appears in front of you."))
|
||||
if(tgui_alert(occupant, "This pod is already linked. Are you certain you wish to engage?", "Commmit?", list("Yes", "No")) != "Yes")
|
||||
visible_message(span_alien("\The [src] pulses!"))
|
||||
go_out(TRUE)
|
||||
return
|
||||
|
||||
to_chat(occupant,span_alien("Your mind blurs as information bombards you."))
|
||||
|
||||
if(!avatar)
|
||||
var/turf/T = get_turf(src)
|
||||
avatar = new(src, produce_species)
|
||||
if(!perfect_replica)
|
||||
avatar = new(src, produce_species)
|
||||
else
|
||||
avatar = new(src, occupant.species.name)
|
||||
|
||||
// If the user has a non-default (Human) bodyshape, make it match theirs.
|
||||
if(occupant.species.name != "Promethean" && occupant.species.name != "Human" && mirror_first_occupant)
|
||||
avatar.shapeshifter_change_shape(occupant.species.name)
|
||||
avatar.Sleeping(6)
|
||||
|
||||
occupant.enter_vr(avatar)
|
||||
if(spawn_with_clothing)
|
||||
job_master.EquipRank(avatar,"Visitor", 1, FALSE)
|
||||
add_verb(avatar,/mob/living/carbon/human/proc/exit_vr)
|
||||
avatar.virtual_reality_mob = FALSE //THIS IS THE BIG DIFFERENCE WITH ALIEN VR PODS. THEY ARE NOT VR, THEY ARE REAL.
|
||||
|
||||
//This handles all the 'We make it look like ourself' code.
|
||||
//We do this BEFORE any mob tf so prefs carry over properly!
|
||||
if(perfect_replica)
|
||||
avatar.species.create_organs(avatar) // Reset our organs/limbs.
|
||||
avatar.restore_all_organs()
|
||||
avatar.client.prefs.copy_to(avatar)
|
||||
avatar.dna.ResetUIFrom(avatar)
|
||||
avatar.sync_dna_traits(TRUE) // Traitgenes Sync traits to genetics if needed
|
||||
avatar.sync_organ_dna()
|
||||
avatar.initialize_vessel()
|
||||
|
||||
var/newname = sanitize(tgui_input_text(avatar, "Your mind feels foggy. You're certain your name is [occupant.real_name], but it could also be [avatar.name]. Would you like to change it to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if (newname)
|
||||
@@ -116,7 +150,7 @@
|
||||
var/newname = sanitize(tgui_input_text(avatar, "Your mind feels foggy. You're certain your name is [occupant.real_name], but it feels like it is [avatar.name]. Would you like to change it to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if(newname)
|
||||
avatar.real_name = newname
|
||||
|
||||
avatar.name = newname
|
||||
occupant.enter_vr(avatar)
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//CHOMPedit: This file has been disabled and moved to the modular_chomp folder. Check that one if you're bug-fixing!
|
||||
|
||||
/obj/machinery/vr_sleeper
|
||||
name = "virtual reality sleeper"
|
||||
desc = "A fancy bed with built-in sensory I/O ports and connectors to interface users' minds with their bodies in virtual reality."
|
||||
@@ -20,10 +18,21 @@
|
||||
|
||||
var/mirror_first_occupant = TRUE // Do we force the newly produced body to look like the occupant?
|
||||
|
||||
var/spawn_with_clothing = TRUE // Do we spawn the avatar with clothing?
|
||||
|
||||
/// If we have a perfect replica of the mob's species that is entering us!
|
||||
/// Because of our player population, I have defaulted this to TRUE.
|
||||
/// If you are a downstream and want to have people spawn as VR prometheans by default, change this to FALSE
|
||||
var/perfect_replica = TRUE
|
||||
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 15
|
||||
active_power_usage = 200
|
||||
light_color = "#FF0000"
|
||||
//var/global/list/vr_mob_tf_options // Global var located in global_lists.dm
|
||||
|
||||
/obj/machinery/vr_sleeper/perfect
|
||||
perfect_replica = TRUE
|
||||
|
||||
/obj/machinery/vr_sleeper/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -32,8 +41,17 @@
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/vr_sleeper/Destroy()
|
||||
if(occupant && occupant.vr_link)
|
||||
occupant.vr_link.exit_vr()
|
||||
//The below deals with the edge case of there being no occupant but there IS things inside, somehow.
|
||||
//Just in case some weirdness happened.
|
||||
for(var/atom/movable/A in src)
|
||||
if(A == circuit)
|
||||
continue
|
||||
if(A in component_parts)
|
||||
continue
|
||||
A.loc = src.loc
|
||||
. = ..()
|
||||
go_out()
|
||||
|
||||
/obj/machinery/vr_sleeper/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
@@ -48,6 +66,11 @@
|
||||
/obj/machinery/vr_sleeper/update_icon()
|
||||
icon_state = "[base_state][occupant ? "1" : "0"]"
|
||||
|
||||
/obj/machinery/vr_sleeper/examine(mob/user)
|
||||
. = ..()
|
||||
if(occupant)
|
||||
. += span_notice("[occupant] is inside.")
|
||||
|
||||
/obj/machinery/vr_sleeper/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
@@ -142,7 +165,7 @@
|
||||
/obj/machinery/vr_sleeper/relaymove(mob/user as mob)
|
||||
if(user.incapacitated())
|
||||
return 0 //maybe they should be able to get out with cuffs, but whatever
|
||||
go_out()
|
||||
go_out(TRUE)
|
||||
|
||||
/obj/machinery/vr_sleeper/proc/go_in(var/mob/M, var/mob/user)
|
||||
if(!M)
|
||||
@@ -151,6 +174,7 @@
|
||||
return
|
||||
if(!ishuman(M))
|
||||
to_chat(user, span_warning("\The [src] rejects [M] with a sharp beep."))
|
||||
return
|
||||
if(occupant)
|
||||
to_chat(user, span_warning("\The [src] is already occupied."))
|
||||
return
|
||||
@@ -169,35 +193,31 @@
|
||||
M.client.perspective = EYE_PERSPECTIVE
|
||||
M.client.eye = src
|
||||
M.loc = src
|
||||
// update_use_power(USE_POWER_ACTIVE) //VOREstation edit: borer VR crash fix
|
||||
occupant = M
|
||||
|
||||
update_icon()
|
||||
|
||||
//VOREstation edit - crashes borers
|
||||
if(!M.has_brain_worms())
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
enter_vr()
|
||||
else
|
||||
to_chat(user, span_warning("\The [src] rejects [M] with a sharp beep."))
|
||||
//VOREstation edit end
|
||||
return
|
||||
|
||||
/obj/machinery/vr_sleeper/proc/go_out(var/forced = TRUE)
|
||||
if(!occupant)
|
||||
return
|
||||
|
||||
if(!forced && avatar && tgui_alert(avatar, "Someone wants to remove you from virtual reality. Do you want to leave?", "Leave VR?", list("Yes", "No")) != "Yes")
|
||||
return
|
||||
if(!forced && avatar)
|
||||
if(tgui_alert(avatar, "Someone wants to remove you from virtual reality. Do you want to leave?", "Leave VR?", list("Yes", "No")) != "Yes")
|
||||
return
|
||||
|
||||
if(avatar)
|
||||
avatar.exit_vr()
|
||||
avatar = null
|
||||
|
||||
if(occupant.client)
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
occupant.loc = src.loc
|
||||
occupant.forceMove(get_turf(src))
|
||||
occupant = null
|
||||
for(var/atom/movable/A in src) // In case an object was dropped inside or something
|
||||
if(A == circuit)
|
||||
@@ -222,6 +242,9 @@
|
||||
if(occupant.stat == DEAD)
|
||||
return
|
||||
|
||||
if(QDELETED(occupant.vr_link)) //Hardrefs...
|
||||
occupant.vr_link = null
|
||||
|
||||
avatar = occupant.vr_link
|
||||
// If they've already enterred VR, and are reconnecting, prompt if they want a new body
|
||||
if(avatar && tgui_alert(occupant, "You already have a [avatar.stat == DEAD ? "" : "deceased "]Virtual Reality avatar. Would you like to use it?", "New avatar", list("Yes", "No")) != "Yes")
|
||||
@@ -240,29 +263,66 @@
|
||||
if(!S)
|
||||
return 0
|
||||
|
||||
var/tf = null
|
||||
if(tgui_alert(occupant, "Would you like to play as a different creature?", "Join as a mob?", list("Yes", "No")) == "Yes")
|
||||
var/k = tgui_input_list(occupant, "Please select a creature:", "Mob list", vr_mob_tf_options)
|
||||
if(!k)
|
||||
return 0
|
||||
tf = vr_mob_tf_options[k]
|
||||
|
||||
for(var/obj/effect/landmark/virtual_reality/i in landmarks_list)
|
||||
if(i.name == S)
|
||||
S = i
|
||||
break
|
||||
|
||||
avatar = new(S, "Virtual Reality Avatar")
|
||||
if(!perfect_replica)
|
||||
avatar = new(S, "Virtual Reality Avatar")
|
||||
else
|
||||
avatar = new(src, occupant.species.name)
|
||||
|
||||
// If the user has a non-default (Human) bodyshape, make it match theirs.
|
||||
if(occupant.species.name != "Promethean" && occupant.species.name != "Human" && mirror_first_occupant)
|
||||
avatar.shapeshifter_change_shape(occupant.species.name)
|
||||
avatar.forceMove(get_turf(S)) // Put the mob on the landmark, instead of inside it
|
||||
|
||||
//CHOMPedit start VR fix
|
||||
occupant.enter_vr(avatar)
|
||||
//Yes, I am using a aheal just so your markings transfer over, I could not get .prefs.copy_to working. This is very stupid, and I can't be assed to rewrite this. Too bad!
|
||||
avatar.revive()
|
||||
avatar.species.equip_survival_gear(avatar)
|
||||
add_verb(avatar, /mob/living/carbon/human/proc/exit_vr) //ahealing removes the prommie verbs and the VR verbs, giving it back
|
||||
if(spawn_with_clothing)
|
||||
job_master.EquipRank(avatar,"Visitor", 1, FALSE)
|
||||
add_verb(avatar,/mob/living/carbon/human/proc/exit_vr)
|
||||
add_verb(avatar,/mob/living/carbon/human/proc/vr_transform_into_mob)
|
||||
add_verb(avatar,/mob/living/proc/set_size)
|
||||
avatar.virtual_reality_mob = TRUE
|
||||
|
||||
//This handles all the 'We make it look like ourself' code.
|
||||
//We do this BEFORE any mob tf so prefs carry over properly!
|
||||
if(perfect_replica)
|
||||
avatar.species.create_organs(avatar) // Reset our organs/limbs.
|
||||
avatar.restore_all_organs()
|
||||
avatar.client.prefs.copy_to(avatar)
|
||||
avatar.dna.ResetUIFrom(avatar)
|
||||
avatar.sync_dna_traits(TRUE) // Traitgenes Sync traits to genetics if needed
|
||||
avatar.sync_organ_dna()
|
||||
avatar.initialize_vessel()
|
||||
|
||||
if(tf)
|
||||
var/mob/living/new_form = avatar.transform_into_mob(tf, TRUE) // No need to check prefs when the occupant already chose to transform.
|
||||
if(isliving(new_form)) // Make sure the mob spawned properly.
|
||||
add_verb(new_form,/mob/living/proc/vr_revert_mob_tf)
|
||||
new_form.virtual_reality_mob = TRUE
|
||||
|
||||
add_verb(avatar, /mob/living/carbon/human/proc/exit_vr) //ahealing removes the prommie verbs and the VR verbs, giving it back
|
||||
avatar.Sleeping(1)
|
||||
|
||||
//CHOMPedit end
|
||||
// Prompt for username after they've enterred the body.
|
||||
var/newname = sanitize(tgui_input_text(avatar, "You are entering virtual reality. Your username is currently [src.name]. Would you like to change it to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if (newname)
|
||||
if(newname)
|
||||
avatar.real_name = newname
|
||||
avatar.name = newname
|
||||
|
||||
else
|
||||
// If TFed, revert TF. Easier than coding mind transfer stuff for edge cases.
|
||||
if(avatar.tfed_into_mob_check())
|
||||
var/mob/living/M = loc
|
||||
if(istype(M)) // Sanity check, though shouldn't be needed since this is already checked by the proc.
|
||||
M.revert_mob_tf()
|
||||
occupant.enter_vr(avatar)
|
||||
|
||||
120
code/game/machinery/virtual_reality/vr_procs.dm
Normal file
120
code/game/machinery/virtual_reality/vr_procs.dm
Normal file
@@ -0,0 +1,120 @@
|
||||
// Gross proc which is called on Life() to check for escaped VR mobs. Tried to do this with Exited() on area/vr but ended up being too heavy.
|
||||
/mob/living/proc/handle_vr_derez()
|
||||
if(virtual_reality_mob && !istype(get_area(src), /area/vr))
|
||||
log_debug("[src] escaped virtual reality")
|
||||
visible_message("[src] blinks out of existence.")
|
||||
return_from_vr()
|
||||
for(var/obj/belly/B in vore_organs) // Assume anybody inside an escaped VR mob is also an escaped VR mob.
|
||||
for(var/mob/living/L in B)
|
||||
log_debug("[L] was inside an escaped VR mob and has been deleted.")
|
||||
L.handle_vr_derez() //Recursive! Let's get EVERYONE properly out of here!
|
||||
if(!QDELETED(L)) //This is so we don't double qdel() things when we're doing recursive removal.
|
||||
qdel(L)
|
||||
qdel(src) // Would like to convert escaped players into AR holograms in the future to encourage exploit finding.
|
||||
|
||||
// This proc checks to see two things: 1. If we have a tf_mob_holder (we are a simple mob) and 2. If we are a human. If so, we try to exit VR properly.
|
||||
/mob/living/proc/return_from_vr()
|
||||
if(tf_mob_holder)
|
||||
var/mob/living/carbon/human/our_holder = tf_mob_holder
|
||||
our_holder.exit_vr() //If we have no vr_holder, perfect, we do nothing. If we DO, we get shoved back into our body.
|
||||
else if(ishuman(src)) //Alright! We don't have a tf_mob_holder, so we must be a human in VR.
|
||||
var/mob/living/carbon/human/our_holder = src
|
||||
our_holder.exit_vr()
|
||||
|
||||
/mob/living/carbon/human/proc/vr_transform_into_mob()
|
||||
set name = "Transform Into Creature"
|
||||
set category = "Abilities.VR"
|
||||
set desc = "Become a different creature"
|
||||
|
||||
var/tf = null
|
||||
var/k = tgui_input_list(usr, "Please select a creature:", "Mob list", vr_mob_tf_options)
|
||||
if(!k)
|
||||
return 0
|
||||
tf = vr_mob_tf_options[k]
|
||||
|
||||
var/mob/living/new_form = transform_into_mob(tf, TRUE, TRUE)
|
||||
if(isliving(new_form)) // Sanity check
|
||||
add_verb(new_form,/mob/living/proc/vr_revert_mob_tf)
|
||||
new_form.virtual_reality_mob = TRUE
|
||||
|
||||
/mob/living/proc/vr_revert_mob_tf()
|
||||
set name = "Revert Transformation"
|
||||
set category = "Abilities.VR"
|
||||
|
||||
revert_mob_tf()
|
||||
|
||||
// Exiting VR but for ghosts
|
||||
/mob/living/carbon/human/proc/fake_exit_vr()
|
||||
set name = "Log Out Of Virtual Reality"
|
||||
set category = "Abilities.VR"
|
||||
|
||||
if(tgui_alert(usr, "Would you like to log out of virtual reality?", "Log out?", list("Yes", "No")) == "Yes")
|
||||
release_vore_contents(TRUE)
|
||||
for(var/obj/item/I in src)
|
||||
drop_from_inventory(I)
|
||||
qdel(src)
|
||||
|
||||
/mob/observer/dead/verb/fake_enter_vr()
|
||||
set name = "Join virtual reality"
|
||||
set category = "Ghost.Join"
|
||||
set desc = "Log into NanoTrasen's local virtual reality server."
|
||||
|
||||
/* Temp removal while I figure out how to reduce the respawn time to 1 minute
|
||||
var/time_till_respawn = time_till_respawn()
|
||||
if(time_till_respawn == -1) // Special case, never allowed to respawn
|
||||
to_chat(usr, span_warning("Respawning is not allowed!"))
|
||||
return
|
||||
if(time_till_respawn) // Nonzero time to respawn
|
||||
to_chat(usr, span_warning("You can't do that yet! You died too recently. You need to wait another [round(time_till_respawn/10/60, 0.1)] minutes."))
|
||||
return
|
||||
*/
|
||||
var/datum/data/record/record_found
|
||||
record_found = find_general_record("name", client.prefs.real_name)
|
||||
// Found their record, they were spawned previously. Remind them corpses cannot play games.
|
||||
if(record_found)
|
||||
var/answer = tgui_alert(src,"You seem to have previously joined this round. If you are currently dead, you should not enter VR as this character. Would you still like to proceed?","Previously spawned",list("Yes","No"))
|
||||
if(answer != "Yes")
|
||||
return
|
||||
|
||||
var/S = null
|
||||
var/list/vr_landmarks = list()
|
||||
for(var/obj/effect/landmark/virtual_reality/sloc in landmarks_list)
|
||||
vr_landmarks += sloc.name
|
||||
if(!LAZYLEN(vr_landmarks))
|
||||
to_chat(src, "There are no available spawn locations in virtual reality.")
|
||||
return
|
||||
S = tgui_input_list(usr, "Please select a location to spawn your avatar at:", "Spawn location", vr_landmarks)
|
||||
if(!S)
|
||||
return 0
|
||||
for(var/obj/effect/landmark/virtual_reality/i in landmarks_list)
|
||||
if(i.name == S)
|
||||
S = i
|
||||
break
|
||||
|
||||
var/mob/living/carbon/human/avatar = new(get_turf(S), client.prefs.species)
|
||||
if(!avatar)
|
||||
to_chat(src, "Something went wrong and spawning failed.")
|
||||
return
|
||||
|
||||
//Write the appearance and whatnot out to the character
|
||||
var/client/C = client
|
||||
C.prefs.copy_to(avatar)
|
||||
avatar.key = key
|
||||
for(var/lang in C.prefs.alternate_languages)
|
||||
var/datum/language/chosen_language = GLOB.all_languages[lang]
|
||||
if(chosen_language)
|
||||
if(is_lang_whitelisted(usr,chosen_language) || (avatar.species && (chosen_language.name in avatar.species.secondary_langs)))
|
||||
avatar.add_language(lang)
|
||||
|
||||
avatar.regenerate_icons()
|
||||
avatar.update_transform()
|
||||
job_master.EquipRank(avatar,JOB_VR, 1, FALSE)
|
||||
add_verb(avatar,/mob/living/carbon/human/proc/fake_exit_vr)
|
||||
add_verb(avatar,/mob/living/carbon/human/proc/vr_transform_into_mob)
|
||||
add_verb(avatar,/mob/living/proc/set_size)
|
||||
avatar.virtual_reality_mob = TRUE
|
||||
log_and_message_admins("[key_name_admin(avatar)] joined virtual reality from the ghost menu.")
|
||||
|
||||
var/newname = sanitize(tgui_input_text(avatar, "You are entering virtual reality. Your username is currently [src.name]. Would you like to change it to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if(newname)
|
||||
avatar.real_name = newname
|
||||
@@ -588,3 +588,34 @@ steam.start() -- spawns the effect
|
||||
round(min(light, BOMBCAP_LIGHT_RADIUS)),
|
||||
round(min(flash, BOMBCAP_FLASH_RADIUS))
|
||||
)
|
||||
|
||||
////////////////////////////////////////////
|
||||
// A fancier teleport, used in hyper pads
|
||||
////////////////////////////////////////////
|
||||
|
||||
/obj/effect/effect/teleport_greyscale
|
||||
name = "teleportation"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "teleport_greyscale"
|
||||
anchored = 1
|
||||
mouse_opacity = 0
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
|
||||
/obj/effect/effect/teleport_greyscale/Initialize(mapload)
|
||||
. = ..()
|
||||
QDEL_IN(src, 2 SECONDS)
|
||||
|
||||
/datum/effect/effect/system/teleport_greyscale
|
||||
var/color = "#FFFFFF"
|
||||
|
||||
/datum/effect/effect/system/teleport_greyscale/set_up(cl, loca)
|
||||
if(istype(loca, /turf/))
|
||||
location = loca
|
||||
else
|
||||
location = get_turf(loca)
|
||||
color = cl
|
||||
|
||||
/datum/effect/effect/system/teleport_greyscale/start()
|
||||
var/obj/effect/effect/teleport_greyscale/tele = new /obj/effect/effect/teleport_greyscale(src.location)
|
||||
tele.color = color
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
/obj/effect/effect/confetti
|
||||
name = "confetti"
|
||||
icon = 'icons/effects/effects_ch.dmi'
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "confetti"
|
||||
opacity = 0
|
||||
anchored = 0.0
|
||||
@@ -86,34 +86,3 @@
|
||||
/obj/effect/effect/snow/heavy
|
||||
name = "heavy snowfall"
|
||||
icon_state = "snowfall_heavy"
|
||||
|
||||
////////////////////////////////////////////
|
||||
// A fancier teleport, used in hyper pads
|
||||
////////////////////////////////////////////
|
||||
|
||||
/obj/effect/effect/teleport_greyscale
|
||||
name = "teleportation"
|
||||
icon = 'icons/effects/effects_ch.dmi'
|
||||
icon_state = "teleport_greyscale"
|
||||
anchored = 1
|
||||
mouse_opacity = 0
|
||||
plane = MOB_PLANE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
|
||||
/obj/effect/effect/teleport_greyscale/Initialize(mapload)
|
||||
. = ..()
|
||||
QDEL_IN(src, 2 SECONDS)
|
||||
|
||||
/datum/effect/effect/system/teleport_greyscale
|
||||
var/color = "#FFFFFF"
|
||||
|
||||
/datum/effect/effect/system/teleport_greyscale/set_up(cl, loca)
|
||||
if(istype(loca, /turf/))
|
||||
location = loca
|
||||
else
|
||||
location = get_turf(loca)
|
||||
color = cl
|
||||
|
||||
/datum/effect/effect/system/teleport_greyscale/start()
|
||||
var/obj/effect/effect/teleport_greyscale/tele = new /obj/effect/effect/teleport_greyscale(src.location)
|
||||
tele.color = color
|
||||
|
||||
@@ -80,7 +80,6 @@
|
||||
src.vr_link = avatar // Can't reuse vr_holder so that death can automatically eject users from VR
|
||||
|
||||
// Move the mind
|
||||
// avatar.Sleeping(1) So vox don't drop their can, also feels arbitrary
|
||||
src.mind.transfer_to(avatar)
|
||||
to_chat(avatar, span_infoplain(span_bold("You have enterred Virtual Reality!\nAll normal gameplay rules still apply.\nWounds you suffer here won't persist when you leave VR, but some of the pain will.\nYou can leave VR at any time by using the \"Exit Virtual Reality\" verb in the Abilities tab, or by ghosting."))) //No more prommie VR thing, so removed tidbit about changing appearance
|
||||
to_chat(avatar, span_notice(" You black out for a moment, and wake to find yourself in a new body in virtual reality.")) // So this is what VR feels like?
|
||||
@@ -92,10 +91,10 @@
|
||||
|
||||
if(!vr_holder)
|
||||
return
|
||||
if(tfed_into_mob_check()) //CHOMPedit start: make sure we're not TFed and revert if we are before checking for a mind.
|
||||
if(tfed_into_mob_check()) //Make sure we're not TFed and revert if we are before checking for a mind.
|
||||
var/mob/living/M = loc
|
||||
if(istype(M)) // Sanity check, though shouldn't be needed since this is already checked by the proc.
|
||||
M.revert_mob_tf() // CHOMPedit end
|
||||
M.revert_mob_tf()
|
||||
|
||||
if(!mind)
|
||||
return
|
||||
@@ -123,9 +122,8 @@
|
||||
|
||||
if(istype(vr_holder.loc, /obj/machinery/vr_sleeper))
|
||||
var/obj/machinery/vr_sleeper/V = vr_holder.loc
|
||||
V.go_out()
|
||||
V.go_out(TRUE)
|
||||
|
||||
//CHOMPAdd Start
|
||||
if(died_in_vr)
|
||||
addtimer(CALLBACK(src, PROC_REF(cleanup_vr)), 3000, TIMER_DELETE_ME) //Delete the body after 5 minutes
|
||||
|
||||
@@ -137,4 +135,3 @@
|
||||
unEquip(I,force = TRUE)
|
||||
release_vore_contents(include_absorbed = TRUE, silent = TRUE)
|
||||
qdel(src)
|
||||
//CHOMPAdd End
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
|
||||
handle_dripping()
|
||||
|
||||
handle_vr_derez() // CHOMPedit
|
||||
handle_vr_derez()
|
||||
|
||||
/mob/living/proc/handle_breathing()
|
||||
return
|
||||
|
||||
@@ -1472,12 +1472,12 @@
|
||||
drop.drips |= drips
|
||||
|
||||
// Update appearance.
|
||||
drop.basecolor = rgb(H.r_skin,H.g_skin,H.b_skin)
|
||||
drop.update_icon()
|
||||
drop.name = "drips of something"
|
||||
drop.desc = "It's thick and gooey. Perhaps it's the chef's cooking?"
|
||||
drop.dryname = "dried something"
|
||||
drop.drydesc = "It's dry and crusty. The janitor isn't doing their job."
|
||||
drop.basecolor = rgb(H.r_skin,H.g_skin,H.b_skin)
|
||||
drop.update_icon()
|
||||
drop.fluorescent = 0
|
||||
drop.invisibility = 0
|
||||
//else
|
||||
|
||||
@@ -107,3 +107,8 @@
|
||||
)
|
||||
|
||||
var/touch_reaction_flags
|
||||
|
||||
var/virtual_reality_mob = FALSE // gross boolean for keeping VR mobs in VR
|
||||
|
||||
var/mob/living/tf_form // Shapeshifter shenanigans
|
||||
var/tf_form_ckey
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
/obj/effect/slug_glue
|
||||
name = "liquid"
|
||||
desc = "This looks wet."
|
||||
icon = 'icons/effects/effects_ch.dmi'
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "wet_turf"
|
||||
opacity = 0
|
||||
mouse_opacity = 0 //Unclickable
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
if(!S.voremob_loaded)
|
||||
S.voremob_loaded = TRUE
|
||||
S.init_vore()
|
||||
new /obj/effect/effect/teleport_greyscale(M.loc) // CHOMPAdd
|
||||
new /obj/effect/effect/teleport_greyscale(M.loc)
|
||||
for(var/obj/belly/B as anything in src.vore_organs)
|
||||
src.vore_organs -= B
|
||||
qdel(B)
|
||||
@@ -68,7 +68,6 @@
|
||||
var/mob/living/ourmob = tf_mob_holder
|
||||
if(soulgem) //Should always be the case, but...Safety. Done here first
|
||||
soulgem.transfer_self(ourmob)
|
||||
//CHOMPAdd Start - OOC Escape functionality for Mind Binder and Body Snatcher
|
||||
if(ourmob.loc != src)
|
||||
if(isnull(ourmob.loc))
|
||||
to_chat(src,span_notice("You have no body."))
|
||||
@@ -100,7 +99,6 @@
|
||||
tf_mob_holder = null
|
||||
return
|
||||
new /obj/effect/effect/teleport_greyscale(src.loc)
|
||||
//CHOMPAdd End - OOC Escape functionality for Mind Binder and Body Snatcher
|
||||
if(ourmob.ai_holder)
|
||||
var/datum/ai_holder/our_AI = ourmob.ai_holder
|
||||
our_AI.set_stance(STANCE_IDLE)
|
||||
@@ -109,7 +107,6 @@
|
||||
var/turf/get_dat_turf = get_turf(src)
|
||||
ourmob.loc = get_dat_turf
|
||||
ourmob.forceMove(get_dat_turf)
|
||||
// CHOMPEdit Start
|
||||
if(!tf_form_ckey)
|
||||
ourmob.vore_selected = vore_selected
|
||||
vore_selected = null
|
||||
@@ -119,7 +116,6 @@
|
||||
B.owner = ourmob
|
||||
vore_organs -= B
|
||||
ourmob.vore_organs += B
|
||||
// CHOMPEdit End
|
||||
|
||||
ourmob.Life(1)
|
||||
|
||||
@@ -129,7 +125,6 @@
|
||||
continue
|
||||
src.drop_from_inventory(W)
|
||||
|
||||
// CHOMPEdit Start
|
||||
if(tf_form == ourmob)
|
||||
if(tf_form_ckey)
|
||||
src.ckey = tf_form_ckey
|
||||
@@ -139,7 +134,6 @@
|
||||
src.forceMove(ourmob)
|
||||
else
|
||||
qdel(src)
|
||||
//CHOMPEdit End
|
||||
|
||||
/mob/living/proc/handle_tf_holder()
|
||||
if(!tf_mob_holder)
|
||||
@@ -208,3 +202,118 @@
|
||||
new_mob.no_latejoin_prey_warning_persists = no_latejoin_prey_warning_persists
|
||||
new_mob.belly_rub_target = belly_rub_target
|
||||
new_mob.soulcatcher_pref_flags = soulcatcher_pref_flags
|
||||
|
||||
// Requires a /mob/living type path for transformation. Returns the new mob on success, null in all other cases.
|
||||
// Just handles mob TF right now, but maybe we'll want to do something similar for items in the future.
|
||||
/mob/living/proc/transform_into_mob(mob/living/new_form, pref_override = FALSE, revert = FALSE, shapeshifting = FALSE)
|
||||
if(!src.mind)
|
||||
return
|
||||
if(!src.allow_spontaneous_tf && !pref_override)
|
||||
return
|
||||
if(src.tf_mob_holder) //If we're already transformed
|
||||
if(revert)
|
||||
revert_mob_tf()
|
||||
return
|
||||
else
|
||||
return
|
||||
else
|
||||
if(src.stat == DEAD)
|
||||
return
|
||||
if(!ispath(new_form, /mob/living) && !ismob(new_form))
|
||||
return
|
||||
var/mob/living/new_mob
|
||||
if(shapeshifting && src.tf_form)
|
||||
new_mob = src.tf_form
|
||||
add_verb(new_mob,/mob/living/proc/shapeshift_form)
|
||||
new_mob.tf_form = src
|
||||
new_mob.forceMove(src.loc)
|
||||
visible_message(span_warning("[src] twists and contorts, shapeshifting into a different form!"))
|
||||
if(new_mob.ckey)
|
||||
new_mob.tf_form_ckey = new_mob.ckey
|
||||
else
|
||||
new_mob = new new_form(get_turf(src))
|
||||
|
||||
if(new_mob && isliving(new_mob))
|
||||
new_mob.faction = src.faction
|
||||
if(istype(new_mob, /mob/living/simple_mob))
|
||||
var/mob/living/simple_mob/S = new_mob
|
||||
if(!S.voremob_loaded)
|
||||
S.voremob_loaded = TRUE
|
||||
S.init_vore()
|
||||
new /obj/effect/effect/teleport_greyscale(src.loc)
|
||||
if(!new_mob.ckey)
|
||||
for(var/obj/belly/B as anything in new_mob.vore_organs)
|
||||
new_mob.vore_organs -= B
|
||||
qdel(B)
|
||||
new_mob.vore_organs = list()
|
||||
new_mob.name = src.name
|
||||
new_mob.real_name = src.real_name
|
||||
for(var/lang in src.languages)
|
||||
new_mob.languages |= lang
|
||||
src.copy_vore_prefs_to_mob(new_mob)
|
||||
new_mob.vore_selected = src.vore_selected
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(ishuman(new_mob))
|
||||
var/mob/living/carbon/human/N = new_mob
|
||||
N.gender = H.gender
|
||||
N.identifying_gender = H.identifying_gender
|
||||
else
|
||||
new_mob.gender = H.gender
|
||||
else
|
||||
new_mob.gender = src.gender
|
||||
if(ishuman(new_mob))
|
||||
var/mob/living/carbon/human/N = new_mob
|
||||
N.identifying_gender = src.gender
|
||||
|
||||
for(var/obj/belly/B as anything in src.vore_organs)
|
||||
B.loc = new_mob
|
||||
B.forceMove(new_mob)
|
||||
B.owner = new_mob
|
||||
src.vore_organs -= B
|
||||
new_mob.vore_organs += B
|
||||
new_mob.nutrition = src.nutrition
|
||||
|
||||
src.soulgem?.transfer_self(new_mob)
|
||||
|
||||
new_mob.ckey = src.ckey
|
||||
if(new_mob.tf_form_ckey)
|
||||
src.ckey = new_mob.tf_form_ckey
|
||||
if(src.ai_holder && new_mob.ai_holder)
|
||||
var/datum/ai_holder/old_AI = src.ai_holder
|
||||
old_AI.set_stance(STANCE_SLEEP)
|
||||
var/datum/ai_holder/new_AI = new_mob.ai_holder
|
||||
new_AI.hostile = old_AI.hostile
|
||||
new_AI.retaliate = old_AI.retaliate
|
||||
src.loc = new_mob
|
||||
src.forceMove(new_mob)
|
||||
new_mob.tf_mob_holder = src
|
||||
return new_mob
|
||||
|
||||
// Used to check if THIS MOB has been transformed into a different mob, as only the NEW mob uses tf_mob_holder.
|
||||
// Necessary in niche cases where a proc interacts with the old body and needs to know it's been transformed (such as transforming into a mob then dying in virtual reality).
|
||||
// Use this if you cannot use the tf_mob_holder var. Returns TRUE if transformed, FALSE if not.
|
||||
/mob/living/proc/tfed_into_mob_check()
|
||||
if(loc && isliving(loc))
|
||||
var/mob/living/M = loc
|
||||
if(istype(M) && M.tf_mob_holder && (M.tf_mob_holder == src))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/mob/living/proc/shapeshift_form()
|
||||
set name = "Shapeshift Form"
|
||||
set category = "Abilities.Shapeshift"
|
||||
set desc = "Shape shift between set mob forms. (Requires a spawned mob to be varedited into the user's tf_form var as mob reference.)"
|
||||
if(!istype(tf_form))
|
||||
to_chat(src, span_notice("No shapeshift form set. (Requires a spawned mob to be varedited into the user's tf_form var as mob reference.)"))
|
||||
return
|
||||
else
|
||||
transform_into_mob(tf_form, TRUE, TRUE, TRUE)
|
||||
|
||||
/mob/living/set_dir(var/new_dir)
|
||||
. = ..()
|
||||
if(size_multiplier != 1 || icon_scale_x != 1 && center_offset > 0)
|
||||
update_transform(TRUE)
|
||||
|
||||
@@ -85,16 +85,14 @@
|
||||
var/mob/living/M = target
|
||||
if(!istype(M))
|
||||
return
|
||||
//CHOMPADDITION: prevent trding bodies that have no mind and are carbon, mianly fixes VR crash
|
||||
if(istype(M,/mob/living/carbon) && !M.mind)
|
||||
return
|
||||
//CHOMPADDITION: prevent trding bodies that have no mind and are carbon, mianly fixes VR crash
|
||||
if(target != firer) //If you shot yourself, you probably want to be TFed so don't bother with prefs.
|
||||
if(!M.allow_spontaneous_tf && !tf_admin_pref_override)
|
||||
return
|
||||
M.drop_both_hands() //CHOMPAdd - Drop items in hand before transformation
|
||||
if(M.tf_mob_holder && M.tf_mob_holder.loc == M) //CHOMPEdit - Extra check to account for Mind Binder usage
|
||||
new /obj/effect/effect/teleport_greyscale(M.loc) //CHOMPEdit Start
|
||||
M.drop_both_hands()
|
||||
if(M.tf_mob_holder && M.tf_mob_holder.loc == M)
|
||||
new /obj/effect/effect/teleport_greyscale(M.loc)
|
||||
var/mob/living/ourmob = M.tf_mob_holder
|
||||
if(ourmob.ai_holder)
|
||||
var/datum/ai_holder/our_AI = ourmob.ai_holder
|
||||
@@ -108,7 +106,7 @@
|
||||
M.vore_selected = null
|
||||
ourmob.mob_belly_transfer(M)
|
||||
ourmob.nutrition = M.nutrition
|
||||
M.soulgem.transfer_self(ourmob) //CHOMPAdd Soulcatcher
|
||||
M.soulgem.transfer_self(ourmob)
|
||||
|
||||
ourmob.ckey = M.ckey
|
||||
|
||||
@@ -127,7 +125,7 @@
|
||||
ourmob.tf_form = M
|
||||
M.forceMove(ourmob)
|
||||
else
|
||||
qdel(target) //CHOMPEdit End
|
||||
qdel(target)
|
||||
return
|
||||
else
|
||||
if(M.stat == DEAD) //We can let it undo the TF, because the person will be dead, but otherwise things get weird.
|
||||
@@ -202,7 +200,7 @@
|
||||
var/turf/get_dat_turf = get_turf(target)
|
||||
ourmob.loc = get_dat_turf
|
||||
ourmob.forceMove(get_dat_turf)
|
||||
if(!M.tf_form_ckey) //CHOMPEdit Start
|
||||
if(!M.tf_form_ckey)
|
||||
ourmob.vore_selected = M.vore_selected
|
||||
M.vore_selected = null
|
||||
for(var/obj/belly/B as anything in M.vore_organs)
|
||||
@@ -212,7 +210,7 @@
|
||||
M.vore_organs -= B
|
||||
ourmob.vore_organs += B
|
||||
ourmob.nutrition = M.nutrition
|
||||
M.soulgem.transfer_self(ourmob) //CHOMPAdd Soulcatcher
|
||||
M.soulgem.transfer_self(ourmob)
|
||||
ourmob.ckey = M.ckey
|
||||
|
||||
ourmob.Life(1)
|
||||
@@ -231,7 +229,7 @@
|
||||
ourmob.tf_form = M
|
||||
M.forceMove(ourmob)
|
||||
else
|
||||
qdel(target) //CHOMPEdit End
|
||||
qdel(target)
|
||||
firer.visible_message(span_notice("\The [shot_from] boops pleasantly."))
|
||||
return
|
||||
else
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 20 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 30 KiB |
@@ -51,10 +51,3 @@
|
||||
if(istype(wallet))
|
||||
wallet.owner_name = H.real_name
|
||||
wallet.worth = 1000
|
||||
|
||||
/decl/hierarchy/outfit/noncrew/vr_avatar
|
||||
pda_slot = null
|
||||
id_slot = null
|
||||
r_pocket = null
|
||||
l_pocket = null
|
||||
flags = OUTFIT_HAS_BACKPACK
|
||||
|
||||
@@ -1,331 +0,0 @@
|
||||
/obj/machinery/vr_sleeper
|
||||
name = "virtual reality sleeper"
|
||||
desc = "A fancy bed with built-in sensory I/O ports and connectors to interface users' minds with their bodies in virtual reality."
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "body_scanner_0"
|
||||
|
||||
var/base_state = "body_scanner_"
|
||||
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
circuit = /obj/item/circuitboard/vr_sleeper
|
||||
var/mob/living/carbon/human/occupant = null
|
||||
var/mob/living/carbon/human/avatar = null
|
||||
var/datum/mind/vr_mind = null
|
||||
var/datum/effect/effect/system/smoke_spread/bad/smoke
|
||||
|
||||
var/eject_dead = TRUE
|
||||
|
||||
var/mirror_first_occupant = TRUE // Do we force the newly produced body to look like the occupant?
|
||||
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 15
|
||||
active_power_usage = 200
|
||||
light_color = "#FF0000"
|
||||
//var/global/list/vr_mob_tf_options // Global var located in global_list_ch.dm
|
||||
|
||||
/obj/machinery/vr_sleeper/Initialize(mapload)
|
||||
. = ..()
|
||||
default_apply_parts()
|
||||
smoke = new
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/vr_sleeper/Destroy()
|
||||
. = ..()
|
||||
go_out()
|
||||
|
||||
/obj/machinery/vr_sleeper/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
if(occupant)
|
||||
go_out()
|
||||
visible_message(span_infoplain(span_bold("\The [src]") + " emits a low droning sound, before the pod door clicks open."))
|
||||
return
|
||||
else if(eject_dead && occupant && occupant.stat == DEAD) // If someone dies somehow while inside, spit them out.
|
||||
visible_message(span_warning("\The [src] sounds an alarm, swinging its hatch open."))
|
||||
go_out()
|
||||
|
||||
/obj/machinery/vr_sleeper/update_icon()
|
||||
icon_state = "[base_state][occupant ? "1" : "0"]"
|
||||
|
||||
// CHOMPedit
|
||||
/obj/machinery/vr_sleeper/examine(mob/user)
|
||||
. = ..()
|
||||
if(occupant)
|
||||
. += span_notice("[occupant] is inside.")
|
||||
|
||||
/obj/machinery/vr_sleeper/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(usr == occupant)
|
||||
to_chat(usr, span_warning("You can't reach the controls from the inside."))
|
||||
return
|
||||
|
||||
add_fingerprint(usr)
|
||||
|
||||
if(href_list["eject"])
|
||||
go_out()
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/vr_sleeper/attackby(var/obj/item/I, var/mob/user)
|
||||
add_fingerprint(user)
|
||||
|
||||
if(occupant && (istype(I, /obj/item/healthanalyzer) || istype(I, /obj/item/robotanalyzer)))
|
||||
I.attack(occupant, user)
|
||||
return
|
||||
|
||||
if(default_deconstruction_screwdriver(user, I))
|
||||
return
|
||||
else if(default_deconstruction_crowbar(user, I))
|
||||
if(occupant && avatar)
|
||||
avatar.exit_vr()
|
||||
avatar = null
|
||||
go_out()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/vr_sleeper/MouseDrop_T(var/mob/target, var/mob/user)
|
||||
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !isliving(target))
|
||||
return
|
||||
go_in(target, user)
|
||||
|
||||
|
||||
|
||||
/obj/machinery/vr_sleeper/relaymove(var/mob/user)
|
||||
..()
|
||||
if(user.incapacitated())
|
||||
return
|
||||
go_out()
|
||||
|
||||
|
||||
|
||||
/obj/machinery/vr_sleeper/emp_act(var/severity)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
..(severity)
|
||||
return
|
||||
|
||||
if(occupant)
|
||||
// This will eject the user from VR
|
||||
// ### Fry the brain? Yes. Maybe.
|
||||
if(prob(15 / ( severity / 4 )) && occupant.species.has_organ[O_BRAIN] && occupant.internal_organs_by_name[O_BRAIN])
|
||||
var/obj/item/organ/O = occupant.internal_organs_by_name[O_BRAIN]
|
||||
O.take_damage(severity * 2)
|
||||
visible_message(span_danger("\The [src]'s internal lighting flashes rapidly, before the hatch swings open with a cloud of smoke."))
|
||||
smoke.set_up(severity, 0, src)
|
||||
smoke.start("#202020")
|
||||
go_out()
|
||||
|
||||
..(severity)
|
||||
|
||||
/obj/machinery/vr_sleeper/verb/eject()
|
||||
set src in view(1)
|
||||
set category = "Object"
|
||||
set name = "Eject VR Capsule"
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
|
||||
var/forced = FALSE
|
||||
|
||||
if(stat & (BROKEN|NOPOWER) || occupant && occupant.stat == DEAD)
|
||||
forced = TRUE
|
||||
|
||||
go_out(forced)
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/machinery/vr_sleeper/verb/climb_in()
|
||||
set src in oview(1)
|
||||
set category = "Object"
|
||||
set name = "Enter VR Capsule"
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
go_in(usr, usr)
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/machinery/vr_sleeper/relaymove(mob/user as mob)
|
||||
if(user.incapacitated())
|
||||
return 0 //maybe they should be able to get out with cuffs, but whatever
|
||||
go_out()
|
||||
|
||||
/obj/machinery/vr_sleeper/proc/go_in(var/mob/M, var/mob/user)
|
||||
if(!M)
|
||||
return
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
if(!ishuman(M))
|
||||
to_chat(user, span_warning("\The [src] rejects [M] with a sharp beep."))
|
||||
return
|
||||
if(occupant)
|
||||
to_chat(user, span_warning("\The [src] is already occupied."))
|
||||
return
|
||||
|
||||
if(M == user)
|
||||
visible_message("\The [user] starts climbing into \the [src].")
|
||||
else
|
||||
visible_message("\The [user] starts putting [M] into \the [src].")
|
||||
|
||||
if(do_after(user, 20))
|
||||
if(occupant)
|
||||
to_chat(user, span_warning("\The [src] is already occupied."))
|
||||
return
|
||||
M.stop_pulling()
|
||||
if(M.client)
|
||||
M.client.perspective = EYE_PERSPECTIVE
|
||||
M.client.eye = src
|
||||
M.loc = src
|
||||
//update_use_power(USE_POWER_ACTIVE)
|
||||
occupant = M
|
||||
|
||||
update_icon()
|
||||
|
||||
//VOREstation edit - crashes borers
|
||||
if(!M.has_brain_worms())
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
enter_vr()
|
||||
else
|
||||
to_chat(user, span_warning("\The [src] rejects [M] with a sharp beep."))
|
||||
//VOREstation edit end
|
||||
return
|
||||
|
||||
/obj/machinery/vr_sleeper/proc/go_out(var/forced = TRUE)
|
||||
if(!occupant)
|
||||
return
|
||||
|
||||
if(!forced && avatar && tgui_alert(avatar, "Someone wants to remove you from virtual reality. Do you want to leave?", "Leave VR?", list("Yes", "No")) != "Yes")
|
||||
return
|
||||
|
||||
if(avatar)
|
||||
avatar.exit_vr()
|
||||
avatar = null
|
||||
|
||||
if(occupant.client)
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
occupant.loc = src.loc
|
||||
occupant = null
|
||||
for(var/atom/movable/A in src) // In case an object was dropped inside or something
|
||||
if(A == circuit)
|
||||
continue
|
||||
if(A in component_parts)
|
||||
continue
|
||||
A.loc = src.loc
|
||||
update_use_power(USE_POWER_IDLE)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/vr_sleeper/proc/enter_vr()
|
||||
|
||||
// No mob to transfer a mind from
|
||||
if(!occupant)
|
||||
return
|
||||
|
||||
// No mind to transfer
|
||||
if(!occupant.mind)
|
||||
return
|
||||
|
||||
// Mob doesn't have an active consciousness to send/receive from
|
||||
if(occupant.stat == DEAD)
|
||||
return
|
||||
|
||||
avatar = occupant.vr_link
|
||||
// If they've already enterred VR, and are reconnecting, prompt if they want a new body
|
||||
if(avatar && tgui_alert(occupant, "You already have a [avatar.stat == DEAD ? "" : "deceased "]Virtual Reality avatar. Would you like to use it?", "New avatar", list("Yes", "No")) != "Yes")
|
||||
// Delink the mob
|
||||
occupant.vr_link = null
|
||||
avatar = null
|
||||
|
||||
if(!avatar)
|
||||
// Get the desired spawn location to put the body
|
||||
var/S = null
|
||||
var/list/vr_landmarks = list()
|
||||
for(var/obj/effect/landmark/virtual_reality/sloc in landmarks_list)
|
||||
vr_landmarks += sloc.name
|
||||
|
||||
S = tgui_input_list(occupant, "Please select a location to spawn your avatar at:", "Spawn location", vr_landmarks)
|
||||
if(!S)
|
||||
return 0
|
||||
|
||||
//CHOMPedit: mob TF masquerading as mob spawning because that's somehow less spaghetti
|
||||
var/tf = null
|
||||
if(tgui_alert(occupant, "Would you like to play as a different creature?", "Join as a mob?", list("Yes", "No")) == "Yes")
|
||||
var/k = tgui_input_list(occupant, "Please select a creature:", "Mob list", vr_mob_tf_options)
|
||||
if(!k)
|
||||
return 0
|
||||
tf = vr_mob_tf_options[k]
|
||||
|
||||
for(var/obj/effect/landmark/virtual_reality/i in landmarks_list)
|
||||
if(i.name == S)
|
||||
S = i
|
||||
break
|
||||
|
||||
avatar = new(S, "Virtual Reality Avatar")
|
||||
//CHOMPedit start: rewriting this to spawn a copy of the user and allow mob TF.
|
||||
// I know this is a modular file now but perhaps keeping old comments will help with documentation.
|
||||
if(mirror_first_occupant && occupant.client && occupant.client.prefs)
|
||||
occupant.client.prefs.copy_to(avatar)
|
||||
|
||||
avatar.forceMove(get_turf(S)) // Put the mob on the landmark, instead of inside it
|
||||
occupant.enter_vr(avatar)
|
||||
avatar.regenerate_icons()
|
||||
avatar.update_transform()
|
||||
job_master.EquipRank(avatar,"Visitor", 1, FALSE)
|
||||
add_verb(avatar,/mob/living/carbon/human/proc/exit_vr) //CHOMPEdit
|
||||
add_verb(avatar,/mob/living/carbon/human/proc/vr_transform_into_mob) //CHOMPEdit
|
||||
add_verb(avatar,/mob/living/proc/set_size) //CHOMPEdit TGPanel // Introducing NeosVR
|
||||
avatar.virtual_reality_mob = TRUE
|
||||
|
||||
// Prompt for username after they've enterred the body.
|
||||
var/newname = sanitize(tgui_input_text(avatar, "You are entering virtual reality. Your username is currently [src.name]. Would you like to change it to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if(newname)
|
||||
avatar.real_name = newname
|
||||
avatar.name = newname
|
||||
|
||||
if(tf)
|
||||
var/mob/living/new_form = avatar.transform_into_mob(tf, TRUE) // No need to check prefs when the occupant already chose to transform.
|
||||
if(isliving(new_form)) // Make sure the mob spawned properly.
|
||||
add_verb(new_form,/mob/living/proc/vr_revert_mob_tf) //CHOMPEdit
|
||||
new_form.virtual_reality_mob = TRUE
|
||||
|
||||
else
|
||||
// If TFed, revert TF. Easier than coding mind transfer stuff for edge cases.
|
||||
if(avatar.tfed_into_mob_check())
|
||||
var/mob/living/M = loc
|
||||
if(istype(M)) // Sanity check, though shouldn't be needed since this is already checked by the proc.
|
||||
M.revert_mob_tf()
|
||||
occupant.enter_vr(avatar)
|
||||
|
||||
// I am not making a new file just for vr-specific mob procs.
|
||||
/mob/living/carbon/human/proc/vr_transform_into_mob()
|
||||
set name = "Transform Into Creature"
|
||||
set category = "Abilities.VR"
|
||||
set desc = "Become a different creature"
|
||||
|
||||
var/tf = null
|
||||
var/k = tgui_input_list(usr, "Please select a creature:", "Mob list", vr_mob_tf_options)
|
||||
if(!k)
|
||||
return 0
|
||||
tf = vr_mob_tf_options[k]
|
||||
|
||||
var/mob/living/new_form = transform_into_mob(tf, TRUE, TRUE)
|
||||
if(isliving(new_form)) // Sanity check
|
||||
add_verb(new_form,/mob/living/proc/vr_revert_mob_tf) //CHOMPEdit
|
||||
new_form.virtual_reality_mob = TRUE
|
||||
|
||||
/mob/living/proc/vr_revert_mob_tf()
|
||||
set name = "Revert Transformation"
|
||||
set category = "Abilities.VR"
|
||||
|
||||
revert_mob_tf()
|
||||
|
||||
// Exiting VR but for ghosts
|
||||
/mob/living/carbon/human/proc/fake_exit_vr()
|
||||
set name = "Log Out Of Virtual Reality"
|
||||
set category = "Abilities.VR"
|
||||
|
||||
if(tgui_alert(usr, "Would you like to log out of virtual reality?", "Log out?", list("Yes", "No")) == "Yes")
|
||||
release_vore_contents(TRUE)
|
||||
for(var/obj/item/I in src)
|
||||
drop_from_inventory(I)
|
||||
qdel(src)
|
||||
//CHOMPedit end
|
||||
@@ -1,66 +1,2 @@
|
||||
/mob/observer
|
||||
low_priority = TRUE
|
||||
|
||||
// Persistence vars not included as we probably don't want losing limbs in the game mean losing limbs in real life. Definitely can't backfire.
|
||||
/mob/observer/dead/verb/fake_enter_vr()
|
||||
set name = "Join virtual reality"
|
||||
set category = "Ghost.Join"
|
||||
set desc = "Log into NanoTrasen's local virtual reality server."
|
||||
|
||||
/* Temp removal while I figure out how to reduce the respawn time to 1 minute
|
||||
var/time_till_respawn = time_till_respawn()
|
||||
if(time_till_respawn == -1) // Special case, never allowed to respawn
|
||||
to_chat(usr, span_warning("Respawning is not allowed!"))
|
||||
return
|
||||
if(time_till_respawn) // Nonzero time to respawn
|
||||
to_chat(usr, span_warning("You can't do that yet! You died too recently. You need to wait another [round(time_till_respawn/10/60, 0.1)] minutes."))
|
||||
return
|
||||
*/
|
||||
var/datum/data/record/record_found
|
||||
record_found = find_general_record("name", client.prefs.real_name)
|
||||
// Found their record, they were spawned previously. Remind them corpses cannot play games.
|
||||
if(record_found)
|
||||
var/answer = tgui_alert(src,"You seem to have previously joined this round. If you are currently dead, you should not enter VR as this character. Would you still like to proceed?","Previously spawned",list("Yes","No"))
|
||||
if(answer != "Yes")
|
||||
return
|
||||
|
||||
var/S = null
|
||||
var/list/vr_landmarks = list()
|
||||
for(var/obj/effect/landmark/virtual_reality/sloc in landmarks_list)
|
||||
vr_landmarks += sloc.name
|
||||
|
||||
S = tgui_input_list(usr, "Please select a location to spawn your avatar at:", "Spawn location", vr_landmarks)
|
||||
if(!S)
|
||||
return 0
|
||||
for(var/obj/effect/landmark/virtual_reality/i in landmarks_list)
|
||||
if(i.name == S)
|
||||
S = i
|
||||
break
|
||||
|
||||
var/mob/living/carbon/human/avatar = new(get_turf(S), client.prefs.species)
|
||||
if(!avatar)
|
||||
to_chat(src, "Something went wrong and spawning failed.")
|
||||
return
|
||||
|
||||
//Write the appearance and whatnot out to the character
|
||||
var/client/C = client
|
||||
C.prefs.copy_to(avatar) // Unfortunately the cascade of procs this calls will add the body to the transcore body DB. Don't see a simple way to prevent that.
|
||||
avatar.key = key
|
||||
for(var/lang in C.prefs.alternate_languages)
|
||||
var/datum/language/chosen_language = GLOB.all_languages[lang]
|
||||
if(chosen_language)
|
||||
if(is_lang_whitelisted(usr,chosen_language) || (avatar.species && (chosen_language.name in avatar.species.secondary_langs)))
|
||||
avatar.add_language(lang)
|
||||
|
||||
avatar.regenerate_icons()
|
||||
avatar.update_transform()
|
||||
job_master.EquipRank(avatar,JOB_VR, 1, FALSE) //CHOMPEdit
|
||||
add_verb(avatar,/mob/living/carbon/human/proc/fake_exit_vr) //CHOMPEdit
|
||||
add_verb(avatar,/mob/living/carbon/human/proc/vr_transform_into_mob) //CHOMPEdit
|
||||
add_verb(avatar,/mob/living/proc/set_size) //CHOMPEdit TGPanel // Introducing NeosVR
|
||||
avatar.virtual_reality_mob = TRUE
|
||||
log_and_message_admins("[key_name_admin(avatar)] joined virtual reality from the ghost menu.")
|
||||
|
||||
var/newname = sanitize(tgui_input_text(avatar, "You are entering virtual reality. Your username is currently [src.name]. Would you like to change it to something else?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if(newname)
|
||||
avatar.real_name = newname
|
||||
|
||||
@@ -10,10 +10,7 @@
|
||||
var/pain_emote_3p = null
|
||||
var/species_sounds = "None" // By default, we have nothing.
|
||||
var/death_sound_override = null
|
||||
var/virtual_reality_mob = FALSE // gross boolean for keeping VR mobs in VR
|
||||
var/datum/looping_sound/mob/on_fire/firesoundloop
|
||||
var/mob/living/tf_form // Shapeshifter shenanigans
|
||||
var/tf_form_ckey
|
||||
// var/datum/looping_sound/mob/stunned/stunnedloop
|
||||
/* // Not sure if needed, screams aren't a carbon thing rn.
|
||||
var/scream_sound = null
|
||||
@@ -62,135 +59,6 @@ Maybe later, gotta figure out a way to click yourself when in a locker etc.
|
||||
/mob/living/proc/handle_vorefootstep(m_intent, turf/T) // Moved from living_ch.dm
|
||||
return FALSE
|
||||
|
||||
// Gross proc which is called on Life() to check for escaped VR mobs. Tried to do this with Exited() on area/vr but ended up being too heavy.
|
||||
/mob/living/proc/handle_vr_derez()
|
||||
if(virtual_reality_mob && !istype(get_area(src), /area/vr))
|
||||
log_debug("[src] escaped virtual reality")
|
||||
visible_message("[src] blinks out of existence.")
|
||||
for(var/obj/belly/B in vore_organs) // Assume anybody inside an escaped VR mob is also an escaped VR mob.
|
||||
for(var/mob/living/L in B)
|
||||
log_debug("[L] was inside an escaped VR mob and has been deleted.")
|
||||
qdel(L)
|
||||
qdel(src) // Would like to convert escaped players into AR holograms in the future to encourage exploit finding.
|
||||
|
||||
// TRANSFORMATION PROCS
|
||||
|
||||
// Used to check if THIS MOB has been transformed into a different mob, as only the NEW mob uses tf_mob_holder.
|
||||
// Necessary in niche cases where a proc interacts with the old body and needs to know it's been transformed (such as transforming into a mob then dying in virtual reality).
|
||||
// Use this if you cannot use the tf_mob_holder var. Returns TRUE if transformed, FALSE if not.
|
||||
/mob/living/proc/tfed_into_mob_check()
|
||||
if(loc && isliving(loc))
|
||||
var/mob/living/M = loc
|
||||
if(istype(M) && M.tf_mob_holder && (M.tf_mob_holder == src))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
// For some reason upstream made a general revert proc but not a general transform proc, so here it is.
|
||||
// Requires a /mob/living type path for transformation. Returns the new mob on success, null in all other cases.
|
||||
// Just handles mob TF right now, but maybe we'll want to do something similar for items in the future.
|
||||
/mob/living/proc/transform_into_mob(mob/living/new_form, pref_override = FALSE, revert = FALSE, shapeshifting = FALSE)
|
||||
if(!src.mind)
|
||||
return
|
||||
if(!src.allow_spontaneous_tf && !pref_override)
|
||||
return
|
||||
if(src.tf_mob_holder) //If we're already transformed
|
||||
if(revert)
|
||||
revert_mob_tf()
|
||||
return
|
||||
else
|
||||
return
|
||||
else
|
||||
if(src.stat == DEAD)
|
||||
return
|
||||
if(!ispath(new_form, /mob/living) && !ismob(new_form))
|
||||
return
|
||||
var/mob/living/new_mob
|
||||
if(shapeshifting && src.tf_form)
|
||||
new_mob = src.tf_form
|
||||
add_verb(new_mob,/mob/living/proc/shapeshift_form) //CHOMPEdit TGPanel
|
||||
new_mob.tf_form = src
|
||||
new_mob.forceMove(src.loc)
|
||||
visible_message(span_warning("[src] twists and contorts, shapeshifting into a different form!"))
|
||||
if(new_mob.ckey)
|
||||
new_mob.tf_form_ckey = new_mob.ckey
|
||||
else
|
||||
new_mob = new new_form(get_turf(src))
|
||||
|
||||
if(new_mob && isliving(new_mob))
|
||||
new_mob.faction = src.faction
|
||||
if(istype(new_mob, /mob/living/simple_mob))
|
||||
var/mob/living/simple_mob/S = new_mob
|
||||
if(!S.voremob_loaded)
|
||||
S.voremob_loaded = TRUE
|
||||
S.init_vore()
|
||||
new /obj/effect/effect/teleport_greyscale(src.loc)
|
||||
if(!new_mob.ckey)
|
||||
for(var/obj/belly/B as anything in new_mob.vore_organs)
|
||||
new_mob.vore_organs -= B
|
||||
qdel(B)
|
||||
new_mob.vore_organs = list()
|
||||
new_mob.name = src.name
|
||||
new_mob.real_name = src.real_name
|
||||
for(var/lang in src.languages)
|
||||
new_mob.languages |= lang
|
||||
src.copy_vore_prefs_to_mob(new_mob)
|
||||
new_mob.vore_selected = src.vore_selected
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(ishuman(new_mob))
|
||||
var/mob/living/carbon/human/N = new_mob
|
||||
N.gender = H.gender
|
||||
N.identifying_gender = H.identifying_gender
|
||||
else
|
||||
new_mob.gender = H.gender
|
||||
else
|
||||
new_mob.gender = src.gender
|
||||
if(ishuman(new_mob))
|
||||
var/mob/living/carbon/human/N = new_mob
|
||||
N.identifying_gender = src.gender
|
||||
|
||||
for(var/obj/belly/B as anything in src.vore_organs)
|
||||
B.loc = new_mob
|
||||
B.forceMove(new_mob)
|
||||
B.owner = new_mob
|
||||
src.vore_organs -= B
|
||||
new_mob.vore_organs += B
|
||||
new_mob.nutrition = src.nutrition
|
||||
|
||||
src.soulgem?.transfer_self(new_mob) //CHOMPAdd Soulcatcher
|
||||
|
||||
new_mob.ckey = src.ckey
|
||||
if(new_mob.tf_form_ckey)
|
||||
src.ckey = new_mob.tf_form_ckey
|
||||
if(src.ai_holder && new_mob.ai_holder)
|
||||
var/datum/ai_holder/old_AI = src.ai_holder
|
||||
old_AI.set_stance(STANCE_SLEEP)
|
||||
var/datum/ai_holder/new_AI = new_mob.ai_holder
|
||||
new_AI.hostile = old_AI.hostile
|
||||
new_AI.retaliate = old_AI.retaliate
|
||||
src.loc = new_mob
|
||||
src.forceMove(new_mob)
|
||||
new_mob.tf_mob_holder = src
|
||||
return new_mob
|
||||
|
||||
/mob/living/proc/shapeshift_form()
|
||||
set name = "Shapeshift Form"
|
||||
set category = "Abilities.Shapeshift"
|
||||
set desc = "Shape shift between set mob forms. (Requires a spawned mob to be varedited into the user's tf_form var as mob reference.)"
|
||||
if(!istype(tf_form))
|
||||
to_chat(src, span_notice("No shapeshift form set. (Requires a spawned mob to be varedited into the user's tf_form var as mob reference.)"))
|
||||
return
|
||||
else
|
||||
transform_into_mob(tf_form, TRUE, TRUE, TRUE)
|
||||
|
||||
/mob/living/set_dir(var/new_dir)
|
||||
. = ..()
|
||||
if(size_multiplier != 1 || icon_scale_x != 1 && center_offset > 0)
|
||||
update_transform(TRUE)
|
||||
|
||||
//ChompEDIT START - Removal of usr
|
||||
/mob/living/proc/set_metainfo_favs(var/mob/user, var/reopen = TRUE)
|
||||
if(user != src)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 30 KiB |
@@ -89,7 +89,7 @@
|
||||
*/
|
||||
//VR maps go here, tell me if theres a better way to load this
|
||||
// #include "virtual_reality/constructVR.dm" Virtual Reality areas included by default.
|
||||
//#include "modular_chomp/maps/virtual_reality/constructVR.dm" //Included in .dme
|
||||
//#include "maps/virtual_reality/constructVR.dm" //Included in .dme
|
||||
/datum/map_template/sc_lateload/vr_world
|
||||
name = "VR World"
|
||||
desc = "A dynamic, virtual world."
|
||||
|
||||
247
modular_chomp/virtual_reality/constructVR.dm
Normal file
247
modular_chomp/virtual_reality/constructVR.dm
Normal file
@@ -0,0 +1,247 @@
|
||||
// -- Areas -- //
|
||||
|
||||
/area/vr
|
||||
name = "VR world"
|
||||
icon_state = "green"
|
||||
base_turf = /turf/simulated/floor/outdoors/dirt
|
||||
flags = AREA_ALLOW_LARGE_SIZE | AREA_LIMIT_DARK_RESPITE
|
||||
|
||||
/area/vr/space
|
||||
name = "VR Space" //copypasta time
|
||||
icon_state = "space"
|
||||
requires_power = 1
|
||||
always_unpowered = 1
|
||||
dynamic_lighting = 0
|
||||
has_gravity = 0
|
||||
power_light = 0
|
||||
power_equip = 0
|
||||
power_environ = 0
|
||||
ambience = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/main.ogg','sound/music/traitor.ogg','sound/ambience/space/space_serithi.ogg','sound/music/freefallin.mid')
|
||||
base_turf = /turf/space
|
||||
ambience = AMBIENCE_SPACE
|
||||
flags = AREA_FLAG_IS_NOT_PERSISTENT | AREA_ALLOW_LARGE_SIZE | AREA_LIMIT_DARK_RESPITE
|
||||
|
||||
/area/space/atmosalert()
|
||||
return
|
||||
|
||||
/area/space/fire_alert()
|
||||
return
|
||||
|
||||
/area/space/fire_reset()
|
||||
return
|
||||
|
||||
/area/space/readyalert()
|
||||
return
|
||||
|
||||
/area/space/partyalert()
|
||||
return
|
||||
|
||||
|
||||
/area/vr/outdoors
|
||||
outdoors = OUTDOORS_YES
|
||||
ambience = AMBIENCE_SIF
|
||||
|
||||
/area/vr/powered
|
||||
name = "Powered VR World Inside"
|
||||
icon_state = "away1"
|
||||
requires_power = 0
|
||||
power_equip = 1
|
||||
power_environ = 1
|
||||
power_light = 1
|
||||
|
||||
/area/vr/powered/rocks
|
||||
name = "VR World Underground"
|
||||
icon_state = "darkred"
|
||||
|
||||
/area/vr/outdoors/powered
|
||||
name = "Powered VR World Outside"
|
||||
icon_state = "away"
|
||||
requires_power = 0
|
||||
power_equip = 1
|
||||
power_environ = 1
|
||||
power_light = 1
|
||||
|
||||
/area/vr/powered/bluebase
|
||||
name = "Blue Base"
|
||||
icon_state = "bluenew"
|
||||
|
||||
/area/vr/powered/redbase
|
||||
name = "Red Base"
|
||||
icon_state = "red"
|
||||
|
||||
/area/vr/outdoors/powered/lava
|
||||
name = "VR Lava Bridge"
|
||||
|
||||
/area/vr/powered/vendor
|
||||
name = "VR Vendor Room"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/material
|
||||
name = "VR Material Room"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/building1
|
||||
name = "VR Building 1"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/building2
|
||||
name = "VR Building 2"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/conspawn
|
||||
name = "VR Construct Spawn"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/armory
|
||||
name = "VR Armory"
|
||||
icon_state = "firingrange"
|
||||
|
||||
/area/vr/powered/cult
|
||||
name = "VR Cultist Base"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/outdoors/powered/cult
|
||||
name = "Cultist Outside"
|
||||
ambience = AMBIENCE_UNHOLY
|
||||
|
||||
//City section
|
||||
/area/vr/powered/bar
|
||||
name = "VR Bar"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/cafe
|
||||
name = "VR Ghost Cafe"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/gunshop
|
||||
name = "VR GunShop"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/vet
|
||||
name = "VR Vet"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/shop
|
||||
name = "VR Shop"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/art
|
||||
name = "VR Art Gallery"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/constore
|
||||
name = "VR Convenience Store"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/nuke
|
||||
name = "VR Violation"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/motel
|
||||
name = "VR Motel"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/dungeon
|
||||
name = "VR Dungeon"
|
||||
icon_state = "darkred"
|
||||
|
||||
/area/vr/powered/mall
|
||||
name = "VR Mall"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/vr/powered/mall/vw
|
||||
name = "VR Vibe"
|
||||
icon_state = "pink"
|
||||
ambience = list('sound/ambience/vaporwave.ogg')
|
||||
|
||||
/area/vr/powered/mall/secondlife
|
||||
name = "VR Thirdlife Bar"
|
||||
icon_state = "pink"
|
||||
ambience = list(AMBIENCE_GENERIC)
|
||||
|
||||
/area/vr/powered/mall/dorms
|
||||
name = "VR Mall Dorms"
|
||||
icon_state = "Sleep"
|
||||
flags = RAD_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING | AREA_LIMIT_DARK_RESPITE
|
||||
|
||||
/area/vr/powered/mall/dorms/dorms1
|
||||
|
||||
/area/vr/powered/mall/dorms/dorms2
|
||||
|
||||
/area/vr/powered/mall/dorms/dorms3
|
||||
|
||||
/area/vr/powered/mall/dorms/dorms4
|
||||
|
||||
/area/vr/powered/mall/dorms/dorms5
|
||||
|
||||
/area/vr/powered/mall/dorms/dorms6
|
||||
|
||||
/area/vr/powered/mall/dorms/secondlife
|
||||
name = "VR Third-Life Dorms"
|
||||
|
||||
/area/vr/powered/mall/dorms/secondlife2
|
||||
|
||||
/area/vr/powered/mall/dorms/secondlife3
|
||||
|
||||
/area/vr/powered/mall/dorms/secondlife4
|
||||
|
||||
/area/vr/powered/mall/dorms/secondlife5
|
||||
|
||||
|
||||
/area/vr/outdoors/powered/mall
|
||||
name = "VR Mall Outdoors"
|
||||
icon_state = "bluenew"
|
||||
|
||||
/area/vr/powered/mall/backrooms
|
||||
name = "VR ???"
|
||||
icon_state = "darkred"
|
||||
forced_ambience = list('sound/ambience/fluorescentlight.ogg')
|
||||
|
||||
/area/vr/powered/dungeon/indoors
|
||||
name = "VR Sewers"
|
||||
icon_state = "red"
|
||||
|
||||
/area/vr/powered/space
|
||||
name = "VR Space Vessel"
|
||||
icon_state = "away2"
|
||||
base_turf = /turf/space
|
||||
/area/vr/powered/space/whiteship
|
||||
name = "VR Whiteship"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/space/sciship
|
||||
name = "VR Sci Ship"
|
||||
icon_state = "green"
|
||||
|
||||
/area/vr/powered/space/mechfactory
|
||||
name = "VR Mech Factory"
|
||||
icon_state = "green"
|
||||
|
||||
// -- Objects -- //
|
||||
/obj/effect/fake_sun/always_day
|
||||
name = "fake sun"
|
||||
advanced_lighting = TRUE
|
||||
desc = "Deletes itself, but first updates all the lighting on outdoor turfs to cool colors."
|
||||
possible_light_setups = list(
|
||||
|
||||
list(
|
||||
"brightness" = 6.0,
|
||||
"color" = "#ABfff7"
|
||||
),
|
||||
list(
|
||||
"brightness" = 4.0,
|
||||
"color" = "#F4EA55"
|
||||
),
|
||||
list(
|
||||
"brightness" = 2.5,
|
||||
"color" = "#EE9AC6"
|
||||
),
|
||||
list(
|
||||
"brightness" = 1.0,
|
||||
"color" = "#F07AD8"
|
||||
)
|
||||
)
|
||||
|
||||
// VR EXCLUSIVE ITEMS
|
||||
/obj/item/reagent_containers/glass/beaker/mayo
|
||||
prefill = list("mayo" = 30) //;)
|
||||
@@ -223,7 +223,6 @@
|
||||
#include "code\_helpers\files.dm"
|
||||
#include "code\_helpers\game.dm"
|
||||
#include "code\_helpers\global_lists.dm"
|
||||
#include "code\_helpers\global_lists_ch.dm"
|
||||
#include "code\_helpers\global_lists_vr.dm"
|
||||
#include "code\_helpers\icons.dm"
|
||||
#include "code\_helpers\icons_procs.dm"
|
||||
@@ -1207,6 +1206,8 @@
|
||||
#include "code\game\machinery\telecomms\telemonitor.dm"
|
||||
#include "code\game\machinery\telecomms\traffic_control.dm"
|
||||
#include "code\game\machinery\virtual_reality\ar_console.dm"
|
||||
#include "code\game\machinery\virtual_reality\vr_console.dm"
|
||||
#include "code\game\machinery\virtual_reality\vr_procs.dm"
|
||||
#include "code\game\magic\Uristrunes.dm"
|
||||
#include "code\game\mecha\mech_bay.dm"
|
||||
#include "code\game\mecha\mech_fabricator.dm"
|
||||
@@ -4786,6 +4787,7 @@
|
||||
#include "maps\redgate\falls\atoll_turfs.dm"
|
||||
#include "maps\submaps\_helpers.dm"
|
||||
#include "maps\submaps\_readme.dm"
|
||||
#include "maps\virtual_reality\constructVR.dm"
|
||||
#include "modular_chomp\code\coalesce_ch.dm"
|
||||
#include "modular_chomp\code\global.dm"
|
||||
#include "modular_chomp\code\__defines\_planes+layers.dm"
|
||||
@@ -4838,7 +4840,6 @@
|
||||
#include "modular_chomp\code\game\machinery\paradox.dm"
|
||||
#include "modular_chomp\code\game\machinery\portable_turret.dm"
|
||||
#include "modular_chomp\code\game\machinery\vending.dm"
|
||||
#include "modular_chomp\code\game\machinery\virtual_reality\vr_console.dm"
|
||||
#include "modular_chomp\code\game\mecha\mecha_construction_paths.dm"
|
||||
#include "modular_chomp\code\game\objects\trash_eating.dm"
|
||||
#include "modular_chomp\code\game\mecha\mecha_parts.dm"
|
||||
@@ -5186,7 +5187,6 @@
|
||||
#include "modular_chomp\maps\submaps\surface_submaps\plains\plains_areas.dm"
|
||||
#include "modular_chomp\maps\submaps\surface_submaps\wilderness\wilderness.dm"
|
||||
#include "modular_chomp\maps\submaps\surface_submaps\wilderness\wilderness_areas.dm"
|
||||
#include "modular_chomp\maps\virtual_reality\constructVR.dm"
|
||||
#include "modular_chomp\maps\~map_system\_map_selection.dm"
|
||||
#include "modular_chomp\maps\~map_system\maps.dm"
|
||||
#include "modular_chomp\maps\~turfpacks\turfpacks.dm"
|
||||
|
||||
Reference in New Issue
Block a user