[MIRROR] VR pod rewrite (#10484)

Co-authored-by: Cameron Lennox <killer65311@gmail.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-03-21 13:57:56 -07:00
committed by GitHub
parent 07e5012dd2
commit ddebf29f35
32 changed files with 861 additions and 808 deletions

View File

@@ -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.
/*

View File

@@ -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"

View File

@@ -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
)

View File

@@ -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
)

View File

@@ -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!
)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -86,7 +86,7 @@
handle_dripping()
handle_vr_derez() // CHOMPedit
handle_vr_derez()
/mob/living/proc/handle_breathing()
return

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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."

View 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) //;)

View File

@@ -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"