diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 85ef2d8912..08c34716f0 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -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. /* diff --git a/code/__defines/misc_ch.dm b/code/__defines/misc_ch.dm index 8cc794c4a7..7f877f8b6d 100644 --- a/code/__defines/misc_ch.dm +++ b/code/__defines/misc_ch.dm @@ -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" diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 3e75070348..67f77063c8 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -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 + ) diff --git a/code/_helpers/global_lists_ch.dm b/code/_helpers/global_lists_ch.dm deleted file mode 100644 index d1b107b2f6..0000000000 --- a/code/_helpers/global_lists_ch.dm +++ /dev/null @@ -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 - ) diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 5c165b39eb..e87f98457b 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -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! ) diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 399f736fdd..afd1429178 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -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 diff --git a/code/datums/outfits/jobs/misc.dm b/code/datums/outfits/jobs/misc.dm index 28cfa9e236..0365d0723a 100644 --- a/code/datums/outfits/jobs/misc.dm +++ b/code/datums/outfits/jobs/misc.dm @@ -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 diff --git a/code/game/gamemodes/cult/construct_spells_ch.dm b/code/game/gamemodes/cult/construct_spells_ch.dm index a550ab2047..19b8bc3281 100644 --- a/code/game/gamemodes/cult/construct_spells_ch.dm +++ b/code/game/gamemodes/cult/construct_spells_ch.dm @@ -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 diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 42c36c8ab5..303e27f365 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -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) diff --git a/code/game/machinery/virtual_reality/ar_console.dm b/code/game/machinery/virtual_reality/ar_console.dm index 24191d3373..b860b62f5d 100644 --- a/code/game/machinery/virtual_reality/ar_console.dm +++ b/code/game/machinery/virtual_reality/ar_console.dm @@ -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) diff --git a/code/game/machinery/virtual_reality/vr_console.dm b/code/game/machinery/virtual_reality/vr_console.dm index c9a78f27dc..1c090a5f9f 100644 --- a/code/game/machinery/virtual_reality/vr_console.dm +++ b/code/game/machinery/virtual_reality/vr_console.dm @@ -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) diff --git a/code/game/machinery/virtual_reality/vr_procs.dm b/code/game/machinery/virtual_reality/vr_procs.dm new file mode 100644 index 0000000000..0afd9e562e --- /dev/null +++ b/code/game/machinery/virtual_reality/vr_procs.dm @@ -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 diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index e56742e757..1fe8f71c83 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -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 diff --git a/code/game/objects/effects/effect_system_ch.dm b/code/game/objects/effects/effect_system_ch.dm index d797791a10..b110e1dd9c 100644 --- a/code/game/objects/effects/effect_system_ch.dm +++ b/code/game/objects/effects/effect_system_ch.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm index 0df97a80c8..483f4f670d 100644 --- a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm +++ b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm @@ -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 diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 31fb4523a2..6b1464fc09 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -86,7 +86,7 @@ handle_dripping() - handle_vr_derez() // CHOMPedit + handle_vr_derez() /mob/living/proc/handle_breathing() return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4a4436245f..4cd63b1ae1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -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 diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index de04366b18..c4344676f8 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -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 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm index 0ecadf5a22..67b9472899 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm @@ -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 diff --git a/code/modules/vore/mob_tf.dm b/code/modules/vore/mob_tf.dm index ae4e1e1890..bd6dc08589 100644 --- a/code/modules/vore/mob_tf.dm +++ b/code/modules/vore/mob_tf.dm @@ -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) diff --git a/code/modules/vore/mouseray.dm b/code/modules/vore/mouseray.dm index 6941c680f5..9d1f42ea16 100644 --- a/code/modules/vore/mouseray.dm +++ b/code/modules/vore/mouseray.dm @@ -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 diff --git a/icons/effects/effects_ch.dmi b/icons/effects/effects_ch.dmi deleted file mode 100644 index 34ac9e5f54..0000000000 Binary files a/icons/effects/effects_ch.dmi and /dev/null differ diff --git a/icons/mob/screen_ghost.dmi b/icons/mob/screen_ghost.dmi index 583dc6dc08..31eb23dcde 100644 Binary files a/icons/mob/screen_ghost.dmi and b/icons/mob/screen_ghost.dmi differ diff --git a/modular_chomp/maps/virtual_reality/constructVR.dm b/maps/virtual_reality/constructVR.dm similarity index 100% rename from modular_chomp/maps/virtual_reality/constructVR.dm rename to maps/virtual_reality/constructVR.dm diff --git a/modular_chomp/code/datums/outfits/jobs/noncrew.dm b/modular_chomp/code/datums/outfits/jobs/noncrew.dm index f1dc8acf6e..c4479f615f 100644 --- a/modular_chomp/code/datums/outfits/jobs/noncrew.dm +++ b/modular_chomp/code/datums/outfits/jobs/noncrew.dm @@ -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 diff --git a/modular_chomp/code/game/machinery/virtual_reality/vr_console.dm b/modular_chomp/code/game/machinery/virtual_reality/vr_console.dm deleted file mode 100644 index ab597b7953..0000000000 --- a/modular_chomp/code/game/machinery/virtual_reality/vr_console.dm +++ /dev/null @@ -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 diff --git a/modular_chomp/code/modules/mob/dead/observer/observer.dm b/modular_chomp/code/modules/mob/dead/observer/observer.dm index ff4bb39db7..e89b93a693 100644 --- a/modular_chomp/code/modules/mob/dead/observer/observer.dm +++ b/modular_chomp/code/modules/mob/dead/observer/observer.dm @@ -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 diff --git a/modular_chomp/code/modules/mob/living/living.dm b/modular_chomp/code/modules/mob/living/living.dm index 6bb3214da5..8dcf20f037 100644 --- a/modular_chomp/code/modules/mob/living/living.dm +++ b/modular_chomp/code/modules/mob/living/living.dm @@ -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) diff --git a/modular_chomp/icons/mob/screen_ghost.dmi b/modular_chomp/icons/mob/screen_ghost.dmi deleted file mode 100644 index 31eb23dcde..0000000000 Binary files a/modular_chomp/icons/mob/screen_ghost.dmi and /dev/null differ diff --git a/modular_chomp/maps/southern_cross/submaps/_southern_cross_submaps.dm b/modular_chomp/maps/southern_cross/submaps/_southern_cross_submaps.dm index 7402a826ba..e8fb06faa6 100644 --- a/modular_chomp/maps/southern_cross/submaps/_southern_cross_submaps.dm +++ b/modular_chomp/maps/southern_cross/submaps/_southern_cross_submaps.dm @@ -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." diff --git a/modular_chomp/virtual_reality/constructVR.dm b/modular_chomp/virtual_reality/constructVR.dm new file mode 100644 index 0000000000..96b23ea387 --- /dev/null +++ b/modular_chomp/virtual_reality/constructVR.dm @@ -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) //;) diff --git a/vorestation.dme b/vorestation.dme index 6399de277b..368af7b69a 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -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"