diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 4e64cf6ff7..38a16bdba9 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -53,7 +53,8 @@ Mostly for chomp exclusive stuff, otherwise if you need to modify a base file fo * For multi-line removals: Use a block comment (/\* xxx \*/) to comment out the existing code block (do not modify whitespace more than necessary) and at the start, it should contain /\* CHOMP Removal - "Reason" * If it is something like a bugfix that Polaris or Vorestation would want (the codebase we use), you may want to consider coding it there as well. They may want any general gameplay bugfixes, and things that are obviously intended to work one way, but do not. They do not have any of our fluff species (vulp, akula, fenn, etc) so do not make PRs related to that, or any vore content to them. * Change whitespace as little as possible. Do not randomly add/remove whitespace. -* Any new files should have "_ch" at the end. For example, "life_ch.dm". Just make them in the same location as the file they are related to. +* Any new files should preferrably go into the modular_chomp folder following the file structure of where it would be placed normally. The old method was to have "_ch" at the end. For example, "life_ch.dm". +* Do not make changes to base icon files. New icon files should go into modular_chomp and code should be changed to point to the new file. * Map changes must be in tgm format. See the [Mapmerge2 Readme] for details, or use [StrongDMM] which can automatically save maps as tgm. The `attempt_ch()` proc has been added for your convienence. It allows a many-line change to become a single-line change in the existing Polaris files, preserving mergeability and allowing better code separation while preventing your new code from causing runtimes that stop the original code from running. If you are wanting to inject new procedures into an existing proc, called `update_atoms()` for example, you would create `update_atoms_ch()` in a nearby `_ch.dm` file, and then call to it from a single line in the original `update_atoms()` with `attempt_ch()`. @@ -81,6 +82,12 @@ Then in our `handle_grabs_ch()` proc, if we want to avoid performing the stock g * Reference issues and pull requests liberally. * Use the GitHub magic words "Fixed/Fixes/Fix, Resolved/Resolves/Resolve, Closed/Closes/Close", as in, "Closes #1928", as this will automatically close that issue when the PR is merged if it is a fix for that issue. +### Early porting + +* You may earlyport. +* Follow standard chompcomments incase upstream ends up closing their PR for any reason. +* If it does get merged upstream and the mirror appears on our repo, you are responsible for unfucking the comments situation, because it'll have to say VORE edits instead of CHOMP edits. + ## Licensing CHOMPStation is licensed under the GNU Affero General Public License version 3, which can be found in full in LICENSE-AGPL3.txt. diff --git a/.github/workflows/autochangelog.yml b/.github/workflows/autochangelog.yml index cb6ecabe46..c9c628fa29 100644 --- a/.github/workflows/autochangelog.yml +++ b/.github/workflows/autochangelog.yml @@ -11,7 +11,7 @@ env: jobs: autochangelog: name: Autochangelog - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 if: github.event.pull_request.merged == true steps: - uses: /actions/checkout@v3 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c531d1ffd9..4dcbd75275 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ env: jobs: file_tests: name: Run Linters - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 - name: Ensure +x on CI directory @@ -36,7 +36,7 @@ jobs: dreamchecker: name: DreamChecker - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 @@ -57,14 +57,14 @@ jobs: ~/dreamchecker > ${GITHUB_WORKSPACE}/output-annotations.txt 2>&1 - name: Annotate Linter - uses: yogstation13/DreamAnnotate@v1 + uses: yogstation13/DreamAnnotate@v2 if: always() with: outputFile: output-annotations.txt unit_tests: name: Integration Tests - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 - name: Ensure +x on CI directory diff --git a/.github/workflows/render_nanomaps.yml b/.github/workflows/render_nanomaps.yml index 57f305772c..62076dca06 100644 --- a/.github/workflows/render_nanomaps.yml +++ b/.github/workflows/render_nanomaps.yml @@ -11,10 +11,15 @@ on: paths: - 'maps/**' +permissions: {} jobs: generate_maps: + permissions: + contents: write # to push to branch + pull-requests: write # to create pull requests (repo-sync/pull-request) + name: 'Generate NanoMaps' - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - name: Clone uses: actions/checkout@v3 diff --git a/.gitignore b/.gitignore index 282f3eabf8..b7121fe8fb 100644 --- a/.gitignore +++ b/.gitignore @@ -22,9 +22,6 @@ cfg/ !/.vscode/settings.json !/.vscode/tasks.json -code/game/gamemodes/technomancer/spells/projectile/overload.dm -code/game/gamemodes/technomancer/spells/projectile/overload.dm -code/modules/client/preference_setup/loadout/loadout_xeno.dm temp.dmi node_modules/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..2b7500b231 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +# We don't want prettier to run on anything outside of the TGUI folder, so we have to do this. +/* + +# We want it to run into the TGUI folder, however. +!/tgui diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 4b96db2f5a..42b452ee25 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -7,7 +7,6 @@ "oderwat.indent-rainbow", "rexebin.darkpurple-black", "dbaeumer.vscode-eslint", - "editorconfig.editorconfig", "donkie.vscode-tgstation-test-adapter", "icrawl.discord-vscode", "esbenp.prettier-vscode" diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 145381146f..4b8970fd94 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -94,6 +94,13 @@ assign_uid() id_tag = num2text(uid) +/obj/machinery/atmospherics/unary/vent_pump/proc/update_area() + initial_loc = get_area(loc) + area_uid = "\ref[initial_loc]" + assign_uid() + id_tag = num2text(uid) + + /obj/machinery/atmospherics/unary/vent_pump/Destroy() unregister_radio(src, frequency) if(initial_loc) diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 64a57a744e..fe3e68130f 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -43,6 +43,12 @@ assign_uid() id_tag = num2text(uid) +/obj/machinery/atmospherics/unary/vent_scrubber/proc/update_area() + initial_loc = get_area(loc) + area_uid = "\ref[initial_loc]" + assign_uid() + id_tag = num2text(uid) + /obj/machinery/atmospherics/unary/vent_scrubber/Destroy() unregister_radio(src, frequency) if(initial_loc) diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 64b5490472..7a1f5cce95 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -161,16 +161,14 @@ if(istype(target, /turf/simulated)) var/turf/simulated/modeled_location = target - - if(modeled_location.special_temperature)//First do special interactions then the usuall stuff - var/delta_temp = modeled_location.special_temperature - air.temperature//2200C - 20C = 2180K - //assuming aluminium with thermal conductivity 235 W * K / m, Copper (400), Silver (430), steel (50), gold (320) - var/heat_gain = 23500 * 100 * delta_temp - air.add_thermal_energy(heat_gain) - if(network) - network.update = 1 - + if (modeled_location.special_temperature) + air.temperature += thermal_conductivity * (modeled_location.special_temperature - air.temperature) + if (air.temperature < TCMB) + air.temperature = TCMB + if (network) + network.update = TRUE + if(modeled_location.blocks_air) if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0)) diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index e67d2ad3ac..73ce3f01e8 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -170,7 +170,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin continue //Spread the fire. - if(prob( 50 + 50 * (firelevel/vsc.fire_firelevel_multiplier) ) && my_tile.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, my_tile, 0,0)) + if(prob( 50 + 50 * (firelevel/vsc.fire_firelevel_multiplier) ) && my_tile.CanPass(src, enemy_tile, 0,0) && enemy_tile.CanPass(src, my_tile, 0,0)) enemy_tile.create_fire(firelevel) else diff --git a/code/__defines/admin_ch.dm b/code/__defines/admin_ch.dm new file mode 100644 index 0000000000..cdbc9b064f --- /dev/null +++ b/code/__defines/admin_ch.dm @@ -0,0 +1,2 @@ +#define SMITE_PIE "Pie Splat" +#define SMITE_SPICE "Spicy Air" \ No newline at end of file diff --git a/code/__defines/admin_vr.dm b/code/__defines/admin_vr.dm index 62c4add906..5cc4ac2299 100644 --- a/code/__defines/admin_vr.dm +++ b/code/__defines/admin_vr.dm @@ -1,5 +1,6 @@ #define SMITE_SHADEKIN_ATTACK "Shadekin (Attack)" #define SMITE_SHADEKIN_NOMF "Shadekin (Devour)" #define SMITE_REDSPACE_ABDUCT "Redspace Abduction" +#define SMITE_AD_SPAM "Ad Spam" #define SMITE_AUTOSAVE "10 Second Autosave" #define SMITE_AUTOSAVE_WIDE "10 Second Autosave (AoE)" diff --git a/code/__defines/belly_modes_ch.dm b/code/__defines/belly_modes_ch.dm index e4b04aa87a..e1bb06b753 100644 --- a/code/__defines/belly_modes_ch.dm +++ b/code/__defines/belly_modes_ch.dm @@ -7,3 +7,8 @@ #define DM_FLAG_REAGENTSDIGEST 0x2 #define DM_FLAG_REAGENTSABSORB 0x4 #define DM_FLAG_REAGENTSDRAIN 0x8 + +//Vore Sprite Flags +#define DM_FLAG_VORESPRITE_BELLY 0x1 +#define DM_FLAG_VORESPRITE_TAIL 0x2 +#define DM_FLAG_VORESPRITE_MARKING 0x4 \ No newline at end of file diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index 2d8f714fc4..7ac58ddf6b 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -21,6 +21,7 @@ #define DM_FLAG_AFFECTWORN 0x10 #define DM_FLAG_JAMSENSORS 0x20 #define DM_FLAG_FORCEPSAY 0x40 +#define DM_FLAG_SLOWBODY 0x80 //CHOMPAdd //Item related modes #define IM_HOLD "Hold" diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm index ed22966cbe..abaab99885 100644 --- a/code/__defines/chemistry.dm +++ b/code/__defines/chemistry.dm @@ -54,8 +54,9 @@ var/list/cheartstopper = list("potassium_chloride") // Thi #define MAX_PILL_SPRITE 24 //max icon state of the pill sprites #define MAX_BOTTLE_SPRITE 4 //max icon state of the pill sprites +#define MAX_PATCH_SPRITE 4 //max icon state of the patch sprites, CHOMPedit #define MAX_MULTI_AMOUNT 20 // Max number of pills/patches that can be made at once #define MAX_UNITS_PER_PILL 60 // Max amount of units in a pill #define MAX_UNITS_PER_PATCH 60 // Max amount of units in a patch #define MAX_UNITS_PER_BOTTLE 60 // Max amount of units in a bottle (it's volume) -#define MAX_CUSTOM_NAME_LEN 64 // Max length of a custom pill/condiment/whatever \ No newline at end of file +#define MAX_CUSTOM_NAME_LEN 64 // Max length of a custom pill/condiment/whatever diff --git a/code/__defines/dcs/signals.dm b/code/__defines/dcs/signals.dm index 1ae4237a0d..06fb819b07 100644 --- a/code/__defines/dcs/signals.dm +++ b/code/__defines/dcs/signals.dm @@ -400,10 +400,6 @@ ///called when removing a given item from a mob, from mob/living/carbon/remove_embedded_object(mob/living/carbon/target, /obj/item) #define COMSIG_CARBON_EMBED_REMOVAL "item_embed_remove_safe" -// /mob/living/simple_animal/hostile signals -#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" - #define COMPONENT_HOSTILE_NO_ATTACK (1<<0) - // /obj signals ///from base of obj/deconstruct(): (disassembled) diff --git a/code/__defines/input.dm b/code/__defines/input.dm index cbc703935a..16afe5a2f3 100644 --- a/code/__defines/input.dm +++ b/code/__defines/input.dm @@ -10,7 +10,7 @@ // Combine the held WASD and arrow keys together (OR) into byond N/S/E/W dir #define MOVEMENT_KEYS_TO_DIR(MK) ((((MK)>>4)|(MK))&(ALL_CARDINALS)) -// Bitflags for pressed modifier keys. +// Bitflags for pressed modifier keys. // Values chosen specifically to not conflict with dir bitfield, in case we want to smoosh them together. #define CTRL_KEY (1<<8) #define SHIFT_KEY (1<<9) diff --git a/code/__defines/materials.dm b/code/__defines/materials.dm index 9536547c1d..e9ec7a357a 100644 --- a/code/__defines/materials.dm +++ b/code/__defines/materials.dm @@ -54,6 +54,8 @@ #define MAT_PLATINUM "platinum" #define MAT_TRITIUM "tritium" #define MAT_DEUTERIUM "deuterium" +#define MAT_CONCRETE "concrete" +#define MAT_PLASTEELREBAR "plasteel rebar" #define DEFAULT_TABLE_MATERIAL MAT_PLASTIC diff --git a/code/__defines/misc_ch.dm b/code/__defines/misc_ch.dm index 0ea4cec334..126c925bba 100644 --- a/code/__defines/misc_ch.dm +++ b/code/__defines/misc_ch.dm @@ -1,3 +1,8 @@ +//Department defines +#define DEPARTMENT_NONCREW "Non crew" + +//Job defines +#define JOB_OUTSIDER "Outsider" //Material defines #define MAT_CARPET "red carpet" @@ -8,4 +13,4 @@ #define MAT_CARPET_SILVERBLUE "silver blue carpet" #define MAT_CARPET_PINK "pink carpet" #define MAT_CARPET_PURPLE "purple carpet" -#define MAT_CARPET_ORANGE "orange carpet" \ No newline at end of file +#define MAT_CARPET_ORANGE "orange carpet" diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm index be17f09c39..253cde36e9 100644 --- a/code/__defines/mobs_vr.dm +++ b/code/__defines/mobs_vr.dm @@ -25,6 +25,7 @@ #define SPECIES_PROTEAN "Protean" #define SPECIES_RAPALA "Rapala" #define SPECIES_SERGAL "Sergal" +#define SPECIES_ALTEVIAN "Altevian" #define SPECIES_SHADEKIN_CREW "Black-Eyed Shadekin" #define SPECIES_VASILISSAN "Vasilissan" #define SPECIES_VULPKANIN "Vulpkanin" @@ -42,3 +43,9 @@ //custom species base sprites #define SPECIES_FENNEC "Fennec" #define SPECIES_XENOHYBRID "Xenohybrid" + +//for custom bodytypes + +#define SELECTS_BODYTYPE_FALSE 0 +#define SELECTS_BODYTYPE_CUSTOM 1 +#define SELECTS_BODYTYPE_SHAPESHIFTER 2 diff --git a/code/__defines/nifsoft.dm b/code/__defines/nifsoft.dm index cca614f1fb..114ee32779 100644 --- a/code/__defines/nifsoft.dm +++ b/code/__defines/nifsoft.dm @@ -40,9 +40,10 @@ #define NIF_SIZECHANGE 33 #define NIF_SOULCATCHER 34 #define NIF_WORLDBEND 35 +#define NIF_MALWARE 36 // Must be equal to the highest number above -#define TOTAL_NIF_SOFTWARE 35 +#define TOTAL_NIF_SOFTWARE 36 ////////////////////// // NIF flag list hints diff --git a/code/__defines/planets.dm b/code/__defines/planets.dm index da67d42ea2..3579cc804d 100644 --- a/code/__defines/planets.dm +++ b/code/__defines/planets.dm @@ -11,6 +11,7 @@ #define WEATHER_BLOOD_MOON "blood moon" // For admin fun or cult later on. #define WEATHER_EMBERFALL "emberfall" // More adminbuse, from TG. Harmless. #define WEATHER_ASH_STORM "ash storm" // Ripped from TG, like the above. Less harmless. +#define WEATHER_ASH_STORM_SAFE "light ash storm" //Safe version of the ash storm. Dimmer. #define WEATHER_FALLOUT "fallout" // Modified emberfall, actually harmful. Admin only. #define MOON_PHASE_NEW_MOON "new moon" diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index f81e48b044..b133acc9ec 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -86,18 +86,15 @@ #define LANGUAGE_ROOTLOCAL "Local Rootspeak" #define LANGUAGE_ROOTGLOBAL "Global Rootspeak" #define LANGUAGE_CULT "Cult" -#define LANGUAGE_OCCULT "Occult" #define LANGUAGE_CHANGELING "Changeling" #define LANGUAGE_VOX "Vox-Pidgin" #define LANGUAGE_TERMINUS "Terminus" -#define LANGUAGE_SKRELLIANFAR "High Skrellian" #define LANGUAGE_MINBUS "Minbus" #define LANGUAGE_EVENT1 "Occursus" #define LANGUAGE_AKHANI "Akhani" #define LANGUAGE_ALAI "Alai" #define LANGUAGE_ZADDAT "Vedahq" #define LANGUAGE_PROMETHEAN "Promethean Biolinguistics" -#define LANGUAGE_BLOB "Chemosense Transmission" #define LANGUAGE_GIBBERISH "Babel" // Language flags. diff --git a/code/__defines/species_languages_vr.dm b/code/__defines/species_languages_vr.dm index 1a5fbdab4c..7980683f9c 100644 --- a/code/__defines/species_languages_vr.dm +++ b/code/__defines/species_languages_vr.dm @@ -1,7 +1,7 @@ #define SPECIES_WHITELIST_SELECTABLE 0x20 // Can select and customize, but not join as #define LANGUAGE_DRUDAKAR "D'Rudak'Ar" -#define LANGUAGE_SLAVIC "Pan-Slavic" +#define LANGUAGE_SLAVIC "Pan-Slavic" //CHOMP reAdd #define LANGUAGE_BIRDSONG "Birdsong" #define LANGUAGE_SAGARU "Sagaru" #define LANGUAGE_CANILUNZT "Canilunzt" @@ -10,13 +10,11 @@ #define LANGUAGE_ENOCHIAN "Enochian" #define LANGUAGE_VESPINAE "Vespinae" #define LANGUAGE_SPACER "Spacer" -#define LANGUAGE_CLOWNISH "Coulrian" #define LANGUAGE_TAVAN "Tavan" #define LANGUAGE_ECHOSONG "Echo Song" -#define LANGUAGE_CHIMPANZEE "Chimpanzee" -#define LANGUAGE_NEAERA "Neaera" -#define LANGUAGE_STOK "Stok" -#define LANGUAGE_FARWA "Farwa" +#define LANGUAGE_ANIMAL "Animal" +#define LANGUAGE_TEPPI "Teppi" +#define LANGUAGE_MOUSE "Mouse" #define LANGUAGE_SHADEKIN "Shadekin Empathy" diff --git a/code/__defines/sprite_sheets.dm b/code/__defines/sprite_sheets.dm index 603bb82d5f..2194efca23 100644 --- a/code/__defines/sprite_sheets.dm +++ b/code/__defines/sprite_sheets.dm @@ -11,7 +11,8 @@ SPECIES_SERGAL = 'icons/inventory/suit/mob_vr_sergal.dmi',\ SPECIES_NEVREAN = 'icons/inventory/suit/mob_vr_sergal.dmi',\ SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ -SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi') +SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ +SPECIES_ALTEVIAN = 'icons/inventory/suit/mob_vr_altevian.dmi') #define VR_SPECIES_SPRITE_SHEETS_HEAD_MOB list(\ SPECIES_HUMAN = 'icons/inventory/head/mob.dmi',\ SPECIES_TAJ = 'icons/inventory/head/mob_tajaran.dmi',\ @@ -24,7 +25,8 @@ SPECIES_SERGAL = 'icons/inventory/head/mob_vr_sergal.dmi',\ SPECIES_NEVREAN = 'icons/inventory/head/mob_vr_sergal.dmi',\ SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ -SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi') +SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ +SPECIES_ALTEVIAN = 'icons/inventory/head/mob_vr_altevian.dmi') #define VR_SPECIES_SPRITE_SHEETS_HANDS_MOB list(\ SPECIES_HUMAN = 'icons/inventory/hands/mob.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/mob_tajaran.dmi',\ @@ -64,7 +66,8 @@ SPECIES_SERGAL = 'icons/inventory/suit/item_vr_sergal.dmi',\ SPECIES_NEVREAN = 'icons/inventory/suit/item_vr_sergal.dmi',\ SPECIES_VULPKANIN = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ -SPECIES_FENNEC = 'icons/inventory/suit/item_vr_vulpkanin.dmi') +SPECIES_FENNEC = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ +SPECIES_ALTEVIAN = 'icons/inventory/suit/item_vr_altevian.dmi') #define VR_SPECIES_SPRITE_SHEETS_HEAD_ITEM list(\ SPECIES_HUMAN = 'icons/inventory/head/item.dmi',\ SPECIES_TAJ = 'icons/inventory/head/item_tajaran.dmi',\ @@ -77,7 +80,8 @@ SPECIES_SERGAL = 'icons/inventory/head/item_vr_sergal.dmi',\ SPECIES_NEVREAN = 'icons/inventory/head/item_vr_sergal.dmi',\ SPECIES_VULPKANIN = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ -SPECIES_FENNEC = 'icons/inventory/head/item_vr_vulpkanin.dmi') +SPECIES_FENNEC = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ +SPECIES_ALTEVIAN = 'icons/inventory/head/item_vr_altevian.dmi') #define VR_SPECIES_SPRITE_SHEETS_HANDS_ITEM list(\ SPECIES_HUMAN = 'icons/inventory/hands/item.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/item_tajaran.dmi',\ @@ -118,7 +122,8 @@ SPECIES_SERGAL = 'icons/inventory/suit/mob_vr_sergal.dmi',\ SPECIES_NEVREAN = 'icons/inventory/suit/mob_vr_sergal.dmi',\ SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ -SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi') +SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ +SPECIES_ALTEVIAN = 'icons/inventory/suit/mob_vr_altevian.dmi') #define ALL_VR_SPRITE_SHEETS_HEAD_MOB list(\ SPECIES_HUMAN = 'icons/inventory/head/mob_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/head/mob_vr_tajaran.dmi',\ @@ -131,7 +136,8 @@ SPECIES_SERGAL = 'icons/inventory/head/mob_vr_sergal.dmi',\ SPECIES_NEVREAN = 'icons/inventory/head/mob_vr_sergal.dmi',\ SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ -SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi') +SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ +SPECIES_ALTEVIAN = 'icons/inventory/head/mob_vr_altevian.dmi') #define ALL_VR_SPRITE_SHEETS_HANDS_MOB list(\ SPECIES_HUMAN = 'icons/inventory/hands/mob_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/mob_vr_tajaran.dmi',\ @@ -171,7 +177,8 @@ SPECIES_SERGAL = 'icons/inventory/suit/item_vr_sergal.dmi',\ SPECIES_NEVREAN = 'icons/inventory/suit/item_vr_sergal.dmi',\ SPECIES_VULPKANIN = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ -SPECIES_FENNEC = 'icons/inventory/suit/item_vr_vulpkanin.dmi') +SPECIES_FENNEC = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ +SPECIES_ALTEVIAN = 'icons/inventory/suit/item_vr_altevian.dmi') #define ALL_VR_SPRITE_SHEETS_HEAD_ITEM list(\ SPECIES_HUMAN = 'icons/inventory/head/item_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/head/item_vr_tajaran.dmi',\ @@ -184,7 +191,8 @@ SPECIES_SERGAL = 'icons/inventory/head/item_vr_sergal.dmi',\ SPECIES_NEVREAN = 'icons/inventory/head/item_vr_sergal.dmi',\ SPECIES_VULPKANIN = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ -SPECIES_FENNEC = 'icons/inventory/head/item_vr_vulpkanin.dmi') +SPECIES_FENNEC = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ +SPECIES_ALTEVIAN = 'icons/inventory/head/item_vr_altevian.dmi') #define ALL_VR_SPRITE_SHEETS_HANDS_ITEM list(\ SPECIES_HUMAN = 'icons/inventory/hands/item_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/item_vr_tajaran.dmi',\ diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index cb30162b73..0a8b333956 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -119,26 +119,3 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_OVERLAYS 500 #define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. - -// Macro defining the actual code applying our overlays lists to the BYOND overlays list. (I guess a macro for speed) -// TODO - I don't really like the location of this macro define. Consider it. ~Leshana -#define COMPILE_OVERLAYS(A)\ - do {\ - var/list/oo = A.our_overlays;\ - var/list/po = A.priority_overlays;\ - if(LAZYLEN(po)){\ - if(LAZYLEN(oo)){\ - A.overlays = oo + po;\ - }\ - else{\ - A.overlays = po;\ - }\ - }\ - else if(LAZYLEN(oo)){\ - A.overlays = oo;\ - }\ - else{\ - A.overlays.Cut();\ - }\ - A.flags &= ~OVERLAY_QUEUED;\ - } while (FALSE) diff --git a/code/__defines/turfs.dm b/code/__defines/turfs.dm index 1c4b228b63..fe327cd632 100644 --- a/code/__defines/turfs.dm +++ b/code/__defines/turfs.dm @@ -28,3 +28,12 @@ #define OUTDOORS_NO 0 // Ditto. #define OUTDOORS_AREA -1 // If a turf has this, it will defer to the area's settings on init. // Note that after init, it will be either YES or NO. + +//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a +///Returns a list of turf in a square + +#define RECT_TURFS(H_RADIUS, V_RADIUS, CENTER) \ + block( \ + locate(max(CENTER.x-(H_RADIUS),1), max(CENTER.y-(V_RADIUS),1), CENTER.z), \ + locate(min(CENTER.x+(H_RADIUS),world.maxx), min(CENTER.y+(V_RADIUS),world.maxy), CENTER.z) \ + ) \ No newline at end of file diff --git a/code/__defines/spaceman_dmm.dm b/code/__spaceman_dmm.dm similarity index 85% rename from code/__defines/spaceman_dmm.dm rename to code/__spaceman_dmm.dm index 94f1743377..51b09cd036 100644 --- a/code/__defines/spaceman_dmm.dm +++ b/code/__spaceman_dmm.dm @@ -1,7 +1,8 @@ -// Interfaces for the SpacemanDMM linter, define'd to nothing when the linter -// is not in use. +/** +* SpacemanDMM dreamchecker extensions for suite 1.7 +* +*/ -// The SPACEMAN_DMM define is set by the linter and other tooling when it runs. #ifdef SPACEMAN_DMM #define RETURN_TYPE(X) set SpacemanDMM_return_type = X #define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X diff --git a/code/_global_vars/lists/misc.dm b/code/_global_vars/lists/misc.dm index a16573905e..97cc3753a1 100644 --- a/code/_global_vars/lists/misc.dm +++ b/code/_global_vars/lists/misc.dm @@ -2,7 +2,8 @@ GLOBAL_LIST_INIT(speech_toppings, list("|" = "i", "+" = "b", "_" = "u")) GLOBAL_LIST_EMPTY(meteor_list) /// List of wire colors for each object type of that round. One for airlocks, one for vendors, etc. -GLOBAL_LIST_EMPTY(wire_color_directory) // This is an associative list with the `holder_type` as the key, and a list of colors as the value. +GLOBAL_LIST_EMPTY(wire_color_directory) // This is an associative list with the `holder_type` as the key, and a list of colors as the value. +GLOBAL_LIST_EMPTY(wire_name_directory) // This is an associative list // Reference list for disposal sort junctions. Filled up by sorting junction's New() GLOBAL_LIST_EMPTY(tagger_locations) diff --git a/code/_global_vars/mobs.dm b/code/_global_vars/mobs.dm index 7e60dc71ea..9e1027bc88 100644 --- a/code/_global_vars/mobs.dm +++ b/code/_global_vars/mobs.dm @@ -1,5 +1,7 @@ GLOBAL_LIST_EMPTY(admins) //all clients whom are admins GLOBAL_PROTECT(admins) +GLOBAL_LIST_EMPTY(mentors) +GLOBAL_PROTECT(mentors) GLOBAL_LIST_EMPTY(deadmins) //all ckeys who have used the de-admin verb. GLOBAL_LIST_EMPTY(stealthminID) GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 94bfbbc232..32e7668f33 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -43,7 +43,7 @@ var/global/list/item_vore_blacklist = list( /obj/item/weapon/gun, /obj/item/weapon/pinpointer, /obj/item/clothing/shoes/magboots, - /obj/item/blueprints, + /obj/item/areaeditor/blueprints, /obj/item/clothing/head/helmet/space, /obj/item/weapon/disk/nuclear, /obj/item/clothing/suit/storage/hooded/wintercoat/roiz) @@ -850,3 +850,95 @@ var/global/list/xenobio_rainbow_extracts = list( /obj/item/slime_extract/emerald = 3, /obj/item/slime_extract/light_pink = 1, /obj/item/slime_extract/rainbow = 1) + + +// AREA GENERATION AND BLUEPRINT STUFF BELOW HERE +// typecacheof(list) and list() are two completely separate things, don't break! + +// WHATEVER YOU DO, DO NOT LEAVE THE LAST THING IN THE LIST BELOW HAVE A COMMA OR EVERYTHING EVER WILL BREAK +// ENSURE THE LAST AREA OR TURF LISTED IS SIMPLY "/area/clownhideout" AND NOT "/area/clownhideout," OR YOU WILL IMMEDIATELY DIE + +// These lists are, obviously, unfinished. + +// ALLOWING BUILDING IN AN AREA: +// If you want someone to be able to build a new area in a place, add the area to the 'BUILDABLE_AREA_TYPES' and 'blacklisted_areas' +// BUILDABLE_AREA_TYPES means they can build an area there. The blacklisted_areas means they CAN NOT EXPAND that area. No making space bigger! + +// DISALLOW BUILDING/AREA MANIPULATION IN AN AREA (OR A TURF TYPE): +// Likewise, if you want someone to never ever EVER be able to do anything area generation/expansion related to an area +// Then add it to SPECIALS and area_or_turf_fail_types + +// If you want someone to +var/global/list/BUILDABLE_AREA_TYPES = list( + /area/space, + /area/mine, +// /area/surface/outside, //SC //CHOMP Comment - Actually these are causing compilation error. +// /area/surface/cave, //SC +// /area/tether/surfacebase/outside, //CHOMP Edit Downstreams, uncomment these if you are using these maps +// /area/groundbase/unexplored/outdoors, +// /area/maintenance/groundbase/level1, +// /area/submap/groundbase/wilderness, +// /area/groundbase/mining, +// /area/offmap/aerostat/surface, +// /area/tether_away/beach, +// /area/tether_away/cave, +) + +var/static/list/blacklisted_areas = typecacheof(list( + /area/space, + /area/mine, +// /area/surface/outside, //SC //CHOMP Comment - Actually these are causing compilation error. +// /area/surface/cave, //SC + //TETHER STUFF BELOW THIS //CHOMP Edit Downstreams, uncomment these if you are using these maps +// /area/tether/surfacebase/outside, + //GROUNDBASE STUFF BELOW THIS +// /area/groundbase/unexplored/outdoors, +// /area/maintenance/groundbase/level1, +// /area/submap/groundbase/wilderness, +// /area/groundbase/mining, +// /area/offmap/aerostat/surface, +// /area/tether_away/beach, +// /area/tether_away/cave + )) + +var/global/list/SPECIALS = list( + /turf/space, + /area/shuttle, + /area/admin, + /area/arrival, + /area/centcom, + /area/asteroid, + /area/tdome, + /area/syndicate_station, + /area/wizard_station, + /area/prison, + /area/holodeck, + /area/turbolift, + /area/tether/elevator, + /turf/unsimulated/wall/planetary, + /area/submap/virgo2, + /area/submap/event, + /area/submap/casino_event + // /area/derelict //commented out, all hail derelict-rebuilders! +) + +var/global/list/area_or_turf_fail_types = typecacheof(list( + /turf/space, + /area/shuttle, + /area/admin, + /area/arrival, + /area/centcom, + /area/asteroid, + /area/tdome, + /area/syndicate_station, + /area/wizard_station, + /area/prison, + /area/holodeck, + /turf/simulated/wall/elevator, + /area/turbolift, + /area/tether/elevator, + /turf/unsimulated/wall/planetary, + /area/submap/virgo2, + /area/submap/event, + /area/submap/casino_event + )) diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index 0cb6c7ee27..15b48c77a7 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -37,7 +37,7 @@ /proc/log_debug(text) if (config.log_debug) - WRITE_LOG(debug_log, "DEBUG: [text]") + WRITE_LOG(debug_log, "DEBUG: [sanitize(text)]") for(var/client/C in GLOB.admins) if(C.is_preference_enabled(/datum/client_preference/debug/show_debug_logs)) diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index e2bc37d93c..5e77b4b09c 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -54,7 +54,9 @@ input = copytext(input,1,max_length) if(extra) - input = replace_characters(input, list("\n"=" ","\t"=" ")) + var/temp_input = replace_characters(input, list("\n"=" ","\t"=" "))//one character is replaced by two + if(length(input) < (length(temp_input) - 6))//6 is the number of linebreaks allowed per message + input = replace_characters(temp_input,list(" "=" "))//replace again, this time the double spaces with single ones if(encode) // The below \ escapes have a space inserted to attempt to enable CI auto-checking of span class usage. Please do not remove the space. diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm index ddfcec7421..515370c50d 100644 --- a/code/_helpers/turfs.dm +++ b/code/_helpers/turfs.dm @@ -156,7 +156,8 @@ for(var/obj/O in T) if(O.simulated) O.loc = X - O.update_light() + if(O.light_system == STATIC_LIGHT) + O.update_light() if(z_level_change) // The objects still need to know if their z-level changed. O.onTransitZ(T.z, X.z) diff --git a/code/_helpers/type2type.dm b/code/_helpers/type2type.dm index 700bbbfc57..e21d973b1b 100644 --- a/code/_helpers/type2type.dm +++ b/code/_helpers/type2type.dm @@ -98,12 +98,18 @@ if(!direction) return "" var/list/dirs = list() - if(direction & NORTH) dirs += "NORTH" - if(direction & SOUTH) dirs += "SOUTH" - if(direction & EAST) dirs += "EAST" - if(direction & WEST) dirs += "WEST" - if(direction & UP) dirs += "UP" - if(direction & DOWN) dirs += "DOWN" + if(direction & NORTH) + dirs += "NORTH" + if(direction & SOUTH) + dirs += "SOUTH" + if(direction & EAST) + dirs += "EAST" + if(direction & WEST) + dirs += "WEST" + if(direction & UP) + dirs += "UP" + if(direction & DOWN) + dirs += "DOWN" return dirs.Join(" ") // Converts an angle (degrees) into an ss13 direction @@ -287,21 +293,122 @@ return strtype return copytext(strtype, delim_pos) +// Concatenates a list of strings into a single string. A seperator may optionally be provided. +/proc/list2text(list/ls, sep) + if (ls.len <= 1) // Early-out code for empty or singleton lists. + return ls.len ? ls[1] : "" + + var/l = ls.len // Made local for sanic speed. + var/i = 0 // Incremented every time a list index is accessed. + + if (sep != null) + // Macros expand to long argument lists like so: sep, ls[++i], sep, ls[++i], sep, ls[++i], etc... + #define S1 sep, ls[++i] + #define S4 S1, S1, S1, S1 + #define S16 S4, S4, S4, S4 + #define S64 S16, S16, S16, S16 + + . = "[ls[++i]]" // Make sure the initial element is converted to text. + + // Having the small concatenations come before the large ones boosted speed by an average of at least 5%. + if (l-1 & 0x01) // 'i' will always be 1 here. + . = text("[][][]", ., S1) // Append 1 element if the remaining elements are not a multiple of 2. + if (l-i & 0x02) + . = text("[][][][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4. + if (l-i & 0x04) + . = text("[][][][][][][][][]", ., S4) // And so on.... + if (l-i & 0x08) + . = text("[][][][][][][][][][][][][][][][][]", ., S4, S4) + if (l-i & 0x10) + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16) + if (l-i & 0x20) + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16) + if (l-i & 0x40) + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64) + while (l > i) // Chomp through the rest of the list, 128 elements at a time. + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64) + + #undef S64 + #undef S16 + #undef S4 + #undef S1 + else + // Macros expand to long argument lists like so: ls[++i], ls[++i], ls[++i], etc... + #define S1 ls[++i] + #define S4 S1, S1, S1, S1 + #define S16 S4, S4, S4, S4 + #define S64 S16, S16, S16, S16 + + . = "[ls[++i]]" // Make sure the initial element is converted to text. + + if (l-1 & 0x01) // 'i' will always be 1 here. + . += S1 // Append 1 element if the remaining elements are not a multiple of 2. + if (l-i & 0x02) + . = text("[][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4. + if (l-i & 0x04) + . = text("[][][][][]", ., S4) // And so on... + if (l-i & 0x08) + . = text("[][][][][][][][][]", ., S4, S4) + if (l-i & 0x10) + . = text("[][][][][][][][][][][][][][][][][]", ., S16) + if (l-i & 0x20) + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16) + if (l-i & 0x40) + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64) + while (l > i) // Chomp through the rest of the list, 128 elements at a time. + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64) + + #undef S64 + #undef S16 + #undef S4 + #undef S1 + +// Converts a string into a list by splitting the string at each delimiter found. (discarding the seperator) +/proc/text2list(text, delimiter="\n") + var/delim_len = length(delimiter) + if (delim_len < 1) + return list(text) + + . = list() + var/last_found = 1 + var/found + + do + found = findtext(text, delimiter, last_found, 0) + . += copytext(text, last_found, found) + last_found = found + delim_len + while (found) + /proc/type2parent(child) var/string_type = "[child]" var/last_slash = findlasttext(string_type, "/") - if(last_slash == 1) - switch(child) - if(/datum) - return null - if(/obj || /mob) - return /atom/movable - if(/area || /turf) - return /atom - else - return /datum + if (last_slash != 1) + return text2path(copytext(string_type, 1, last_slash)) + switch (child) + if (/datum) + return null + if (/obj, /mob) + return /atom/movable + if (/area, /turf) + return /atom + else + return /datum - return text2path(copytext(string_type, 1, last_slash)) //checks if a file exists and contains text //returns text as a string if these conditions are met @@ -315,4 +422,4 @@ error("File not found ([filename])") catch(var/exception/E) if(error_on_invalid_return) - error("Exception when loading file as string: [E]") \ No newline at end of file + error("Exception when loading file as string: [E]") diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 4c60b7a9bc..d9e3be6e7f 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -643,6 +643,20 @@ Turf and target are seperate in case you want to teleport some distance from a t for(var/turf/T in N) turfs += T return turfs + +//Takes: An instance of the area. +//Returns: A list of all turfs in that area. +//Side note: I don't know why this was never a thing. Did everyone just ignore the Blueprint item?! - C.L. +/proc/get_current_area_turfs(var/area/checked_area) + if(!checked_area) + return null + + var/list/turfs = new/list() + for(var/turf/counted_turfs in checked_area.contents) //Cheap. Efficient. Lovely. + turfs += counted_turfs + return turfs + + //Takes: Area type as text string or as typepath OR an instance of the area. //Returns: A list of all atoms (objs, turfs, mobs) in areas of that type of that type in the world. /proc/get_area_all_atoms(var/areatype) @@ -659,6 +673,18 @@ Turf and target are seperate in case you want to teleport some distance from a t atoms += A return atoms + +//Takes: Area as an instance of the area. +//Returns: A list of all atoms (objs, turfs, mobs) in the selected area. +/proc/get_current_area_atoms(var/area/checked_area) + if(!checked_area) + return null + + var/list/atoms = new/list() + for(var/atom/A in checked_area.contents) + atoms += A + return atoms + /datum/coords //Simple datum for storing coordinates. var/x_pos = null var/y_pos = null diff --git a/code/_onclick/hud/popups_vr.dm b/code/_onclick/hud/popups_vr.dm new file mode 100644 index 0000000000..20dc1963da --- /dev/null +++ b/code/_onclick/hud/popups_vr.dm @@ -0,0 +1,71 @@ +/obj/screen/popup + name = "popup" + desc = "NOTICE ME!" + + icon = 'icons/mob/screen1_popups.dmi' + plane = PLANE_PLAYER_HUD_ABOVE + layer = INFINITY + + var/close_button_x_start + var/close_button_x_end + var/close_button_y_start + var/close_button_y_end + + var/client/holder + +/obj/screen/popup/Click(location, control,params) + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + if(check_click_spot(icon_x, icon_y)) + close_popup() + else + popup_action() + +/obj/screen/popup/proc/popup_action() + return + +/obj/screen/popup/proc/close_popup() + holder.screen -= src + qdel(src) + +/obj/screen/popup/proc/check_click_spot(click_x, click_y) + if((click_x <= close_button_x_end) && (click_x >= close_button_x_start)) + if((click_y <= close_button_y_end) && (click_y >= close_button_y_start)) + return TRUE + return FALSE + +/obj/screen/popup/proc/get_random_screen_location() + var/loc_x = rand(1,11) + var/loc_x_offset = rand(0,16) + var/loc_y = rand(1,12) + var/loc_y_offset = rand(0,16) + return "[loc_x]:[loc_x_offset],[loc_y]:[loc_y_offset]" + +/client/proc/create_fake_ad_popup(popup_type) + if(!src) + return + var/obj/screen/popup/ad = new popup_type() + ad.screen_loc = ad.get_random_screen_location() + src.screen |= ad + ad.holder = src + +/client/proc/create_fake_ad_popup_multiple(popup_type, popup_amount) + if(!src) + return + for(var/i = 0, i < popup_amount, i++) + create_fake_ad_popup(popup_type) + +/obj/screen/popup/default + name = "CLICK ME" + + icon_state = "popup1" + + close_button_x_start = 118 + close_button_x_end = 126 + close_button_y_start = 86 + close_button_y_end = 94 + +/obj/screen/popup/default/New() + ..() + icon_state = "popup[rand(1,10)]" \ No newline at end of file diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 8954bf45bc..72e2219ad8 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -167,6 +167,9 @@ vis_contents -= hover_overlays_cache[hovering_choice] hovering_choice = choice + if(!choice) + return + var/obj/effect/overlay/zone_sel/overlay_object = hover_overlays_cache[choice] if(!overlay_object) overlay_object = new @@ -174,7 +177,6 @@ hover_overlays_cache[choice] = overlay_object vis_contents += overlay_object - /obj/effect/overlay/zone_sel icon = 'icons/mob/zone_sel.dmi' mouse_opacity = MOUSE_OPACITY_TRANSPARENT @@ -240,7 +242,7 @@ update_icon() /obj/screen/zone_sel/update_icon() - cut_overlay(selecting_appearance) + cut_overlays() selecting_appearance = mutable_appearance('icons/mob/zone_sel.dmi', "[selecting]") add_overlay(selecting_appearance) @@ -985,4 +987,4 @@ else //"0" is still length 1 so this means it's over 999 overlays += image('icons/mob/screen_ammo.dmi', src, "o9") overlays += image('icons/mob/screen_ammo.dmi', src, "t9") - overlays += image('icons/mob/screen_ammo.dmi', src, "h9") \ No newline at end of file + overlays += image('icons/mob/screen_ammo.dmi', src, "h9") diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 2f336d1a39..2a81ab313d 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -79,6 +79,7 @@ var/list/gamemode_cache = list() var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 var/static/show_mods = 0 var/static/show_devs = 0 + var/static/show_mentors = 0 var/static/show_event_managers = 0 var/static/mods_can_tempban = 0 var/static/mods_can_job_tempban = 0 @@ -290,7 +291,7 @@ var/list/gamemode_cache = list() // How strictly the loadout enforces object species whitelists var/loadout_whitelist = LOADOUT_WHITELIST_LAX - + var/static/vgs_access_identifier = null // VOREStation Edit - VGS var/static/vgs_server_port = null // VOREStation Edit - VGS @@ -660,6 +661,9 @@ var/list/gamemode_cache = list() if("show_devs") config.show_devs = 1 + if("show_mentors") + config.show_mentors = 1 + if("show_event_managers") config.show_event_managers = 1 diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index 6b7c0b4137..bacaa59f8f 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -36,7 +36,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) if(!statclick) statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) - stat("GLOB:", statclick.update("Edit")) + stat("GLOB:", "Button Removed Due To Crashing") //VOREStation Edit /datum/controller/global_vars/vv_edit_var(var_name, var_value) if(gvars_datum_protected_varlist[var_name]) diff --git a/code/controllers/subsystems/ai.dm b/code/controllers/subsystems/ai.dm index 41fb3a7e29..eb29e2fec2 100644 --- a/code/controllers/subsystems/ai.dm +++ b/code/controllers/subsystems/ai.dm @@ -39,7 +39,7 @@ SUBSYSTEM_DEF(ai) if(!L?.loc) continue - if(process_z[get_z(L)] || !L.low_priority) //VOREStation Edit End + if((get_z(L) && process_z[get_z(L)]) || !L.low_priority) //VOREStation Edit End A.handle_strategicals() else slept_mobs++ diff --git a/code/controllers/subsystems/chat.dm b/code/controllers/subsystems/chat.dm index aece61d39e..92a1be2757 100644 --- a/code/controllers/subsystems/chat.dm +++ b/code/controllers/subsystems/chat.dm @@ -52,7 +52,7 @@ SUBSYSTEM_DEF(chat) for(var/I in target) var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible - if(!C) + if(!C || !C.chatOutput) continue // No client? No care. else if(C.chatOutput.broken) DIRECT_OUTPUT(C, original_message) @@ -65,7 +65,7 @@ SUBSYSTEM_DEF(chat) else var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible - if(!C) + if(!C || !C.chatOutput) return // No client? No care. else if(C.chatOutput.broken) DIRECT_OUTPUT(C, original_message) diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm index f265f39955..2aa6d84cb6 100644 --- a/code/controllers/subsystems/job.dm +++ b/code/controllers/subsystems/job.dm @@ -131,12 +131,13 @@ SUBSYSTEM_DEF(job) return department_datums[primary_department] +/datum/controller/subsystem/job/proc/get_ping_role(var/role) + var/datum/job/J = get_job(role) + if(J.requestable) + return get_primary_department_of_job(J) + // Someday it might be good to port code/game/jobs/job_controller.dm to here and clean it up. - - - - /datum/controller/subsystem/job/proc/job_debug_message(message) if(debug_messages) log_debug("JOB DEBUG: [message]") \ No newline at end of file diff --git a/code/controllers/subsystems/lighting.dm b/code/controllers/subsystems/lighting.dm index f851e3edf2..eff77ea394 100644 --- a/code/controllers/subsystems/lighting.dm +++ b/code/controllers/subsystems/lighting.dm @@ -32,17 +32,18 @@ SUBSYSTEM_DEF(lighting) MC_SPLIT_TICK var/list/queue = sources_queue var/i = 0 - for (i in 1 to length(queue)) - var/datum/light_source/L = queue[i] + if(length(queue)) + for(i in 1 to length(queue)) + var/datum/light_source/L = queue[i] - L.update_corners() + L.update_corners() - L.needs_update = LIGHTING_NO_UPDATE + L.needs_update = LIGHTING_NO_UPDATE - if(init_tick_checks) - CHECK_TICK - else if (MC_TICK_CHECK) - break + if(init_tick_checks) + CHECK_TICK + else if (MC_TICK_CHECK) + break if (i) queue.Cut(1, i+1) i = 0 diff --git a/code/controllers/subsystems/mobs.dm b/code/controllers/subsystems/mobs.dm index 20379861f3..66352c9c9e 100644 --- a/code/controllers/subsystems/mobs.dm +++ b/code/controllers/subsystems/mobs.dm @@ -40,7 +40,7 @@ SUBSYSTEM_DEF(mobs) if(!M || QDELETED(M)) mob_list -= M continue - else if(M.low_priority && !(M.loc && process_z[get_z(M)])) + else if(M.low_priority && !(M.loc && get_z(M) && process_z[get_z(M)])) slept_mobs++ continue //CHOMPEdit Start - Enable pausing mobs (For transformation, holding until reformation, etc.) diff --git a/code/controllers/subsystems/overlays.dm b/code/controllers/subsystems/overlays.dm index 92400e495b..25dbfbd62a 100644 --- a/code/controllers/subsystems/overlays.dm +++ b/code/controllers/subsystems/overlays.dm @@ -1,176 +1,149 @@ SUBSYSTEM_DEF(overlays) name = "Overlay" flags = SS_TICKER - wait = 1 + wait = 1 // SS_TICKER - Ticks priority = FIRE_PRIORITY_OVERLAYS init_order = INIT_ORDER_OVERLAY - var/list/queue // Queue of atoms needing overlay compiling (TODO-VERIFY!) - var/list/stats - var/list/overlay_icon_state_caches // Cache thing - var/list/overlay_icon_cache // Cache thing + /// The queue of atoms that need overlay updates. + var/static/tmp/list/queue = list() - var/static/image/stringbro - var/static/image/iconbro - var/static/image/appearance_bro + /// A list([icon] = list([state] = [appearance], ...), ...) cache of appearances. + var/static/tmp/list/state_cache = list() -/datum/controller/subsystem/overlays/PreInit() - overlay_icon_state_caches = list() - overlay_icon_cache = list() - queue = list() - stats = list() + /// A list([icon] = [appearance], ...) cache of appearances. + var/static/tmp/list/icon_cache = list() - stringbro = new() - iconbro = new() - appearance_bro = new() + /// The number of appearances currently cached. + var/static/tmp/cache_size = 0 -/datum/controller/subsystem/overlays/Initialize() - fire(mc_check = FALSE) + +/datum/controller/subsystem/overlays/Recover() + queue.Cut() + state_cache.Cut() + icon_cache.Cut() + cache_size = 0 + for (var/atom/atom) + atom.flags &= ~OVERLAY_QUEUED + CHECK_TICK + + +/datum/controller/subsystem/overlays/Initialize(timeofday) + fire(FALSE, TRUE) ..() /datum/controller/subsystem/overlays/stat_entry() - ..("Ov:[length(queue)]") + ..("Queued Atoms: [queue.len], Cache Size: [cache_size]") -/datum/controller/subsystem/overlays/Shutdown() - text2file(render_stats(stats), "[log_path]-overlay.log") - -/datum/controller/subsystem/overlays/Recover() - overlay_icon_state_caches = SSoverlays.overlay_icon_state_caches - overlay_icon_cache = SSoverlays.overlay_icon_cache - queue = SSoverlays.queue - - -/datum/controller/subsystem/overlays/fire(resumed = FALSE, mc_check = TRUE) - var/list/queue = src.queue - var/static/count = 0 - if (count) - var/c = count - count = 0 //so if we runtime on the Cut, we don't try again. - queue.Cut(1,c+1) - - for (var/thing in queue) - count++ - if(thing) - STAT_START_STOPWATCH - var/atom/A = thing - COMPILE_OVERLAYS(A) - STAT_STOP_STOPWATCH - STAT_LOG_ENTRY(stats, A.type) - if(mc_check) - if(MC_TICK_CHECK) - break - else +/datum/controller/subsystem/overlays/fire(resumed, no_mc_tick) + var/count = 1 + for (var/atom/atom as anything in queue) + ++count + atom?.UpdateOverlays() + if (no_mc_tick) CHECK_TICK + else if (MC_TICK_CHECK) + queue.Cut(1, count) + return + queue.Cut() - if (count) - queue.Cut(1,count+1) - count = 0 -/proc/iconstate2appearance(icon, iconstate) - // var/static/image/stringbro = new() // Moved to be superglobal due to BYOND insane init order stupidness. - var/list/icon_states_cache = SSoverlays.overlay_icon_state_caches - var/list/cached_icon = icon_states_cache[icon] - if (cached_icon) - var/cached_appearance = cached_icon["[iconstate]"] - if (cached_appearance) - return cached_appearance - SSoverlays.stringbro.icon = icon - SSoverlays.stringbro.icon_state = iconstate - if (!cached_icon) //not using the macro to save an associated lookup - cached_icon = list() - icon_states_cache[icon] = cached_icon - var/cached_appearance = SSoverlays.stringbro.appearance - cached_icon["[iconstate]"] = cached_appearance - return cached_appearance +/datum/controller/subsystem/overlays/proc/GetStateAppearance(icon, state) + var/list/subcache = state_cache[icon] + if (!subcache) + subcache = list() + state_cache[icon] = subcache + if (!subcache[state]) + var/image/image = new (icon, null, state) + subcache[state] = image.appearance + ++cache_size + return subcache[state] -/proc/icon2appearance(icon) - // var/static/image/iconbro = new() // Moved to be superglobal due to BYOND insane init order stupidness. - var/list/icon_cache = SSoverlays.overlay_icon_cache - . = icon_cache[icon] - if (!.) - SSoverlays.iconbro.icon = icon - . = SSoverlays.iconbro.appearance - icon_cache[icon] = . -/atom/proc/build_appearance_list(old_overlays) - // var/static/image/appearance_bro = new() // Moved to be superglobal due to BYOND insane init order stupidness. - var/list/new_overlays = list() - if (!islist(old_overlays)) - old_overlays = list(old_overlays) - for (var/overlay in old_overlays) - if(!overlay) +/datum/controller/subsystem/overlays/proc/GetIconAppearance(icon) + if (!icon_cache[icon]) + var/image/image = new (icon) + icon_cache[icon] = image.appearance + ++cache_size + return icon_cache[icon] + + +/datum/controller/subsystem/overlays/proc/GetAppearanceList(atom/subject, list/sources) + if (!sources) + return list() + if (!islist(sources)) + sources = list(sources) + var/list/result = list() + var/icon/icon = subject.icon + for (var/atom/entry as anything in sources) + if (!entry) continue - if (istext(overlay)) - new_overlays += iconstate2appearance(icon, overlay) - else if(isicon(overlay)) - new_overlays += icon2appearance(overlay) + else if (istext(entry)) + result += GetStateAppearance(icon, entry) + else if (isicon(entry)) + result += GetIconAppearance(entry) else - if(isloc(overlay)) - var/atom/A = overlay - if (A.flags & OVERLAY_QUEUED) - COMPILE_OVERLAYS(A) - SSoverlays.appearance_bro.appearance = overlay //this works for images and atoms too! - if(!ispath(overlay)) - var/image/I = overlay - SSoverlays.appearance_bro.dir = I.dir - new_overlays += SSoverlays.appearance_bro.appearance - return new_overlays + if (isloc(entry)) + if (entry.flags & OVERLAY_QUEUED) + entry.ImmediateOverlayUpdate() + if (!ispath(entry)) + result += entry.appearance + else + var/image/image = entry + result += image.appearance + return result -#define NOT_QUEUED_ALREADY (!(flags & OVERLAY_QUEUED)) -#define QUEUE_FOR_COMPILE flags |= OVERLAY_QUEUED; SSoverlays.queue += src; -/** - * Cut all of atom's normal overlays. Usually leaves "priority" overlays untouched. - * - * @param priority If true, also will cut priority overlays. - */ -/atom/proc/cut_overlays(priority = FALSE) - var/list/cached_overlays = our_overlays - var/list/cached_priority = priority_overlays - - var/need_compile = FALSE - - if(LAZYLEN(cached_overlays)) //don't queue empty lists, don't cut priority overlays - cached_overlays.Cut() //clear regular overlays - need_compile = TRUE - - if(priority && LAZYLEN(cached_priority)) - cached_priority.Cut() - need_compile = TRUE - - if(NOT_QUEUED_ALREADY && need_compile) - QUEUE_FOR_COMPILE - -/** - * Removes specific overlay(s) from the atom. Usually does not remove them from "priority" overlays. - * - * @param overlays The overlays to removed, type can be anything that is allowed for add_overlay(). - * @param priority If true, also will remove them from the "priority" overlays. - */ -/atom/proc/cut_overlay(list/overlays, priority) - if(!overlays) +/// Enqueues the atom for an overlay update if not already queued +/atom/proc/QueueOverlayUpdate() + if (flags & OVERLAY_QUEUED) return + SSoverlays.queue += src + flags |= OVERLAY_QUEUED - overlays = build_appearance_list(overlays) - var/list/cached_overlays = our_overlays //sanic - var/list/cached_priority = priority_overlays - var/init_o_len = LAZYLEN(cached_overlays) - var/init_p_len = LAZYLEN(cached_priority) //starter pokemon +/// Builds the atom's overlay state from caches +/atom/proc/UpdateOverlays() + if (gc_destroyed) + if (length(overlays)) + overlays.Cut() + return + flags &= ~OVERLAY_QUEUED + if (length(priority_overlays)) + if (length(our_overlays)) + overlays = priority_overlays + our_overlays + else + overlays = priority_overlays + else if (length(our_overlays)) + overlays = our_overlays + else + overlays.Cut() - LAZYREMOVE(cached_overlays, overlays) - if(priority) - LAZYREMOVE(cached_priority, overlays) - if(NOT_QUEUED_ALREADY && ((init_o_len != LAZYLEN(cached_overlays)) || (init_p_len != LAZYLEN(cached_priority)))) - QUEUE_FOR_COMPILE +/// Immediately runs an overlay update and dequeues the atom +/atom/proc/ImmediateOverlayUpdate() + SSoverlays.queue -= src + UpdateOverlays() + + +/// Clears the atom's overlay cache(s) and queues an update if needed +/atom/proc/cut_overlays(priority) + if (priority) + if (!length(priority_overlays)) + return + priority_overlays.Cut() + QueueOverlayUpdate() + else if (length(our_overlays)) + our_overlays.Cut() + QueueOverlayUpdate() + /** * Adds specific overlay(s) to the atom. * It is designed so any of the types allowed to be added to /atom/overlays can be added here too. More details below. * - * @param overlays The overlay(s) to add. These may be + * @param add The overlay(s) to add. These may be * - A string: In which case it is treated as an icon_state of the atom's icon. * - An icon: It is treated as an icon. * - An atom: Its own overlays are compiled and then it's appearance is added. (Meaning its current apperance is frozen). @@ -179,30 +152,46 @@ SUBSYSTEM_DEF(overlays) * - Or a list containing any of the above. * @param priority The overlays are added to the "priority" list istead of the normal one. */ -/atom/proc/add_overlay(list/overlays, priority = FALSE) - if(!overlays) +/atom/proc/add_overlay(list/add, priority) + if (!add) return - - overlays = build_appearance_list(overlays) - - LAZYINITLIST(our_overlays) //always initialized after this point - LAZYINITLIST(priority_overlays) - - var/list/cached_overlays = our_overlays //sanic - var/list/cached_priority = priority_overlays - var/init_o_len = cached_overlays.len - var/init_p_len = cached_priority.len //starter pokemon - var/need_compile - - if(priority) - cached_priority += overlays //or in the image. Can we use [image] = image? - need_compile = init_p_len != cached_priority.len + add = SSoverlays.GetAppearanceList(src, add) + if (!length(add)) + return + if (priority) + if (priority_overlays) + priority_overlays += add + else + priority_overlays = add + else if (our_overlays) + our_overlays += add else - cached_overlays += overlays - need_compile = init_o_len != cached_overlays.len + our_overlays = add + QueueOverlayUpdate() + + +/** + * Removes specific overlay(s) from the atom. Usually does not remove them from "priority" overlays. + * + * @param overlays The overlays to removed, type can be anything that is allowed for add_overlay(). + * @param priority If true, also will remove them from the "priority" overlays. + */ +/atom/proc/cut_overlay(list/cut, priority) + if (!cut) + return + cut = SSoverlays.GetAppearanceList(src, cut) + if (!length(cut)) + return + var/update + if (priority && length(priority_overlays)) + priority_overlays -= cut + update = TRUE + if (length(our_overlays)) + our_overlays -= cut + update = TRUE + if (update) + QueueOverlayUpdate() - if(NOT_QUEUED_ALREADY && need_compile) //have we caught more pokemon? - QUEUE_FOR_COMPILE /** * Copy the overlays from another atom, either replacing all of ours or appending to our existing overlays. @@ -211,22 +200,21 @@ SUBSYSTEM_DEF(overlays) * @param other The atom to copy overlays from. * @param cut_old If true, all of our overlays will be *replaced* by the other's. If other is null, that means cutting all ours. */ -/atom/proc/copy_overlays(atom/other, cut_old) //copys our_overlays from another atom - if(!other) - if(cut_old) +/atom/proc/copy_overlays(atom/other, cut) + if (!other) + if (cut) cut_overlays() return + if (!length(other.our_overlays)) + if (cut) + cut_overlays() + return + if (cut || !length(our_overlays)) + our_overlays = other.our_overlays.Copy() + else + our_overlays |= other.our_overlays + QueueOverlayUpdate() - var/list/cached_other = other.our_overlays - if(cached_other) - if(cut_old || !LAZYLEN(our_overlays)) - our_overlays = cached_other.Copy() - else - our_overlays |= cached_other - if(NOT_QUEUED_ALREADY) - QUEUE_FOR_COMPILE - else if(cut_old) - cut_overlays() /** * Returns a list of overlays that the target atom has @@ -236,37 +224,32 @@ SUBSYSTEM_DEF(overlays) */ /proc/get_overlays(atom/other, priority, special) var/list/including = list() - if(!other) + if (!other) return including - - for(var/image/I as anything in other.our_overlays) - if(!special && I.plane > 0) + for (var/image/I as anything in other.our_overlays) + if (!special && I.plane > 0) continue including += I - - if(!priority) + if (!priority) return including - - for(var/image/I as anything in other.priority_overlays) - if(!special && I.plane > 0) + for (var/image/I as anything in other.priority_overlays) + if (!special && I.plane > 0) continue including += I - return including -#undef NOT_QUEUED_ALREADY -#undef QUEUE_FOR_COMPILE - -//TODO: Better solution for these? /image/proc/add_overlay(x) overlays += x + /image/proc/cut_overlay(x) overlays -= x + /image/proc/cut_overlays(x) overlays.Cut() + /image/proc/copy_overlays(atom/other, cut_old) if(!other) if(cut_old) diff --git a/code/controllers/subsystems/processing/instruments.dm b/code/controllers/subsystems/processing/instruments.dm index 3f305fb8fc..72770ea39b 100644 --- a/code/controllers/subsystems/processing/instruments.dm +++ b/code/controllers/subsystems/processing/instruments.dm @@ -34,7 +34,7 @@ PROCESSING_SUBSYSTEM_DEF(instruments) /datum/controller/subsystem/processing/instruments/proc/initialize_instrument_data() for(var/datum/instrument/I as anything in subtypesof(/datum/instrument)) - if(initial(I.abstract_type) == I) + if(initial(I.instrument_type) == I) continue I = new I I.Initialize() diff --git a/code/controllers/subsystems/transcore_vr.dm b/code/controllers/subsystems/transcore_vr.dm index 6bffac865d..81364db733 100644 --- a/code/controllers/subsystems/transcore_vr.dm +++ b/code/controllers/subsystems/transcore_vr.dm @@ -74,9 +74,13 @@ SUBSYSTEM_DEF(transcore) //In a human BITSET(H.hud_updateflag, BACKUP_HUD) - if(H == imp.imp_in && H.mind && H.stat < DEAD) - db.m_backup(H.mind,H.nif) - persist_nif_data(H) + if(H == imp.imp_in && H.stat < DEAD) //CHOMPEdit Start + if(H.mind) + db.m_backup(H.mind,H.nif) + persist_nif_data(H) + else if(H.vr_link && H.vr_link.mind) + db.m_backup(H.vr_link.mind,H.nif) + persist_nif_data(H) //CHOMPEdit End if(MC_TICK_CHECK) return diff --git a/code/controllers/subsystems/xenoarch.dm b/code/controllers/subsystems/xenoarch.dm index a175625b1f..111653fc68 100644 --- a/code/controllers/subsystems/xenoarch.dm +++ b/code/controllers/subsystems/xenoarch.dm @@ -1,8 +1,8 @@ #define XENOARCH_SPAWN_CHANCE 0.5 #define DIGSITESIZE_LOWER 4 #define DIGSITESIZE_UPPER 12 -#define ARTIFACTSPAWNNUM_LOWER 6 -#define ARTIFACTSPAWNNUM_UPPER 12 +#define ARTIFACTSPAWNNUM_LOWER 12 +#define ARTIFACTSPAWNNUM_UPPER 24 // // Xenoarch subsystem handles initialization of Xenoarcheaology artifacts and digsites. diff --git a/code/core/atom/Transform.dm b/code/core/atom/Transform.dm new file mode 100644 index 0000000000..8a914a52ed --- /dev/null +++ b/code/core/atom/Transform.dm @@ -0,0 +1,53 @@ +/// The atom's base transform scale for width. +/atom/var/tf_scale_x + +/// The atom's base transform scale for height. +/atom/var/tf_scale_y + +/// The atom's base transform scale for rotation. +/atom/var/tf_rotation + +/// The atom's base transform scale for horizontal offset. +/atom/var/tf_offset_x + +/// The atom's base transform scale for vertical offset. +/atom/var/tf_offset_y + + +/// Clear the atom's tf_* variables and the current transform state. +/atom/proc/ClearTransform() + tf_scale_x = null + tf_scale_y = null + tf_rotation = null + tf_offset_x = null + tf_offset_y = null + transform = null + + +/// Sets the atom's tf_* variables and the current transform state, also applying others if supplied. +/atom/proc/SetTransform( + scale, + scale_x = tf_scale_x, + scale_y = tf_scale_y, + rotation = tf_rotation, + offset_x = tf_offset_x, + offset_y = tf_offset_y, + list/others +) + if (!isnull(scale)) + tf_scale_x = scale + tf_scale_y = scale + else + tf_scale_x = scale_x + tf_scale_y = scale_y + tf_rotation = rotation + tf_offset_x = offset_x + tf_offset_y = offset_y + transform = matrix().Update( + scale_x = tf_scale_x, + scale_y = tf_scale_y, + rotation = tf_rotation, + offset_x = tf_offset_x, + offset_y = tf_offset_y, + others = others + ) diff --git a/code/core/datum/IsAbstract.dm b/code/core/datum/IsAbstract.dm new file mode 100644 index 0000000000..12263dc098 --- /dev/null +++ b/code/core/datum/IsAbstract.dm @@ -0,0 +1,23 @@ +/** +* Abstract-ness is a meta-property of a class that is used to indicate +* that the class is intended to be used as a base class for others, and +* should not (or cannot) be instantiated. +* We have no such language concept in DM, and so we provide a datum member +* that can be used to hint at abstractness for circumstances where we would +* like that to be the case, such as base behavior providers. +*/ + +/// If set, a path at/above this one that expects not to be instantiated. +/datum/var/abstract_type + +/// If true, this datum is an instance of an abstract type. Oops. +/datum/proc/IsAbstract() + SHOULD_NOT_OVERRIDE(TRUE) + return type == abstract_type + +/// Passed a path or instance, returns whether it is abstract. Otherwise null. +/proc/is_abstract(datum/thing) + if (ispath(thing)) + return thing == initial(thing.abstract_type) + if (istype(thing)) + return thing.IsAbstract() diff --git a/code/core/image/Transform.dm b/code/core/image/Transform.dm new file mode 100644 index 0000000000..8129952939 --- /dev/null +++ b/code/core/image/Transform.dm @@ -0,0 +1,53 @@ +/// The image's base transform scale for width. +/image/var/tf_scale_x + +/// The image's base transform scale for height. +/image/var/tf_scale_y + +/// The image's base transform scale for rotation. +/image/var/tf_rotation + +/// The image's base transform scale for horizontal offset. +/image/var/tf_offset_x + +/// The image's base transform scale for vertical offset. +/image/var/tf_offset_y + + +/// Clear the image's tf_* variables and the current transform state. +/image/proc/ClearTransform() + tf_scale_x = null + tf_scale_y = null + tf_rotation = null + tf_offset_x = null + tf_offset_y = null + transform = null + + +/// Sets the image's tf_* variables and the current transform state, also applying others if supplied. +/image/proc/SetTransform( + scale, + scale_x = tf_scale_x, + scale_y = tf_scale_y, + rotation = tf_rotation, + offset_x = tf_offset_x, + offset_y = tf_offset_y, + list/others +) + if (!isnull(scale)) + tf_scale_x = scale + tf_scale_y = scale + else + tf_scale_x = scale_x + tf_scale_y = scale_y + tf_rotation = rotation + tf_offset_x = offset_x + tf_offset_y = offset_y + transform = matrix().Update( + scale_x = tf_scale_x, + scale_y = tf_scale_y, + rotation = tf_rotation, + offset_x = tf_offset_x, + offset_y = tf_offset_y, + others = others + ) diff --git a/code/core/matrix/Transform.dm b/code/core/matrix/Transform.dm new file mode 100644 index 0000000000..c3efc59d9a --- /dev/null +++ b/code/core/matrix/Transform.dm @@ -0,0 +1,27 @@ +/// Clears the matrix's a-f variables to identity. +/matrix/proc/Clear() + a = 1 + b = 0 + c = 0 + d = 0 + e = 1 + f = 0 + return src + + +/// Runs Scale, Turn, and Translate if supplied parameters, then multiplies by others if set. +/matrix/proc/Update(scale_x, scale_y, rotation, offset_x, offset_y, list/others) + var/x_null = isnull(scale_x) + var/y_null = isnull(scale_y) + if (!x_null || !y_null) + Scale(x_null ? 1 : scale_x, y_null ? 1 : scale_y) + if (!isnull(rotation)) + Turn(rotation) + if (offset_x || offset_y) + Translate(offset_x || 0, offset_y || 0) + if (islist(others)) + for (var/other in others) + Multiply(other) + else if (others) + Multiply(others) + return src diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index fbad2752ee..2b0c74e269 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -152,6 +152,11 @@ to_chat(user, "[parent] cannot contain [material].") return + // Our sheet had no material. Whoops. + if(!matter_per_sheet) + to_chat(user, "[S] does not contain any matter acceptable by [parent].") + return + // If we can't fit the material for one sheet, we're full. if(!has_space(matter_per_sheet)) to_chat(user, "[parent] is full. Please remove materials from [parent] in order to insert more.") diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index a3627ada9b..4c53798f81 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -339,18 +339,7 @@ var/global/list/PDA_Manifest = list() var/datum/job/J = SSjob.get_job(H.mind.assigned_role) hidden = J?.offmap_spawn - /* Note: Due to cached_character_icon, a number of emergent properties occur due to the initialization - * order of readied-up vs latejoiners. Namely, latejoiners will get a uniform in their datacore picture, but readied-up will - * not. This is due to the fact that SSticker calls data_core.manifest_inject() inside of ticker/proc/create_characters(), - * but does not equip them until ticker/proc/equip_characters(), which is called later. So, this proc is literally called before - * they ever get their equipment, and so it can't get a picture of them in their equipment. - * Latejoiners do not have this problem, because /mob/new_player/proc/AttemptLateSpawn calls EquipRank() before it calls - * this proc, which means that they're already clothed by the time they get their picture taken here. - * The COMPILE_OVERLAYS() here is just to bypass SSoverlays taking for-fucking-ever to update the mob, since we're about to - * take a picture of them, we want all the overlays. - */ - COMPILE_OVERLAYS(H) - SSoverlays.queue -= H + H.ImmediateOverlayUpdate() var/id = generate_record_id() //General Record diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 956adec1fb..270f52410c 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -1,3 +1,10 @@ +var/bluespace_item_types = newlist(/obj/item/weapon/storage/backpack/holding, +/obj/item/weapon/storage/bag/trash/holding, +/obj/item/weapon/storage/pouch/holding, +/obj/item/weapon/storage/belt/utility/holding, +/obj/item/weapon/storage/belt/medical/holding +) + //wrapper /proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=TRUE, bohsafe=FALSE) //CHOMPStation Edit new /datum/teleport/instant/science(arglist(args)) @@ -157,21 +164,27 @@ /datum/teleport/instant/science/setPrecision(aprecision) ..() - if(bohsafe) - return 1 - if(istype(teleatom, /obj/item/weapon/storage/backpack/holding)) - precision = rand(1,100) + if(bohsafe) //CHOMPedit + return 1 //CHOMPedit + + var/list/bluespace_things = newlist() + + for (var/item in bluespace_item_types) + if (istype(teleatom, item)) + precision = rand(1, 100) + bluespace_things |= teleatom.search_contents_for(item) - var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding) //VOREStation Addition Start: Prevent taurriding abuse if(istype(teleatom, /mob/living)) var/mob/living/L = teleatom if(LAZYLEN(L.buckled_mobs)) for(var/mob/rider in L.buckled_mobs) - bagholding += rider.search_contents_for(/obj/item/weapon/storage/backpack/holding) + for (var/item in bluespace_item_types) + bluespace_things |= rider.search_contents_for(item) //VOREStation Addition End: Prevent taurriding abuse - if(bagholding.len) - precision = max(rand(1,100)*bagholding.len,100) + + if(bluespace_things.len) + precision = max(rand(1,100)*bluespace_things.len,100) if(istype(teleatom, /mob/living)) var/mob/living/MM = teleatom to_chat(MM, "The Bluespace interface on your [teleatom] interferes with the teleport!") @@ -226,4 +239,4 @@ return 0 else return 1 - //VOREStation Edit End \ No newline at end of file + //VOREStation Edit End diff --git a/code/datums/helper_datums/teleport_vr.dm b/code/datums/helper_datums/teleport_vr.dm index d8e8428535..bf98361151 100644 --- a/code/datums/helper_datums/teleport_vr.dm +++ b/code/datums/helper_datums/teleport_vr.dm @@ -1,8 +1,14 @@ //wrapper +//This teleport effect means that bluespace items will cause a teleport location variation of 1 to 100 tiles. /proc/do_noeffect_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=FALSE) new /datum/teleport/instant/science/noeffect(arglist(args)) return +//This teleport effect does not interact with bluespace items. +/proc/do_safe_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=FALSE) + new /datum/teleport/instant(arglist(args)) + return + /datum/teleport/instant/science/noeffect/setEffects(datum/effect/effect/system/aeffectin,datum/effect/effect/system/aeffectout) return 1 diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index 0330811428..d7011dd094 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -80,7 +80,7 @@ /datum/looping_sound/cerealmaker start_sound = 'sound/machines/kitchen/cerealmaker/cerealmaker-start.ogg' - start_length = 10 + start_length = 10 mid_sounds = list('sound/machines/kitchen/cerealmaker/cerealmaker-mid1.ogg'=10) mid_length = 60 end_sound = 'sound/machines/kitchen/cerealmaker/cerealmaker-stop.ogg' @@ -104,4 +104,14 @@ mid_length = 70 end_sound = 'sound/machines/air_pump/airpumpshutdown.ogg' volume = 15 - pref_check = /datum/client_preference/air_pump_noise \ No newline at end of file + pref_check = /datum/client_preference/air_pump_noise + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/looping_sound/vehicle_engine + start_sound = 'sound/machines/vehicle/engine_start.ogg' + start_length = 2 + mid_sounds = list('sound/machines/vehicle/engine_mid.ogg'=1) + mid_length = 6 + end_sound = 'sound/machines/vehicle/engine_end.ogg' + volume = 20 diff --git a/code/datums/outfits/jobs/command.dm b/code/datums/outfits/jobs/command.dm index d8a74f925d..3bc5bb3099 100644 --- a/code/datums/outfits/jobs/command.dm +++ b/code/datums/outfits/jobs/command.dm @@ -7,7 +7,7 @@ backpack = /obj/item/weapon/storage/backpack/captain satchel_one = /obj/item/weapon/storage/backpack/satchel/cap messenger_bag = /obj/item/weapon/storage/backpack/messenger/com - id_type = /obj/item/weapon/card/id/gold + id_type = /obj/item/weapon/card/id/gold/captain // CHOMPFix, captain gets their two gold stripe drip back. pda_type = /obj/item/device/pda/captain /decl/hierarchy/outfit/job/captain/post_equip(var/mob/living/carbon/human/H) diff --git a/code/datums/riding.dm b/code/datums/riding.dm index 9dd32dcd93..ec5afff5d5 100644 --- a/code/datums/riding.dm +++ b/code/datums/riding.dm @@ -225,3 +225,28 @@ /datum/riding/boat/get_offsets(pass_index) // list(dir = x, y, layer) return list("[NORTH]" = list(1, 2), "[SOUTH]" = list(1, 2), "[EAST]" = list(1, 2), "[WEST]" = list(1, 2)) + +/datum/riding/snowmobile + only_one_driver = TRUE // Keep your hands to yourself back there! + +/datum/riding/snowmobile/get_offsets(pass_index) // list(dir = x, y, layer) + var/H = 3 // Horizontal seperation. + var/V = 2 // Vertical seperation. + var/O = 2 // Vertical offset. + switch(pass_index) + if(1) // Person on front. + return list( + "[NORTH]" = list( 0, O+V, MOB_LAYER), + "[SOUTH]" = list( 0, O, ABOVE_MOB_LAYER), + "[EAST]" = list( H, O, MOB_LAYER), + "[WEST]" = list(-H, O, MOB_LAYER) + ) + if(2) // Person on back. + return list( + "[NORTH]" = list( 0, O, ABOVE_MOB_LAYER), + "[SOUTH]" = list( 0, O+V, MOB_LAYER), + "[EAST]" = list(-H, O, MOB_LAYER), + "[WEST]" = list( H, O, MOB_LAYER) + ) + else + return null // This will runtime, but we want that since this is out of bounds. diff --git a/code/datums/roundstats/roundstats.dm b/code/datums/roundstats/roundstats.dm index 2fc1950bb6..0c25b83838 100644 --- a/code/datums/roundstats/roundstats.dm +++ b/code/datums/roundstats/roundstats.dm @@ -25,6 +25,8 @@ GLOBAL_VAR_INIT(prey_eaten_roundstat, 0) //VOREStation Edit - Obviously GLOBAL_VAR_INIT(prey_absorbed_roundstat, 0) //VOREStation Edit - Obviously GLOBAL_VAR_INIT(prey_digested_roundstat, 0) //VOREStation Edit - Obviously GLOBAL_VAR_INIT(items_digested_roundstat, 0) //VOREStation Edit - Obviously +var/global/list/security_printer_tickets = list() //VOREStation Edit + /hook/roundend/proc/RoundTrivia()//bazinga var/list/valid_stats_list = list() //This is to be populated with the good shit @@ -54,6 +56,22 @@ GLOBAL_VAR_INIT(items_digested_roundstat, 0) //VOREStation Edit - Obviously else if(GLOB.disposals_flush_shift_roundstat > 40) valid_stats_list.Add("The disposal system flushed a whole [GLOB.disposals_flush_shift_roundstat] times for this shift. We should really invest in waste treatement.") + //VOREStation add Start - Ticket time! + if(security_printer_tickets.len) + valid_stats_list.Add("[security_printer_tickets.len] unique security tickets were issued today!
Examples include:") + var/good_num = 5 + var/ourticket + while(good_num > 0) + ourticket = null + if(security_printer_tickets.len) + ourticket = pick(security_printer_tickets) + security_printer_tickets -= ourticket + if(ourticket) + valid_stats_list.Add("-\"[ourticket]\"") + good_num-- + else + good_num = 0 + //VOREStation Add Start - Vore stats lets gooooo if(GLOB.prey_eaten_roundstat > 0) valid_stats_list.Add("A total of [GLOB.prey_eaten_roundstat] individuals were eaten today!") diff --git a/code/datums/supplypacks/engineering.dm b/code/datums/supplypacks/engineering.dm index c35d048f54..0529f5aedd 100644 --- a/code/datums/supplypacks/engineering.dm +++ b/code/datums/supplypacks/engineering.dm @@ -77,6 +77,20 @@ containertype = /obj/structure/closet/crate/focalpoint containername = "advanced hull shield generator crate" +/datum/supply_pack/eng/point_defense_cannon_circuit + name = "Point Defense Turret Circuit" + contains = list(/obj/item/weapon/circuitboard/pointdefense = 2) + cost = 20 + containertype = /obj/structure/closet/crate/heph + containername = "point defense turret circuit crate" + +/datum/supply_pack/eng/point_defense_control_circuit + name = "Point Defense Controller Circuit" + contains = list(/obj/item/weapon/circuitboard/pointdefense_control = 1) + cost = 30 + containertype = /obj/structure/closet/crate/heph + containername = "point defense mainframe circuit crate" + /datum/supply_pack/eng/electrical name = "Electrical maintenance crate" contains = list( diff --git a/code/datums/supplypacks/hospitality.dm b/code/datums/supplypacks/hospitality.dm index bcf472a0b9..544ad90b6e 100644 --- a/code/datums/supplypacks/hospitality.dm +++ b/code/datums/supplypacks/hospitality.dm @@ -47,7 +47,7 @@ cost = 10 containertype = /obj/structure/closet/crate/gilthari containername = "crate of bar supplies" - + /datum/supply_pack/hospitality/cookingoil name = "Cooking oil tank crate" contains = list(/obj/structure/reagent_dispensers/cookingoil) @@ -96,6 +96,15 @@ containertype = /obj/structure/closet/crate/centauri containername = "Painting equipment" +/datum/supply_pack/hospitality/holywater + name = "Holy water crate" + contains = list( + /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater = 3 + ) + cost = 15 + containertype = /obj/structure/closet/crate/gilthari + containername = "holy water crate" + /datum/supply_pack/randomised/hospitality/ group = "Hospitality" diff --git a/code/datums/supplypacks/hydroponics_vr.dm b/code/datums/supplypacks/hydroponics_vr.dm index 7476fdd29b..fa912852e7 100644 --- a/code/datums/supplypacks/hydroponics_vr.dm +++ b/code/datums/supplypacks/hydroponics_vr.dm @@ -70,4 +70,10 @@ name = "Jerboa crate" cost = 10 containertype = /obj/structure/largecrate/animal/jerboa - containername = "Jerboa crate" \ No newline at end of file + containername = "Jerboa crate" + +/datum/supply_pack/hydro/tits + name = "A pair of great tits" + cost = 10 + containertype = /obj/structure/largecrate/tits + containername = "A pair of great tits" diff --git a/code/datums/supplypacks/materials.dm b/code/datums/supplypacks/materials.dm index 3268d05a46..d06238dc41 100644 --- a/code/datums/supplypacks/materials.dm +++ b/code/datums/supplypacks/materials.dm @@ -83,4 +83,11 @@ containertype = /obj/structure/closet/crate/grayson containername = "Linoleum crate" cost = 15 - contains = list(/obj/fiftyspawner/linoleum) \ No newline at end of file + contains = list(/obj/fiftyspawner/linoleum) + +/datum/supply_pack/materials/concrete + name = "Concrete" + cost = 10 + containertype = /obj/structure/closet/crate/grayson + contains = list(/obj/fiftyspawner/concrete) + containername = "Concrete bricks crate" \ No newline at end of file diff --git a/code/datums/supplypacks/misc_vr.dm b/code/datums/supplypacks/misc_vr.dm index dbe2143e03..8118ff0ab1 100644 --- a/code/datums/supplypacks/misc_vr.dm +++ b/code/datums/supplypacks/misc_vr.dm @@ -161,3 +161,18 @@ cost = 300 containertype = /obj/structure/closet/crate containername = "cordless jukebox speakers crate" + +/datum/supply_pack/misc/explorer_headsets + name = "shortwave-capable headsets (x4)" + contains = list( + /obj/item/device/radio/headset/explorer = 4 + ) + cost = 20 + containertype = /obj/structure/closet/crate/secure/gear + containername = "exploration radio headsets crate" + access = list( + access_explorer, + access_eva, + access_pilot + ) + one_access = TRUE diff --git a/code/datums/supplypacks/munitions.dm b/code/datums/supplypacks/munitions.dm index 73d150fd03..64567176a0 100644 --- a/code/datums/supplypacks/munitions.dm +++ b/code/datums/supplypacks/munitions.dm @@ -75,6 +75,19 @@ containername = "Shotgun crate" access = access_armory /* VOREStation edit -- This is a bad idea. -- So is this. + +/datum/supply_pack/munitions/shotgunsemi + name = "Weapons - Semi-Automatic Shotgun crate" + contains = list( + /obj/item/ammo_magazine/ammo_box/b12g, + /obj/item/ammo_magazine/ammo_box/b12g/pellet, + /obj/item/weapon/gun/projectile/shotgun/semi = 2 + ) + cost = 100 + containertype = /obj/structure/closet/crate/secure/weapon + containername = "Semi-Auto Shotgun crate" + access = access_armory + /datum/supply_pack/munitions/erifle name = "Weapons - Energy marksman" contains = list(/obj/item/weapon/gun/energy/sniperrifle = 2) @@ -307,4 +320,4 @@ cost = 500 containertype = /obj/structure/closet/crate/secure containername = "Light machine gun crate" - access = access_armory \ No newline at end of file + access = access_armory diff --git a/code/datums/supplypacks/science_vr.dm b/code/datums/supplypacks/science_vr.dm index 1d9922e7d8..2e9f756aa2 100644 --- a/code/datums/supplypacks/science_vr.dm +++ b/code/datums/supplypacks/science_vr.dm @@ -29,7 +29,7 @@ containertype = /obj/structure/largecrate/animal/weretiger containername = "Weretiger crate" access = access_xenobiology -/* + /datum/supply_pack/sci/otie name = "VARMAcorp adoptable reject (Dangerous!)" cost = 100 @@ -43,4 +43,3 @@ containertype = /obj/structure/largecrate/animal/otie/phoron containername = "VARMAcorp adaptive beta subject (Experimental)" access = access_xenobiology -*/ //VORESTATION AI TEMPORARY REMOVAL. Oties commented out cuz broke. diff --git a/code/datums/supplypacks/security.dm b/code/datums/supplypacks/security.dm index 5c4ddf1a6a..fc8d9b373b 100644 --- a/code/datums/supplypacks/security.dm +++ b/code/datums/supplypacks/security.dm @@ -444,7 +444,8 @@ /obj/item/weapon/storage/belt/security = 3, /obj/item/clothing/glasses/sunglasses/sechud = 3, /obj/item/device/radio/headset/headset_sec/alt = 3, - /obj/item/clothing/suit/storage/hooded/wintercoat/security = 3 + /obj/item/clothing/suit/storage/hooded/wintercoat/security = 3, + /obj/item/clothing/glasses/sunglasses/sechud/tactical_sec_vis = 3 ) cost = 10 containertype = /obj/structure/closet/crate/nanothreads diff --git a/code/datums/supplypacks/security_vr.dm b/code/datums/supplypacks/security_vr.dm index a00556e528..bbb28e08fb 100644 --- a/code/datums/supplypacks/security_vr.dm +++ b/code/datums/supplypacks/security_vr.dm @@ -1,4 +1,4 @@ -/*/datum/supply_pack/security/guardbeast //VORESTATION AI TEMPORARY REMOVAL +/datum/supply_pack/security/guardbeast name = "VARMAcorp autoNOMous security solution" cost = 150 containertype = /obj/structure/largecrate/animal/guardbeast @@ -17,7 +17,6 @@ access_security, access_xenobiology) one_access = TRUE -*/ /datum/supply_pack/randomised/security/armor access = access_armory diff --git a/code/datums/supplypacks/vending_refills_vr.dm b/code/datums/supplypacks/vending_refills_vr.dm index 47ee538d7e..bfa42113f7 100644 --- a/code/datums/supplypacks/vending_refills_vr.dm +++ b/code/datums/supplypacks/vending_refills_vr.dm @@ -18,11 +18,6 @@ name = "SweatMAX Vendor Refill Cartridge" cost = 10 -/datum/supply_pack/vending_refills/hotfood - contains = list(/obj/item/weapon/refill_cartridge/autoname/food/hotfood) - name = "Hot Foods Vendor Refill Cartridge" - cost = 10 - /datum/supply_pack/vending_refills/weeb contains = list(/obj/item/weapon/refill_cartridge/autoname/food/weeb) name = "Nippon-tan Vendor Refill Cartridge" @@ -48,6 +43,11 @@ name = "Ration Station Vendor Refill Cartridge" cost = 10 +/datum/supply_pack/vending_refills/altevian + contains = list(/obj/item/weapon/refill_cartridge/autoname/food/altevian) + name = "Altevian Vendor Refill Cartridge" + cost = 10 + /datum/supply_pack/vending_refills/coffee contains = list(/obj/item/weapon/refill_cartridge/autoname/drink/coffee) name = "Hot Drinks Vendor Refill Cartridge" @@ -117,7 +117,6 @@ num_contained = 5 contains = list(/obj/item/weapon/refill_cartridge/autoname/food/snack, /obj/item/weapon/refill_cartridge/autoname/food/fitness, - /obj/item/weapon/refill_cartridge/autoname/food/hotfood, /obj/item/weapon/refill_cartridge/autoname/food/weeb, /obj/item/weapon/refill_cartridge/autoname/food/sol, /obj/item/weapon/refill_cartridge/autoname/food/snix, diff --git a/code/datums/supplypacks/voidsuits.dm b/code/datums/supplypacks/voidsuits.dm index f8e091bb3d..c28b3e9559 100644 --- a/code/datums/supplypacks/voidsuits.dm +++ b/code/datums/supplypacks/voidsuits.dm @@ -259,4 +259,20 @@ cost = 80 containertype = /obj/structure/closet/crate/oculum containername = "Vox Civilian Hardsuit" + +/datum/supply_pack/voidsuits/voxeng + name = "Vox Engineering Hardsuit" + contains = list (/obj/item/weapon/rig/vox/engineering) + cost = 150 + containertype = /obj/structure/closet/crate/oculum + containername = "Vox Engineering Hardsuit" + +/datum/supply_pack/voidsuits/voxsec + name = "Vox Security Hardsuit" + contains = list (/obj/item/weapon/rig/vox/security) + cost = 90 + containertype = /obj/structure/closet/crate/secure/heph + containername = "Vox security Rigsuit Crate" + access = access_security + //ChompEdit End diff --git a/code/datums/underwear/socks.dm b/code/datums/underwear/socks.dm index e1fe7e07f2..16465cfb61 100644 --- a/code/datums/underwear/socks.dm +++ b/code/datums/underwear/socks.dm @@ -60,4 +60,128 @@ /datum/category_item/underwear/socks/leggings name = "Leggings" - icon_state = "leggings" \ No newline at end of file + icon_state = "leggings" + + + +//NEW SOCKS BELOW HERE +/datum/category_item/underwear/socks/white_norm + name = "White Socks" + icon_state = "white_norm" + has_color = TRUE + +/datum/category_item/underwear/socks/white_short + name = "Short White Socks" + icon_state = "white_short" + has_color = TRUE + +/datum/category_item/underwear/socks/white_knee + name = "White Knee Socks" + icon_state = "white_knee" + has_color = TRUE + +/datum/category_item/underwear/socks/white_thigh + name = "White Thigh Socks" + icon_state = "white_thigh" + has_color = TRUE + +/datum/category_item/underwear/socks/black_norm + name = "Black Socks" + icon_state = "black_norm" + +/datum/category_item/underwear/socks/black_short + name = "Short Black Socks" + icon_state = "black_short" + +/datum/category_item/underwear/socks/black_knee + name = "Black Knee Socks" + icon_state = "black_knee" + +/datum/category_item/underwear/socks/black_thigh + name = "Black Thigh Socks" + icon_state = "black_thigh" + +/datum/category_item/underwear/socks/assblastusa_knee + name = "Striped Patriotic Knee Socks" + icon_state = "assblastusa_knee" + +/datum/category_item/underwear/socks/assblastusa_thigh + name = "Striped Patriotic Thigh Socks" + icon_state = "assblastusa_thigh" + +/datum/category_item/underwear/socks/uk_knee + name = "United Kingdom Knee Socks" + icon_state = "uk_knee" + +/datum/category_item/underwear/socks/uk_thigh + name = "United Kingdom Thigh Socks" + icon_state = "uk_thigh" + +/datum/category_item/underwear/socks/commie_knee + name = "Yellow and Red Striped Knee Socks" + icon_state = "commie_knee" + +/datum/category_item/underwear/socks/commie_thigh + name = "Yellow and Red Striped Thigh Socks" + icon_state = "commie_thigh" + +/datum/category_item/underwear/socks/stockings_lpink + name = "Light Pink Stockings" + icon_state = "stockings_lpink" + +/datum/category_item/underwear/socks/stockings_purple + name = "Purple Stockings" + icon_state = "stockings_purple" + +/datum/category_item/underwear/socks/stockings_green + name = "Green Stockings" + icon_state = "stockings_green" + +/datum/category_item/underwear/socks/stockings_cyan + name = "Cyan Stockings" + icon_state = "stockings_cyan" + +/datum/category_item/underwear/socks/stockings_orange + name = "Orange Stockings" + icon_state = "stockings_orange" + +/datum/category_item/underwear/socks/stockings_yellow + name = "Yellow Stockings" + icon_state = "stockings_yellow" + +/datum/category_item/underwear/socks/stockings_dpink + name = "Dark Pink Stockings" + icon_state = "stockings_dpink" + +/datum/category_item/underwear/socks/stockings_blue + name = "Blue Stockings" + icon_state = "stockings_blue" + +/datum/category_item/underwear/socks/bee_thigh + name = "Bee Thigh Socks" + icon_state = "bee_thigh" + +/datum/category_item/underwear/socks/bee_knee + name = "Bee Knee Socks" //You do not know how much I want to make a 'bee's knees' pun. + icon_state = "bee_knee" + +/datum/category_item/underwear/socks/thocks + name = "Thocks" + icon_state = "thocks" + has_color = TRUE + +/datum/category_item/underwear/socks/ace_thigh + name = "Ace Pride Thigh Socks" + icon_state = "ace_thigh" + +/datum/category_item/underwear/socks/ace_knee + name = "Ace Pride Knee Socks" + icon_state = "ace_knee" + +/datum/category_item/underwear/socks/trans_knee + name = "Trans Pride Knee Socks" + icon_state = "trans_knee" + +/datum/category_item/underwear/socks/trans_thigh + name = "Trans Pride Thigh Socks" + icon_state = "trans_thigh" diff --git a/code/datums/uplink/armor.dm b/code/datums/uplink/armor.dm index 0d7d814310..362aec5d92 100644 --- a/code/datums/uplink/armor.dm +++ b/code/datums/uplink/armor.dm @@ -6,25 +6,25 @@ /datum/uplink_item/item/armor/combat name = "Combat Armor Set" - item_cost = 60 + item_cost = 30 path = /obj/item/weapon/storage/box/syndie_kit/combat_armor /datum/uplink_item/item/armor/heavy_vest name = "Heavy Armor Vest" - item_cost = 40 + item_cost = 20 path = /obj/item/clothing/suit/storage/vest/heavy/merc /datum/uplink_item/item/armor/gorlexsuit name = "Mercenary Voidsuit" - item_cost = 40 + item_cost = 20 path = /obj/item/weapon/storage/box/syndie_kit/voidsuit /datum/uplink_item/item/armor/gorlexsuit_fire name = "Mercenary Voidsuit (Fire)" - item_cost = 40 + item_cost = 20 path = /obj/item/weapon/storage/box/syndie_kit/voidsuit/fire /datum/uplink_item/item/armor/combat name = "Combat Platecarrier Set" - item_cost = 60 + item_cost = 30 path = /obj/item/clothing/suit/armor/pcarrier/merc diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm index c7b0b0d123..c1ff848877 100644 --- a/code/datums/uplink/medical.dm +++ b/code/datums/uplink/medical.dm @@ -6,88 +6,108 @@ /datum/uplink_item/item/medical/onegativeblood name = "O- Blood Pack" - item_cost = 5 + item_cost = 1 path = /obj/item/weapon/reagent_containers/blood/OMinus /datum/uplink_item/item/medical/sinpockets name = "Box of Sin-Pockets" - item_cost = 5 + item_cost = 1 path = /obj/item/weapon/storage/box/sinpockets /datum/uplink_item/item/medical/ambrosiaseeds name = "Box of 7x ambrosia seed packets" - item_cost = 5 + item_cost = 1 path = /obj/item/weapon/storage/box/ambrosia /datum/uplink_item/item/medical/clotting name = "Clotting Medicine injector" - item_cost = 10 + item_cost = 5 path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting /datum/uplink_item/item/medical/clotting_case name = "Clotting Medicine case" - item_cost = 20 + item_cost = 10 desc = "A case of three myelamine injectors. Can rapidly remove and stow up to six injectors." path = /obj/item/weapon/storage/quickdraw/syringe_case/clotting /datum/uplink_item/item/medical/bonemeds name = "Bone Repair injector" - item_cost = 10 + item_cost = 5 path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed /datum/uplink_item/item/medical/clonemeds name = "Clone injector" - item_cost = 15 + item_cost = 5 path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/clonemed /datum/uplink_item/item/medical/bonemeds_case name = "Bone Repair case" - item_cost = 20 + item_cost = 10 desc = "A case of three osteodaxon injectors. Can rapidly remove and stow up to six injectors." path = /obj/item/weapon/storage/quickdraw/syringe_case/bonemed /datum/uplink_item/item/medical/clonemeds_case name = "Clone case" - item_cost = 30 + item_cost = 10 desc = "A case of three rezadone injectors. Can rapidly remove and stow up to six injectors." path = /obj/item/weapon/storage/quickdraw/syringe_case/clonemed /datum/uplink_item/item/medical/ambrosiadeusseeds name = "Box of 7x ambrosia deus seed packets" - item_cost = 10 + item_cost = 5 path = /obj/item/weapon/storage/box/ambrosiadeus /datum/uplink_item/item/medical/freezer name = "Portable Freezer" - item_cost = 10 + item_cost = 1 path = /obj/item/weapon/storage/box/freezer /datum/uplink_item/item/medical/monkeycubes name = "Box, Monkey Cubes" - item_cost = 10 + item_cost = 1 path = /obj/item/weapon/storage/box/monkeycubes /datum/uplink_item/item/medical/farwacubes name = "Box, Farwa Cubes" - item_cost = 10 + item_cost = 1 path = /obj/item/weapon/storage/box/monkeycubes /datum/uplink_item/item/medical/neaeracubes name = "Box, Neaera Cubes" - item_cost = 10 + item_cost = 1 path = /obj/item/weapon/storage/box/monkeycubes/neaeracubes /datum/uplink_item/item/medical/stokcubes name = "Box, Stok Cubes" - item_cost = 10 + item_cost = 1 path = /obj/item/weapon/storage/box/monkeycubes/stokcubes /datum/uplink_item/item/medical/surgery name = "Surgery kit" - item_cost = 45 + item_cost = 5 path = /obj/item/weapon/storage/firstaid/surgery +/datum/uplink_item/item/medical/toxins + name = "Anti-toxins medical kit" + item_cost = 5 + path = /obj/item/weapon/storage/firstaid/toxin + +/datum/uplink_item/item/medical/o2 + name = "oxygen deprivation medical kit" + item_cost = 5 + path = /obj/item/weapon/storage/firstaid/o2 + +/datum/uplink_item/item/medical/fire + name = "fire medical kit" + item_cost = 5 + path = /obj/item/weapon/storage/firstaid/fire + +/datum/uplink_item/item/medical/adv + name = "advanced medical kit" + item_cost = 10 + path = /obj/item/weapon/storage/firstaid/adv + /datum/uplink_item/item/medical/combat name = "Combat medical kit" - item_cost = 60 + item_cost = 20 path = /obj/item/weapon/storage/firstaid/combat diff --git a/code/datums/uplink/tools.dm b/code/datums/uplink/tools.dm index eee41e9699..9c1a46d632 100644 --- a/code/datums/uplink/tools.dm +++ b/code/datums/uplink/tools.dm @@ -6,22 +6,22 @@ /datum/uplink_item/item/tools/binoculars name = "Binoculars" - item_cost = 5 + item_cost = 3 path = /obj/item/device/binoculars /datum/uplink_item/item/tools/toolbox // Leaving the basic as an option since powertools are loud. name = "Fully Loaded Toolbox" - item_cost = 5 + item_cost = 3 path = /obj/item/weapon/storage/toolbox/syndicate /datum/uplink_item/item/tools/powertoolbox name = "Fully Loaded Powertool Box" - item_cost = 10 + item_cost = 5 path = /obj/item/weapon/storage/toolbox/syndicate/powertools /datum/uplink_item/item/tools/clerical name = "Morphic Clerical Kit" - item_cost = 10 + item_cost = 5 path = /obj/item/weapon/storage/box/syndie_kit/clerical /datum/uplink_item/item/tools/encryptionkey_radio @@ -42,7 +42,7 @@ /datum/uplink_item/item/tools/duffle name = "Black Duffle Bag" - item_cost = 10 + item_cost = 5 path = /obj/item/weapon/storage/backpack/dufflebag/syndie /datum/uplink_item/item/tools/duffle/med @@ -61,7 +61,7 @@ /datum/uplink_item/item/tools/space_suit name = "Space Suit" - item_cost = 15 + item_cost = 10 path = /obj/item/weapon/storage/box/syndie_kit/space /datum/uplink_item/item/tools/encryptionkey_binary @@ -71,7 +71,7 @@ /datum/uplink_item/item/tools/hacking_tool name = "Door Hacking Tool" - item_cost = 20 + item_cost = 15 path = /obj/item/device/multitool/hacktool desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \ When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \ @@ -79,7 +79,7 @@ /datum/uplink_item/item/tools/ai_detector name = "Anti-Surveillance Tool" - item_cost = 20 + item_cost = 15 path = /obj/item/device/multitool/ai_detector desc = "This functions like a normal multitool, but includes an integrated camera network sensor that will warn the holder if they are being \ watched, by changing color and beeping. It is able to detect both AI visual surveillance and security camera utilization from terminals, and \ @@ -87,20 +87,20 @@ /datum/uplink_item/item/tools/radio_jammer name = "Subspace Jammer" - item_cost = 25 + item_cost = 20 path = /obj/item/device/radio_jammer desc = "A device which is capable of disrupting subspace communications, preventing the use of headsets, PDAs, and communicators within \ a radius of seven meters. It runs off weapon cells, which can be replaced as needed. One cell will last for approximately ten minutes." /datum/uplink_item/item/tools/wall_elecrtifier name = "Wall Electrifier" - item_cost = 10 + item_cost = 5 path = /obj/item/weapon/cell/spike desc = "A modified powercell which will electrify walls and reinforced floors in a 3x3 tile range around it. Always active." /datum/uplink_item/item/tools/emag name = "Cryptographic Sequencer" - item_cost = 30 + item_cost = 20 path = /obj/item/weapon/card/emag /datum/uplink_item/item/tools/graviton @@ -111,7 +111,7 @@ /datum/uplink_item/item/tools/thermal name = "Thermal Imaging Glasses" - item_cost = 30 + item_cost = 25 path = /obj/item/clothing/glasses/thermal/syndi /datum/uplink_item/item/tools/packagebomb diff --git a/code/datums/uplink/visible_weapons.dm b/code/datums/uplink/visible_weapons.dm index b939e953de..f8526c022a 100644 --- a/code/datums/uplink/visible_weapons.dm +++ b/code/datums/uplink/visible_weapons.dm @@ -139,6 +139,11 @@ item_cost = 75 path = /obj/item/weapon/gun/projectile/shotgun/pump/combat +/datum/uplink_item/item/visible_weapons/semishotgun + name = "Semi-Automatic Shotgun" + item_cost = 100 + path = /obj/item/weapon/gun/projectile/shotgun/semi + /datum/uplink_item/item/visible_weapons/leveraction name = "Lever Action Rifle" item_cost = 50 diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 83ebb65fa8..9a411c60ee 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -43,6 +43,7 @@ if(!GLOB.wire_color_directory[holder_type]) randomize() GLOB.wire_color_directory[holder_type] = colors + GLOB.wire_name_directory[holder_type] = proper_name else colors = GLOB.wire_color_directory[holder_type] diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 99fc8efcf1..116a17c67e 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -29,9 +29,9 @@ /obj/item/weapon/soap name = "soap" - desc = "A cheap bar of soap. Doesn't smell." + desc = "A cheap bar of soap. Smells of lye." gender = PLURAL - icon = 'icons/obj/items.dmi' + icon = 'icons/obj/soap.dmi' icon_state = "soap" flags = NOCONDUCT w_class = ITEMSIZE_SMALL @@ -39,9 +39,15 @@ throwforce = 0 throw_speed = 4 throw_range = 20 + var/randomize = TRUE + var/square_chance = 10 + +/obj/item/weapon/soap/Initialize() + if(randomize && prob(square_chance)) + icon_state = "[icon_state]-alt" /obj/item/weapon/soap/nanotrasen - desc = "A NanoTrasen-brand bar of soap. Smells of phoron." + desc = "A NanoTrasen-brand bar of soap. Smells of phoron, a years-old marketing gimmick." icon_state = "soapnt" /obj/item/weapon/soap/deluxe @@ -55,6 +61,82 @@ desc = "An untrustworthy bar of soap. Smells of fear." icon_state = "soapsyndie" +/obj/item/weapon/soap/space_soap + desc = "Smells like hot metal and walnuts." + icon_state = "space_soap" + +/obj/item/weapon/soap/water_soap + desc = "Smells like chlorine." + icon_state = "water_soap" + +/obj/item/weapon/soap/fire_soap + desc = "Smells like a campfire." + icon_state = "fire_soap" + +/obj/item/weapon/soap/rainbow_soap + desc = "Smells sickly sweet." + icon_state = "rainbow_soap" + +/obj/item/weapon/soap/diamond_soap + desc = "Smells like saffron and vanilla." + icon_state = "diamond_soap" + +/obj/item/weapon/soap/uranium_soap + desc = "Smells not great... Not terrible." + icon_state = "uranium_soap" + +/obj/item/weapon/soap/silver_soap + desc = "Smells like birch and amaranth." + icon_state = "silver_soap" + +/obj/item/weapon/soap/brown_soap + desc = "Smells like cinnamon and cognac." + icon_state = "brown_soap" + +/obj/item/weapon/soap/white_soap + desc = "Smells like nutmeg and oats." + icon_state = "white_soap" + +/obj/item/weapon/soap/grey_soap + desc = "Smells like bergamot and lilies." + icon_state = "grey_soap" + +/obj/item/weapon/soap/pink_soap + desc = "Smells like bubblegum." + icon_state = "pink_soap" + +/obj/item/weapon/soap/purple_soap + desc = "Smells like lavender." + icon_state = "purple_soap" + +/obj/item/weapon/soap/blue_soap + desc = "Smells like cardamom." + icon_state = "blue_soap" + +/obj/item/weapon/soap/cyan_soap + desc = "Smells like bluebells and peaches." + icon_state = "cyan_soap" + +/obj/item/weapon/soap/green_soap + desc = "Smells like a freshly mowed lawn." + icon_state = "green_soap" + +/obj/item/weapon/soap/yellow_soap + desc = "Smells like citron and ginger." + icon_state = "yellow_soap" + +/obj/item/weapon/soap/orange_soap + desc = "Smells like oranges and dark chocolate." + icon_state = "orange_soap" + +/obj/item/weapon/soap/red_soap + desc = "Smells like cherries." + icon_state = "red_soap" + +/obj/item/weapon/soap/golden_soap + desc = "Smells like honey." + icon_state = "golden_soap" + /obj/item/weapon/bikehorn name = "bike horn" desc = "A horn off of a bicycle." @@ -397,6 +479,7 @@ continue remove_from_storage(B, T) + /obj/item/weapon/stock_parts name = "stock part" desc = "What?" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 18d7dc4666..e8f9e2fe13 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -451,6 +451,8 @@ var/list/mob/living/forced_ambiance_list = new return if(H.incorporeal_move) // VOREstation edit - Phaseshifted beings should not be affected by gravity return + if(H.species.can_zero_g_move || H.species.can_space_freemove) + return if(H.m_intent == "run") H.AdjustStunned(6) @@ -463,7 +465,7 @@ var/list/mob/living/forced_ambiance_list = new /area/proc/prison_break(break_lights = TRUE, open_doors = TRUE, open_blast_doors = FALSE) //CHOMP Edit set blast doors to FALSE var/obj/machinery/power/apc/theAPC = get_apc() - if(theAPC.operating) + if(theAPC && theAPC.operating) if(break_lights) for(var/obj/machinery/power/apc/temp_apc in src) temp_apc.overload_lighting(70) diff --git a/code/game/area/areas_vr.dm b/code/game/area/areas_vr.dm index e356063e2a..f932674566 100644 --- a/code/game/area/areas_vr.dm +++ b/code/game/area/areas_vr.dm @@ -5,6 +5,9 @@ var/block_suit_sensors = FALSE //If mob size is limited in the area. var/turf/ceiling_type + // Size of the area in open turfs, only calculated for indoors areas. + var/areasize = 0 + /area/Entered(var/atom/movable/AM, oldLoc) . = ..() if(enter_message && isliving(AM)) @@ -29,3 +32,41 @@ var/turf/TA = GetAbove(T) if(isopenspace(TA)) TA.ChangeTurf(ceiling_type, TRUE, TRUE, TRUE) + +/** + * Setup an area (with the given name) + * + * Sets the area name, sets all status var's to false and adds the area to the sorted area list + * //NOTE: Virgo does not have a sorted area list. + */ +/area/proc/setup(a_name) + name = a_name + power_equip = FALSE + power_light = FALSE + power_environ = FALSE + always_unpowered = FALSE + update_areasize() + +/area/proc/update_areasize() + if(outdoors) + return FALSE + areasize = 0 + for(var/turf/simulated/floor/T in contents) + areasize++ + +/proc/rename_area(a, new_name) + var/area/A = get_area(a) + var/prevname = "[A.name]" + set_area_machinery(A, new_name, prevname) + A.name = new_name + A.update_areasize() + return TRUE + +/area/proc/power_check() + if(!requires_power || !apc) + power_light = 0 + power_equip = 0 + power_environ = 0 + power_change() // all machines set to current power level, also updates lighting icon + if(no_spoilers) + set_spoiler_obfuscation(TRUE) \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 29c937afd6..a17be310bd 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -639,4 +639,4 @@ return selfimage /atom/movable/proc/get_cell() - return + return \ No newline at end of file diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 931b298091..d5cdc700c7 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -22,7 +22,7 @@ // Give Random Bad Mutation to M /proc/randmutb(var/mob/living/M) - if(!M) return + if(!M || !(M.dna)) return M.dna.check_integrity() //var/block = pick(GLASSESBLOCK,COUGHBLOCK,FAKEBLOCK,NERVOUSBLOCK,CLUMSYBLOCK,TWITCHBLOCK,HEADACHEBLOCK,BLINDBLOCK,DEAFBLOCK,HALLUCINATIONBLOCK) // Most of these are disabled anyway. var/block = pick(FAKEBLOCK,CLUMSYBLOCK,BLINDBLOCK,DEAFBLOCK) @@ -30,7 +30,7 @@ // Give Random Good Mutation to M /proc/randmutg(var/mob/living/M) - if(!M) return + if(!M || !(M.dna)) return M.dna.check_integrity() //var/block = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,BLENDBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK) // Much like above, most of these blocks are disabled in code. var/block = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,REGENERATEBLOCK,REMOTETALKBLOCK) @@ -38,13 +38,13 @@ // Random Appearance Mutation /proc/randmuti(var/mob/living/M) - if(!M) return + if(!M || !(M.dna)) return M.dna.check_integrity() M.dna.SetUIValue(rand(1,DNA_UI_LENGTH),rand(1,4095)) // Scramble UI or SE. /proc/scramble(var/UI, var/mob/M, var/prob) - if(!M) return + if(!M || !(M.dna)) return M.dna.check_integrity() if(UI) for(var/i = 1, i <= DNA_UI_LENGTH-1, i++) diff --git a/code/game/gamemodes/cult/construct_spells.dm b/code/game/gamemodes/cult/construct_spells.dm index 62cdd5bf48..5bd8929555 100644 --- a/code/game/gamemodes/cult/construct_spells.dm +++ b/code/game/gamemodes/cult/construct_spells.dm @@ -512,7 +512,7 @@ var/obj/item/projectile/new_projectile = make_projectile(spell_projectile, user) new_projectile.old_style_target(hit_atom) new_projectile.fire() - log_and_message_admins("has casted [src] at \the [hit_atom].") + log_attack("has casted [src] at \the [hit_atom].")//CHOMPEdit from log_and_message_admins if(fire_sound) playsound(src, fire_sound, 75, 1) return 1 diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm index c04d6408b6..9c156a50bd 100644 --- a/code/game/gamemodes/events/holidays/Holidays.dm +++ b/code/game/gamemodes/events/holidays/Holidays.dm @@ -22,7 +22,7 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t Holiday = list() // reset our switch now so we can recycle it as our Holiday name - var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year + //var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year - unused currently but can be used for floating dates var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day @@ -36,56 +36,63 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t Holiday["New Years's Day"] = "The day of the new solar year on Sol." if(12) Holiday["Vertalliq-Qerr"] = "Vertalliq-Qerr, translated to mean 'Festival of the Royals', is a \ - Skrell holiday that celebrates the Qerr-Katish and all they have provided for the rest of Skrell society, \ + skrellian holiday that celebrates the Qerr-Katish and all they have provided for the rest of skrellian society, \ it often features colourful displays and skilled performers take this time to show off some of their more \ - fancy displays." + elaborate displays." + if(14) + Holiday["Lohri"] = "A human festival traditionally celebrating the end of winter on the Indian subcontinent. \ + The holiday is now celebrated independently of seasons in many colonies with large populations of Indian \ + descent. Traditions include the burning of bonfires, dancing, and door-to-door singing in exchange for treats." + if(30) + Holiday["Lunar New Year"] = "Originally the new year on the ancient lunisolar calendar, the Lunar New Year is \ + celebrated with a wide variety of east Asian traditions with roots in Chinese, Japanese, Korean, Vietnamese, \ + Tibetan, Mongolian, and Ryukyu cultures. Elaborate parades, performances, dances and meals are usual staples." if(2) //Feb switch(DD) if(2) - Holiday["Groundhog Day"] = "An unoffical holiday based on ancient folklore that originated on Earth, \ - that involves the worship of an almighty groundhog, that could control the weather based on if it casted a shadow." + Holiday["Groundhog Day"] = "An unoffical holiday based on medieval folklore that originated on Earth, \ + that involves the reverence of a prophetic animal - traditionally a badger, fox or groundhog - that was \ + said to be able to predict, or even control the changing of the seasons." if(14) - Holiday["Valentine's Day"] = "An old holiday that revolves around romance and love." + Holiday["Valentine's Day"] = "A human holiday that revolves around expressions of romance and love. \ + In particular, the exchanging of gifts, letters and cards is traditional." + if(15) + Holiday["Lantern Festival"] = "A human holiday with origins in Chinese new year celebrations. Participants \ + carry or hang elaborate paper lanterns that are thought to bring good luck. Today, electric lights are often used \ + in environments where open flames would be hazardous or non-functional." if(17) Holiday["Random Acts of Kindness Day"] = "An unoffical holiday that challenges everyone to perform \ - acts of kindness to their friends, co-workers, and strangers, for no reason." + acts of kindness to their friends, co-workers, and strangers, with no strings attached." if(3) //Mar switch(DD) if(3) - Holiday["Qixm-tes"] = "Qixm-tes, or 'Day of mourning', is a Skrell holiday where Skrell gather at places \ - of worship and sing a song of mourning for all those who have died in service to their empire." + Holiday["Qixm-tes"] = "Qixm-tes, or 'Day of mourning', is a skrellian holiday where skrell gather at places \ + of worship and sing a song of mourning for all those who have died in service to their kingdoms." if(14) Holiday["Pi Day"] = "An unoffical holiday celebrating the mathematical constant Pi. It is celebrated on \ March 14th, as the digits form 3 14, the first three significant digits of Pi. Observance of Pi Day generally \ involve eating (or throwing) pie, due to a pun. Pies also tend to be round, and thus relatable to Pi." if(17) - Holiday["St. Patrick's Day"] = "An old holiday originating from Earth, Sol, celebrating the color green, \ - shamrocks, attending parades, and drinking alcohol." + Holiday["St. Patrick's Day"] = "A holiday originating on Earth, celebrating a popular version of Irish culture. \ + Traditions include elaborate parades, wearing of the colour green, and drinking alcohol." + if(18) + Holiday["Holi"] = "Also known as the Festival of Colours, a human Hindu festival celebrating divine love and the \ + triumph of good over evil. Traditionally a bonfire is lit overnight, followed by the free-for-all smearing of \ + celebrants with colourful pigments, and the forgiveness of past wrongs." if(27) - if(YY == 16) - Holiday["Easter"] = "" - if(31) - if(YY == 13) - Holiday["Easter"] = "" + Holiday["Easter"] = "A Earth springtime festival variously celebrating rebirth and the beginning of the planting \ + season. Traditionally celebrated with the painting and exchange of eggs, sometimes made from chocolate. \ + The holiday's date was standardized in the 22nd century." if(4) //Apr switch(DD) if(1) - Holiday["April Fool's Day"] = "An old holiday that endevours one to pull pranks and spread hoaxes on their friends." - if(YY == 18) - Holiday["Easter"] = "" - if(8) - if(YY == 15) - Holiday["Easter"] = "" - if(16) - if(YY == 17) //Easter can go die for all of this copypasta. - Holiday["Easter"] = "" - - if(20) - if(YY == 14) - Holiday["Easter"] = "" + Holiday["April Fool's Day"] = "A human holiday that endevours one to pull pranks and spread hoaxes on their friends." + if(5) + Holiday["First Day of Passover"] = "The first of eight days of a human holiday celebrating the exodus of ancient Jewish people \ + from slavery, and of the spring harvest. The most well-known tradition is the Sedar meal. The date was standardized in the 22nd century." if(22) Holiday["Earth Day"] = "A holiday of enviromentalism, that originated on it's namesake, Earth." @@ -100,7 +107,7 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t Observance of this day varies throughout human space, but most common traditions are the act of bringing flowers to graves,\ attending parades, and the wearing of poppies (either paper or real) in one's clothing." if(28) - Holiday["Jiql-tes"] = "A Skrellian holiday that translates to 'Day of Celebration', Skrell communities \ + Holiday["Jiql-tes"] = "A skrellian holiday that translates to 'Day of Celebration', skrell communities \ gather for a grand feast and give gifts to friends and close relatives." if(6) //Jun @@ -113,7 +120,11 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t and to thank blood donors for their voluntary, life-saving gifts of blood." if(20) Holiday["Civil Servant's Day"] = "Civil Servant's Day is a holiday observed in SCG member states that honors civil servants everywhere,\ -+ (especially those who are members of the armed forces and the emergency services), or have been or have been civil servants in the past." + (especially those who are members of the armed forces and the emergency services), or have been or have been civil servants in the past." +/* if(25) + Holiday["Merhyat Njarha"] = "A Njarir'Akhan tajaran tradition translating to \"Harmony of the House\", in which Njarjirii citizens pay \ + homage to their ruling house and their ancestors. Traditions include large communal meals and dances hosted by the ruling house, \ + and the intensive upkeep of community spaces."*/ if(7) //Jul switch(DD) @@ -126,36 +137,43 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t if(8) //Aug switch(DD) -// if(10) -// Holiday["S'randarr's Day"] = "A Tajaran holiday that occurs on the longest day of the year in summer, -// on Ahdomai. It is named after the Tajaran deity of Light, and huge celebrations are common." -//VOREStation Add - Of course we need this. - if(8) - Holiday["Vore Day"] = "A holiday representing the innate desire in all/most/some/a few of us to devour each other or be devoured. \ - That's probably why you're here, isn't it? Get to it, then!" -//VOREStation Add End. - + if(11) + Holiday["Tajaran Contact Day"] = "The anniversary of first contact between SolGov and the tajaran species, widely observed\ + throughout tajaran and human space. Marks the date that in 2513, a human exploration team investigating electromagnetic \ + emissions from the Meralar system made radio contact with the tajaran scientific outpost that had broadcast them." + if(20) + Holiday["Obon"] = "An ancient Earth holiday originating in east Asia, for the honouring of one's ancestral spirits. \ + Traditions include the maintenance of grave sites and memorials, and community traditional dance performances." if(27) Holiday["Forgiveness Day"] = "A time to forgive and be forgiven." if(9) //Sep switch(DD) if(17) - Holiday["Qill-xamr"] = "Translated to 'Night of the dead', it is a Skrell holiday where Skrell \ + Holiday["Qill-xamr"] = "Translated to 'Night of the dead', it is a skrellian holiday where skrell \ communities hold parties in order to remember loved ones who passed, unlike Qixm-tes, this applies to everyone \ and is a joyful celebration." if(19) - Holiday["Talk-Like-a-Pirate Day"] = "Ahoy, matey! Tis unoffical holiday be celebratin' the jolly \ - good humor of speakin' like the pirates of old." + Holiday["Talk-Like-a-Pirate Day"] = "Ahoy, matey! It be the unoffical holiday celebratin' the salty \ + sea humor of speakin' like the pirates of old." + if(20) + Holiday["Rosh Hashanah"] = "An old human holiday that marks the traditional Hebrew new year." if(28) Holiday["Stupid-Questions Day"] = "Known as Ask A Stupid Question Day, it is an unoffical holiday \ created by teachers in Sol, very long ago, to encourage students to ask more questions in the classroom." if(10) //Oct switch(DD) + if(9) + Holiday["Lief Eriksson Day"] = "A day commemorating Norse explorer Lief Eriksson, an early Scandinavian cultural figure \ + who is thought to have been the first European to set foot in North America." if(16) Holiday["Boss' Day"] = "Boss' Day has traditionally been a day for employees to thank their bosses for the difficult work that they do \ throughout the year. This day was created for the purpose of strengthening the bond between employer and employee." + if(21) + Holiday["First Day of Diwali"] = "An ancient Hindu, Jain and Sikh festival lasting five days, celebrating victory of light over darkness, good over \ + evil, and knowledge over ignorance. It is celebrated by the wearing of your finest clothes, decorating with oil lamps and rangolis, \ + fireworks, and gift-giving. Electric lights are often used in modern times where oil lamps would be hazardous or inoperable." if(31) Holiday["Halloween"] = "Originating from Earth, Halloween is also known as All Saints' Eve, and \ is celebrated by some by attending costume parties, trick-or-treating, carving faces in pumpkins, or visiting \ @@ -163,6 +181,10 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t if(11) //Nov switch(DD) + if(1) + Holiday["Day of the Dead"] = "An old human holiday celebrating the lives of deceased friends and family members, \ + by means of good humour and joyful parties. Offerings are often left at altars to the dead, and exchanging gifts \ + among the living is not uncommon." if(13) Holiday["Kindness Day"] = "Kindness Day is an unofficial holiday to highlight good deeds in the \ community, focusing on the positive power and the common thread of kindness which binds humanity and \ @@ -182,16 +204,17 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t if(10) Holiday["Human-Rights Day"] = "An old holiday created by an intergovernmental organization known back than as the United Nations, \ human rights were not recognized globally at the time, and the holiday was made in honor of the Universal Declaration of Human Rights. \ - These days, SolGov ensures that past efforts were not in vein, and continues to honor this holiday across the galaxy." + These days, SolGov ensures that past efforts were not in vein, and continues to honor this holiday across the galaxy as a historical \ + reminder." if(22) - Holiday["Vertalliq-qixim"] = "A Skrellian holiday that celebrates the Skrell's first landing on one of \ - their moons. It's often celebrated with grand festivals." + Holiday["Vertalliq-qixim"] = "A skrellian holiday that celebrates the skrell's first landing on one of \ + their moons. It's often celebrated with grand festivals." if(24) Holiday["Christmas Eve"] = "The eve of Christmas, an old holiday from Earth that mainly involves gift \ giving, decorating, family reunions, and a fat red human breaking into people's homes to steal milk and cookies." if(25) Holiday["Christmas"] = "Christmas is a very old holiday that originated in Earth, Sol. It was a \ - religious holiday for the Christian religion, which would later form Unitarianism. Nowdays, the holiday is celebrated \ + religious holiday for the Christian religion, which would later form Unitarianism. Nowadays, the holiday is celebrated \ generally by giving gifts, symbolic decoration, and reuniting with one's family. It also features a mythical fat \ red human, known as Santa, who broke into people's homes to loot cookies and milk." if(31) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 0b0b8d014c..6b88e45765 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -13,7 +13,7 @@ /obj/effect/meteor/big=3, /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3 - ) + ) //for threatening meteor event /var/list/meteors_threatening = list( @@ -109,13 +109,13 @@ desc = "You should probably run instead of gawking at this." icon = 'icons/obj/meteor.dmi' icon_state = "small" - density = 1 - anchored = 1 + density = TRUE + anchored = TRUE var/hits = 4 var/hitpwr = 2 //Level of ex_act to be called on hit. var/dest pass_flags = PASSTABLE - var/heavy = 0 + var/heavy = FALSE var/z_original var/meteordrop = /obj/item/weapon/ore/iron @@ -147,7 +147,7 @@ get_hit() /obj/effect/meteor/Destroy() - walk(src,0) //this cancels the walk_towards() proc + walk(src,FALSE) //this cancels the walk_towards() proc GLOB.meteor_list -= src return ..() @@ -162,10 +162,10 @@ ram_turf(get_turf(A)) get_hit() else - die(0) + die(FALSE) /obj/effect/meteor/CanPass(atom/movable/mover, turf/target) - return istype(mover, /obj/effect/meteor) ? 1 : ..() + return istype(mover, /obj/effect/meteor) ? TRUE : ..() /obj/effect/meteor/proc/ram_turf(var/turf/T) //first bust whatever is in the turf @@ -190,9 +190,9 @@ /obj/effect/meteor/proc/get_hit() hits-- if(hits <= 0) - die(1) + die(TRUE) -/obj/effect/meteor/proc/die(var/explode = 1) +/obj/effect/meteor/proc/die(var/explode = TRUE) make_debris() meteor_effect(explode) qdel(src) @@ -206,6 +206,18 @@ return ..() +/obj/effect/meteor/bullet_act(var/obj/item/projectile/Proj) + if(Proj.excavation_amount) + get_hit() + + if(!QDELETED(src)) + wall_power -= Proj.excavation_amount + Proj.damage + (Proj.hitscan * 25) // Instant-impact projectiles are inherently better at dealing with meteors. + + if(wall_power <= 0) + die(FALSE) // If you kill the meteor, then it dies. + return + return + /obj/effect/meteor/proc/make_debris() for(var/throws = dropamt, throws > 0, throws--) var/obj/item/O = new meteordrop(get_turf(src)) @@ -330,4 +342,4 @@ /obj/effect/meteor/tunguska/Bump() ..() if(prob(20)) - explosion(src.loc,2,4,6,8) + explosion(src.loc,2,4,6,8) \ No newline at end of file diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index c52e51d5b5..1b3a1147a1 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -749,7 +749,7 @@ datum blueprints - steal_target = /obj/item/blueprints + steal_target = /obj/item/areaeditor/blueprints explanation_text = "Steal the station's blueprints." weight = 20 diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 2ab94983f5..787cc0fc49 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -431,7 +431,7 @@ var/global/list/all_objectives = list() "a site manager's jumpsuit" = /obj/item/clothing/under/rank/captain, "a functional AI" = /obj/item/device/aicard, "a pair of magboots" = /obj/item/clothing/shoes/magboots, - "the station blueprints" = /obj/item/blueprints, + "the station blueprints" = /obj/item/areaeditor/blueprints, "a nasa voidsuit" = /obj/item/clothing/suit/space/void, "28 moles of phoron (full tank)" = /obj/item/weapon/tank, "a sample of slime extract" = /obj/item/slime_extract, diff --git a/code/game/jobs/job/assistant_vr.dm b/code/game/jobs/job/assistant_vr.dm index bfcf3037b4..1aa1f7cb55 100644 --- a/code/game/jobs/job/assistant_vr.dm +++ b/code/game/jobs/job/assistant_vr.dm @@ -27,6 +27,7 @@ job_description = "An Intern does whatever is requested of them, often doing so in process of learning \ another job. Though they are part of the crew, they have no real authority." timeoff_factor = 0 // Interns, noh + requestable = FALSE /datum/alt_title/intern_eng title = "Apprentice Engineer" @@ -96,6 +97,7 @@ supervisors = "nobody! You don't work here" job_description = "A Visitor is just there to visit the place. They have no real authority or responsibility." timeoff_factor = 0 + requestable = FALSE alt_titles = list("Guest" = /datum/alt_title/guest, "Traveler" = /datum/alt_title/traveler) /datum/job/assistant/New() diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm index e327805cc0..62b0eb93ef 100644 --- a/code/game/jobs/job/captain_vr.dm +++ b/code/game/jobs/job/captain_vr.dm @@ -14,6 +14,9 @@ /datum/alt_title/captain title = "Captain" +/datum/job/captain/get_request_reasons() + return list("Training crew") + /datum/job/hop disallow_jobhop = TRUE pto_type = PTO_CIVILIAN @@ -29,13 +32,13 @@ access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway) + access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway, access_entertainment) minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway) + access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway, access_entertainment) /datum/alt_title/deputy_director title = "Deputy Director" @@ -46,6 +49,9 @@ /datum/alt_title/facility_steward title = "Facility Steward" +/datum/job/hop/get_request_reasons() + return list("ID modification", "Training crew") + /datum/job/secretary disallow_jobhop = TRUE diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm index 688f52bf85..9c5de6d54b 100644 --- a/code/game/jobs/job/civilian_vr.dm +++ b/code/game/jobs/job/civilian_vr.dm @@ -30,7 +30,7 @@ spawn_positions = 2 pto_type = PTO_CIVILIAN alt_titles = list("Hydroponicist" = /datum/alt_title/hydroponicist, "Cultivator" = /datum/alt_title/cultivator, "Farmer" = /datum/alt_title/farmer, - "Gardener" = /datum/alt_title/gardener, "Florist" = /datum/alt_title/florsit) + "Gardener" = /datum/alt_title/gardener, "Florist" = /datum/alt_title/florsit, "Rancher" = /datum/alt_title/rancher) /datum/alt_title/hydroponicist title = "Hydroponicist" @@ -45,6 +45,10 @@ title = "Florist" title_blurb = "A Florist may be less professional than their counterparts, and are more likely to tend to the public gardens if they aren't needed elsewhere." +/datum/alt_title/rancher + title = "Rancher" + title_blurb = "A Rancher is tasked with the care, feeding, raising, and harvesting of livestock." + /datum/job/qm pto_type = PTO_CARGO @@ -57,6 +61,9 @@ /datum/alt_title/cargo_supervisor title = "Cargo Supervisor" +/datum/job/qm/get_request_reasons() + return list("Training crew") + /datum/job/cargo_tech total_positions = 3 diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm index 1455fe0df0..58ebb57dd2 100644 --- a/code/game/jobs/job/engineering_vr.dm +++ b/code/game/jobs/job/engineering_vr.dm @@ -23,6 +23,9 @@ /datum/alt_title/maintenance_manager title = "Maintenance Manager" +/datum/job/chief_engineer/get_request_reasons() + return list("Engine setup", "Construction project", "Repairs necessary", "Training crew") + /datum/job/engineer pto_type = PTO_ENGINEERING @@ -38,6 +41,9 @@ title = "Engineering Contractor" title_blurb = "An Engineering Contractor fulfills similar duties to other engineers, but isn't directly employed by NT proper." +/datum/job/engineer/get_request_reasons() + return list("Engine setup", "Construction project", "Repairs necessary") + @@ -55,3 +61,6 @@ /datum/alt_title/disposals_tech title = "Disposals Technician" title_blurb = "A Disposals Technician is an Atmospheric Technician still and can fulfill all the same duties, although specializes more in disposals delivery system's operations and configurations." + +/datum/job/atmos/get_request_reasons() + return list("Construction project", "Repairs necessary") \ No newline at end of file diff --git a/code/game/jobs/job/exploration_vr.dm b/code/game/jobs/job/exploration_vr.dm index 05427d5173..66ece35139 100644 --- a/code/game/jobs/job/exploration_vr.dm +++ b/code/game/jobs/job/exploration_vr.dm @@ -55,6 +55,9 @@ /datum/alt_title/exploration_manager title = "Exploration Manager" +/datum/job/pathfinder/get_request_reasons() + return list("Training crew") + /datum/job/pilot title = "Pilot" diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 509572aa98..b0e678298b 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -147,7 +147,7 @@ var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin("#job_icon") dress_mannequin(mannequin) mannequin.dir = SOUTH - COMPILE_OVERLAYS(mannequin) + mannequin.ImmediateOverlayUpdate() var/icon/preview_icon = getFlatIcon(mannequin) preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser. @@ -174,6 +174,10 @@ //return (brain_type && LAZYACCESS(ideal_age_by_species, brain_type)) || LAZYACCESS(ideal_age_by_species, brain_type) || ideal_character_age //VOREStation Removal /datum/job/proc/is_species_banned(species_name, brain_type) + // CHOMPEdit begin -- Shadekin cannot be any crew position + if(species_name == SPECIES_SHADEKIN) + return TRUE + // CHOMPEdit end return FALSE // VOREStation Edit - Any species can be any job. /* VOREStation Removal if(banned_job_species == null) diff --git a/code/game/jobs/job/job_vr.dm b/code/game/jobs/job/job_vr.dm index 0f2599b8aa..ac8b6be0b4 100644 --- a/code/game/jobs/job/job_vr.dm +++ b/code/game/jobs/job/job_vr.dm @@ -20,6 +20,8 @@ //Do we forbid ourselves from earning PTO? var/playtime_only = FALSE + var/requestable = TRUE + // Check client-specific availability rules. /datum/job/proc/player_has_enough_pto(client/C) return timeoff_factor >= 0 || (C && LAZYACCESS(C.department_hours, pto_type) > 0) @@ -58,4 +60,7 @@ if(isnum(C.play_hours[PTO_EXPLORATION])) remaining_time_needed = max(0, remaining_time_needed - C.play_hours[PTO_EXPLORATION]) return remaining_time_needed - return 0 \ No newline at end of file + return 0 + +/datum/job/proc/get_request_reasons() + return list() \ No newline at end of file diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm index 29033ebadc..8c2140c5a0 100644 --- a/code/game/jobs/job/medical_vr.dm +++ b/code/game/jobs/job/medical_vr.dm @@ -21,6 +21,9 @@ /datum/alt_title/healthcare_manager title = "Healthcare Manager" +/datum/job/cmo/get_request_reasons() + return list("Surgery pending", "Viral outbreak", "Training crew") + /datum/job/doctor spawn_positions = 5 @@ -29,7 +32,6 @@ "Emergency Physician" = /datum/alt_title/emergency_physician, "Nurse" = /datum/alt_title/nurse, "Orderly" = /datum/alt_title/orderly, "Virologist" = /datum/alt_title/virologist, "Medical Contractor" = /datum/alt_title/medical_contractor) - /datum/alt_title/physician title = "Physician" @@ -46,6 +48,9 @@ title = "Medical Contractor" title_blurb = "A Medical Contractor can be anything from a full-blown doctor to the likes of a nurse or orderly, but isn't directly employed by NT proper." +/datum/job/doctor/get_request_reasons() + return list("Surgery pending", "Viral outbreak") + /datum/job/chemist pto_type = PTO_MEDICAL diff --git a/code/game/jobs/job/science_vr.dm b/code/game/jobs/job/science_vr.dm index b40b264aff..bbcf853324 100644 --- a/code/game/jobs/job/science_vr.dm +++ b/code/game/jobs/job/science_vr.dm @@ -25,6 +25,9 @@ /datum/alt_title/head_scientist title = "Head Scientist" +/datum/job/rd/get_request_reasons() + return list("Repairs needed", "Training crew") + /datum/job/scientist spawn_positions = 5 pto_type = PTO_SCIENCE @@ -87,6 +90,9 @@ /datum/alt_title/assembly_tech title = "Assembly Technician" +/datum/job/roboticist/get_request_reasons() + return list("Repairs needed") + ////////////////////////////////// // Xenobotanist ////////////////////////////////// @@ -116,4 +122,4 @@ title = "Xenoflorist" /datum/alt_title/xenohydroponicist - title = "Xenohydroponicist" \ No newline at end of file + title = "Xenohydroponicist" diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm index bba60df71a..80acbb451e 100644 --- a/code/game/jobs/job/security_vr.dm +++ b/code/game/jobs/job/security_vr.dm @@ -16,6 +16,9 @@ /datum/alt_title/security_manager title = "Security Manager" +/datum/job/hos/get_request_reasons() + return list("Wildlife management", "Forensic investigation", "Training crew") + /datum/job/warden pto_type = PTO_SECURITY @@ -28,6 +31,9 @@ /datum/alt_title/armory_superintendent title = "Armory Superintendent" +/datum/job/warden/get_request_reasons() + return list("Wildlife management") + /datum/job/detective pto_type = PTO_SECURITY @@ -39,6 +45,9 @@ /datum/alt_title/security_inspector title = "Security Inspector" +/datum/job/detective/get_request_reasons() + return list("Forensic investigation") + /datum/job/officer total_positions = 5 @@ -58,3 +67,6 @@ /datum/alt_title/security_contractor title = "Security Contractor" + +/datum/job/officer/get_request_reasons() + return list("Wildlife management") diff --git a/code/game/jobs/job/special_vr.dm b/code/game/jobs/job/special_vr.dm index 54e8c157da..3a10a23df5 100644 --- a/code/game/jobs/job/special_vr.dm +++ b/code/game/jobs/job/special_vr.dm @@ -113,6 +113,7 @@ job_description = "A Clown is there to entertain the crew and keep high morale using various harmless pranks and ridiculous jokes!" whitelist_only = 1 latejoin_only = 0 + requestable = FALSE outfit_type = /decl/hierarchy/outfit/job/clown pto_type = PTO_CIVILIAN alt_titles = list("Jester" = /datum/alt_title/jester, "Fool" = /datum/alt_title/fool) @@ -144,6 +145,7 @@ alt_titles = list("Poseur" = /datum/alt_title/poseur) whitelist_only = 1 latejoin_only = 0 + requestable = FALSE outfit_type = /decl/hierarchy/outfit/job/mime pto_type = PTO_CIVILIAN diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 5a414430ea..63f8a702e0 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -393,7 +393,7 @@ var/global/datum/controller/occupations/job_master //Equip custom gear loadout. var/list/custom_equip_slots = list() var/list/custom_equip_leftovers = list() - if(H.client.prefs.gear && H.client.prefs.gear.len && !(job.mob_type & JOB_SILICON)) + if(H.client && H.client.prefs && H.client.prefs.gear && H.client.prefs.gear.len && !(job.mob_type & JOB_SILICON)) for(var/thing in H.client.prefs.gear) var/datum/gear/G = gear_datums[thing] if(!G) //Not a real gear datum (maybe removed, as this is loaded from their savefile) @@ -657,8 +657,7 @@ var/global/datum/controller/occupations/job_master var/obj/belly/vore_spawn_gut var/mob/living/prey_to_nomph - var/datum/job/J = SSjob.get_job(rank) - fail_deadly = J?.offmap_spawn + //CHOMPEdit - Remove fail_deadly addition on offmap_spawn //Spawn them at their preferred one if(C && C.prefs.spawnpoint) @@ -804,7 +803,8 @@ var/global/datum/controller/occupations/job_master .["msg"] = spawnpos.msg .["channel"] = spawnpos.announce_channel else - if(fail_deadly) + var/datum/job/J = SSjob.get_job(rank) + if(fail_deadly || J?.offmap_spawn) to_chat(C, "Your chosen spawnpoint ([spawnpos.display_name]) is unavailable for your chosen job. Please correct your spawn point choice.") return to_chat(C, "Your chosen spawnpoint ([spawnpos.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.") diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 3c949ba66d..e71f4eb72b 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -51,6 +51,8 @@ var/const/ASSISTANT =(1<<11) var/const/BRIDGE =(1<<12) var/const/ENTERTAINER =(1<<13) //VOREStation Add +var/const/OTHER =(1<<10) //CHOMPStation Add +var/const/NONCREW =(1<<0) //CHOMPStation Add /* // CHOMPedit: Comment out Talon positions, we don't have that here. //VOREStation Add var/const/TALON =(1<<3) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index b785a42639..18765fcf9b 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -423,6 +423,8 @@ /obj/machinery/sleeper/relaymove(var/mob/user) ..() + if(user.incapacitated()) + return go_out() /obj/machinery/sleeper/emp_act(var/severity) diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index 8d3933faca..874b04b51b 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -154,6 +154,12 @@ update_icon() +/obj/machinery/alarm/proc/update_area() + alarm_area = get_area(src) + area_uid = "\ref[alarm_area]" + if(name == "alarm") + name = "[alarm_area.name] Air Alarm" + /obj/machinery/alarm/Initialize() . = ..() set_frequency(frequency) @@ -540,9 +546,9 @@ var/list/list/environment_data = list() data["environment_data"] = environment_data - + DECLARE_TLV_VALUES - + var/pressure = environment.return_pressure() LOAD_TLV_VALUES(TLV["pressure"], pressure) environment_data.Add(list(list( @@ -551,7 +557,7 @@ "unit" = "kPa", "danger_level" = TEST_TLV_VALUES ))) - + var/temperature = environment.temperature LOAD_TLV_VALUES(TLV["temperature"], temperature) environment_data.Add(list(list( @@ -573,7 +579,7 @@ "unit" = "%", "danger_level" = TEST_TLV_VALUES ))) - + if(!locked || issilicon(user) || data["remoteUser"]) var/list/list/vents = list() data["vents"] = vents @@ -595,7 +601,7 @@ "extdefault"= (info["external"] == ONE_ATMOSPHERE), "intdefault"= (info["internal"] == 0), ))) - + var/list/list/scrubbers = list() data["scrubbers"] = scrubbers @@ -622,7 +628,7 @@ data["scrubbers"] = scrubbers data["mode"] = mode - + var/list/list/modes = list() data["modes"] = modes modes[++modes.len] = list("name" = "Filtering - Scrubs out contaminants", "mode" = AALARM_MODE_SCRUBBING, "selected" = mode == AALARM_MODE_SCRUBBING, "danger" = 0) @@ -682,7 +688,7 @@ else target_temperature = input_temperature + T0C return TRUE - + // Account for remote users here. // Yes, this is kinda snowflaky; however, I would argue it would be far more snowflakey // to include "custom hrefs" and all the other bullshit that nano states have just for the diff --git a/code/game/machinery/casino_ch.dm b/code/game/machinery/casino_ch.dm index 13c65bc335..e892d1218b 100644 --- a/code/game/machinery/casino_ch.dm +++ b/code/game/machinery/casino_ch.dm @@ -277,7 +277,7 @@ "sodawater", "lemon_lime", "sugar", "orangejuice", "limejuice", "watermelonjuice", "thirteenloko", "grapesoda", "coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice", "orangejuice", "lemonjuice", "limejuice", "berryjuice", "mint", "lemon_lime", "sugar", "orangejuice", "limejuice", "sodawater", - "tonic", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac", + "tonic", "beer", "kahlua", "whiskey", "redwine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac", "ale", "mead", "bitters", "champagne", "singulo", "doctorsdelight", "nothing", "banana", "honey", "egg", "coco", "cherryjelly", "carrotjuice", "applejuice", "tomatojuice", "peanutbutter", "soymilk", "grenadine", "gingerale", "roy_rogers", "patron", "goldschlager", "gelatin", "melonliquor", "bluecuracao", "thirteenloko", "deadrum", "sake", "acidspit", diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 4efec263f8..1d45a3e508 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -184,7 +184,7 @@ /obj/machinery/computer/operating/proc/build_surgery_list(mob/user) if(!istype(victim)) return null - + . = list() for(var/limb in victim.organs_by_name) @@ -281,6 +281,7 @@ /datum/surgery_step/cavity, /datum/surgery_step/limb, /datum/surgery_step/brainstem, + /datum/surgery_step/generic/ripper, ) good_surgeries = surgery_steps for(var/datum/surgery_step/S in good_surgeries) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 35a060863e..0226d0bc66 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -189,7 +189,7 @@ var/mob/M = grab.affecting qdel(grab) put_mob(M) - + return /obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(var/mob/target, var/mob/user) //Allows borgs to put people into cryo without external assistance @@ -226,6 +226,9 @@ if(occupant.bodytemperature < 225) if(occupant.getToxLoss()) occupant.adjustToxLoss(max(-1, -20/occupant.getToxLoss())) + if(occupant.radiation || occupant.accumulated_rads) + occupant.radiation -= 25 + occupant.accumulated_rads -= 25 var/heal_brute = occupant.getBruteLoss() ? min(1, 20/occupant.getBruteLoss()) : 0 var/heal_fire = occupant.getFireLoss() ? min(1, 20/occupant.getFireLoss()) : 0 occupant.heal_organ_damage(heal_brute,heal_fire) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 38ac815cff..3ae04b718b 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -475,8 +475,8 @@ //Handle job slot/tater cleanup. var/job = to_despawn.mind.assigned_role - job_master.FreeRole(job) + to_despawn.mind.assigned_role = null if(to_despawn.mind.objectives.len) qdel(to_despawn.mind.objectives) @@ -526,12 +526,14 @@ //VOREStation Edit Start var/depart_announce = TRUE + var/departing_job = to_despawn.mind.role_alt_title + if(istype(to_despawn, /mob/living/dominated_brain)) depart_announce = FALSE if(depart_announce) - announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]", announce_channel, using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE)) + announce.autosay("[to_despawn.real_name][departing_job ? ", [departing_job], " : " "][on_store_message]", "[on_store_name]", announce_channel, using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE)) visible_message("\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2]", 3) //VOREStation Edit End diff --git a/code/game/machinery/deployable_vr.dm b/code/game/machinery/deployable_vr.dm index bbb835b763..c939fea3f4 100644 --- a/code/game/machinery/deployable_vr.dm +++ b/code/game/machinery/deployable_vr.dm @@ -72,7 +72,7 @@ /obj/structure/barricade/cutout/attackby(var/obj/I, var/mob/user) if(is_type_in_list(I, painters)) var/choice = tgui_input_list(user, "What would you like to paint the cutout as?", "Cutout Painting", cutout_types) - if(!choice || !Adjacent(user, src) || I != user.get_active_hand()) + if(!choice || !Adjacent(user) || I != user.get_active_hand()) return TRUE if(do_after(user, 10 SECONDS, src)) var/picked_type = cutout_types[choice] diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 6e5618d39e..6a66f568cd 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -149,6 +149,41 @@ M.close() return +//CHOMP Add start +/obj/machinery/button/remote/blast_door/bear + name = "stuffed bear" + icon = 'icons/obj/stationobjs_vr.dmi' + icon_state = "stuffedbear" + desc = "A stuffed and mounted bear. Quite a statement piece, but holds a curious glare." + density = 1 + +/obj/machinery/button/remote/blast_door/bear/attack_hand(mob/user as mob) //code to stop bear ever reverting to standard button sprites + if(..()) + return + + add_fingerprint(user) + if(stat & (NOPOWER|BROKEN)) + return + + if(!allowed(user) && (wires & 1)) + to_chat(user, "Access Denied") + flick("doorctrl-denied",src) + return + + use_power(5) + icon_state = "stuffedbear" + desiredstate = !desiredstate + trigger(user) + spawn(15) + update_icon() + +/obj/machinery/button/remote/blast_door/bear/update_icon() + if(stat & NOPOWER) + icon_state = "stuffedbear" + else + icon_state = "stuffedbear" +//CHOMP Add end + /* Emitter remote control */ diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index eb763daa2d..b1c6b23b71 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -43,6 +43,7 @@ var/obj/item/weapon/airlock_electronics/electronics = null var/hasShocked = 0 //Prevents multiple shocks from happening var/secured_wires = 0 + var/security_level = 1 //VOREStation Addition - acts as a multiplier on the time required to hack an airlock with a hacktool var/datum/wires/airlock/wires = null var/open_sound_powered = 'sound/machines/door/covert1o.ogg' @@ -129,6 +130,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/cmd3o.ogg' department_close_powered = 'sound/machines/door/cmd3c.ogg' + security_level = 3 //VOREStation Addition /obj/machinery/door/airlock/security name = "Security Airlock" @@ -139,6 +141,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/sec1o.ogg' department_close_powered = 'sound/machines/door/sec1c.ogg' + security_level = 2 //VOREStation Addition /obj/machinery/door/airlock/engineering name = "Engineering Airlock" @@ -149,6 +152,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/eng1o.ogg' department_close_powered = 'sound/machines/door/eng1c.ogg' + security_level = 1.5 //VOREStation Addition /obj/machinery/door/airlock/engineeringatmos name = "Atmospherics Airlock" @@ -159,6 +163,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/eng1o.ogg' department_close_powered = 'sound/machines/door/eng1c.ogg' + security_level = 1.5 //VOREStation Addition /obj/machinery/door/airlock/medical name = "Medical Airlock" @@ -169,6 +174,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/med1o.ogg' department_close_powered = 'sound/machines/door/med1c.ogg' + security_level = 1.5 //VOREStation Addition /obj/machinery/door/airlock/maintenance name = "Maintenance Access" @@ -260,6 +266,7 @@ opacity = 1 open_sound_powered = 'sound/machines/door/cmd3o.ogg' close_sound_powered = 'sound/machines/door/cmd3c.ogg' + security_level = 100 //VOREStation Addition /obj/machinery/door/airlock/glass_centcom name = "Airlock" @@ -268,6 +275,7 @@ glass = 1 open_sound_powered = 'sound/machines/door/cmd3o.ogg' close_sound_powered = 'sound/machines/door/cmd3c.ogg' + security_level = 100 //VOREStation Addition /obj/machinery/door/airlock/vault name = "Vault" @@ -279,6 +287,7 @@ req_one_access = list(access_heads_vault) open_sound_powered = 'sound/machines/door/vault1o.ogg' close_sound_powered = 'sound/machines/door/vault1c.ogg' + security_level = 5 //VOREStation Addition /obj/machinery/door/airlock/vault/bolted icon_state = "door_locked" @@ -326,6 +335,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/cmd1o.ogg' department_close_powered = 'sound/machines/door/cmd1c.ogg' + security_level = 3 //VOREStation Addition /obj/machinery/door/airlock/glass_engineering name = "Engineering Airlock" @@ -339,6 +349,7 @@ req_one_access = list(access_engine) department_open_powered = 'sound/machines/door/eng1o.ogg' department_close_powered = 'sound/machines/door/eng1c.ogg' + security_level = 1.5 //VOREStation Addition /obj/machinery/door/airlock/glass_engineeringatmos name = "Atmospherics Airlock" @@ -354,6 +365,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/eng1o.ogg' department_close_powered = 'sound/machines/door/eng1c.ogg' + security_level = 1.5 //VOREStation Addition /obj/machinery/door/airlock/glass_security name = "Security Airlock" @@ -369,6 +381,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/sec1o.ogg' department_close_powered = 'sound/machines/door/sec1c.ogg' + security_level = 2 //VOREStation Additio /obj/machinery/door/airlock/glass_medical name = "Medical Airlock" @@ -384,6 +397,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/med1o.ogg' department_close_powered = 'sound/machines/door/med1c.ogg' + security_level = 1.5 //VOREStation Addition /obj/machinery/door/airlock/mining name = "Mining Airlock" @@ -404,6 +418,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/eng1o.ogg' department_close_powered = 'sound/machines/door/eng1c.ogg' + security_level = 1.5 //VOREStation Addition /obj/machinery/door/airlock/research name = "Research Airlock" @@ -413,6 +428,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/sci1o.ogg' department_close_powered = 'sound/machines/door/sci1c.ogg' + security_level = 2 //VOREStation Addition /obj/machinery/door/airlock/glass_research name = "Research Airlock" @@ -428,6 +444,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/sci1o.ogg' department_close_powered = 'sound/machines/door/sci1c.ogg' + security_level = 2 //VOREStation Addition /obj/machinery/door/airlock/glass_mining name = "Mining Airlock" @@ -458,6 +475,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/eng1o.ogg' department_close_powered = 'sound/machines/door/eng1c.ogg' + security_level = 1.5 //VOREStation Addition /obj/machinery/door/airlock/gold name = "Gold Airlock" @@ -542,6 +560,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/sci1o.ogg' department_close_powered = 'sound/machines/door/sci1c.ogg' + security_level = 1.5 //VOREStation Addition /obj/machinery/door/airlock/glass_science name = "Glass Airlocks" @@ -554,6 +573,7 @@ close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. department_open_powered = 'sound/machines/door/sci1o.ogg' department_close_powered = 'sound/machines/door/sci1c.ogg' + security_level = 1.5 //VOREStation Addition /obj/machinery/door/airlock/highsecurity name = "Secure Airlock" @@ -564,6 +584,7 @@ req_one_access = list(access_heads_vault) open_sound_powered = 'sound/machines/door/secure1o.ogg' close_sound_powered = 'sound/machines/door/secure1c.ogg' + security_level = 4 //VOREStation Addition /obj/machinery/door/airlock/voidcraft name = "voidcraft hatch" @@ -611,6 +632,7 @@ hackProof = TRUE assembly_type = /obj/structure/door_assembly/door_assembly_alien req_one_access = list(access_alien) + security_level = 100 //VOREStation Addition /obj/machinery/door/airlock/alien/locked icon_state = "door_locked" diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index cc8227147c..9c6950bfbe 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -319,6 +319,15 @@ density = FALSE opacity = 0 +/obj/machinery/door/blast/regular/bookcase //CHOMP Add code block + name = "bookcase" + desc = "On closer inspection, the array of books is decorative and built into the frame." + icon_state = "bookcase1" + icon_state_open = "bookcase0" + icon_state_opening = "bookcasec0" + icon_state_closed = "bookcase1" + icon_state_closing = "bookcasec1" + // SUBTYPE: Shutters // Nicer looking, and also weaker, shutters. Found in kitchen and similar areas. /obj/machinery/door/blast/shutters @@ -456,4 +465,4 @@ #undef BLAST_DOOR_CRUSH_DAMAGE -#undef SHUTTER_CRUSH_DAMAGE \ No newline at end of file +#undef SHUTTER_CRUSH_DAMAGE diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index d651ad2025..6c71e63207 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -81,31 +81,6 @@ frame_class = FRAME_CLASS_MACHINE frame_size = 4 -/datum/frame/frame_types/oven - name = "Oven" - frame_class = FRAME_CLASS_MACHINE - frame_size = 4 - -/datum/frame/frame_types/fryer - name = "Fryer" - frame_class = FRAME_CLASS_MACHINE - frame_size = 4 - -/datum/frame/frame_types/grill - name = "Grill" - frame_class = FRAME_CLASS_MACHINE - frame_size = 4 - -/datum/frame/frame_types/cerealmaker - name = "Cereal Maker" - frame_class = FRAME_CLASS_MACHINE - frame_size = 4 - -/datum/frame/frame_types/candymachine - name = "Candy Machine" - frame_class = FRAME_CLASS_MACHINE - frame_size = 4 - /datum/frame/frame_types/fax name = "Fax" frame_class = FRAME_CLASS_MACHINE @@ -221,7 +196,7 @@ frame_style = FRAME_STYLE_WALL x_offset = 28 y_offset = 28 - + /datum/frame/frame_types/arfgs name = "ARF Generator" frame_class = FRAME_CLASS_MACHINE diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 1e1fff180e..be37e988b8 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -150,7 +150,7 @@ Transponder Codes: