From 7af461539f322824c139be39681641af5ac1ae24 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sat, 16 Dec 2017 13:08:50 -0600 Subject: [PATCH] Revert "[SHOULD BE DONE BUT LETS TESTMERGE FIRST] TG SYNC" --- .github/CONTRIBUTING.md | 12 +- .github/PULL_REQUEST_TEMPLATE.md | 10 +- README.md | 25 +- SQL/database_changelog.txt | 2 +- SQL/errofreedatabase.sql | 2 +- SQL/feedback_conversion_2017-11-12.py | 25 +- SQL/optimisations_2017-02-19.sql | 2 +- SQL/tgstation_schema.sql | 2 +- SQL/tgstation_schema_prefixed.sql | 2 +- code/__DEFINES/DNA.dm | 2 +- code/__DEFINES/admin.dm | 74 + code/__DEFINES/clockcult.dm | 1 + code/__DEFINES/configuration.dm | 2 + code/__DEFINES/inventory.dm | 19 +- code/__DEFINES/preferences.dm | 98 +- code/__DEFINES/radio.dm | 58 +- code/__DEFINES/research.dm | 6 - code/__DEFINES/server_tools.config.dm | 8 - code/__DEFINES/server_tools.dm | 29 +- code/__DEFINES/shuttles.dm | 1 + code/__DEFINES/sight.dm | 2 +- code/__DEFINES/stat.dm | 4 +- code/__DEFINES/subsystems.dm | 2 +- code/__DEFINES/time.dm | 4 +- code/__HELPERS/cmp.dm | 3 +- code/__HELPERS/mobs.dm | 2 +- code/__HELPERS/names.dm | 5 + code/__HELPERS/roundend.dm | 432 --- code/__HELPERS/type2type.dm | 1 + code/__HELPERS/unsorted.dm | 5 +- code/_globalvars/game_modes.dm | 18 +- code/_globalvars/misc.dm | 2 - code/_js/byjax.dm | 1 - code/_onclick/hud/_defines.dm | 2 +- code/_onclick/hud/alert.dm | 31 +- code/_onclick/hud/credits.dm | 69 - code/_onclick/hud/fullscreen.dm | 2 +- code/_onclick/telekinesis.dm | 2 +- .../controllers/configuration/config_entry.dm | 25 +- .../configuration/configuration.dm | 44 +- .../configuration/entries/comms.dm | 26 +- .../configuration/entries/dbconfig.dm | 16 +- .../configuration/entries/game_options.dm | 194 +- .../configuration/entries/general.dm | 388 --- code/controllers/subsystem/air.dm | 2 +- code/controllers/subsystem/blackbox.dm | 45 +- code/controllers/subsystem/input.dm | 12 - code/controllers/subsystem/job.dm | 12 + code/controllers/subsystem/lighting.dm | 2 +- code/controllers/subsystem/machines.dm | 2 +- code/controllers/subsystem/npcpool.dm | 4 +- code/controllers/subsystem/persistence.dm | 2 +- code/controllers/subsystem/radio.dm | 19 +- code/controllers/subsystem/research.dm | 1 - code/controllers/subsystem/shuttle.dm | 6 +- code/controllers/subsystem/squeak.dm | 2 +- code/controllers/subsystem/stickyban.dm | 2 +- code/controllers/subsystem/ticker.dm | 199 +- code/controllers/subsystem/time_track.dm | 2 +- code/controllers/subsystem/timer.dm | 305 +- code/controllers/subsystem/title.dm | 2 +- code/controllers/subsystem/vote.dm | 11 - code/datums/action.dm | 5 +- code/datums/ai_laws.dm | 29 +- code/datums/antagonists/abductor.dm | 63 - code/datums/antagonists/antag_datum.dm | 58 +- code/datums/antagonists/blob.dm | 59 - code/datums/antagonists/brother.dm | 68 - code/datums/antagonists/changeling.dm | 45 +- code/datums/antagonists/clockcult.dm | 53 +- code/datums/antagonists/cult.dm | 259 +- code/datums/antagonists/datum_traitor.dm | 66 +- code/datums/antagonists/devil.dm | 30 - code/datums/antagonists/ninja.dm | 21 +- code/datums/antagonists/nukeop.dm | 322 -- code/datums/antagonists/pirate.dm | 57 +- code/datums/antagonists/revolution.dm | 55 +- code/datums/antagonists/wizard.dm | 48 +- code/datums/components/spooky.dm | 2 +- code/datums/datacore.dm | 1 - code/datums/datum.dm | 9 - code/datums/diseases/advance/presets.dm | 90 +- .../datums/diseases/advance/symptoms/beard.dm | 54 +- .../diseases/advance/symptoms/confusion.dm | 64 +- .../datums/diseases/advance/symptoms/dizzy.dm | 2 +- .../diseases/advance/symptoms/flesh_eating.dm | 2 +- .../diseases/advance/symptoms/headache.dm | 2 +- .../diseases/advance/symptoms/itching.dm | 2 +- .../diseases/advance/symptoms/sensory.dm | 2 +- .../diseases/advance/symptoms/shedding.dm | 58 +- .../diseases/advance/symptoms/shivering.dm | 2 +- .../diseases/advance/symptoms/sneeze.dm | 7 +- .../diseases/advance/symptoms/weight.dm | 2 +- .../datums/diseases/advance/symptoms/youth.dm | 54 +- code/datums/diseases/beesease.dm | 2 +- code/datums/diseases/cold.dm | 2 +- code/datums/diseases/cold9.dm | 2 +- code/datums/diseases/gbs.dm | 2 +- code/datums/diseases/magnitis.dm | 2 +- code/datums/diseases/retrovirus.dm | 2 +- code/datums/dna.dm | 1 - code/datums/explosion.dm | 9 - code/datums/helper_datums/getrev.dm | 1 + code/datums/helper_datums/topic_input.dm | 122 +- code/datums/mind.dm | 163 +- code/datums/weakrefs.dm | 1 - .../weather/weather_types/radiation_storm.dm | 29 +- code/datums/wires/radio.dm | 3 +- code/game/area/ai_monitored.dm | 2 +- code/game/area/areas/holodeck.dm | 2 +- code/game/atoms_movable.dm | 4 +- code/game/communications.dm | 198 +- code/game/gamemodes/antag_hud.dm | 4 +- code/game/gamemodes/antag_spawner.dm | 50 +- code/game/gamemodes/blob/blobs/shield.dm | 2 +- code/game/gamemodes/blob/overmind.dm | 35 +- code/game/gamemodes/blob/powers.dm | 33 +- code/game/gamemodes/blob/theblob.dm | 2 +- code/game/gamemodes/brother/traitor_bro.dm | 72 +- code/game/gamemodes/changeling/changeling.dm | 41 + code/game/gamemodes/clock_cult/clock_cult.dm | 51 +- .../clock_effects/spatial_gateway.dm | 12 +- .../clock_helpers/fabrication_helpers.dm | 4 +- .../clock_items/construct_chassis.dm | 3 +- .../clock_items/replica_fabricator.dm | 6 +- .../clock_cult/clock_mobs/_eminence.dm | 22 +- .../clock_structures/eminence_spire.dm | 10 +- code/game/gamemodes/cult/cult.dm | 210 +- code/game/gamemodes/cult/cult_comms.dm | 68 +- code/game/gamemodes/cult/cult_items.dm | 2 +- code/game/gamemodes/cult/cult_structures.dm | 5 +- code/game/gamemodes/cult/ritual.dm | 25 +- code/game/gamemodes/cult/runes.dm | 25 +- code/game/gamemodes/devil/game_mode.dm | 38 + code/game/gamemodes/game_mode.dm | 96 +- .../gamemodes/malfunction/Malf_Modules.dm | 4 +- code/game/gamemodes/meteor/meteor.dm | 19 +- code/game/gamemodes/meteor/meteors.dm | 2 +- .../miniantags/abduction/abduction.dm | 45 +- .../gamemodes/miniantags/abduction/gland.dm | 9 +- .../abduction/machinery/experiment.dm | 20 +- .../miniantags/bot_swarm/swarmer_event.dm | 4 +- .../gamemodes/miniantags/monkey/monkey.dm | 11 +- code/game/gamemodes/miniantags/morph/morph.dm | 1 - .../gamemodes/miniantags/revenant/revenant.dm | 3 +- .../miniantags/slaughter/slaughterevent.dm | 1 - code/game/gamemodes/nuclear/nuclear.dm | 306 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 4 +- code/game/gamemodes/nuclear/pinpointer.dm | 4 +- code/game/gamemodes/objective.dm | 14 +- code/game/gamemodes/objective_team.dm | 14 +- code/game/gamemodes/revolution/revolution.dm | 60 +- code/game/gamemodes/sandbox/h_sandbox.dm | 2 +- code/game/gamemodes/traitor/traitor.dm | 73 +- code/game/gamemodes/wizard/artefact.dm | 18 +- code/game/gamemodes/wizard/soulstone.dm | 4 +- code/game/gamemodes/wizard/wizard.dm | 63 +- code/game/machinery/PDApainter.dm | 2 +- code/game/machinery/Sleeper.dm | 4 +- code/game/machinery/airlock_control.dm | 52 +- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/arcade.dm | 2 +- code/game/machinery/computer/atmos_alert.dm | 6 +- code/game/machinery/computer/atmos_control.dm | 33 +- .../game/machinery/computer/communications.dm | 16 +- code/game/machinery/computer/message.dm | 1 - .../machinery/computer/telecrystalconsoles.dm | 7 +- code/game/machinery/computer/teleporter.dm | 37 +- code/game/machinery/constructable_frame.dm | 11 +- code/game/machinery/doors/airlock.dm | 20 +- code/game/machinery/doors/alarmlock.dm | 6 +- code/game/machinery/doors/brigdoors.dm | 4 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/poddoor.dm | 122 +- code/game/machinery/doors/shutters.dm | 2 +- code/game/machinery/doors/unpowered.dm | 44 +- code/game/machinery/doors/windowdoor.dm | 7 +- code/game/machinery/doppler_array.dm | 4 - .../embedded_controller/airlock_controller.dm | 93 +- .../embedded_controller_base.dm | 12 +- .../simple_vent_controller.dm | 37 +- code/game/machinery/hologram.dm | 10 +- code/game/machinery/iv_drip.dm | 2 +- code/game/machinery/magnet.dm | 26 +- code/game/machinery/navbeacon.dm | 4 +- code/game/machinery/newscaster.dm | 15 +- code/game/machinery/quantum_pad.dm | 6 +- code/game/machinery/requests_console.dm | 18 +- code/game/machinery/robot_fabricator.dm | 2 +- code/game/machinery/shieldgen.dm | 30 +- code/game/machinery/spaceheater.dm | 2 +- code/game/machinery/status_display.dm | 2 +- code/game/machinery/telecomms/broadcasting.dm | 21 +- .../telecomms/machine_interactions.dm | 2 +- .../machinery/telecomms/machines/allinone.dm | 4 +- code/game/machinery/telecomms/machines/bus.dm | 12 +- .../machinery/telecomms/machines/receiver.dm | 8 +- .../machinery/telecomms/machines/server.dm | 19 +- .../machinery/telecomms/telecomunications.dm | 2 +- code/game/machinery/transformer.dm | 2 +- code/game/machinery/wishgranter.dm | 1 - code/game/mecha/combat/combat.dm | 2 - code/game/mecha/combat/gygax.dm | 1 - code/game/mecha/combat/honker.dm | 2 - code/game/mecha/combat/marauder.dm | 172 +- code/game/mecha/combat/reticence.dm | 54 +- code/game/mecha/equipment/mecha_equipment.dm | 2 +- code/game/mecha/equipment/tools/work_tools.dm | 4 +- code/game/mecha/mech_fabricator.dm | 14 +- code/game/mecha/mecha.dm | 2 +- code/game/mecha/mecha_construction_paths.dm | 10 +- code/game/mecha/mecha_topic.dm | 2 +- code/game/mecha/mecha_wreckage.dm | 2 +- code/game/objects/effects/anomalies.dm | 2 +- code/game/objects/effects/bump_teleporter.dm | 1 - code/game/objects/effects/decals/cleanable.dm | 9 +- code/game/objects/effects/decals/crayon.dm | 2 +- .../effects/effect_system/effects_foam.dm | 2 +- code/game/objects/effects/landmarks.dm | 2 +- code/game/objects/effects/misc.dm | 1 - code/game/objects/effects/portals.dm | 2 - .../objects/effects/spawners/gibspawner.dm | 12 +- .../game/objects/effects/spawners/lootdrop.dm | 2 +- code/game/objects/effects/spiders.dm | 4 +- .../effects/temporary_visuals/clockcult.dm | 4 +- .../objects/effects/temporary_visuals/cult.dm | 4 +- .../temporary_visuals/miscellaneous.dm | 2 +- code/game/objects/items.dm | 69 +- code/game/objects/items/RCL.dm | 9 +- code/game/objects/items/apc_frame.dm | 3 +- code/game/objects/items/bodybag.dm | 2 +- code/game/objects/items/cards_ids.dm | 6 +- code/game/objects/items/chrono_eraser.dm | 6 +- code/game/objects/items/cigs_lighters.dm | 4 - .../items/circuitboards/circuitboard.dm | 1 - .../circuitboards/machine_circuitboards.dm | 37 +- code/game/objects/items/clown_items.dm | 1 - code/game/objects/items/cosmetics.dm | 2 +- code/game/objects/items/crayons.dm | 5 +- code/game/objects/items/defib.dm | 2 +- code/game/objects/items/devices/PDA/PDA.dm | 6 +- code/game/objects/items/devices/PDA/cart.dm | 44 +- code/game/objects/items/devices/PDA/radio.dm | 53 +- code/game/objects/items/devices/camera_bug.dm | 1 - .../objects/items/devices/chameleonproj.dm | 4 +- code/game/objects/items/devices/flashlight.dm | 2 - .../objects/items/devices/laserpointer.dm | 2 +- code/game/objects/items/devices/multitool.dm | 2 +- .../objects/items/devices/pressureplates.dm | 2 +- .../objects/items/devices/radio/beacon.dm | 4 + .../items/devices/radio/electropack.dm | 12 +- .../items/devices/radio/encryptionkey.dm | 6 +- .../objects/items/devices/radio/headset.dm | 52 +- .../objects/items/devices/radio/intercom.dm | 16 +- .../game/objects/items/devices/radio/radio.dm | 132 +- code/game/objects/items/devices/scanners.dm | 2 - code/game/objects/items/extinguisher.dm | 1 + .../objects/items/grenades/chem_grenade.dm | 6 +- .../game/objects/items/grenades/ghettobomb.dm | 118 +- .../objects/items/grenades/syndieminibomb.dm | 2 +- code/game/objects/items/handcuffs.dm | 1 + code/game/objects/items/holy_weapons.dm | 7 +- .../objects/items/implants/implantcase.dm | 5 +- code/game/objects/items/mop.dm | 2 - code/game/objects/items/paiwire.dm | 2 +- code/game/objects/items/pinpointer.dm | 4 +- code/game/objects/items/plushes.dm | 2 +- code/game/objects/items/robot/robot_items.dm | 2 +- code/game/objects/items/robot/robot_parts.dm | 6 +- code/game/objects/items/shooting_range.dm | 2 +- code/game/objects/items/stacks/bscrystal.dm | 3 - code/game/objects/items/stacks/medical.dm | 2 - .../game/objects/items/stacks/sheets/glass.dm | 4 - .../game/objects/items/stacks/sheets/light.dm | 71 +- .../objects/items/stacks/sheets/mineral.dm | 6 - .../items/stacks/sheets/sheet_types.dm | 10 +- code/game/objects/items/stacks/stack.dm | 11 - code/game/objects/items/storage/briefcase.dm | 1 - code/game/objects/items/storage/storage.dm | 6 - code/game/objects/items/tanks/watertank.dm | 10 +- code/game/objects/items/teleportation.dm | 5 +- code/game/objects/items/theft_tools.dm | 13 +- code/game/objects/items/tools/weldingtool.dm | 682 ++--- code/game/objects/items/trash.dm | 4 +- code/game/objects/items/twohanded.dm | 2 +- code/game/objects/items/weaponry.dm | 2 +- code/game/objects/structures/aliens.dm | 2 +- code/game/objects/structures/artstuff.dm | 6 +- .../objects/structures/beds_chairs/bed.dm | 6 +- .../crates_lockers/closets/gimmick.dm | 208 +- .../crates_lockers/closets/job_closets.dm | 1 - .../crates_lockers/closets/secure/bar.dm | 20 +- .../closets/secure/hydroponics.dm | 22 +- .../crates_lockers/closets/secure/medical.dm | 2 +- .../crates_lockers/closets/secure/personal.dm | 100 +- .../closets/secure/scientist.dm | 4 +- .../closets/secure/secure_closets.dm | 20 +- .../crates_lockers/closets/secure/security.dm | 2 +- .../crates_lockers/crates/critter.dm | 2 +- .../structures/crates_lockers/crates/large.dm | 66 +- code/game/objects/structures/displaycase.dm | 8 +- code/game/objects/structures/electricchair.dm | 2 +- .../objects/structures/ghost_role_spawners.dm | 9 +- code/game/objects/structures/kitchen_spike.dm | 4 +- code/game/objects/structures/lattice.dm | 2 +- code/game/objects/structures/manned_turret.dm | 2 +- code/game/objects/structures/mineral_doors.dm | 2 +- code/game/objects/structures/mop_bucket.dm | 42 +- code/game/objects/structures/noticeboard.dm | 4 +- code/game/objects/structures/safe.dm | 2 +- code/game/objects/structures/signs.dm | 9 +- code/game/objects/structures/tables_racks.dm | 2 +- code/game/objects/structures/target_stake.dm | 8 +- code/game/objects/structures/watercloset.dm | 1 + .../objects/structures/windoor_assembly.dm | 10 +- code/game/objects/structures/window.dm | 5 +- code/game/say.dm | 24 +- code/game/turfs/closed.dm | 15 + code/game/turfs/space/space.dm | 3 +- code/game/turfs/turf.dm | 2 +- code/game/world.dm | 2 +- code/modules/admin/DB_ban/functions.dm | 8 +- code/modules/admin/admin.dm | 23 +- code/modules/admin/admin_investigate.dm | 2 - code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/create_mob.dm | 3 +- code/modules/admin/fun_balloon.dm | 2 +- code/modules/admin/holder2.dm | 2 +- code/modules/admin/player_panel.dm | 19 +- code/modules/admin/secrets.dm | 55 +- code/modules/admin/topic.dm | 125 +- code/modules/admin/verbs/BrokenInhands.dm | 2 - .../admin/verbs/SDQL2/SDQL_2_wrappers.dm | 4 +- code/modules/admin/verbs/adminhelp.dm | 19 +- code/modules/admin/verbs/adminjump.dm | 4 +- code/modules/admin/verbs/cinematic.dm | 2 +- code/modules/admin/verbs/debug.dm | 4 +- code/modules/admin/verbs/diagnostics.dm | 15 +- code/modules/admin/verbs/mapping.dm | 1 + code/modules/admin/verbs/massmodvar.dm | 10 +- code/modules/admin/verbs/modifyvariables.dm | 16 +- code/modules/admin/verbs/one_click_antag.dm | 26 +- code/modules/admin/verbs/onlyone.dm | 3 - code/modules/admin/verbs/panicbunker.dm | 3 +- code/modules/admin/verbs/playsound.dm | 1 - code/modules/admin/verbs/possess.dm | 11 +- code/modules/admin/verbs/randomverbs.dm | 11 +- code/modules/assembly/assembly.dm | 1 - code/modules/assembly/holder.dm | 7 +- code/modules/assembly/infrared.dm | 3 +- code/modules/assembly/mousetrap.dm | 8 +- code/modules/assembly/shock_kit.dm | 79 +- code/modules/assembly/signaler.dm | 21 +- code/modules/assembly/voice.dm | 180 +- .../atmospherics/machinery/airalarm.dm | 31 +- .../atmospherics/machinery/atmosmachinery.dm | 5 +- .../components/binary_devices/circulator.dm | 3 - .../components/binary_devices/dp_vent_pump.dm | 12 +- .../components/binary_devices/passive_gate.dm | 13 +- .../components/binary_devices/pump.dm | 13 +- .../components/trinary_devices/filter.dm | 2 +- .../components/unary_devices/cryo.dm | 5 +- .../unary_devices/outlet_injector.dm | 9 +- .../components/unary_devices/vent_pump.dm | 14 +- .../components/unary_devices/vent_scrubber.dm | 18 +- .../atmospherics/machinery/other/meter.dm | 7 +- .../atmospherics/machinery/portable/pump.dm | 2 +- .../machinery/portable/scrubber.dm | 2 +- code/modules/awaymissions/capture_the_flag.dm | 5 +- code/modules/awaymissions/corpse.dm | 16 - code/modules/awaymissions/exile.dm | 22 +- .../awaymissions/mission_code/Academy.dm | 2 +- .../awaymissions/mission_code/caves.dm | 2 +- .../awaymissions/mission_code/centcomAway.dm | 2 +- .../mission_code/stationCollision.dm | 31 +- .../awaymissions/mission_code/wildwest.dm | 2 - code/modules/awaymissions/pamphlet.dm | 74 +- .../modules/awaymissions/super_secret_room.dm | 2 +- code/modules/cargo/console.dm | 8 +- code/modules/cargo/exports/research.dm | 4 +- code/modules/client/asset_cache.dm | 3 - code/modules/client/client_defines.dm | 3 - code/modules/client/client_procs.dm | 43 +- code/modules/client/player_details.dm | 2 - code/modules/client/preferences_toggles.dm | 48 +- code/modules/clothing/chameleon.dm | 26 +- code/modules/clothing/ears/_ears.dm | 91 +- code/modules/clothing/gloves/color.dm | 10 +- code/modules/clothing/head/hardhat.dm | 158 +- code/modules/clothing/head/helmet.dm | 2 +- code/modules/clothing/head/misc.dm | 16 +- code/modules/clothing/outfits/ert.dm | 4 +- code/modules/clothing/outfits/standard.dm | 12 +- .../modules/clothing/spacesuits/chronosuit.dm | 10 +- code/modules/clothing/spacesuits/hardsuit.dm | 2 +- code/modules/clothing/suits/_suits.dm | 2 +- code/modules/clothing/suits/armor.dm | 2 +- code/modules/clothing/suits/bio.dm | 2 +- code/modules/clothing/suits/jobs.dm | 10 +- code/modules/clothing/suits/labcoat.dm | 94 +- code/modules/clothing/suits/miscellaneous.dm | 24 +- code/modules/clothing/suits/utility.dm | 6 +- code/modules/clothing/under/accessories.dm | 8 +- code/modules/clothing/under/jobs/civilian.dm | 1 - .../clothing/under/jobs/engineering.dm | 2 +- code/modules/clothing/under/miscellaneous.dm | 3 +- code/modules/events/alien_infestation.dm | 1 - code/modules/events/blob.dm | 1 - code/modules/events/carp_migration.dm | 2 - code/modules/events/disease_outbreak.dm | 62 +- code/modules/events/dust.dm | 2 +- code/modules/events/ghost_role.dm | 1 - code/modules/events/holiday/friday13th.dm | 2 +- code/modules/events/holiday/vday.dm | 7 - code/modules/events/mass_hallucination.dm | 2 +- code/modules/events/nightmare.dm | 1 - code/modules/events/operative.dm | 22 +- code/modules/events/prison_break.dm | 2 +- code/modules/events/radiation_storm.dm | 3 +- code/modules/events/sentience.dm | 1 - code/modules/events/shuttle_loan.dm | 4 +- .../events/spontaneous_appendicitis.dm | 2 +- code/modules/events/weightless.dm | 2 - .../modules/events/wizard/departmentrevolt.dm | 1 - code/modules/events/wizard/greentext.dm | 1 - code/modules/flufftext/Dreaming.dm | 16 +- code/modules/flufftext/Hallucination.dm | 2 +- code/modules/food_and_drinks/drinks/drinks.dm | 11 +- .../food_and_drinks/drinks/drinks/bottle.dm | 4 +- code/modules/food_and_drinks/food.dm | 7 +- .../food_and_drinks/food/customizables.dm | 4 +- code/modules/food_and_drinks/food/snacks.dm | 7 +- .../food_and_drinks/food/snacks_egg.dm | 1 - .../food_and_drinks/food/snacks_other.dm | 21 +- .../food_and_drinks/food/snacks_pastry.dm | 110 - .../food_and_drinks/food/snacks_pie.dm | 4 +- .../food_and_drinks/food/snacks_salad.dm | 6 +- .../food_and_drinks/food/snacks_soup.dm | 16 +- code/modules/food_and_drinks/pizzabox.dm | 27 +- .../recipes/tablecraft/recipes_pastry.dm | 29 +- code/modules/games/cards.dm | 4 +- code/modules/goonchat/browserOutput.dm | 1 - code/modules/holiday/easter.dm | 4 +- code/modules/holiday/halloween.dm | 4 +- code/modules/holodeck/items.dm | 14 +- code/modules/hydroponics/beekeeping/beebox.dm | 27 +- .../hydroponics/beekeeping/honeycomb.dm | 5 +- code/modules/hydroponics/biogenerator.dm | 2 +- code/modules/hydroponics/gene_modder.dm | 10 +- code/modules/hydroponics/grown.dm | 23 - code/modules/hydroponics/grown/apple.dm | 1 - code/modules/hydroponics/grown/banana.dm | 1 - code/modules/hydroponics/grown/beans.dm | 1 - code/modules/hydroponics/grown/berries.dm | 5 - code/modules/hydroponics/grown/cereals.dm | 4 - code/modules/hydroponics/grown/citrus.dm | 3 - code/modules/hydroponics/grown/corn.dm | 1 - code/modules/hydroponics/grown/flowers.dm | 1 - code/modules/hydroponics/grown/melon.dm | 1 - code/modules/hydroponics/grown/nettle.dm | 2 - code/modules/hydroponics/grown/potato.dm | 1 - code/modules/hydroponics/grown/pumpkin.dm | 4 +- code/modules/hydroponics/grown/random.dm | 4 +- code/modules/hydroponics/grown/root.dm | 1 - code/modules/hydroponics/grown/tea_coffee.dm | 9 +- code/modules/hydroponics/grown/tomato.dm | 3 - code/modules/hydroponics/growninedible.dm | 4 - code/modules/hydroponics/hydroponics.dm | 2 +- code/modules/hydroponics/sample.dm | 4 +- code/modules/hydroponics/seed_extractor.dm | 6 +- code/modules/hydroponics/seeds.dm | 4 +- .../integrated_electronics/subtypes/input.dm | 18 +- .../subtypes/reagents.dm | 1 - code/modules/jobs/job_exp.dm | 2 +- code/modules/jobs/job_types/captain.dm | 164 +- code/modules/jobs/job_types/job.dm | 11 +- code/modules/jobs/job_types/medical.dm | 334 +- code/modules/jobs/job_types/science.dm | 216 +- code/modules/jobs/job_types/silicon.dm | 2 +- code/modules/keybindings/bindings_admin.dm | 18 - code/modules/keybindings/bindings_atom.dm | 18 - code/modules/keybindings/bindings_carbon.dm | 18 - code/modules/keybindings/bindings_client.dm | 50 - code/modules/keybindings/bindings_human.dm | 6 - code/modules/keybindings/bindings_living.dm | 7 - code/modules/keybindings/bindings_mob.dm | 79 - code/modules/keybindings/bindings_robot.dm | 12 - code/modules/keybindings/focus.dm | 20 - code/modules/keybindings/readme.md | 40 - code/modules/keybindings/setup.dm | 62 - code/modules/language/codespeak.dm | 2 +- code/modules/language/common.dm | 2 +- code/modules/language/draconic.dm | 2 +- code/modules/language/drone.dm | 4 +- code/modules/language/language.dm | 8 +- code/modules/language/machine.dm | 2 +- code/modules/language/swarmer.dm | 2 +- code/modules/library/lib_items.dm | 18 +- code/modules/library/lib_machines.dm | 4 +- code/modules/mapping/dmm_suite.dm | 2 +- code/modules/mapping/ruins.dm | 2 - code/modules/mining/abandoned_crates.dm | 4 +- code/modules/mining/aux_base.dm | 2 +- .../modules/mining/equipment/explorer_gear.dm | 4 +- .../mining/equipment/mineral_scanner.dm | 2 +- code/modules/mining/laborcamp/laborshuttle.dm | 50 +- code/modules/mining/laborcamp/laborstacker.dm | 4 +- code/modules/mining/lavaland/ash_flora.dm | 8 +- .../mining/lavaland/necropolis_chests.dm | 7 +- code/modules/mining/lavaland/ruins/gym.dm | 6 +- code/modules/mining/machine_stacking.dm | 2 +- code/modules/mining/machine_unloading.dm | 2 +- code/modules/mining/machine_vending.dm | 4 +- code/modules/mining/mine_items.dm | 7 +- code/modules/mining/money_bag.dm | 4 +- code/modules/mob/camera/camera.dm | 27 +- code/modules/mob/dead/dead.dm | 61 +- .../modules/mob/dead/new_player/new_player.dm | 30 +- .../mob/dead/new_player/preferences_setup.dm | 7 +- code/modules/mob/dead/observer/observer.dm | 17 +- code/modules/mob/dead/observer/say.dm | 48 +- code/modules/mob/living/brain/MMI.dm | 6 +- code/modules/mob/living/brain/posibrain.dm | 2 +- .../mob/living/carbon/alien/alien_defense.dm | 250 +- .../carbon/alien/humanoid/alien_powers.dm | 2 +- .../carbon/alien/humanoid/caste/hunter.dm | 2 +- .../carbon/alien/humanoid/caste/praetorian.dm | 2 +- .../carbon/alien/humanoid/caste/sentinel.dm | 2 +- .../mob/living/carbon/alien/humanoid/death.dm | 2 +- .../living/carbon/alien/humanoid/humanoid.dm | 2 +- .../mob/living/carbon/alien/larva/larva.dm | 2 +- .../modules/mob/living/carbon/alien/organs.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 14 +- .../mob/living/carbon/carbon_defense.dm | 1 + .../mob/living/carbon/carbon_movement.dm | 2 +- code/modules/mob/living/carbon/human/emote.dm | 2 +- .../mob/living/carbon/human/examine.dm | 8 +- code/modules/mob/living/carbon/human/human.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 21 +- .../mob/living/carbon/human/interactive.dm | 18 +- code/modules/mob/living/carbon/human/life.dm | 10 +- .../mob/living/carbon/human/species.dm | 8 +- .../carbon/human/species_types/angel.dm | 2 +- .../carbon/human/species_types/corporate.dm | 2 +- .../carbon/human/species_types/golems.dm | 2 - .../carbon/human/species_types/humans.dm | 2 +- .../human/species_types/shadowpeople.dm | 4 +- .../carbon/human/species_types/skeletons.dm | 2 +- code/modules/mob/living/carbon/inventory.dm | 258 +- .../mob/living/carbon/monkey/combat.dm | 6 +- code/modules/mob/living/carbon/monkey/life.dm | 1 + .../living/carbon/monkey/monkey_defense.dm | 11 + .../mob/living/carbon/monkey/punpun.dm | 2 +- code/modules/mob/living/carbon/say.dm | 4 +- code/modules/mob/living/living.dm | 1 + code/modules/mob/living/say.dm | 12 +- code/modules/mob/living/silicon/ai/ai.dm | 2 +- code/modules/mob/living/silicon/ai/examine.dm | 48 +- .../mob/living/silicon/ai/freelook/chunk.dm | 2 +- code/modules/mob/living/silicon/death.dm | 22 +- code/modules/mob/living/silicon/pai/pai.dm | 4 +- .../mob/living/silicon/pai/software.dm | 23 +- code/modules/mob/living/silicon/robot/life.dm | 1 - .../modules/mob/living/silicon/robot/login.dm | 1 - .../modules/mob/living/silicon/robot/robot.dm | 26 +- .../mob/living/silicon/robot/robot_modules.dm | 4 +- .../mob/living/simple_animal/bot/bot.dm | 6 +- .../living/simple_animal/bot/construction.dm | 4 +- .../mob/living/simple_animal/constructs.dm | 10 +- .../mob/living/simple_animal/friendly/crab.dm | 2 +- .../mob/living/simple_animal/friendly/dog.dm | 4 +- .../friendly/drone/drones_as_items.dm | 6 +- .../friendly/drone/extra_drone_types.dm | 2 +- .../simple_animal/friendly/drone/verbs.dm | 2 + .../simple_animal/friendly/farm_animals.dm | 2 +- .../living/simple_animal/friendly/mouse.dm | 4 - .../mob/living/simple_animal/friendly/pet.dm | 26 +- .../living/simple_animal/guardian/guardian.dm | 2 +- .../living/simple_animal/hostile/faithless.dm | 2 +- .../simple_animal/hostile/gorilla/gorilla.dm | 1 - .../living/simple_animal/hostile/hostile.dm | 16 +- .../simple_animal/hostile/mecha_pilot.dm | 5 +- .../hostile/megafauna/blood_drunk_miner.dm | 6 +- .../hostile/megafauna/colossus.dm | 2 +- .../simple_animal/hostile/megafauna/dragon.dm | 2 +- .../hostile/megafauna/megafauna.dm | 14 +- .../hostile/mining_mobs/basilisk.dm | 7 +- .../hostile/mining_mobs/gutlunch.dm | 3 +- .../living/simple_animal/hostile/pirate.dm | 1 - .../simple_animal/hostile/venus_human_trap.dm | 4 +- .../mob/living/simple_animal/parrot.dm | 15 +- code/modules/mob/login.dm | 6 +- code/modules/mob/mob.dm | 3 +- code/modules/mob/mob_defines.dm | 4 + code/modules/mob/mob_helpers.dm | 2 +- code/modules/mob/mob_movement.dm | 126 +- code/modules/mob/say.dm | 3 +- code/modules/mob/say_readme.dm | 4 +- code/modules/mob/transform_procs.dm | 14 +- .../computers/item/laptop_presets.dm | 2 +- .../computers/item/tablet_presets.dm | 6 +- .../modular_computers/hardware/hard_drive.dm | 4 +- code/modules/ninja/ninja_event.dm | 2 +- code/modules/ninja/suit/suit.dm | 6 +- .../modules/ninja/suit/suit_initialisation.dm | 2 +- code/modules/orbit/orbit.dm | 6 +- code/modules/paperwork/clipboard.dm | 4 +- code/modules/paperwork/filingcabinet.dm | 6 +- code/modules/paperwork/folders.dm | 2 +- code/modules/paperwork/paper.dm | 1 + code/modules/paperwork/paper_cutter.dm | 8 +- code/modules/paperwork/paper_premade.dm | 51 +- code/modules/paperwork/pen.dm | 5 +- code/modules/paperwork/photocopier.dm | 11 +- code/modules/paperwork/photography.dm | 1 - code/modules/power/antimatter/control.dm | 2 +- code/modules/power/apc.dm | 2 +- code/modules/power/cable.dm | 3 +- code/modules/power/cell.dm | 4 +- code/modules/power/gravitygenerator.dm | 2 +- code/modules/power/lighting.dm | 11 +- code/modules/power/singularity/collector.dm | 2 +- .../power/singularity/containment_field.dm | 1 - .../power/singularity/field_generator.dm | 3 +- code/modules/power/singularity/narsie.dm | 11 +- .../particle_accelerator.dm | 2 +- .../particle_accelerator/particle_control.dm | 2 +- code/modules/power/singularity/singularity.dm | 16 +- code/modules/power/solar.dm | 4 +- code/modules/power/tracker.dm | 4 +- .../procedural_mapping/mapGeneratorReadme.dm | 2 +- .../mapGenerators/lava_river.dm | 1 - .../mapGenerators/syndicate.dm | 113 +- code/modules/projectiles/ammunition.dm | 4 +- .../projectiles/ammunition/ammo_casings.dm | 10 +- .../projectiles/ammunition/caseless.dm | 2 +- code/modules/projectiles/box_magazine.dm | 4 +- .../boxes_magazines/internal_mag.dm | 8 +- code/modules/projectiles/gun.dm | 29 +- code/modules/projectiles/guns/ballistic.dm | 7 +- .../projectiles/guns/ballistic/automatic.dm | 14 +- .../projectiles/guns/ballistic/revolver.dm | 4 +- .../projectiles/guns/ballistic/shotgun.dm | 6 +- code/modules/projectiles/guns/beam_rifle.dm | 8 +- .../guns/energy/kinetic_accelerator.dm | 4 +- .../projectiles/guns/misc/blastcannon.dm | 4 +- code/modules/projectiles/guns/syringe_gun.dm | 4 +- code/modules/projectiles/projectile.dm | 4 +- .../modules/projectiles/projectile/bullets.dm | 12 +- .../modules/projectiles/projectile/special.dm | 3 +- code/modules/reagents/chemistry/holder.dm | 14 +- .../chemistry/machinery/reagentgrinder.dm | 272 +- .../chemistry/reagents/medicine_reagents.dm | 35 +- code/modules/reagents/reagent_containers.dm | 9 +- .../reagents/reagent_containers/bottle.dm | 2 +- .../reagents/reagent_containers/glass.dm | 12 +- .../reagents/reagent_containers/pill.dm | 3 +- .../reagents/reagent_containers/spray.dm | 7 - code/modules/recycling/disposal/bin.dm | 4 +- code/modules/recycling/disposal/pipe.dm | 1 - code/modules/research/circuitprinter.dm | 14 +- .../departmental_circuit_imprinter.dm | 5 +- code/modules/research/departmental_lathe.dm | 5 +- code/modules/research/designs.dm | 38 - code/modules/research/destructive_analyzer.dm | 24 +- code/modules/research/experimentor.dm | 6 +- code/modules/research/protolathe.dm | 16 +- code/modules/research/rdconsole.dm | 319 +- code/modules/research/rdmachines.dm | 28 +- code/modules/research/stock_parts.dm | 1 + .../research/techweb/__techweb_helpers.dm | 7 +- code/modules/research/techweb/_techweb.dm | 34 +- .../modules/research/techweb/_techweb_node.dm | 6 +- code/modules/research/techweb/all_nodes.dm | 411 ++- .../research/xenobiology/xenobiology.dm | 7 +- .../ruins/objects_and_mobs/necropolis_gate.dm | 2 +- .../ruins/spaceruin_code/listeningstation.dm | 2 +- .../ruins/spaceruin_code/oldstation.dm | 4 +- .../ruins/spaceruin_code/spacehotel.dm | 2 +- .../security_levels/security_levels.dm | 2 +- code/modules/server_tools/st_commands.dm | 2 +- code/modules/server_tools/st_interface.dm | 13 +- code/modules/shuttle/arrivals.dm | 2 +- code/modules/shuttle/emergency.dm | 1 - code/modules/shuttle/navigation_computer.dm | 3 +- code/modules/shuttle/on_move.dm | 6 +- code/modules/shuttle/shuttle.dm | 2 +- code/modules/shuttle/white_ship.dm | 1 - code/modules/spells/spell.dm | 2 +- code/modules/spells/spell_types/dumbfire.dm | 70 +- code/modules/spells/spell_types/genetic.dm | 50 +- code/modules/spells/spell_types/knock.dm | 60 +- code/modules/spells/spell_types/mime.dm | 140 + .../spells/spell_types/mind_transfer.dm | 152 +- code/modules/spells/spell_types/projectile.dm | 54 +- .../spells/spell_types/rightandwrong.dm | 6 +- code/modules/spells/spell_types/shapeshift.dm | 6 +- code/modules/station_goals/station_goal.dm | 6 +- code/modules/surgery/amputation.dm | 2 +- .../surgery/bodyparts/dismemberment.dm | 6 +- code/modules/surgery/helpers.dm | 1 - code/modules/surgery/implant_removal.dm | 4 +- code/modules/surgery/limb_augmentation.dm | 1 - code/modules/surgery/lipoplasty.dm | 2 +- code/modules/surgery/mechanic_steps.dm | 2 +- code/modules/surgery/organ_manipulation.dm | 2 +- code/modules/surgery/organs/augments_chest.dm | 2 +- .../modules/surgery/prosthetic_replacement.dm | 1 - code/modules/surgery/surgery.dm | 2 +- code/modules/surgery/surgery_step.dm | 2 +- code/modules/uplink/uplink.dm | 3 +- code/modules/uplink/uplink_items.dm | 6 +- code/modules/zombie/items.dm | 2 +- code/modules/zombie/organs.dm | 4 +- code/world.dm | 1 + config/admin_nicknames.txt | 2 - config/admin_ranks.txt | 8 +- config/admins.txt | 6 +- config/comms.txt | 4 +- config/config.txt | 16 - config/game_options.txt | 2 + config/maps.txt | 6 +- config/spaceRuinBlacklist.txt | 2 +- html/browser/roundend.css | 67 - html/browser/techwebs.css | 20 - html/changelog.html | 2711 +++++++---------- html/changelogs/.all_changelog.yml | 852 +----- html/changelogs/AutoChangeLog-pr-33181.yml | 7 - html/changelogs/AutoChangeLog-pr-33207.yml | 4 - html/changelogs/AutoChangeLog-pr-33216.yml | 4 - html/changelogs/AutoChangeLog-pr-33307.yml | 4 - html/changelogs/AutoChangeLog-pr-33381.yml | 4 - html/changelogs/AutoChangeLog-pr-33465.yml | 4 - html/changelogs/AutoChangeLog-pr-33466.yml | 5 - html/changelogs/AutoChangeLog-pr-33480.yml | 5 - html/changelogs/AutoChangeLog-pr-33488.yml | 5 - html/changelogs/AutoChangeLog-pr-33490.yml | 4 - html/changelogs/AutoChangeLog-pr-33497.yml | 4 - html/changelogs/AutoChangeLog-pr-33503.yml | 5 - html/changelogs/AutoChangeLog-pr-33519.yml | 4 - icons/obj/assemblies/electronic_setups.dmi | Bin 3757 -> 7411 bytes icons/obj/closet.dmi | Bin 33185 -> 31098 bytes interface/skin.dmf | 1481 ++++++++- strings/abductee_objectives.txt | 40 - strings/brain_damage_lines.json | 32 +- strings/cas_black.txt | 2 +- strings/greek_letters.txt | 2 +- strings/numbers_as_words.txt | 2 +- strings/phonetic_alphabet.txt | 2 +- strings/station_names.txt | 2 +- strings/station_prefixes.txt | 2 +- strings/station_suffixes.txt | 2 +- strings/tips.txt | 16 + tgstation.dme | 24 +- tgui/assets/tgui.css | 2 +- tgui/assets/tgui.js | 35 +- 756 files changed, 10062 insertions(+), 11368 deletions(-) delete mode 100644 code/__DEFINES/server_tools.config.dm delete mode 100644 code/__HELPERS/roundend.dm delete mode 100644 code/_onclick/hud/credits.dm delete mode 100644 code/controllers/configuration/entries/general.dm delete mode 100644 code/controllers/subsystem/input.dm delete mode 100644 code/datums/antagonists/blob.dm delete mode 100644 code/datums/antagonists/nukeop.dm delete mode 100644 code/modules/client/player_details.dm delete mode 100644 code/modules/keybindings/bindings_admin.dm delete mode 100644 code/modules/keybindings/bindings_atom.dm delete mode 100644 code/modules/keybindings/bindings_carbon.dm delete mode 100644 code/modules/keybindings/bindings_client.dm delete mode 100644 code/modules/keybindings/bindings_human.dm delete mode 100644 code/modules/keybindings/bindings_living.dm delete mode 100644 code/modules/keybindings/bindings_mob.dm delete mode 100644 code/modules/keybindings/bindings_robot.dm delete mode 100644 code/modules/keybindings/focus.dm delete mode 100644 code/modules/keybindings/readme.md delete mode 100644 code/modules/keybindings/setup.dm delete mode 100644 config/admin_nicknames.txt delete mode 100644 html/browser/roundend.css delete mode 100644 html/browser/techwebs.css delete mode 100644 html/changelogs/AutoChangeLog-pr-33181.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33207.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33216.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33307.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33381.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33465.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33466.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33480.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33488.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33490.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33497.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33503.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-33519.yml delete mode 100644 strings/abductee_objectives.txt diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 192c91ecc5..a4d6c07526 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -312,7 +312,7 @@ var/list/bag_of_items = list(sword, apple, coinpouch, sword, sword) var/obj/item/sword/best_sword for(var/obj/item/sword/S in bag_of_items) if(!best_sword || S.damage > best_sword.damage) - best_sword = S + best_sword = S ``` The above is a simple proc for checking all swords in a container and returning the one with the highest damage, and it uses DM's standard syntax for a for-loop by specifying a type in the variable of the for's header that DM interprets as a type to filter by. It performs this filter using ```istype()``` (or some internal-magic similar to ```istype()``` - this is BYOND, after all). This is fine in its current state for ```bag_of_items```, but if ```bag_of_items``` contained ONLY swords, or only SUBTYPES of swords, then the above is inefficient. For example: ```DM @@ -320,7 +320,7 @@ var/list/bag_of_swords = list(sword, sword, sword, sword) var/obj/item/sword/best_sword for(var/obj/item/sword/S in bag_of_swords) if(!best_sword || S.damage > best_sword.damage) - best_sword = S + best_sword = S ``` specifies a type for DM to filter by. @@ -332,7 +332,7 @@ var/obj/item/sword/best_sword for(var/s in bag_of_swords) var/obj/item/sword/S = s if(!best_sword || S.damage > best_sword.damage) - best_sword = S + best_sword = S ``` Of course, if the list contains data of a mixed type then the above optimisation is DANGEROUS, as it will blindly typecast all data in the list as the specified type, even if it isn't really that type, causing runtime errors. @@ -355,9 +355,9 @@ DM has a var keyword, called global. This var keyword is for vars inside of type ```DM mob - var - global - thing = TRUE + var + global + thing = TRUE ``` This does NOT mean that you can access it everywhere like a global var. Instead, it means that that var will only exist once for all instances of its type, in this case that var will only exist once for all mobs - it's shared across everything in its type. (Much more like the keyword `static` in other languages like PHP/C++/C#/Java) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 7855fd5782..1332358e04 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,5 @@ -[Changelogs]: # (Your PR should contain a detailed changelog of notable changes, titled and categorized appropriately. This includes, new features, sprites, sounds, balance changes, admin tools, map edits, removals, big refactors, config changes, hosting changes and important fixes. An example changelog has been provided below for you to edit. If you need additional help, read https://github.com/tgstation/tgstation/wiki/Changelogs) +[Changelogs]: # (Please make a changelog if you're adding, removing or changing content that'll affect players. This includes, but is not limited to, new features, sprites, sounds; balance changes; map edits and important fixes. An example changelog has been provided below for you to edit or remove. If you need help, read https://github.com/tgstation/tgstation/wiki/Changelogs) + :cl: optional name here add: Added new things @@ -7,16 +8,13 @@ del: Removed old things tweak: tweaked a few things balance: rebalanced something fix: fixed a few things +wip: added a few works in progress soundadd: added a new sound thingy sounddel: removed an old sound thingy imageadd: added some icons and images imagedel: deleted some icons and images spellcheck: fixed a few typos -code: changed some code -refactor: refactored some code -config: changed some config setting -admin: messed with admin stuff -server: something server ops should know +experiment: added an experimental thingy /:cl: [why]: # (Please add a short description [two lines down] of why you think these changes would benefit the game. If you can't justify it in words, it might not be worth adding.) diff --git a/README.md b/README.md index cdf07dab25..e2b9bbfbbc 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,21 @@ -## Citadel Station 13 codebase +<<<<<<< HEAD +##Citadel Station 13
+Based and maintained from /tg/station.
+======= [![Build Status](https://travis-ci.org/tgstation/tgstation.png)](https://travis-ci.org/tgstation/tgstation) [![Krihelimeter](https://www.krihelinator.xyz/badge/tgstation/tgstation)](https://www.krihelinator.xyz) [![Percentage of issues still open](https://isitmaintained.com/badge/open/tgstation/tgstation.svg)](https://isitmaintained.com/project/tgstation/tgstation "Percentage of issues still open") [![Average time to resolve an issue](https://isitmaintained.com/badge/resolution/tgstation/tgstation.svg)](https://isitmaintained.com/project/tgstation/tgstation "Average time to resolve an issue") ![Coverage](https://img.shields.io/badge/coverage---2%25-red.svg) [![forthebadge](https://forthebadge.com/images/badges/built-with-resentment.svg)](https://forthebadge.com) [![forthebadge](https://forthebadge.com/images/badges/contains-technical-debt.svg)](https://forthebadge.com) [![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) +>>>>>>> c47dde9... Merge pull request #33172 from praisenarsie/patch-12 [![Build Status](https://api.travis-ci.org/Citadel-Station-13/Citadel-Station-13.png)](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13) [![Krihelimeter](http://www.krihelinator.xyz/badge/Citadel-Station-13/Citadel-Station-13)](http://www.krihelinator.xyz) [![Percentage of issues still open](http://isitmaintained.com/badge/open/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open") [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue") **Upstream Information**
-**Website:** https://www.tgstation13.org
+**Website:** http://www.tgstation13.org
**Code:** https://github.com/tgstation/tgstation
-**Wiki** https://tgstation13.org/wiki/Main_Page
+**Wiki** http://tgstation13.org/wiki/Main_Page
**IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus).
**Citadel Station Information**
@@ -22,10 +26,10 @@ ## DOWNLOADING -There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at https://www.tgstation13.org/wiki/Downloading_the_source_code +There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://www.tgstation13.org/wiki/Downloading_the_source_code Option 1: -Follow this: https://www.tgstation13.org/wiki/Setting_up_git +Follow this: http://www.tgstation13.org/wiki/Setting_up_git Option 2: Download the source code as a zip by clicking the ZIP button in the code tab of https://github.com/tgstation/tgstation @@ -99,7 +103,7 @@ https://github.com/tgstation/tgstation-server /tg/station currently comes equipped with five maps. -* [BoxStation (default)](https://tgstation13.org/wiki/Boxstation) +* [BoxStation (default)](http://tgstation13.org/wiki/Boxstation) * [MetaStation](https://tgstation13.org/wiki/MetaStation) * [DeltaStation](https://tgstation13.org/wiki/DeltaStation) * [OmegaStation](https://tgstation13.org/wiki/OmegaStation) @@ -112,7 +116,7 @@ The map that will be loaded for the upcoming round is determined by reading data If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file. -Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](https://tgstation13.org/wiki/Map_Merger) +Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](http://tgstation13.org/wiki/Map_Merger) ## AWAY MISSIONS @@ -126,7 +130,6 @@ To enable an away mission open `config/awaymissionconfig.txt` and uncomment one The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database - ## IRC BOT SETUP Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified @@ -138,7 +141,7 @@ Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md) ## LICENSE -All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.html). +All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](http://www.gnu.org/licenses/agpl-3.0.html). All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html). (Including tools unless their readme specifies otherwise.) @@ -147,11 +150,11 @@ See LICENSE and GPLv3.txt for more details. tgui clientside is licensed as a subproject under the MIT license. Font Awesome font files, used by tgui, are licensed under the SIL Open Font License v1.1 -tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-sa/4.0/). +tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). The TGS3 API is licensed as a subproject under the MIT license. See tgui/LICENSE.md for the MIT license. See tgui/assets/fonts/SIL-OFL-1.1-LICENSE.md for the SIL Open Font License. See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license. -All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. +All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](http://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt index 9f0f2c50c0..e2a172e107 100644 --- a/SQL/database_changelog.txt +++ b/SQL/database_changelog.txt @@ -383,4 +383,4 @@ UPDATE erro_library SET deleted = 1 WHERE id = someid (Replace someid with the id of the book you want to soft delete.) ----------------------------------------------------- +---------------------------------------------------- \ No newline at end of file diff --git a/SQL/errofreedatabase.sql b/SQL/errofreedatabase.sql index 7f23fcc861..7d6ea4561c 100644 --- a/SQL/errofreedatabase.sql +++ b/SQL/errofreedatabase.sql @@ -12,4 +12,4 @@ ALTER TABLE erro_poll_option RENAME TO SS13_poll_option; ALTER TABLE erro_poll_question RENAME TO SS13_poll_question; ALTER TABLE erro_poll_textreply RENAME TO SS13_poll_textreply; ALTER TABLE erro_poll_vote RENAME TO SS13_poll_vote; -ALTER TABLE erro_watch RENAME TO SS13_watch; +ALTER TABLE erro_watch RENAME TO SS13_watch; \ No newline at end of file diff --git a/SQL/feedback_conversion_2017-11-12.py b/SQL/feedback_conversion_2017-11-12.py index 8a60e10b7e..b8577460b3 100644 --- a/SQL/feedback_conversion_2017-11-12.py +++ b/SQL/feedback_conversion_2017-11-12.py @@ -5,10 +5,6 @@ #It can be downloaded from command line with pip: #pip install mysqlclient # -#tgstation no longer supports MySQL which has been superseded by MariaDB, a drop-in replacement. -#Before running this script you will need to migrate to MariaDB. -#Migrating is very easy to do, for details on how see: https://mariadb.com/kb/en/library/upgrading-from-mysql-to-mariadb/ -# #You will also have to create a new feedback table for inserting converted data to per the schema: #CREATE TABLE `feedback_new` ( # `id` int(11) unsigned NOT NULL AUTO_INCREMENT, @@ -480,25 +476,11 @@ parser.add_argument("newtable", help="Name of the new table to insert to, can't args = parser.parse_args() db=MySQLdb.connect(host=args.address, user=args.username, passwd=args.password, db=args.database) cursor=db.cursor() -cursor.execute("SELECT @@GLOBAL.version_comment") -db_version = "".join([x for x in cursor.fetchone()]) -database_mysql = False -if 'MySQL' in db_version: - database_mysql = True -elif 'mariadb' not in db_version: - choice = input("Unable to determine database version installed, are you using MySQL? Type Yes or No and press enter...").lower() - if choice == "yes": - database_mysql = True -if database_mysql == True: - print("WARNING Database detected to be MySQL: tgstation no longer supports MySQL which has been superseded by MariaDB, a drop-in replacement.\nBefore running this script you will need to migrate to MariaDB.\nMigrating is very easy to do, for details on how see: https://mariadb.com/kb/en/library/upgrading-from-mysql-to-mariadb/") - input("Press enter to quit...") - quit() current_table = args.curtable new_table = args.newtable -cursor.execute("SELECT max(id), max(round_id) FROM {0}".format(current_table)) +cursor.execute("SELECT max(id) FROM {0}".format(current_table)) query_id = cursor.fetchone() max_id = query_id[0] -max_round_id = query_id[1] start_time = datetime.now() print("Beginning conversion at {0}".format(start_time.strftime("%Y-%m-%d %H:%M:%S"))) try: @@ -511,7 +493,7 @@ try: if not query_row: continue else: - if current_round != query_row[2] or current_round == max_round_id: + if current_round != query_row[2]: multirows_completed.clear() if query_values: query_values = query_values[:-1] @@ -542,11 +524,8 @@ try: print("Conversion completed at {0}".format(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) print("Script duration: {0}".format(end_time - start_time)) except Exception as e: - cursor.execute("SELECT round_id FROM {0} WHERE id = {1}".format(current_table, current_id-1)) - query_round_id = cursor.fetchone() end_time = datetime.now() print("Error encountered on row ID {0} at {1}".format(current_id, datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) - print("Note SQL insertion errors will be due to data from round ID {0}".format(query_round_id[0])) #since data is inserted when the round id changes on a new row print("Script duration: {0}".format(end_time - start_time)) cursor.execute("TRUNCATE {0} ".format(new_table)) raise e diff --git a/SQL/optimisations_2017-02-19.sql b/SQL/optimisations_2017-02-19.sql index 1bb19cc667..b9017497ed 100644 --- a/SQL/optimisations_2017-02-19.sql +++ b/SQL/optimisations_2017-02-19.sql @@ -226,4 +226,4 @@ ALTER TABLE `poll_vote` , ADD INDEX `idx_pvote_optionid_ckey` (`optionid` ASC, `ckey` ASC); ALTER TABLE `poll_textreply` - ADD INDEX `idx_ptext_pollid_ckey` (`pollid` ASC, `ckey` ASC); + ADD INDEX `idx_ptext_pollid_ckey` (`pollid` ASC, `ckey` ASC); \ No newline at end of file diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index 8ec2fcfc41..2d914161d3 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -432,4 +432,4 @@ CREATE TABLE `schema_revision` ( /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; \ No newline at end of file diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index 8bc768967d..2d44c8eac0 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -432,4 +432,4 @@ CREATE TABLE `SS13_schema_revision` ( /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; \ No newline at end of file diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 50055ad67c..5a834b1f87 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -127,7 +127,7 @@ #define TOXINLOVER 24 #define DIGITIGRADE 25 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi) #define NO_UNDERWEAR 26 -#define NOLIVER 27 +#define NOLIVER 27 #define NOSTOMACH 28 #define NO_DNA_COPY 29 #define DRINKSBLOOD 30 diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index ded699c69d..65d028ea34 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -1,5 +1,79 @@ //A set of constants used to determine which type of mute an admin wishes to apply: //Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO etc = (MUTE_IC << 1) +//Therefore there needs to be a gap between the flags_1 for the automute flags_1 +#define MUTE_IC 1 +#define MUTE_OOC 2 +#define MUTE_PRAY 4 +#define MUTE_ADMINHELP 8 +#define MUTE_DEADCHAT 16 +#define MUTE_ALL 31 + +//Some constants for DB_Ban +#define BANTYPE_PERMA 1 +#define BANTYPE_TEMP 2 +#define BANTYPE_JOB_PERMA 3 +#define BANTYPE_JOB_TEMP 4 +#define BANTYPE_ANY_FULLBAN 5 //used to locate stuff to unban. + +#define BANTYPE_ADMIN_PERMA 7 +#define BANTYPE_ADMIN_TEMP 8 +#define BANTYPE_ANY_JOB 9 //used to remove jobbans + +//Please don't edit these values without speaking to Errorage first ~Carn +//Admin Permissions +#define R_BUILDMODE 1 +#define R_ADMIN 2 +#define R_BAN 4 +#define R_FUN 8 +#define R_SERVER 16 +#define R_DEBUG 32 +#define R_POSSESS 64 +#define R_PERMISSIONS 128 +#define R_STEALTH 256 +#define R_POLL 512 +#define R_VAREDIT 1024 +#define R_SOUNDS 2048 +#define R_SPAWN 4096 + +#if DM_VERSION > 512 +#error Remove the flag below , its been long enough +#endif +//legacy , remove post 512, it was replaced by R_POLL +#define R_REJUVINATE 2 + +#define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated. + +#define ADMIN_QUE(user) "(?)" +#define ADMIN_FLW(user) "(FLW)" +#define ADMIN_PP(user) "(PP)" +#define ADMIN_VV(atom) "(VV)" +#define ADMIN_SM(user) "(SM)" +#define ADMIN_TP(user) "(TP)" +#define ADMIN_KICK(user) "(KICK)" +#define ADMIN_CENTCOM_REPLY(user) "(RPLY)" +#define ADMIN_SYNDICATE_REPLY(user) "(RPLY)" +#define ADMIN_SC(user) "(SC)" +#define ADMIN_SMITE(user) "(SMITE)" +#define ADMIN_LOOKUP(user) "[key_name_admin(user)][ADMIN_QUE(user)]" +#define ADMIN_LOOKUPFLW(user) "[key_name_admin(user)][ADMIN_QUE(user)] [ADMIN_FLW(user)]" +#define ADMIN_SET_SD_CODE "(SETCODE)" +#define ADMIN_FULLMONTY_NONAME(user) "[ADMIN_QUE(user)] [ADMIN_PP(user)] [ADMIN_VV(user)] [ADMIN_SM(user)] [ADMIN_FLW(user)] [ADMIN_TP(user)] [ADMIN_INDIVIDUALLOG(user)] [ADMIN_SMITE(user)]" +#define ADMIN_FULLMONTY(user) "[key_name_admin(user)] [ADMIN_FULLMONTY_NONAME(user)]" +#define ADMIN_JMP(src) "(JMP)" +#define COORD(src) "[src ? "([src.x],[src.y],[src.z])" : "nonexistent location"]" +#define ADMIN_COORDJMP(src) "[src ? "[COORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]" +#define ADMIN_INDIVIDUALLOG(user) "(LOGS)" + +#define ADMIN_PUNISHMENT_LIGHTNING "Lightning bolt" +#define ADMIN_PUNISHMENT_BRAINDAMAGE "Brain damage" +#define ADMIN_PUNISHMENT_GIB "Gib" +#define ADMIN_PUNISHMENT_BSA "Bluespace Artillery Device" + +#define AHELP_ACTIVE 1 +#define AHELP_CLOSED 2 +#define AHELP_RESOLVED 3 +//A set of constants used to determine which type of mute an admin wishes to apply: +//Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO etc = (MUTE_IC << 1) //Therefore there needs to be a gap between the flags for the automute flags #define MUTE_IC 1 #define MUTE_OOC 2 diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index 7451c42cab..d51dbfd047 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -6,6 +6,7 @@ #define HIEROPHANT_ANSIBLE "hierophant_ansible" //Use this for construction-related scripture! GLOBAL_VAR_INIT(clockwork_construction_value, 0) //The total value of all structures built by the clockwork cult +GLOBAL_VAR_INIT(clockwork_caches, 0) //How many clockwork caches exist in the world (not each individual) GLOBAL_VAR_INIT(clockwork_vitality, 0) //How much Vitality is stored, total GLOBAL_VAR_INIT(clockwork_power, 0) //How many watts of power are globally available to the clockwork cult diff --git a/code/__DEFINES/configuration.dm b/code/__DEFINES/configuration.dm index c4ef8e6606..3db0ca24c2 100644 --- a/code/__DEFINES/configuration.dm +++ b/code/__DEFINES/configuration.dm @@ -1,6 +1,8 @@ //config files +#define CONFIG_DEF(X) /datum/config_entry/##X { resident_file = CURRENT_RESIDENT_FILE }; /datum/config_entry/##X #define CONFIG_GET(X) global.config.Get(/datum/config_entry/##X) #define CONFIG_SET(X, Y) global.config.Set(/datum/config_entry/##X, ##Y) +#define CONFIG_TWEAK(X) /datum/config_entry/##X #define CONFIG_MAPS_FILE "maps.txt" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index d2de6f9100..a1842648ac 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -86,7 +86,7 @@ . = SLOT_POCKET -//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. +//Bit flags_1 for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. #define HIDEGLOVES 1 #define HIDESUITSTORAGE 2 #define HIDEJUMPSUIT 4 //these first four are only used in exterior suits @@ -134,17 +134,17 @@ #define THERMAL_PROTECTION_HAND_LEFT 0.025 #define THERMAL_PROTECTION_HAND_RIGHT 0.025 -//flags for female outfits: How much the game can safely "take off" the uniform without it looking weird +//flags_1 for female outfits: How much the game can safely "take off" the uniform without it looking weird #define NO_FEMALE_UNIFORM 0 #define FEMALE_UNIFORM_FULL 1 #define FEMALE_UNIFORM_TOP 2 -//flags for alternate styles: These are hard sprited so don't set this if you didn't put the effort in +//flags_1 for alternate styles: These are hard sprited so don't set this if you didn't put the effort in #define NORMAL_STYLE 0 #define ALT_STYLE 1 #define DIGITIGRADE_STYLE 2 -//flags for outfits that have mutantrace variants (try not to use this): Currently only needed if you're trying to add tight fitting bootyshorts +//flags_1 for outfits that have mutantrace variants (try not to use this): Currently only needed if you're trying to add tight fitting bootyshorts #define NO_MUTANTRACE_VARIATION 0 #define MUTANTRACE_VARIATION 1 @@ -152,9 +152,9 @@ #define FULL_DIGITIGRADE 1 #define SQUISHED_DIGITIGRADE 2 -//flags for covering body parts +//flags_1 for covering body parts #define GLASSESCOVERSEYES 1 -#define MASKCOVERSEYES 2 // get rid of some of the other retardation in these flags +#define MASKCOVERSEYES 2 // get rid of some of the other retardation in these flags_1 #define HEADCOVERSEYES 4 // feel free to realloc these numbers for other purposes #define MASKCOVERSMOUTH 8 // on other items, these are just for mask/head #define HEADCOVERSMOUTH 16 @@ -199,8 +199,7 @@ GLOBAL_LIST_INIT(detective_vest_allowed, typecacheof(list( /obj/item/reagent_containers/spray/pepper, /obj/item/restraints/handcuffs, /obj/item/storage/fancy/cigarettes, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/plasmaman))) + /obj/item/tank/internals/emergency_oxygen))) GLOBAL_LIST_INIT(security_vest_allowed, typecacheof(list( /obj/item/ammo_box, @@ -213,8 +212,7 @@ GLOBAL_LIST_INIT(security_vest_allowed, typecacheof(list( /obj/item/melee/classic_baton/telescopic, /obj/item/reagent_containers/spray/pepper, /obj/item/restraints/handcuffs, - /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/plasmaman))) + /obj/item/tank/internals/emergency_oxygen))) GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list( /obj/item/ammo_box, @@ -229,5 +227,4 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list( /obj/item/reagent_containers/spray/pepper, /obj/item/restraints/handcuffs, /obj/item/tank/internals/emergency_oxygen, - /obj/item/tank/internals/plasmaman, /obj/item/toy))) diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index d7a5356f0f..b6133df287 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -1,52 +1,52 @@ - -//Preference toggles -#define SOUND_ADMINHELP 1 -#define SOUND_MIDI 2 -#define SOUND_AMBIENCE 4 -#define SOUND_LOBBY 8 -#define MEMBER_PUBLIC 16 -#define INTENT_STYLE 32 -#define MIDROUND_ANTAG 64 -#define SOUND_INSTRUMENTS 128 -#define SOUND_SHIP_AMBIENCE 256 -#define SOUND_PRAYERS 512 -#define ANNOUNCE_LOGIN 1024 -#define SOUND_ANNOUNCEMENTS 2048 -#define DISABLE_DEATHRATTLE 4096 -#define DISABLE_ARRIVALRATTLE 8192 - -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS) - -//Chat toggles -#define CHAT_OOC 1 -#define CHAT_DEAD 2 -#define CHAT_GHOSTEARS 4 -#define CHAT_GHOSTSIGHT 8 -#define CHAT_PRAYER 16 -#define CHAT_RADIO 32 -#define CHAT_PULLR 64 -#define CHAT_GHOSTWHISPER 128 -#define CHAT_GHOSTPDA 256 -#define CHAT_GHOSTRADIO 512 -#define CHAT_LOOC 1024 - -#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_LOOC) - -#define PARALLAX_INSANE -1 //for show offs -#define PARALLAX_HIGH 0 //default. -#define PARALLAX_MED 1 -#define PARALLAX_LOW 2 -#define PARALLAX_DISABLE 3 //this option must be the highest number - -#define PARALLAX_DELAY_DEFAULT world.tick_lag -#define PARALLAX_DELAY_MED 1 -#define PARALLAX_DELAY_LOW 2 - -#define SEC_DEPT_NONE "None" -#define SEC_DEPT_RANDOM "Random" -#define SEC_DEPT_ENGINEERING "Engineering" -#define SEC_DEPT_MEDICAL "Medical" -#define SEC_DEPT_SCIENCE "Science" + +//Preference toggles +#define SOUND_ADMINHELP 1 +#define SOUND_MIDI 2 +#define SOUND_AMBIENCE 4 +#define SOUND_LOBBY 8 +#define MEMBER_PUBLIC 16 +#define INTENT_STYLE 32 +#define MIDROUND_ANTAG 64 +#define SOUND_INSTRUMENTS 128 +#define SOUND_SHIP_AMBIENCE 256 +#define SOUND_PRAYERS 512 +#define ANNOUNCE_LOGIN 1024 +#define SOUND_ANNOUNCEMENTS 2048 +#define DISABLE_DEATHRATTLE 4096 +#define DISABLE_ARRIVALRATTLE 8192 + +#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS) + +//Chat toggles +#define CHAT_OOC 1 +#define CHAT_DEAD 2 +#define CHAT_GHOSTEARS 4 +#define CHAT_GHOSTSIGHT 8 +#define CHAT_PRAYER 16 +#define CHAT_RADIO 32 +#define CHAT_PULLR 64 +#define CHAT_GHOSTWHISPER 128 +#define CHAT_GHOSTPDA 256 +#define CHAT_GHOSTRADIO 512 +#define CHAT_LOOC 1024 + +#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_LOOC) + +#define PARALLAX_INSANE -1 //for show offs +#define PARALLAX_HIGH 0 //default. +#define PARALLAX_MED 1 +#define PARALLAX_LOW 2 +#define PARALLAX_DISABLE 3 //this option must be the highest number + +#define PARALLAX_DELAY_DEFAULT world.tick_lag +#define PARALLAX_DELAY_MED 1 +#define PARALLAX_DELAY_LOW 2 + +#define SEC_DEPT_NONE "None" +#define SEC_DEPT_RANDOM "Random" +#define SEC_DEPT_ENGINEERING "Engineering" +#define SEC_DEPT_MEDICAL "Medical" +#define SEC_DEPT_SCIENCE "Science" #define SEC_DEPT_SUPPLY "Supply" // Playtime tracking system, see jobs_exp.dm diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index e262aa2df7..edacfb836a 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -1,55 +1,5 @@ -// Radios use a large variety of predefined frequencies. +#define MIN_FREE_FREQ 1201 +#define MAX_FREE_FREQ 1599 -#define MIN_FREE_FREQ 1201 // ------------------------------------------------- -// Frequencies are always odd numbers and range from 1201 to 1599. - -#define FREQ_SYNDICATE 1213 // Nuke op comms frequency, dark brown -#define FREQ_CTF_RED 1215 // CTF red team comms frequency, red -#define FREQ_CTF_BLUE 1217 // CTF blue team comms frequency, blue -#define FREQ_CENTCOM 1337 // CentCom comms frequency, gray -#define FREQ_SUPPLY 1347 // Supply comms frequency, light brown -#define FREQ_SERVICE 1349 // Service comms frequency, green -#define FREQ_SCIENCE 1351 // Science comms frequency, plum -#define FREQ_COMMAND 1353 // Command comms frequency, gold -#define FREQ_MEDICAL 1355 // Medical comms frequency, soft blue -#define FREQ_ENGINEERING 1357 // Engineering comms frequency, orange -#define FREQ_SECURITY 1359 // Security comms frequency, red - -#define FREQ_STATUS_DISPLAYS 1435 -#define FREQ_ATMOS_ALARMS 1437 // air alarms <-> alert computers -#define FREQ_ATMOS_CONTROL 1439 // air alarms <-> vents and scrubbers - -#define MIN_FREQ 1441 // ------------------------------------------------------ -// Only the 1441 to 1489 range is freely available for general conversation. -// This represents 1/8th of the available spectrum. - -#define FREQ_ATMOS_STORAGE 1441 -#define FREQ_NAV_BEACON 1445 -#define FREQ_AI_PRIVATE 1447 // AI private comms frequency, magenta -#define FREQ_PRESSURE_PLATE 1447 -#define FREQ_AIRLOCK_CONTROL 1449 -#define FREQ_ELECTROPACK 1449 -#define FREQ_MAGNETS 1449 -#define FREQ_LOCATOR_IMPLANT 1451 -#define FREQ_SIGNALER 1457 // the default for new signalers -#define FREQ_COMMON 1459 // Common comms frequency, dark green - -#define MAX_FREQ 1489 // ------------------------------------------------------ - -#define MAX_FREE_FREQ 1599 // ------------------------------------------------- - -// Transmission types. -#define TRANSMISSION_WIRE 0 // some sort of wired connection, not used -#define TRANSMISSION_RADIO 1 // electromagnetic radiation (default) -#define TRANSMISSION_SUBSPACE 2 // subspace transmission (headsets only) - -// Filter types, used as an optimization to avoid unnecessary proc calls. -#define RADIO_TO_AIRALARM "to_airalarm" -#define RADIO_FROM_AIRALARM "from_airalarm" -#define RADIO_SIGNALER "signaler" -#define RADIO_ATMOSIA "atmosia" -#define RADIO_NAVBEACONS "navbeacons" -#define RADIO_AIRLOCK "airlock" -#define RADIO_MAGNETS "magnets" - -#define DEFAULT_SIGNALER_CODE 30 +#define MIN_FREQ 1441 +#define MAX_FREQ 1489 \ No newline at end of file diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index bb2e232886..14e6798528 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -1,8 +1,4 @@ -#define RDCONSOLE_UI_MODE_NORMAL 1 -#define RDCONSOLE_UI_MODE_EXPERT 2 -#define RDCONSOLE_UI_MODE_LIST 3 - //RDSCREEN screens #define RDSCREEN_MENU 0 #define RDSCREEN_TECHDISK 1 @@ -63,5 +59,3 @@ //#define DEPARTMENTAL_FLAG_MINING 128 #define DESIGN_ID_IGNORE "IGNORE_THIS_DESIGN" - -#define RESEARCH_MATERIAL_RECLAMATION_ID "__materials" diff --git a/code/__DEFINES/server_tools.config.dm b/code/__DEFINES/server_tools.config.dm deleted file mode 100644 index 7d3c5b8eba..0000000000 --- a/code/__DEFINES/server_tools.config.dm +++ /dev/null @@ -1,8 +0,0 @@ -#define SERVER_TOOLS_EXTERNAL_CONFIGURATION -#define SERVER_TOOLS_DEFINE_AND_SET_GLOBAL(Name, Value) GLOBAL_VAR_INIT(##Name, ##Value); GLOBAL_PROTECT(##Name) -#define SERVER_TOOLS_READ_GLOBAL(Name) GLOB.##Name -#define SERVER_TOOLS_WRITE_GLOBAL(Name, Value) GLOB.##Name = ##Value -#define SERVER_TOOLS_WORLD_ANNOUNCE(message) to_chat(world, "[html_encode(##message)]") -#define SERVER_TOOLS_LOG(message) log_world("SERVICE: [##message]") -#define SERVER_TOOLS_NOTIFY_ADMINS(event) message_admins(##event) -#define SERVER_TOOLS_CLIENT_COUNT GLOB.clients.len diff --git a/code/__DEFINES/server_tools.dm b/code/__DEFINES/server_tools.dm index a444caf02a..9547c381c1 100644 --- a/code/__DEFINES/server_tools.dm +++ b/code/__DEFINES/server_tools.dm @@ -1,29 +1,28 @@ -// /tg/station 13 server tools API -#define SERVICE_API_VERSION_STRING "3.2.0.1" +// /tg/station 13 server tools API v3.1.0.2 //CONFIGURATION //use this define if you want to do configuration outside of this file #ifndef SERVER_TOOLS_EXTERNAL_CONFIGURATION //Comment this out once you've filled in the below -#error /tg/station server tools interface unconfigured +//#error /tg/station server tools interface unconfigured //Required interfaces (fill in with your codebase equivalent): //create a global variable named `Name` and set it to `Value` //These globals must not be modifiable from anywhere outside of the server tools -#define SERVER_TOOLS_DEFINE_AND_SET_GLOBAL(Name, Value) +#define SERVER_TOOLS_DEFINE_AND_SET_GLOBAL(Name, Value) GLOBAL_VAR_INIT(##Name, ##Value); GLOBAL_PROTECT(##Name) //Read the value in the global variable `Name` -#define SERVER_TOOLS_READ_GLOBAL(Name) +#define SERVER_TOOLS_READ_GLOBAL(Name) GLOB.##Name //Set the value in the global variable `Name` to `Value` -#define SERVER_TOOLS_WRITE_GLOBAL(Name, Value) +#define SERVER_TOOLS_WRITE_GLOBAL(Name, Value) GLOB.##Name = ##Value //display an announcement `message` from the server to all players -#define SERVER_TOOLS_WORLD_ANNOUNCE(message) +#define SERVER_TOOLS_WORLD_ANNOUNCE(message) to_chat(world, "[html_encode(##message)]") //Write a string `message` to a server log -#define SERVER_TOOLS_LOG(message) +#define SERVER_TOOLS_LOG(message) log_world("SERVICE: [##message]") //Notify current in-game administrators of a string `event` -#define SERVER_TOOLS_NOTIFY_ADMINS(event) +#define SERVER_TOOLS_NOTIFY_ADMINS(event) message_admins(##event) //The current amount of connected clients -#define SERVER_TOOLS_CLIENT_COUNT +#define SERVER_TOOLS_CLIENT_COUNT GLOB.clients.len #endif //Required hooks: @@ -65,15 +64,16 @@ //IMPLEMENTATION +#define SERVICE_API_VERSION_STRING "3.1.0.2" + #define REBOOT_MODE_NORMAL 0 #define REBOOT_MODE_HARD 1 #define REBOOT_MODE_SHUTDOWN 2 #define SERVICE_WORLD_PARAM "server_service" #define SERVICE_VERSION_PARAM "server_service_version" -#define SERVICE_INSTANCE_PARAM "server_instance" #define SERVICE_PR_TEST_JSON "prtestjob.json" -#define SERVICE_INTERFACE_DLL "TGDreamDaemonBridge.dll" +#define SERVICE_INTERFACE_DLL "TGServiceInterface.dll" #define SERVICE_INTERFACE_FUNCTION "DDEntryPoint" #define SERVICE_CMD_HARD_REBOOT "hard_reboot" @@ -98,12 +98,11 @@ #define SERVICE_REQUEST_WORLD_REBOOT "worldreboot" #define SERVICE_REQUEST_API_VERSION "api_ver" -#define SERVICE_RETURN_SUCCESS "SUCCESS" - /* The MIT License -Copyright (c) 2017 Jordan Brown +Copyright (c) 2011 Dominic Tarr + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index ac081c1ca9..b961c9bd44 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -61,6 +61,7 @@ #define DOCKING_NULL_DESTINATION 8 #define DOCKING_NULL_SOURCE 16 + //Docking turf movements #define MOVE_TURF 1 #define MOVE_AREA 2 diff --git a/code/__DEFINES/sight.dm b/code/__DEFINES/sight.dm index d756cbaf1b..218afcafb7 100644 --- a/code/__DEFINES/sight.dm +++ b/code/__DEFINES/sight.dm @@ -25,6 +25,6 @@ //for clothing visor toggles, these determine which vars to toggle #define VISOR_FLASHPROTECT 1 #define VISOR_TINT 2 -#define VISOR_VISIONFLAGS 4 //all following flags only matter for glasses +#define VISOR_VISIONFLAGS 4 //all following flags_1 only matter for glasses #define VISOR_DARKNESSVIEW 8 #define VISOR_INVISVIEW 16 diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index d2993f2f13..331bc6765f 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -18,8 +18,8 @@ #define HUSK 64 #define NOCLONE 128 #define CLUMSY 256 -#define DUMB 512 -#define MONKEYLIKE 1024 //sets IsAdvancedToolUser to FALSE +#define DUMB 512 +#define MONKEYLIKE 1024 //sets IsAdvancedToolUser to FALSE // bitflags for machine stat variable #define BROKEN 1 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 3a5b0cac59..5a0dded276 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -102,4 +102,4 @@ A.overlays.Cut();\ }\ A.flags_1 &= ~OVERLAY_QUEUED_1;\ - } \ No newline at end of file + } diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index 8bc4d039f6..987d52e0cd 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -22,6 +22,6 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using #define TICKS *world.tick_lag -#define DS2TICKS(DS) ((DS)/world.tick_lag) +#define DS2TICKS(DS) (DS/world.tick_lag) -#define TICKS2DS(T) ((T) TICKS) \ No newline at end of file +#define TICKS2DS(T) (T TICKS) \ No newline at end of file diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index a9f5766eb6..3831349536 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -30,7 +30,7 @@ GLOBAL_VAR_INIT(cmp_field, "name") return sorttext(a.ckey, b.ckey) /proc/cmp_subsystem_init(datum/controller/subsystem/a, datum/controller/subsystem/b) - return initial(b.init_order) - initial(a.init_order) //uses initial() so it can be used on types + return b.init_order - a.init_order /proc/cmp_subsystem_display(datum/controller/subsystem/a, datum/controller/subsystem/b) return sorttext(b.name, a.name) @@ -72,3 +72,4 @@ GLOBAL_VAR_INIT(cmp_field, "name") /proc/cmp_profile_count_dsc(list/A, list/B) return B[PROFILE_ITEM_COUNT] - A[PROFILE_ITEM_COUNT] + diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 56a5e9b8b7..d3b62b67af 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -473,7 +473,7 @@ Proc for attack log creation, because really why not if(extra_args) new_args += extra_args - for(var/j in 1 to amount) + for(var/j in 1 to amount) var/atom/X = new spawn_type(arglist(new_args)) X.admin_spawned = admin_spawn diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index e019af213f..bfcfd23f50 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -121,6 +121,10 @@ GLOBAL_VAR(command_name) return new_station_name /proc/syndicate_name() + var/static/syndicate_name + if (syndicate_name) + return syndicate_name + var/name = "" // Prefix @@ -143,6 +147,7 @@ GLOBAL_VAR(command_name) name += pick("-", "*", "") name += pick("Tech", "Sun", "Co", "Tek", "X", "Inc", "Gen", "Star", "Dyne", "Code", "Hive") + syndicate_name = name return name diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm deleted file mode 100644 index c8710d6570..0000000000 --- a/code/__HELPERS/roundend.dm +++ /dev/null @@ -1,432 +0,0 @@ -/datum/controller/subsystem/ticker/proc/gather_roundend_feedback() - var/clients = GLOB.player_list.len - var/surviving_humans = 0 - var/surviving_total = 0 - var/ghosts = 0 - var/escaped_humans = 0 - var/escaped_total = 0 - - for(var/mob/M in GLOB.player_list) - if(ishuman(M)) - if(!M.stat) - surviving_humans++ - if(M.z == ZLEVEL_CENTCOM) - escaped_humans++ - if(!M.stat) - surviving_total++ - if(M.z == ZLEVEL_CENTCOM) - escaped_total++ - - if(isobserver(M)) - ghosts++ - - if(clients) - SSblackbox.record_feedback("nested tally", "round_end_stats", clients, list("clients")) - if(ghosts) - SSblackbox.record_feedback("nested tally", "round_end_stats", ghosts, list("ghosts")) - if(surviving_humans) - SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_humans, list("survivors", "human")) - if(surviving_total) - SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_total, list("survivors", "total")) - if(escaped_humans) - SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_humans, list("escapees", "human")) - if(escaped_total) - SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_total, list("escapees", "total")) - - gather_antag_success_rate() - -/datum/controller/subsystem/ticker/proc/gather_antag_success_rate() - var/team_gid = 1 - var/list/team_ids = list() - - for(var/datum/antagonist/A in GLOB.antagonists) - var/list/antag_info = list() - antag_info["key"] = A.owner.key - antag_info["name"] = A.owner.name - antag_info["antagonist_type"] = A.type - antag_info["antagonist_name"] = A.name //For auto and custom roles - antag_info["objectives"] = list() - antag_info["team"] = list() - var/datum/objective_team/T = A.get_team() - if(T) - antag_info["team"]["type"] = T.type - antag_info["team"]["name"] = T.name - if(!team_ids[T]) - team_ids[T] = team_gid++ - antag_info["team"]["id"] = team_ids[T] - - if(!A.owner) - continue - if(A.objectives.len) - for(var/datum/objective/O in A.objectives) - var/result = O.check_completion() ? "SUCCESS" : "FAIL" - antag_info["objectives"] += list(list("objective_type"=O.type,"text"=O.explanation_text,"result"=result)) - SSblackbox.record_feedback("associative", "antagonists", 1, antag_info) - -/datum/controller/subsystem/ticker/proc/gather_newscaster() - var/json_file = file("[GLOB.log_directory]/newscaster.json") - var/list/file_data = list() - var/pos = 1 - for(var/datum/newscaster/feed_channel/channel in GLOB.news_network.network_channels) - if(!GLOB.news_network.network_channels.len) - break - file_data["[pos]"] = list("channel name" = "[channel.channel_name]", "author" = "[channel.author]", "censored" = channel.censored ? 1 : 0, "author censored" = channel.authorCensor ? 1 : 0, "messages" = list()) - if(!channel.messages.len) - continue - for(var/datum/newscaster/feed_message/message in channel.messages) - file_data["[pos]"]["messages"] |= list("author" = "[message.author]", "time stamp" = "[message.time_stamp]", "censored" = message.bodyCensor ? 1 : 0, "author censored" = message.authorCensor ? 1 : 0, "photo file" = "[message.photo_file]", "photo caption" = "[message.caption]", "body" = "[message.body]", "comments" = list()) - if(!message.comments.len) - continue - for(var/datum/newscaster/feed_comment/comment in message.comments) - file_data["[pos]"]["messages"]["comments"] = list("author" = "[comment.author]", "time stamp" = "[comment.time_stamp]", "body" = "[comment.body]") - pos++ - if(GLOB.news_network.wanted_issue.active) - file_data["wanted"] = list("author" = "[GLOB.news_network.wanted_issue.scannedUser]", "criminal" = "[GLOB.news_network.wanted_issue.criminal]", "description" = "[GLOB.news_network.wanted_issue.body]", "photo file" = "[GLOB.news_network.wanted_issue.photo_file]") - WRITE_FILE(json_file, json_encode(file_data)) - -/datum/controller/subsystem/ticker/proc/declare_completion() - set waitfor = FALSE - - to_chat(world, "


The round has ended.") - if(LAZYLEN(GLOB.round_end_notifiees)) - send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.") - - for(var/client/C in GLOB.clients) - if(!C.credits) - C.RollCredits() - C.playtitlemusic(40) - - display_report() - - gather_roundend_feedback() - - CHECK_TICK - - //Set news report and mode result - mode.set_round_result() - - send2irc("Server", "Round just ended.") - - if(length(CONFIG_GET(keyed_string_list/cross_server))) - send_news_report() - - CHECK_TICK - - //These need update to actually reflect the real antagonists - //Print a list of antagonists to the server log - var/list/total_antagonists = list() - //Look into all mobs in world, dead or alive - for(var/datum/mind/Mind in minds) - var/temprole = Mind.special_role - if(temprole) //if they are an antagonist of some sort. - if(temprole in total_antagonists) //If the role exists already, add the name to it - total_antagonists[temprole] += ", [Mind.name]([Mind.key])" - else - total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob - total_antagonists[temprole] += ": [Mind.name]([Mind.key])" - - CHECK_TICK - - //Now print them all into the log! - log_game("Antagonists at round end were...") - for(var/i in total_antagonists) - log_game("[i]s[total_antagonists[i]].") - - CHECK_TICK - - //Collects persistence features - if(mode.allow_persistence_save) - SSpersistence.CollectData() - - //stop collecting feedback during grifftime - SSblackbox.Seal() - - sleep(50) - ready_for_reboot = TRUE - standard_reboot() - -/datum/controller/subsystem/ticker/proc/standard_reboot() - if(ready_for_reboot) - if(mode.station_was_nuked) - Reboot("Station destroyed by Nuclear Device.", "nuke") - else - Reboot("Round ended.", "proper completion") - else - CRASH("Attempted standard reboot without ticker roundend completion") - -//Common part of the report -/datum/controller/subsystem/ticker/proc/build_roundend_report() - var/list/parts = list() - - //Gamemode specific things. Should be empty most of the time. - parts += mode.special_report() - - CHECK_TICK - - //AI laws - parts += law_report() - - CHECK_TICK - - //Antagonists - parts += antag_report() - - CHECK_TICK - //Medals - parts += medal_report() - //Station Goals - parts += goal_report() - - listclearnulls(parts) - - return parts.Join() - - -/datum/controller/subsystem/ticker/proc/survivor_report() - var/list/parts = list() - var/station_evacuated = EMERGENCY_ESCAPED_OR_ENDGAMED - var/num_survivors = 0 - var/num_escapees = 0 - var/num_shuttle_escapees = 0 - - //Player status report - for(var/i in GLOB.mob_list) - var/mob/Player = i - if(Player.mind && !isnewplayer(Player)) - if(Player.stat != DEAD && !isbrain(Player)) - num_survivors++ - if(station_evacuated) //If the shuttle has already left the station - var/list/area/shuttle_areas - if(SSshuttle && SSshuttle.emergency) - shuttle_areas = SSshuttle.emergency.shuttle_areas - if(Player.onCentCom() || Player.onSyndieBase()) - num_escapees++ - if(shuttle_areas[get_area(Player)]) - num_shuttle_escapees++ - - //Round statistics report - var/datum/station_state/end_state = new /datum/station_state() - end_state.count() - var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100) - - parts += "[GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]" - parts += "[GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]" - var/total_players = GLOB.joined_player_list.len - if(total_players) - parts+= "[GLOB.TAB]Total Population: [total_players]" - if(station_evacuated) - parts += "
[GLOB.TAB]Evacuation Rate: [num_escapees] ([PERCENT(num_escapees/total_players)]%)" - parts += "[GLOB.TAB](on emergency shuttle): [num_shuttle_escapees] ([PERCENT(num_shuttle_escapees/total_players)]%)" - parts += "[GLOB.TAB]Survival Rate: [num_survivors] ([PERCENT(num_survivors/total_players)]%)" - return parts.Join("
") - -/datum/controller/subsystem/ticker/proc/show_roundend_report(client/C,common_report) - var/list/report_parts = list() - - report_parts += personal_report(C) - report_parts += common_report - - var/datum/browser/roundend_report = new(C, "roundend") - roundend_report.width = 800 - roundend_report.height = 600 - roundend_report.set_content(report_parts.Join()) - roundend_report.stylesheets = list() - roundend_report.add_stylesheet("roundend",'html/browser/roundend.css') - - roundend_report.open(0) - -/datum/controller/subsystem/ticker/proc/personal_report(client/C) - var/list/parts = list() - var/mob/M = C.mob - if(M.mind && !isnewplayer(M)) - if(M.stat != DEAD && !isbrain(M)) - if(EMERGENCY_ESCAPED_OR_ENDGAMED) - if(!M.onCentCom() || !M.onSyndieBase()) - parts += "
" - parts += "You managed to survive, but were marooned on [station_name()]..." - else - parts += "
" - parts += "You managed to survive the events on [station_name()] as [M.real_name]." - else - parts += "
" - parts += "You managed to survive the events on [station_name()] as [M.real_name]." - - else - parts += "
" - parts += "You did not survive the events on [station_name()]..." - else - parts += "
" - parts += "
" - if(GLOB.survivor_report) - parts += GLOB.survivor_report - else - parts += survivor_report() - - parts += "
" - - return parts.Join() - -/datum/controller/subsystem/ticker/proc/display_report() - GLOB.common_report = build_roundend_report() - for(var/client/C in GLOB.clients) - show_roundend_report(C,GLOB.common_report) - give_show_report_button(C) - CHECK_TICK - -/datum/controller/subsystem/ticker/proc/law_report() - var/list/parts = list() - //Silicon laws report - for (var/i in GLOB.ai_list) - var/mob/living/silicon/ai/aiPlayer = i - if(aiPlayer.mind) - parts += "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws [aiPlayer.stat != DEAD ? "at the end of the round" : "when it was deactivated"] were:" - parts += aiPlayer.laws.get_law_list(include_zeroth=TRUE) - - parts += "Total law changes: [aiPlayer.law_change_counter]" - - if (aiPlayer.connected_robots.len) - var/robolist = "[aiPlayer.real_name]'s minions were: " - for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots) - if(robo.mind) - robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.mind.key]), ":" (Played by: [robo.mind.key]), "]" - parts += "[robolist]" - - for (var/mob/living/silicon/robot/robo in GLOB.silicon_mobs) - if (!robo.connected_ai && robo.mind) - if (robo.stat != DEAD) - parts += "[robo.name] (Played by: [robo.mind.key]) survived as an AI-less borg! Its laws were:" - else - parts += "[robo.name] (Played by: [robo.mind.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:" - - if(robo) //How the hell do we lose robo between here and the world messages directly above this? - parts += robo.laws.get_law_list(include_zeroth=TRUE) - if(parts.len) - return "
[parts.Join("
")]
" - else - return "" - -/datum/controller/subsystem/ticker/proc/goal_report() - var/list/parts = list() - if(mode.station_goals.len) - for(var/V in mode.station_goals) - var/datum/station_goal/G = V - parts += G.get_result() - return "
    [parts.Join()]
" - -/datum/controller/subsystem/ticker/proc/medal_report() - if(GLOB.commendations.len) - var/list/parts = list() - parts += "Medal Commendations:" - for (var/com in GLOB.commendations) - parts += com - return "
[parts.Join("
")]
" - return "" - -/datum/controller/subsystem/ticker/proc/antag_report() - var/list/result = list() - var/list/all_teams = list() - var/list/all_antagonists = list() - - for(var/datum/antagonist/A in GLOB.antagonists) - all_teams |= A.get_team() - all_antagonists += A - - for(var/datum/objective_team/T in all_teams) - result += T.roundend_report() - for(var/datum/antagonist/X in all_antagonists) - if(X.get_team() == T) - all_antagonists -= X - result += " "//newline between teams - - var/currrent_category - var/datum/antagonist/previous_category - - sortTim(all_antagonists, /proc/cmp_antag_category) - - for(var/datum/antagonist/A in all_antagonists) - if(!A.show_in_roundend) - continue - if(A.roundend_category != currrent_category) - if(previous_category) - result += previous_category.roundend_report_footer() - result += "
" - result += "
" - result += A.roundend_report_header() - currrent_category = A.roundend_category - previous_category = A - result += A.roundend_report() - result += "

" - - if(all_antagonists.len) - var/datum/antagonist/last = all_antagonists[all_antagonists.len] - result += last.roundend_report_footer() - result += "
" - - return result.Join() - -/proc/cmp_antag_category(datum/antagonist/A,datum/antagonist/B) - return sorttext(B.roundend_category,A.roundend_category) - - -/datum/controller/subsystem/ticker/proc/give_show_report_button(client/C) - var/datum/action/report/R = new - C.player_details.player_actions += R - R.Grant(C.mob) - to_chat(C,"Show roundend report again") - -/datum/action/report - name = "Show roundend report" - button_icon_state = "vote" - -/datum/action/report/Trigger() - if(owner && GLOB.common_report && SSticker.current_state == GAME_STATE_FINISHED) - SSticker.show_roundend_report(owner.client,GLOB.common_report) - -/datum/action/report/IsAvailable() - return 1 - -/datum/action/report/Topic(href,href_list) - if(usr != owner) - return - if(href_list["report"]) - Trigger() - return - - -/proc/printplayer(datum/mind/ply, fleecheck) - var/text = "[ply.key] was [ply.name] the [ply.assigned_role] and" - if(ply.current) - if(ply.current.stat == DEAD) - text += " died" - else - text += " survived" - if(fleecheck) - var/turf/T = get_turf(ply.current) - if(!T || !(T.z in GLOB.station_z_levels)) - text += " while fleeing the station" - if(ply.current.real_name != ply.name) - text += " as [ply.current.real_name]" - else - text += " had their body destroyed" - return text - -/proc/printplayerlist(list/players,fleecheck) - var/list/parts = list() - - parts += "
    " - for(var/datum/mind/M in players) - parts += "
  • [printplayer(M,fleecheck)]
  • " - parts += "
" - return parts.Join() - - -/proc/printobjectives(datum/mind/ply) - var/list/objective_parts = list() - var/count = 1 - for(var/datum/objective/objective in ply.objectives) - if(objective.check_completion()) - objective_parts += "Objective #[count]: [objective.explanation_text] Success!" - else - objective_parts += "Objective #[count]: [objective.explanation_text] Fail." - count++ - return objective_parts.Join("
") diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 2eeee95d09..bae773b27e 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -139,6 +139,7 @@ return NORTH //returns the north-zero clockwise angle in degrees, given a direction + /proc/dir2angle(D) switch(D) if(NORTH) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index da7d2134a1..9ec23fa966 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -199,8 +199,6 @@ Turf and target are separate in case you want to teleport some distance from a t newname = C.prefs.custom_names[role] else switch(role) - if("human") - newname = random_unique_name(gender) if("clown") newname = pick(GLOB.clown_names) if("mime") @@ -526,7 +524,7 @@ Turf and target are separate in case you want to teleport some distance from a t processing_list.Cut(1, 2) //Byond does not allow things to be in multiple contents, or double parent-child hierarchies, so only += is needed //This is also why we don't need to check against assembled as we go along - processing_list += A.contents + processing_list += A.contents assembled += A return assembled @@ -1494,7 +1492,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) var/time_low = num2hex(world.time, 3) var/time_clock = num2hex(TICK_DELTA_TO_MS(world.tick_usage), 3) - return "{[time_high]-[time_mid]-[GUID_VERSION][time_low]-[GUID_VARIANT][time_clock]-[node_id]}" // \ref behaviour got changed in 512 so this is necesary to replicate old behaviour. diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index 3822f7077d..9c3af923f1 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -1,12 +1,18 @@ GLOBAL_VAR_INIT(master_mode, "traitor") //"extended" GLOBAL_VAR_INIT(secret_force_mode, "secret") // if this is anything but "secret", the secret rotation will forceably choose this mode -GLOBAL_VAR(common_report) //Contains commmon part of roundend report -GLOBAL_VAR(survivor_report) //Contains shared surivor report for roundend report (part of personal report) - GLOBAL_VAR_INIT(wavesecret, 0) // meteor mode, delays wave progression, terrible name GLOBAL_DATUM(start_state, /datum/station_state) // Used in round-end report - -//TODO clear this one up too -GLOBAL_DATUM(cult_narsie, /obj/singularity/narsie/large/cult) \ No newline at end of file +// Cult, needs to be global so admin cultists are functional +GLOBAL_VAR_INIT(blood_target, null) // Cult Master's target or Construct's Master +GLOBAL_DATUM(blood_target_image, /image) +GLOBAL_VAR_INIT(blood_target_reset_timer, null) +GLOBAL_DATUM(sac_mind, /datum/mind) +GLOBAL_VAR_INIT(sac_image, null) +GLOBAL_VAR_INIT(cult_vote_called, FALSE) +GLOBAL_VAR_INIT(cult_mastered, FALSE) +GLOBAL_VAR_INIT(reckoning_complete, FALSE) +GLOBAL_VAR_INIT(sac_complete, FALSE) +GLOBAL_DATUM(cult_narsie, /obj/singularity/narsie/large/cult) +GLOBAL_LIST_EMPTY(summon_spots) \ No newline at end of file diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 8b8b817586..bb86b4cbb0 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -16,5 +16,3 @@ GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a perce GLOBAL_LIST_EMPTY(powernets) GLOBAL_VAR_INIT(bsa_unlock, FALSE) //BSA unlocked by head ID swipes - -GLOBAL_LIST_EMPTY(player_details) // ckey -> /datum/player_details \ No newline at end of file diff --git a/code/_js/byjax.dm b/code/_js/byjax.dm index 9d96bbc412..5557440d32 100644 --- a/code/_js/byjax.dm +++ b/code/_js/byjax.dm @@ -45,4 +45,3 @@ Be sure to include required js functions in your page, or it'll raise an excepti receiver << output(argums,"[control_id]:replaceContent") return - diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 6d941589d3..dc06d17819 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -104,7 +104,7 @@ #define ui_health "EAST-1:28,CENTER-1:15" #define ui_internal "EAST-1:28,CENTER:17" -//borgs +//borgs #define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. //aliens diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 2ad2eb76f5..0006d72d3b 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -302,41 +302,32 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /obj/screen/alert/bloodsense/process() var/atom/blood_target - - var/datum/antagonist/cult/antag = mob_viewer.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(!antag) - return - var/datum/objective/sacrifice/sac_objective = locate() in antag.cult_team.objectives - - if(antag.cult_team.blood_target) - if(!get_turf(antag.cult_team.blood_target)) - antag.cult_team.blood_target = null + if(GLOB.blood_target) + if(!get_turf(GLOB.blood_target)) + GLOB.blood_target = null else - blood_target = antag.cult_team.blood_target + blood_target = GLOB.blood_target if(Cviewer && Cviewer.seeking && Cviewer.master) blood_target = Cviewer.master desc = "Your blood sense is leading you to [Cviewer.master]" if(!blood_target) - if(sac_objective && !sac_objective.check_completion()) + if(!GLOB.sac_complete) if(icon_state == "runed_sense0") return animate(src, transform = null, time = 1, loop = 0) angle = 0 cut_overlays() icon_state = "runed_sense0" - desc = "Nar-Sie demands that [sac_objective.target] be sacrificed before the summoning ritual can begin." - add_overlay(sac_objective.sac_image) + desc = "Nar-Sie demands that [GLOB.sac_mind] be sacrificed before the summoning ritual can begin." + add_overlay(GLOB.sac_image) else - var/datum/objective/eldergod/summon_objective = locate() in antag.cult_team.objectives - if(!summon_objective) - return if(icon_state == "runed_sense1") return animate(src, transform = null, time = 1, loop = 0) angle = 0 cut_overlays() icon_state = "runed_sense1" - desc = "The sacrifice is complete, summon Nar-Sie! The summoning can only take place in [english_list(summon_objective.summon_spots)]!" + desc = "The sacrifice is complete, summon Nar-Sie! The summoning can only take place in [english_list(GLOB.summon_spots)]!" add_overlay(narnar) return var/turf/P = get_turf(blood_target) @@ -397,13 +388,11 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." desc = "CHETR
NYY
HAGEHUGF-NAQ-UBABE
RATVAR.
" else var/servants = 0 - var/list/textlist = list() + var/list/textlist for(var/mob/living/L in GLOB.alive_mob_list) if(is_servant_of_ratvar(L)) servants++ - var/datum/antagonist/clockcult/C = mob_viewer.mind.has_antag_datum(/datum/antagonist/clockcult,TRUE) - if(C && C.clock_team) - textlist += "[C.clock_team.eminence ? "There is an Eminence." : "There is no Eminence! Get one ASAP!"]
" + textlist = list("[SSticker.mode.eminence ? "There is an Eminence." : "There is no Eminence! Get one ASAP!"]
") textlist += "There are currently [servants] servant[servants > 1 ? "s" : ""] of Ratvar.
" for(var/i in SSticker.scripture_states) if(i != SCRIPTURE_DRIVER) //ignore the always-unlocked stuff diff --git a/code/_onclick/hud/credits.dm b/code/_onclick/hud/credits.dm deleted file mode 100644 index dfdbf390c1..0000000000 --- a/code/_onclick/hud/credits.dm +++ /dev/null @@ -1,69 +0,0 @@ -#define CREDIT_ROLL_SPEED 125 -#define CREDIT_SPAWN_SPEED 10 -#define CREDIT_ANIMATE_HEIGHT (14 * world.icon_size) -#define CREDIT_EASE_DURATION 22 -#define CREDITS_PATH "[GLOB.config_dir]contributors.dmi" - -/client/proc/RollCredits() - set waitfor = FALSE - if(!fexists(CREDITS_PATH)) - return - var/icon/credits_icon = new(CREDITS_PATH) - LAZYINITLIST(credits) - var/list/_credits = credits - verbs += /client/proc/ClearCredits - var/static/list/credit_order_for_this_round - if(isnull(credit_order_for_this_round)) - credit_order_for_this_round = list("Thanks for playing!") + (shuffle(icon_states(credits_icon)) - "Thanks for playing!") - for(var/I in credit_order_for_this_round) - if(!credits) - return - _credits += new /obj/screen/credit(null, I, src, credits_icon) - sleep(CREDIT_SPAWN_SPEED) - sleep(CREDIT_ROLL_SPEED - CREDIT_SPAWN_SPEED) - verbs -= /client/proc/ClearCredits - qdel(credits_icon) - -/client/proc/ClearCredits() - set name = "Hide Credits" - set category = "OOC" - verbs -= /client/proc/ClearCredits - QDEL_LIST(credits) - credits = null - -/obj/screen/credit - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - alpha = 0 - screen_loc = "12,1" - layer = SPLASHSCREEN_LAYER - var/client/parent - var/matrix/target - -/obj/screen/credit/Initialize(mapload, credited, client/P, icon/I) - . = ..() - icon = I - parent = P - icon_state = credited - maptext = credited - maptext_x = world.icon_size + 8 - maptext_y = (world.icon_size / 2) - 4 - maptext_width = world.icon_size * 3 - var/matrix/M = matrix(transform) - M.Translate(0, CREDIT_ANIMATE_HEIGHT) - animate(src, transform = M, time = CREDIT_ROLL_SPEED) - target = M - animate(src, alpha = 255, time = CREDIT_EASE_DURATION, flags = ANIMATION_PARALLEL) - addtimer(CALLBACK(src, .proc/FadeOut), CREDIT_ROLL_SPEED - CREDIT_EASE_DURATION) - QDEL_IN(src, CREDIT_ROLL_SPEED) - P.screen += src - -/obj/screen/credit/Destroy() - var/client/P = parent - P.screen -= src - icon = null - LAZYREMOVE(P.credits, src) - parent = null - return ..() - -/obj/screen/credit/proc/FadeOut() - animate(src, alpha = 0, transform = target, time = CREDIT_EASE_DURATION) diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 65c4bd23c2..2047225589 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -1,4 +1,3 @@ - /mob var/list/screens = list() @@ -175,3 +174,4 @@ layer = LIGHTING_LAYER blend_mode = BLEND_ADD show_when_dead = TRUE + diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 87354d6f0b..903f3c0790 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -78,7 +78,7 @@ var/mob/living/carbon/tk_user = null /obj/item/tk_grab/Initialize() - . = ..() + ..() START_PROCESSING(SSfastprocess, src) /obj/item/tk_grab/Destroy() diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 28643bea20..92dcb9baf0 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -9,7 +9,7 @@ var/value var/default //read-only, just set value directly - var/resident_file //the file which this was loaded from, if any + var/resident_file //the file which this belongs to, must be set var/modified = FALSE //set to TRUE if the default has been overridden by a config entry var/protection = NONE @@ -18,6 +18,8 @@ var/dupes_allowed = FALSE /datum/config_entry/New() + if(!resident_file) + CRASH("Config entry [type] has no resident_file set") if(type == abstract_type) CRASH("Abstract config entry [type] instatiated!") name = lowertext(type2top(type)) @@ -53,9 +55,8 @@ . = !(IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "ValidateAndSet" && GLOB.LastAdminCalledTargetRef == "[REF(src)]") if(!.) log_admin_private("Config set of [type] to [str_val] attempted by [key_name(usr)]") - + /datum/config_entry/proc/ValidateAndSet(str_val) - VASProcCallGuard(str_val) CRASH("Invalid config entry type!") /datum/config_entry/proc/ValidateKeyedList(str_val, list_mode, splitter) @@ -79,12 +80,12 @@ if(LIST_MODE_TEXT) temp = key_value continue_check = temp - if(continue_check && ValidateListEntry(key_name, temp)) + if(continue_check && ValidateKeyName(key_name)) value[key_name] = temp return TRUE return FALSE -/datum/config_entry/proc/ValidateListEntry(key_name, key_value) +/datum/config_entry/proc/ValidateKeyName(key_name) return TRUE /datum/config_entry/string @@ -96,8 +97,6 @@ return var_name != "auto_trim" && ..() /datum/config_entry/string/ValidateAndSet(str_val) - if(!VASProcCallGuard(str_val)) - return FALSE value = auto_trim ? trim(str_val) : str_val return TRUE @@ -109,8 +108,6 @@ var/min_val = -INFINITY /datum/config_entry/number/ValidateAndSet(str_val) - if(!VASProcCallGuard(str_val)) - return FALSE var/temp = text2num(trim(str_val)) if(!isnull(temp)) value = Clamp(integer ? round(temp) : temp, min_val, max_val) @@ -128,8 +125,6 @@ abstract_type = /datum/config_entry/flag /datum/config_entry/flag/ValidateAndSet(str_val) - if(!VASProcCallGuard(str_val)) - return FALSE value = text2num(trim(str_val)) != 0 return TRUE @@ -138,8 +133,6 @@ value = list() /datum/config_entry/number_list/ValidateAndSet(str_val) - if(!VASProcCallGuard(str_val)) - return FALSE str_val = trim(str_val) var/list/new_list = list() var/list/values = splittext(str_val," ") @@ -159,8 +152,6 @@ dupes_allowed = TRUE /datum/config_entry/keyed_flag_list/ValidateAndSet(str_val) - if(!VASProcCallGuard(str_val)) - return FALSE return ValidateKeyedList(str_val, LIST_MODE_FLAG, " ") /datum/config_entry/keyed_number_list @@ -173,8 +164,6 @@ return var_name != "splitter" && ..() /datum/config_entry/keyed_number_list/ValidateAndSet(str_val) - if(!VASProcCallGuard(str_val)) - return FALSE return ValidateKeyedList(str_val, LIST_MODE_NUM, splitter) /datum/config_entry/keyed_string_list @@ -187,8 +176,6 @@ return var_name != "splitter" && ..() /datum/config_entry/keyed_string_list/ValidateAndSet(str_val) - if(!VASProcCallGuard(str_val)) - return FALSE return ValidateKeyedList(str_val, LIST_MODE_TEXT, splitter) #undef LIST_MODE_NUM diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index f411bd65d3..e9c0aa71b8 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -20,13 +20,10 @@ GLOBAL_PROTECT(config_dir) /datum/controller/configuration/New() config = src - InitEntries() + var/list/config_files = InitEntries() LoadModes() - if(!LoadEntries("config.txt")) - log_config("No $include directives found in config.txt! Loading legacy game_options/dbconfig/comms files...") - LoadEntries("game_options.txt") - LoadEntries("dbconfig.txt") - LoadEntries("comms.txt") + for(var/I in config_files) + LoadEntries(I) loadmaplist(CONFIG_MAPS_FILE) /datum/controller/configuration/Destroy() @@ -45,6 +42,8 @@ GLOBAL_PROTECT(config_dir) var/list/_entries_by_type = list() entries_by_type = _entries_by_type + . = list() + for(var/I in typesof(/datum/config_entry)) //typesof is faster in this case var/datum/config_entry/E = I if(initial(E.abstract_type) == I) @@ -58,30 +57,24 @@ GLOBAL_PROTECT(config_dir) continue _entries[esname] = E _entries_by_type[I] = E + .[E.resident_file] = TRUE /datum/controller/configuration/proc/RemoveEntry(datum/config_entry/CE) entries -= CE.name entries_by_type -= CE.type -/datum/controller/configuration/proc/LoadEntries(filename, list/stack = list()) - var/filename_to_test = world.system_type == MS_WINDOWS ? lowertext(filename) : filename - if(filename_to_test in stack) - log_config("Warning: Config recursion detected ([english_list(stack)]), breaking!") - return - stack = stack + filename_to_test - +/datum/controller/configuration/proc/LoadEntries(filename) log_config("Loading config file [filename]...") var/list/lines = world.file2list("[GLOB.config_dir][filename]") var/list/_entries = entries for(var/L in lines) if(!L) continue - - var/firstchar = copytext(L, 1, 2) - if(firstchar == "#") + + if(copytext(L, 1, 2) == "#") continue - var/lockthis = firstchar == "@" + var/lockthis = copytext(L, 1, 2) == "@" if(lockthis) L = copytext(L, 2) @@ -98,17 +91,14 @@ GLOBAL_PROTECT(config_dir) if(!entry) continue - if(entry == "$include") - if(!value) - log_config("Warning: Invalid $include directive: [value]") - else - LoadEntries(value, stack) - continue - var/datum/config_entry/E = _entries[entry] if(!E) log_config("Unknown setting in configuration: '[entry]'") continue + + if(filename != E.resident_file) + log_config("Found [entry] in [filename] when it should have been in [E.resident_file]! Ignoring.") + continue if(lockthis) E.protection |= CONFIG_ENTRY_LOCKED @@ -117,14 +107,10 @@ GLOBAL_PROTECT(config_dir) if(!validated) log_config("Failed to validate setting \"[value]\" for [entry]") else if(E.modified && !E.dupes_allowed) - log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.") - - E.resident_file = filename + log_config("Duplicate setting for [entry] ([value]) detected! Using latest.") if(validated) E.modified = TRUE - - . = TRUE /datum/controller/configuration/can_vv_get(var_name) return (var_name != "entries_by_type" || !hiding_entries_by_type) && ..() diff --git a/code/controllers/configuration/entries/comms.dm b/code/controllers/configuration/entries/comms.dm index e720ed93fd..bf099f6cb6 100644 --- a/code/controllers/configuration/entries/comms.dm +++ b/code/controllers/configuration/entries/comms.dm @@ -1,28 +1,22 @@ -/datum/config_entry/string/comms_key +#define CURRENT_RESIDENT_FILE "comms.txt" + +CONFIG_DEF(string/comms_key) protection = CONFIG_ENTRY_HIDDEN /datum/config_entry/string/comms_key/ValidateAndSet(str_val) - return str_val != "default_pwd" && length(str_val) > 6 && ..() + return str_val != "default_pwd" && length(str_val) > 6 && ..() -/datum/config_entry/keyed_string_list/cross_server +CONFIG_DEF(string/cross_server_address) protection = CONFIG_ENTRY_LOCKED -/datum/config_entry/keyed_string_list/cross_server/ValidateAndSet(str_val) - . = ..() - if(.) - var/list/newv = list() - for(var/I in value) - newv[replacetext(I, "+", " ")] = value[I] - value = newv +/datum/config_entry/string/cross_server_address/ValidateAndSet(str_val) + return str_val != "byond:\\address:port" && ..() -/datum/config_entry/keyed_string_list/cross_server/ValidateListEntry(key_name, key_value) - return key_value != "byond:\\address:port" && ..() - -/datum/config_entry/string/cross_comms_name +CONFIG_DEF(string/cross_comms_name) GLOBAL_VAR_INIT(medals_enabled, TRUE) //will be auto set to false if the game fails contacting the medal hub to prevent unneeded calls. -/datum/config_entry/string/medal_hub_address +CONFIG_DEF(string/medal_hub_address) -/datum/config_entry/string/medal_hub_password +CONFIG_DEF(string/medal_hub_password) protection = CONFIG_ENTRY_HIDDEN \ No newline at end of file diff --git a/code/controllers/configuration/entries/dbconfig.dm b/code/controllers/configuration/entries/dbconfig.dm index 1ac4d85419..c46880686a 100644 --- a/code/controllers/configuration/entries/dbconfig.dm +++ b/code/controllers/configuration/entries/dbconfig.dm @@ -1,26 +1,28 @@ -/datum/config_entry/flag/sql_enabled // for sql switching +#define CURRENT_RESIDENT_FILE "dbconfig.txt" + +CONFIG_DEF(flag/sql_enabled) // for sql switching protection = CONFIG_ENTRY_LOCKED -/datum/config_entry/string/address +CONFIG_DEF(string/address) value = "localhost" protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN -/datum/config_entry/number/port +CONFIG_DEF(number/port) value = 3306 min_val = 0 max_val = 65535 protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN -/datum/config_entry/string/feedback_database +CONFIG_DEF(string/feedback_database) value = "test" protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN -/datum/config_entry/string/feedback_login +CONFIG_DEF(string/feedback_login) value = "root" protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN -/datum/config_entry/string/feedback_password +CONFIG_DEF(string/feedback_password) protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN -/datum/config_entry/string/feedback_tableprefix +CONFIG_DEF(string/feedback_tableprefix) protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 0f7e65ec13..b04d7845f5 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -1,253 +1,253 @@ -/datum/config_entry/number_list/repeated_mode_adjust +#define CURRENT_RESIDENT_FILE "game_options.txt" -/datum/config_entry/keyed_number_list/probability +CONFIG_DEF(number_list/repeated_mode_adjust) -/datum/config_entry/keyed_number_list/probability/ValidateListEntry(key_name) +CONFIG_DEF(keyed_number_list/probability) + +/datum/config_entry/keyed_number_list/probability/ValidateKeyName(key_name) return key_name in config.modes -/datum/config_entry/keyed_number_list/max_pop +CONFIG_DEF(keyed_number_list/max_pop) -/datum/config_entry/keyed_number_list/max_pop/ValidateListEntry(key_name) +/datum/config_entry/keyed_number_list/max_pop/ValidateKeyName(key_name) return key_name in config.modes -/datum/config_entry/keyed_number_list/min_pop +CONFIG_DEF(keyed_number_list/min_pop) -/datum/config_entry/keyed_number_list/min_pop/ValidateListEntry(key_name, key_value) +/datum/config_entry/keyed_number_list/min_pop/ValidateKeyName(key_name) return key_name in config.modes -/datum/config_entry/keyed_flag_list/continuous // which roundtypes continue if all antagonists die +CONFIG_DEF(keyed_flag_list/continuous) // which roundtypes continue if all antagonists die -/datum/config_entry/keyed_flag_list/continuous/ValidateListEntry(key_name, key_value) +/datum/config_entry/keyed_flag_list/continuous/ValidateKeyName(key_name) return key_name in config.modes -/datum/config_entry/keyed_flag_list/midround_antag // which roundtypes use the midround antagonist system +CONFIG_DEF(keyed_flag_list/midround_antag) // which roundtypes use the midround antagonist system -/datum/config_entry/keyed_flag_list/midround_antag/ValidateListEntry(key_name, key_value) +/datum/config_entry/keyed_flag_list/midround_antag/ValidateKeyName(key_name) return key_name in config.modes -/datum/config_entry/keyed_string_list/policy +CONFIG_DEF(keyed_string_list/policy) -/datum/config_entry/number/damage_multiplier +CONFIG_DEF(number/damage_multiplier) value = 1 integer = FALSE -/datum/config_entry/number/minimal_access_threshold //If the number of players is larger than this threshold, minimal access will be turned on. +CONFIG_DEF(number/minimal_access_threshold) //If the number of players is larger than this threshold, minimal access will be turned on. min_val = 0 -/datum/config_entry/flag/jobs_have_minimal_access //determines whether jobs use minimal access or expanded access. +CONFIG_DEF(flag/jobs_have_minimal_access) //determines whether jobs use minimal access or expanded access. -/datum/config_entry/flag/assistants_have_maint_access +CONFIG_DEF(flag/assistants_have_maint_access) -/datum/config_entry/flag/security_has_maint_access +CONFIG_DEF(flag/security_has_maint_access) -/datum/config_entry/flag/everyone_has_maint_access +CONFIG_DEF(flag/everyone_has_maint_access) -/datum/config_entry/flag/sec_start_brig //makes sec start in brig instead of dept sec posts +CONFIG_DEF(flag/sec_start_brig) //makes sec start in brig instead of dept sec posts -/datum/config_entry/flag/force_random_names +CONFIG_DEF(flag/force_random_names) -/datum/config_entry/flag/humans_need_surnames +CONFIG_DEF(flag/humans_need_surnames) -/datum/config_entry/flag/allow_ai // allow ai job +CONFIG_DEF(flag/allow_ai) // allow ai job -/datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen. +CONFIG_DEF(flag/disable_secborg) // disallow secborg module to be chosen. -/datum/config_entry/flag/disable_peaceborg +CONFIG_DEF(flag/disable_peaceborg) -/datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors +CONFIG_DEF(number/traitor_scaling_coeff) //how much does the amount of players get divided by to determine traitors value = 6 min_val = 1 -/datum/config_entry/number/brother_scaling_coeff //how many players per brother team +CONFIG_DEF(number/brother_scaling_coeff) //how many players per brother team value = 25 min_val = 1 -/datum/config_entry/number/changeling_scaling_coeff //how much does the amount of players get divided by to determine changelings +CONFIG_DEF(number/changeling_scaling_coeff) //how much does the amount of players get divided by to determine changelings value = 6 min_val = 1 -/datum/config_entry/number/security_scaling_coeff //how much does the amount of players get divided by to determine open security officer positions +CONFIG_DEF(number/security_scaling_coeff) //how much does the amount of players get divided by to determine open security officer positions value = 8 min_val = 1 -/datum/config_entry/number/abductor_scaling_coeff //how many players per abductor team +CONFIG_DEF(number/abductor_scaling_coeff) //how many players per abductor team value = 15 min_val = 1 -/datum/config_entry/number/traitor_objectives_amount +CONFIG_DEF(number/traitor_objectives_amount) value = 2 min_val = 0 -/datum/config_entry/number/brother_objectives_amount +CONFIG_DEF(number/brother_objectives_amount) value = 2 min_val = 0 -/datum/config_entry/flag/reactionary_explosions //If we use reactionary explosions, explosions that react to walls and doors +CONFIG_DEF(flag/reactionary_explosions) //If we use reactionary explosions, explosions that react to walls and doors -/datum/config_entry/flag/protect_roles_from_antagonist //If security and such can be traitor/cult/other +CONFIG_DEF(flag/protect_roles_from_antagonist) //If security and such can be traitor/cult/other -/datum/config_entry/flag/protect_assistant_from_antagonist //If assistants can be traitor/cult/other +CONFIG_DEF(flag/protect_assistant_from_antagonist) //If assistants can be traitor/cult/other -/datum/config_entry/flag/enforce_human_authority //If non-human species are barred from joining as a head of staff +CONFIG_DEF(flag/enforce_human_authority) //If non-human species are barred from joining as a head of staff -/datum/config_entry/flag/allow_latejoin_antagonists // If late-joining players can be traitor/changeling +CONFIG_DEF(flag/allow_latejoin_antagonists) // If late-joining players can be traitor/changeling -/datum/config_entry/number/midround_antag_time_check // How late (in minutes you want the midround antag system to stay on, setting this to 0 will disable the system) +CONFIG_DEF(number/midround_antag_time_check) // How late (in minutes) you want the midround antag system to stay on, setting this to 0 will disable the system value = 60 min_val = 0 -/datum/config_entry/number/midround_antag_life_check // A ratio of how many people need to be alive in order for the round not to immediately end in midround antagonist +CONFIG_DEF(number/midround_antag_life_check) // A ratio of how many people need to be alive in order for the round not to immediately end in midround antagonist value = 0.7 integer = FALSE min_val = 0 max_val = 1 -/datum/config_entry/number/shuttle_refuel_delay +CONFIG_DEF(number/shuttle_refuel_delay) value = 12000 min_val = 0 -/datum/config_entry/flag/show_game_type_odds //if set this allows players to see the odds of each roundtype on the get revision screen +CONFIG_DEF(flag/show_game_type_odds) //if set this allows players to see the odds of each roundtype on the get revision screen -/datum/config_entry/keyed_flag_list/roundstart_races //races you can play as from the get go. +CONFIG_DEF(keyed_flag_list/roundstart_races) //races you can play as from the get go. -/datum/config_entry/flag/join_with_mutant_humans //players can pick mutant bodyparts for humans before joining the game +CONFIG_DEF(flag/join_with_mutant_humans) //players can pick mutant bodyparts for humans before joining the game -/datum/config_entry/flag/no_summon_guns //No +CONFIG_DEF(flag/no_summon_guns) //No -/datum/config_entry/flag/no_summon_magic //Fun +CONFIG_DEF(flag/no_summon_magic) //Fun -/datum/config_entry/flag/no_summon_events //Allowed +CONFIG_DEF(flag/no_summon_events) //Allowed -/datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overriden by gamemodes. +CONFIG_DEF(flag/no_intercept_report) //Whether or not to send a communications intercept report roundstart. This may be overriden by gamemodes. -/datum/config_entry/number/arrivals_shuttle_dock_window //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station +CONFIG_DEF(number/arrivals_shuttle_dock_window) //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station value = 55 min_val = 30 -/datum/config_entry/flag/arrivals_shuttle_require_undocked //Require the arrivals shuttle to be undocked before latejoiners can join +CONFIG_DEF(flag/arrivals_shuttle_require_undocked) //Require the arrivals shuttle to be undocked before latejoiners can join -/datum/config_entry/flag/arrivals_shuttle_require_safe_latejoin //Require the arrivals shuttle to be operational in order for latejoiners to join +CONFIG_DEF(flag/arrivals_shuttle_require_safe_latejoin) //Require the arrivals shuttle to be operational in order for latejoiners to join -/datum/config_entry/string/alert_green +CONFIG_DEF(string/alert_green) value = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." -/datum/config_entry/string/alert_blue_upto +CONFIG_DEF(string/alert_blue_upto) value = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted." -/datum/config_entry/string/alert_blue_downto +CONFIG_DEF(string/alert_blue_downto) value = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed." -/datum/config_entry/string/alert_red_upto +CONFIG_DEF(string/alert_red_upto) value = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." -/datum/config_entry/string/alert_red_downto +CONFIG_DEF(string/alert_red_downto) value = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." -/datum/config_entry/string/alert_delta +CONFIG_DEF(string/alert_delta) value = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." -/datum/config_entry/flag/revival_pod_plants +CONFIG_DEF(flag/revival_pod_plants) -/datum/config_entry/flag/revival_cloning +CONFIG_DEF(flag/revival_cloning) -/datum/config_entry/number/revival_brain_life +CONFIG_DEF(number/revival_brain_life) value = -1 min_val = -1 -/datum/config_entry/flag/rename_cyborg +CONFIG_DEF(flag/rename_cyborg) -/datum/config_entry/flag/ooc_during_round +CONFIG_DEF(flag/ooc_during_round) -/datum/config_entry/flag/emojis +CONFIG_DEF(flag/emojis) -/datum/config_entry/number/run_delay //Used for modifying movement speed for mobs. +CONFIG_DEF(number/run_delay) //Used for modifying movement speed for mobs. var/static/value_cache = 0 -/datum/config_entry/number/run_delay/ValidateAndSet() +CONFIG_TWEAK(number/run_delay/ValidateAndSet()) . = ..() if(.) value_cache = value -/datum/config_entry/number/walk_delay +CONFIG_DEF(number/walk_delay) var/static/value_cache = 0 -/datum/config_entry/number/walk_delay/ValidateAndSet() +CONFIG_TWEAK(number/walk_delay/ValidateAndSet()) . = ..() if(.) value_cache = value -/datum/config_entry/number/human_delay //Mob specific modifiers. NOTE: These will affect different mob types in different ways -/datum/config_entry/number/robot_delay -/datum/config_entry/number/monkey_delay -/datum/config_entry/number/alien_delay -/datum/config_entry/number/slime_delay -/datum/config_entry/number/animal_delay +CONFIG_DEF(number/human_delay) //Mob specific modifiers. NOTE: These will affect different mob types in different ways +CONFIG_DEF(number/robot_delay) +CONFIG_DEF(number/monkey_delay) +CONFIG_DEF(number/alien_delay) +CONFIG_DEF(number/slime_delay) +CONFIG_DEF(number/animal_delay) -/datum/config_entry/number/gateway_delay //How long the gateway takes before it activates. Default is half an hour. +CONFIG_DEF(number/gateway_delay) //How long the gateway takes before it activates. Default is half an hour. value = 18000 min_val = 0 -/datum/config_entry/flag/ghost_interaction +CONFIG_DEF(flag/ghost_interaction) -/datum/config_entry/flag/silent_ai -/datum/config_entry/flag/silent_borg +CONFIG_DEF(flag/silent_ai) +CONFIG_DEF(flag/silent_borg) -/datum/config_entry/flag/sandbox_autoclose // close the sandbox panel after spawning an item, potentially reducing griff +CONFIG_DEF(flag/sandbox_autoclose) // close the sandbox panel after spawning an item, potentially reducing griff -/datum/config_entry/number/default_laws //Controls what laws the AI spawns with. +CONFIG_DEF(number/default_laws) //Controls what laws the AI spawns with. value = 0 min_val = 0 max_val = 3 -/datum/config_entry/number/silicon_max_law_amount +CONFIG_DEF(number/silicon_max_law_amount) value = 12 min_val = 0 -/datum/config_entry/keyed_flag_list/random_laws +CONFIG_DEF(keyed_flag_list/random_laws) -/datum/config_entry/keyed_number_list/law_weight +CONFIG_DEF(keyed_number_list/law_weight) splitter = "," -/datum/config_entry/number/assistant_cap +CONFIG_DEF(number/assistant_cap) value = -1 min_val = -1 -/datum/config_entry/flag/starlight -/datum/config_entry/flag/grey_assistants +CONFIG_DEF(flag/starlight) +CONFIG_DEF(flag/grey_assistants) -/datum/config_entry/number/lavaland_budget +CONFIG_DEF(number/lavaland_budget) value = 60 min_val = 0 -/datum/config_entry/number/space_budget +CONFIG_DEF(number/space_budget) value = 16 min_val = 0 -/datum/config_entry/flag/allow_random_events // Enables random events mid-round when set +CONFIG_DEF(flag/allow_random_events) // Enables random events mid-round when set -/datum/config_entry/number/events_min_time_mul // Multipliers for random events minimal starting time and minimal players amounts +CONFIG_DEF(number/events_min_time_mul) // Multipliers for random events minimal starting time and minimal players amounts value = 1 min_val = 0 integer = FALSE -/datum/config_entry/number/events_min_players_mul +CONFIG_DEF(number/events_min_players_mul) value = 1 min_val = 0 integer = FALSE -/datum/config_entry/number/mice_roundstart +CONFIG_DEF(number/mice_roundstart) value = 10 min_val = 0 -/datum/config_entry/number/bombcap +CONFIG_DEF(number/bombcap) value = 14 min_val = 4 -/datum/config_entry/flag/allow_crew_objectives - -/datum/config_entry/flag/allow_miscreants - -/datum/config_entry/flag/allow_extended_miscreants +CONFIG_DEF(flag/allow_crew_objectives) +CONFIG_DEF(flag/allow_miscreants) +CONFIG_DEF(flag/allow_extended_miscreants) /datum/config_entry/number/bombcap/ValidateAndSet(str_val) . = ..() @@ -258,9 +258,9 @@ GLOB.MAX_EX_FLASH_RANGE = value GLOB.MAX_EX_FLAME_RANGE = value -/datum/config_entry/number/emergency_shuttle_autocall_threshold +CONFIG_DEF(number/emergency_shuttle_autocall_threshold) min_val = 0 max_val = 1 integer = FALSE -/datum/config_entry/flag/ic_printing +CONFIG_DEF(flag/ic_printing) diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm deleted file mode 100644 index e6b3695033..0000000000 --- a/code/controllers/configuration/entries/general.dm +++ /dev/null @@ -1,388 +0,0 @@ -/datum/config_entry/flag/autoadmin // if autoadmin is enabled - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/string/autoadmin_rank // the rank for autoadmins - value = "Game Master" - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/string/servername // server name (the name of the game window) - -/datum/config_entry/string/serversqlname // short form server name used for the DB - -/datum/config_entry/string/stationname // station name (the name of the station in-game) - -/datum/config_entry/number/lobby_countdown // In between round countdown. - value = 120 - min_val = 0 - -/datum/config_entry/number/round_end_countdown // Post round murder death kill countdown - value = 25 - min_val = 0 - -/datum/config_entry/flag/hub // if the game appears on the hub or not - -/datum/config_entry/flag/log_ooc // log OOC channel - -/datum/config_entry/flag/log_access // log login/logout - -/datum/config_entry/flag/log_say // log client say - -/datum/config_entry/flag/log_admin // log admin actions - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/log_prayer // log prayers - -/datum/config_entry/flag/log_law // log lawchanges - -/datum/config_entry/flag/log_game // log game events - -/datum/config_entry/flag/log_vote // log voting - -/datum/config_entry/flag/log_whisper // log client whisper - -/datum/config_entry/flag/log_attack // log attack messages - -/datum/config_entry/flag/log_emote // log emotes - -/datum/config_entry/flag/log_adminchat // log admin chat messages - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/log_pda // log pda messages - -/datum/config_entry/flag/log_twitter // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases. - -/datum/config_entry/flag/log_world_topic // log all world.Topic() calls - -/datum/config_entry/flag/log_manifest // log crew manifest to seperate file - -/datum/config_entry/flag/allow_admin_ooccolor // Allows admins with relevant permissions to have their own ooc colour - -/datum/config_entry/flag/allow_vote_restart // allow votes to restart - -/datum/config_entry/flag/allow_vote_mode // allow votes to change mode - -/datum/config_entry/number/vote_delay // minimum time between voting sessions (deciseconds, 10 minute default) - value = 6000 - min_val = 0 - -/datum/config_entry/number/vote_period // length of voting period (deciseconds, default 1 minute) - value = 600 - min_val = 0 - -/datum/config_entry/flag/default_no_vote // vote does not default to nochange/norestart - -/datum/config_entry/flag/no_dead_vote // dead people can't vote - -/datum/config_entry/flag/allow_metadata // Metadata is supported. - -/datum/config_entry/flag/popup_admin_pm // adminPMs to non-admins show in a pop-up 'reply' window when set - -/datum/config_entry/number/fps - value = 20 - min_val = 1 - max_val = 100 //byond will start crapping out at 50, so this is just ridic - var/sync_validate = FALSE - -/datum/config_entry/number/fps/ValidateAndSet(str_val) - . = ..() - if(.) - sync_validate = TRUE - var/datum/config_entry/number/ticklag/TL = config.entries_by_type[/datum/config_entry/number/ticklag] - if(!TL.sync_validate) - TL.ValidateAndSet(10 / value) - sync_validate = FALSE - -/datum/config_entry/number/ticklag - integer = FALSE - var/sync_validate = FALSE - -/datum/config_entry/number/ticklag/New() //ticklag weirdly just mirrors fps - var/datum/config_entry/CE = /datum/config_entry/number/fps - value = 10 / initial(CE.value) - ..() - -/datum/config_entry/number/ticklag/ValidateAndSet(str_val) - . = text2num(str_val) > 0 && ..() - if(.) - sync_validate = TRUE - var/datum/config_entry/number/fps/FPS = config.entries_by_type[/datum/config_entry/number/fps] - if(!FPS.sync_validate) - FPS.ValidateAndSet(10 / value) - sync_validate = FALSE - -/datum/config_entry/flag/allow_holidays - -/datum/config_entry/number/tick_limit_mc_init //SSinitialization throttling - value = TICK_LIMIT_MC_INIT_DEFAULT - min_val = 0 //oranges warned us - integer = FALSE - -/datum/config_entry/flag/admin_legacy_system //Defines whether the server uses the legacy admin system with admins.txt or the SQL system - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/string/hostedby - -/datum/config_entry/flag/norespawn - -/datum/config_entry/flag/guest_jobban - -/datum/config_entry/flag/usewhitelist - -/datum/config_entry/flag/ban_legacy_system //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/use_age_restriction_for_jobs //Do jobs use account age restrictions? --requires database - -/datum/config_entry/flag/use_account_age_for_jobs //Uses the time they made the account for the job restriction stuff. New player joining alerts should be unaffected. - -/datum/config_entry/flag/use_exp_tracking - -/datum/config_entry/flag/use_exp_restrictions_heads - -/datum/config_entry/number/use_exp_restrictions_heads_hours - value = 0 - min_val = 0 - -/datum/config_entry/flag/use_exp_restrictions_heads_department - -/datum/config_entry/flag/use_exp_restrictions_other - -/datum/config_entry/flag/use_exp_restrictions_admin_bypass - -/datum/config_entry/string/server - -/datum/config_entry/string/banappeals - -/datum/config_entry/string/wikiurl - value = "http://www.tgstation13.org/wiki" - -/datum/config_entry/string/forumurl - value = "http://tgstation13.org/phpBB/index.php" - -/datum/config_entry/string/rulesurl - value = "http://www.tgstation13.org/wiki/Rules" - -/datum/config_entry/string/githuburl - value = "https://www.github.com/tgstation/-tg-station" - -/datum/config_entry/number/githubrepoid - value = null - min_val = 0 - -/datum/config_entry/flag/guest_ban - -/datum/config_entry/number/id_console_jobslot_delay - value = 30 - min_val = 0 - -/datum/config_entry/number/inactivity_period //time in ds until a player is considered inactive - value = 3000 - min_val = 0 - -/datum/config_entry/number/inactivity_period/ValidateAndSet(str_val) - . = ..() - if(.) - value *= 10 //documented as seconds in config.txt - -/datum/config_entry/number/afk_period //time in ds until a player is considered inactive - value = 3000 - min_val = 0 - -/datum/config_entry/number/afk_period/ValidateAndSet(str_val) - . = ..() - if(.) - value *= 10 //documented as seconds in config.txt - -/datum/config_entry/flag/kick_inactive //force disconnect for inactive players - -/datum/config_entry/flag/load_jobs_from_txt - -/datum/config_entry/flag/forbid_singulo_possession - -/datum/config_entry/flag/automute_on //enables automuting/spam prevention - -/datum/config_entry/string/panic_server_name - -/datum/config_entry/string/panic_server_name/ValidateAndSet(str_val) - return str_val != "\[Put the name here\]" && ..() - -/datum/config_entry/string/panic_server_address //Reconnect a player this linked server if this server isn't accepting new players - -/datum/config_entry/string/panic_server_address/ValidateAndSet(str_val) - return str_val != "byond://address:port" && ..() - -/datum/config_entry/string/invoke_youtubedl - protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN - -/datum/config_entry/flag/show_irc_name - -/datum/config_entry/flag/see_own_notes //Can players see their own admin notes - -/datum/config_entry/number/note_fresh_days - value = null - min_val = 0 - integer = FALSE - -/datum/config_entry/number/note_stale_days - value = null - min_val = 0 - integer = FALSE - -/datum/config_entry/flag/maprotation - -/datum/config_entry/number/maprotatechancedelta - value = 0.75 - min_val = 0 - max_val = 1 - integer = FALSE - -/datum/config_entry/number/soft_popcap - value = null - min_val = 0 - -/datum/config_entry/number/hard_popcap - value = null - min_val = 0 - -/datum/config_entry/number/extreme_popcap - value = null - min_val = 0 - -/datum/config_entry/string/soft_popcap_message - value = "Be warned that the server is currently serving a high number of users, consider using alternative game servers." - -/datum/config_entry/string/hard_popcap_message - value = "The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers." - -/datum/config_entry/string/extreme_popcap_message - value = "The server is currently serving a high number of users, find alternative servers." - -/datum/config_entry/flag/panic_bunker // prevents people the server hasn't seen before from connecting - -/datum/config_entry/number/notify_new_player_age // how long do we notify admins of a new player - min_val = -1 - -/datum/config_entry/number/notify_new_player_account_age // how long do we notify admins of a new byond account - min_val = 0 - -/datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time? - -/datum/config_entry/flag/check_randomizer - -/datum/config_entry/string/ipintel_email - -/datum/config_entry/string/ipintel_email/ValidateAndSet(str_val) - return str_val != "ch@nge.me" && ..() - -/datum/config_entry/number/ipintel_rating_bad - value = 1 - integer = FALSE - min_val = 0 - max_val = 1 - -/datum/config_entry/number/ipintel_save_good - value = 12 - min_val = 0 - -/datum/config_entry/number/ipintel_save_bad - value = 1 - min_val = 0 - -/datum/config_entry/string/ipintel_domain - value = "check.getipintel.net" - -/datum/config_entry/flag/aggressive_changelog - -/datum/config_entry/flag/autoconvert_notes //if all connecting player's notes should attempt to be converted to the database - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/allow_webclient - -/datum/config_entry/flag/webclient_only_byond_members - -/datum/config_entry/flag/announce_admin_logout - -/datum/config_entry/flag/announce_admin_login - -/datum/config_entry/flag/allow_map_voting - -/datum/config_entry/flag/generate_minimaps - -/datum/config_entry/number/client_warn_version - value = null - min_val = 500 - max_val = DM_VERSION - 1 - -/datum/config_entry/string/client_warn_message - value = "Your version of byond may have issues or be blocked from accessing this server in the future." - -/datum/config_entry/flag/client_warn_popup - -/datum/config_entry/number/client_error_version - value = null - min_val = 500 - max_val = DM_VERSION - 1 - -/datum/config_entry/string/client_error_message - value = "Your version of byond is too old, may have issues, and is blocked from accessing this server." - -/datum/config_entry/number/minute_topic_limit - value = null - min_val = 0 - -/datum/config_entry/number/second_topic_limit - value = null - min_val = 0 - -/datum/config_entry/number/error_cooldown // The "cooldown" time for each occurrence of a unique error - value = 600 - min_val = 0 - -/datum/config_entry/number/error_limit // How many occurrences before the next will silence them - value = 50 - -/datum/config_entry/number/error_silence_time // How long a unique error will be silenced for - value = 6000 - -/datum/config_entry/number/error_msg_delay // How long to wait between messaging admins about occurrences of a unique error - value = 50 - -/datum/config_entry/flag/irc_announce_new_game - -/datum/config_entry/flag/debug_admin_hrefs - -/datum/config_entry/number/mc_tick_rate/base_mc_tick_rate - integer = FALSE - value = 1 - -/datum/config_entry/number/mc_tick_rate/high_pop_mc_tick_rate - integer = FALSE - value = 1.1 - -/datum/config_entry/number/mc_tick_rate/high_pop_mc_mode_amount - value = 65 - -/datum/config_entry/number/mc_tick_rate/disable_high_pop_mc_mode_amount - value = 60 - -/datum/config_entry/number/mc_tick_rate - abstract_type = /datum/config_entry/number/mc_tick_rate - -/datum/config_entry/number/mc_tick_rate/ValidateAndSet(str_val) - . = ..() - if (.) - Master.UpdateTickRate() - -/datum/config_entry/flag/resume_after_initializations - -/datum/config_entry/flag/resume_after_initializations/ValidateAndSet(str_val) - . = ..() - if(. && Master.current_runlevel) - world.sleep_offline = !value - -/datum/config_entry/number/rounds_until_hard_restart - value = -1 - min_val = 0 - -/datum/config_entry/string/default_view - value = "15x15" diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 93230b3e37..59b6fc34ef 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -394,4 +394,4 @@ SUBSYSTEM_DEF(air) #undef SSAIR_EXCITEDGROUPS #undef SSAIR_HIGHPRESSURE #undef SSAIR_HOTSPOT -#undef SSAIR_SUPERCONDUCTIVITY +#undef SSAIR_SUPERCONDUCTIVITY \ No newline at end of file diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 485e4e7fd3..941fcbbcd6 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -8,11 +8,11 @@ SUBSYSTEM_DEF(blackbox) var/list/feedback = list() //list of datum/feedback_variable var/triggertime = 0 var/sealed = FALSE //time to stop tracking stats? - var/list/versions = list("antagonists" = 3, - "admin_secrets_fun_used" = 2, - "time_dilation_current" = 3, + var/list/research_levels = list() //list of highest tech levels attained that isn't lost lost by destruction of RD computers + var/list/versions = list("time_dilation_current" = 2, "science_techweb_unlock" = 2) //associative list of any feedback variables that have had their format changed since creation and their current version, remember to update this + /datum/controller/subsystem/blackbox/Initialize() triggertime = world.time . = ..() @@ -62,6 +62,8 @@ SUBSYSTEM_DEF(blackbox) record_feedback("tally", "radio_usage", MS.pda_msgs.len, "PDA") if (MS.rc_msgs.len) record_feedback("tally", "radio_usage", MS.rc_msgs.len, "request console") + if(research_levels.len) + SSblackbox.record_feedback("associative", "high_research_level", 1, research_levels) if (!SSdbcore.Connect()) return @@ -88,35 +90,39 @@ SUBSYSTEM_DEF(blackbox) sealed = TRUE return TRUE +/datum/controller/subsystem/blackbox/proc/log_research(tech, level) + if(!(tech in research_levels) || research_levels[tech] < level) + research_levels[tech] = level + /datum/controller/subsystem/blackbox/proc/LogBroadcast(freq) if(sealed) return switch(freq) - if(FREQ_COMMON) + if(1459) record_feedback("tally", "radio_usage", 1, "common") - if(FREQ_SCIENCE) + if(GLOB.SCI_FREQ) record_feedback("tally", "radio_usage", 1, "science") - if(FREQ_COMMAND) + if(GLOB.COMM_FREQ) record_feedback("tally", "radio_usage", 1, "command") - if(FREQ_MEDICAL) + if(GLOB.MED_FREQ) record_feedback("tally", "radio_usage", 1, "medical") - if(FREQ_ENGINEERING) + if(GLOB.ENG_FREQ) record_feedback("tally", "radio_usage", 1, "engineering") - if(FREQ_SECURITY) + if(GLOB.SEC_FREQ) record_feedback("tally", "radio_usage", 1, "security") - if(FREQ_SYNDICATE) + if(GLOB.SYND_FREQ) record_feedback("tally", "radio_usage", 1, "syndicate") - if(FREQ_SERVICE) + if(GLOB.SERV_FREQ) record_feedback("tally", "radio_usage", 1, "service") - if(FREQ_SUPPLY) + if(GLOB.SUPP_FREQ) record_feedback("tally", "radio_usage", 1, "supply") - if(FREQ_CENTCOM) + if(GLOB.CENTCOM_FREQ) record_feedback("tally", "radio_usage", 1, "centcom") - if(FREQ_AI_PRIVATE) + if(GLOB.AIPRIV_FREQ) record_feedback("tally", "radio_usage", 1, "ai private") - if(FREQ_CTF_RED) + if(GLOB.REDTEAM_FREQ) record_feedback("tally", "radio_usage", 1, "CTF red team") - if(FREQ_CTF_BLUE) + if(GLOB.BLUETEAM_FREQ) record_feedback("tally", "radio_usage", 1, "CTF blue team") else record_feedback("tally", "radio_usage", 1, "other") @@ -186,7 +192,7 @@ Versioning "gun_fired" = 2) */ /datum/controller/subsystem/blackbox/proc/record_feedback(key_type, key, increment, data, overwrite) - if(sealed || !key_type || !istext(key) || !isnum(increment) || !data) + if(sealed || !key_type || !istext(key) || !isnum(increment || !data)) return var/datum/feedback_variable/FV = find_feedback_datum(key, key_type) switch(key_type) @@ -219,10 +225,7 @@ Versioning var/pos = length(FV.json["data"]) + 1 FV.json["data"]["[pos]"] = list() //in 512 "pos" can be replaced with "[FV.json["data"].len+1]" for(var/i in data) - if(islist(data[i])) - FV.json["data"]["[pos]"]["[i]"] = data[i] //and here with "[FV.json["data"].len]" - else - FV.json["data"]["[pos]"]["[i]"] = "[data[i]]" + FV.json["data"]["[pos]"]["[i]"] = "[data[i]]" //and here with "[FV.json["data"].len]" else CRASH("Invalid feedback key_type: [key_type]") diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm deleted file mode 100644 index f4763a74ed..0000000000 --- a/code/controllers/subsystem/input.dm +++ /dev/null @@ -1,12 +0,0 @@ -SUBSYSTEM_DEF(input) - name = "Input" - wait = 1 //SS_TICKER means this runs every tick - flags = SS_TICKER | SS_NO_INIT | SS_KEEP_TIMING - priority = 151 - runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY - -/datum/controller/subsystem/input/fire() - var/list/clients = GLOB.clients // Let's sing the list cache song - for(var/i in 1 to clients.len) - var/client/C = clients[i] - C.keyLoop() \ No newline at end of file diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 756a22174a..5cfbeb9414 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -107,6 +107,9 @@ SUBSYSTEM_DEF(job) if(player.mind && job.title in player.mind.restricted_roles) Debug("FOC incompatible with antagonist role, Player: [player]") continue + if(CONFIG_GET(flag/enforce_human_authority) && !player.client.prefs.pref_species.qualifies_for_rank(job.title, player.client.prefs.features)) + Debug("FOC non-human failed, Player: [player]") + continue if(player.client.prefs.GetJobDepartment(job, level) & job.flag) Debug("FOC pass, Player: [player], Level:[level]") candidates += player @@ -141,6 +144,11 @@ SUBSYSTEM_DEF(job) Debug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]") continue + if(CONFIG_GET(flag/enforce_human_authority) && !player.client.prefs.pref_species.qualifies_for_rank(job.title, player.client.prefs.features)) + Debug("GRJ non-human failed, Player: [player]") + continue + + if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) Debug("GRJ Random job given, Player: [player], Job: [job]") if(AssignRole(player, job.title)) @@ -311,6 +319,10 @@ SUBSYSTEM_DEF(job) Debug("DO incompatible with antagonist role, Player: [player], Job:[job.title]") continue + if(CONFIG_GET(flag/enforce_human_authority) && !player.client.prefs.pref_species.qualifies_for_rank(job.title, player.client.prefs.features)) + Debug("DO non-human failed, Player: [player], Job:[job.title]") + continue + // If the player wants that job on this level, then try give it to him. if(player.client.prefs.GetJobDepartment(job, level) & job.flag) diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 1ad3a8ab15..43565846fb 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -22,7 +22,7 @@ SUBSYSTEM_DEF(lighting) create_all_lighting_objects() initialized = TRUE - + fire(FALSE, TRUE) ..() diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm index e235afaaa4..db6af6d686 100644 --- a/code/controllers/subsystem/machines.dm +++ b/code/controllers/subsystem/machines.dm @@ -62,4 +62,4 @@ SUBSYSTEM_DEF(machines) if (istype(SSmachines.processing)) processing = SSmachines.processing if (istype(SSmachines.powernets)) - powernets = SSmachines.powernets + powernets = SSmachines.powernets \ No newline at end of file diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 63ceb15ab8..6ee4626f25 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -135,12 +135,12 @@ SUBSYSTEM_DEF(npcpool) if(facCount == 1 && helpProb) helpProb = 100 - + if(prob(helpProb) && candidate.takeDelegate(check,FALSE)) --canBeUsed.len candidate.eye_color = "yellow" candidate.update_icons() - + if(!currentrun.len || MC_TICK_CHECK) //don't change SS state if it isn't necessary return diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index b98be937fc..d310f46d2a 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -250,4 +250,4 @@ SUBSYSTEM_DEF(persistence) var/list/file_data = list() file_data["data"] = saved_modes fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) + WRITE_FILE(json_file, json_encode(file_data)) \ No newline at end of file diff --git a/code/controllers/subsystem/radio.dm b/code/controllers/subsystem/radio.dm index 8299709392..43803aa647 100644 --- a/code/controllers/subsystem/radio.dm +++ b/code/controllers/subsystem/radio.dm @@ -14,22 +14,35 @@ SUBSYSTEM_DEF(radio) /datum/controller/subsystem/radio/proc/add_object(obj/device, new_frequency as num, filter = null as text|null) var/f_text = num2text(new_frequency) var/datum/radio_frequency/frequency = frequencies[f_text] + if(!frequency) - frequencies[f_text] = frequency = new(new_frequency) + frequency = new + frequency.frequency = new_frequency + frequencies[f_text] = frequency + frequency.add_listener(device, filter) return frequency /datum/controller/subsystem/radio/proc/remove_object(obj/device, old_frequency) var/f_text = num2text(old_frequency) var/datum/radio_frequency/frequency = frequencies[f_text] + if(frequency) frequency.remove_listener(device) - // let's don't delete frequencies in case a non-listener keeps a reference + + if(frequency.devices.len == 0) + qdel(frequency) + frequencies -= f_text + return 1 /datum/controller/subsystem/radio/proc/return_frequency(new_frequency as num) var/f_text = num2text(new_frequency) var/datum/radio_frequency/frequency = frequencies[f_text] + if(!frequency) - frequencies[f_text] = frequency = new(new_frequency) + frequency = new + frequency.frequency = new_frequency + frequencies[f_text] = frequency + return frequency diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index a2dc4b9c74..d1bcf31885 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -54,7 +54,6 @@ SUBSYSTEM_DEF(research) bitcoins = single_server_income break //Just need one to work. var/income_time_difference = world.time - last_income - science_tech.last_bitcoins = bitcoins // Doesn't take tick drift into account bitcoins *= income_time_difference / 10 science_tech.research_points += bitcoins last_income = world.time diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 24e31e3c7c..c80bc17047 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -158,7 +158,7 @@ SUBSYSTEM_DEF(shuttle) break /datum/controller/subsystem/shuttle/proc/CheckAutoEvac() - if(emergencyNoEscape || emergencyNoRecall || !emergency || !SSticker.HasRoundStarted()) + if(emergencyNoEscape || emergencyNoRecall || !emergency) return var/threshold = CONFIG_GET(number/emergency_shuttle_autocall_threshold) @@ -261,7 +261,7 @@ SUBSYSTEM_DEF(shuttle) if(!admiral_message) admiral_message = pick(GLOB.admiral_messages) - var/intercepttext = "Nanotrasen Update: Request For Shuttle.
\ + var/intercepttext = "NanoTrasen Update: Request For Shuttle.
\ To whom it may concern:

\ We have taken note of the situation upon [station_name()] and have come to the \ conclusion that it does not warrant the abandonment of the station.
\ @@ -382,7 +382,7 @@ SUBSYSTEM_DEF(shuttle) emergency.setTimer(emergencyDockTime) priority_announce("Hostile environment resolved. \ You have 3 minutes to board the Emergency Shuttle.", - null, 'sound/ai/shuttledock.ogg', "Priority") + null, 'sound/AI/shuttledock.ogg', "Priority") //try to move/request to dockHome if possible, otherwise dockAway. Mainly used for admin buttons /datum/controller/subsystem/shuttle/proc/toggleShuttle(shuttleId, dockHome, dockAway, timed) diff --git a/code/controllers/subsystem/squeak.dm b/code/controllers/subsystem/squeak.dm index 022b659d8a..0148011e8b 100644 --- a/code/controllers/subsystem/squeak.dm +++ b/code/controllers/subsystem/squeak.dm @@ -1,6 +1,6 @@ // The Squeak // because this is about placement of mice mobs, and nothing to do with -// mice - the computer peripheral +// mice - the computer peripheral SUBSYSTEM_DEF(squeak) name = "Squeak" diff --git a/code/controllers/subsystem/stickyban.dm b/code/controllers/subsystem/stickyban.dm index 371cf22b3b..8251df0039 100644 --- a/code/controllers/subsystem/stickyban.dm +++ b/code/controllers/subsystem/stickyban.dm @@ -27,6 +27,6 @@ SUBSYSTEM_DEF(stickyban) ban["existing_user_matches_this_round"] = list() ban["admin_matches_this_round"] = list() cache[ckey] = ban - + for (var/bannedckey in cache) world.SetConfig("ban", bannedckey, list2stickyban(cache[bannedckey])) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 54b693d543..881bb7fcb7 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -398,6 +398,204 @@ SUBSYSTEM_DEF(ticker) var/mob/living/L = I L.notransform = FALSE +/datum/controller/subsystem/ticker/proc/declare_completion() + set waitfor = FALSE + var/station_evacuated = EMERGENCY_ESCAPED_OR_ENDGAMED + var/num_survivors = 0 + var/num_escapees = 0 + var/num_shuttle_escapees = 0 + var/list/successfulCrew = list() + var/list/miscreants = list() + + to_chat(world, "


The round has ended.") + if(LAZYLEN(GLOB.round_end_notifiees)) + send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.") + +/* var/nocredits = config.no_credits_round_end + for(var/client/C in GLOB.clients) + if(!C.credits && !nocredits) + C.RollCredits() + C.playtitlemusic(40)*/ + + //Player status report + for(var/i in GLOB.mob_list) + var/mob/Player = i + if(Player.mind && !isnewplayer(Player)) + if(Player.stat != DEAD && !isbrain(Player)) + num_survivors++ + if(station_evacuated) //If the shuttle has already left the station + var/list/area/shuttle_areas + if(SSshuttle && SSshuttle.emergency) + shuttle_areas = SSshuttle.emergency.shuttle_areas + if(!Player.onCentCom() && !Player.onSyndieBase()) + to_chat(Player, "You managed to survive, but were marooned on [station_name()]...") + else + num_escapees++ + to_chat(Player, "You managed to survive the events on [station_name()] as [Player.real_name].") + if(shuttle_areas[get_area(Player)]) + num_shuttle_escapees++ + else + to_chat(Player, "You managed to survive the events on [station_name()] as [Player.real_name].") + else + to_chat(Player, "You did not survive the events on [station_name()]...") + + CHECK_TICK + + //Round statistics report + var/datum/station_state/end_state = new /datum/station_state() + end_state.count() + var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100) + + to_chat(world, "
[GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]") + to_chat(world, "
[GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]") + if(mode.station_was_nuked) + SSticker.news_report = STATION_DESTROYED_NUKE + var/total_players = GLOB.joined_player_list.len + if(total_players) + to_chat(world, "
[GLOB.TAB]Total Population: [total_players]") + if(station_evacuated) + to_chat(world, "
[GLOB.TAB]Evacuation Rate: [num_escapees] ([PERCENT(num_escapees/total_players)]%)") + to_chat(world, "
[GLOB.TAB](on emergency shuttle): [num_shuttle_escapees] ([PERCENT(num_shuttle_escapees/total_players)]%)") + news_report = STATION_EVACUATED + if(SSshuttle.emergency.is_hijacked()) + news_report = SHUTTLE_HIJACK + to_chat(world, "
[GLOB.TAB]Survival Rate: [num_survivors] ([PERCENT(num_survivors/total_players)]%)") + to_chat(world, "
") + + CHECK_TICK + + //Silicon laws report + for (var/i in GLOB.ai_list) + var/mob/living/silicon/ai/aiPlayer = i + if (aiPlayer.stat != DEAD && aiPlayer.mind) + to_chat(world, "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws at the end of the round were:") + aiPlayer.show_laws(1) + else if (aiPlayer.mind) //if the dead ai has a mind, use its key instead + to_chat(world, "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws when it was deactivated were:") + aiPlayer.show_laws(1) + + to_chat(world, "Total law changes: [aiPlayer.law_change_counter]") + + if (aiPlayer.connected_robots.len) + var/robolist = "[aiPlayer.real_name]'s minions were: " + for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots) + if(robo.mind) + robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.mind.key]), ":" (Played by: [robo.mind.key]), "]" + to_chat(world, "[robolist]") + + CHECK_TICK + + for (var/mob/living/silicon/robot/robo in GLOB.silicon_mobs) + if (!robo.connected_ai && robo.mind) + if (robo.stat != DEAD) + to_chat(world, "[robo.name] (Played by: [robo.mind.key]) survived as an AI-less borg! Its laws were:") + else + to_chat(world, "[robo.name] (Played by: [robo.mind.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:") + + if(robo) //How the hell do we lose robo between here and the world messages directly above this? + robo.laws.show_laws(world) + + CHECK_TICK + + mode.declare_completion()//To declare normal completion. + + CHECK_TICK + + //calls auto_declare_completion_* for all modes + for(var/handler in typesof(/datum/game_mode/proc)) + if (findtext("[handler]","auto_declare_completion_")) + call(mode, handler)(force_ending) + + CHECK_TICK + + if(CONFIG_GET(string/cross_server_address)) + send_news_report() + + CHECK_TICK + + //Print a list of antagonists to the server log + var/list/total_antagonists = list() + //Look into all mobs in world, dead or alive + for(var/datum/mind/Mind in minds) + var/temprole = Mind.special_role + if(temprole) //if they are an antagonist of some sort. + if(temprole in total_antagonists) //If the role exists already, add the name to it + total_antagonists[temprole] += ", [Mind.name]([Mind.key])" + else + total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob + total_antagonists[temprole] += ": [Mind.name]([Mind.key])" + + CHECK_TICK + + //Now print them all into the log! + log_game("Antagonists at round end were...") + for(var/i in total_antagonists) + log_game("[i]s[total_antagonists[i]].") + + CHECK_TICK + + for(var/datum/mind/crewMind in minds) + if(!crewMind.current || !crewMind.objectives.len) + continue + for(var/datum/objective/miscreant/MO in crewMind.objectives) + miscreants += "[crewMind.current.real_name] (Played by: [crewMind.key])
Objective: [MO.explanation_text] (Optional)" + for(var/datum/objective/crew/CO in crewMind.objectives) + if(CO.check_completion()) + to_chat(crewMind.current, "
Your optional objective: [CO.explanation_text] Success!") + successfulCrew += "[crewMind.current.real_name] (Played by: [crewMind.key])
Objective: [CO.explanation_text] Success! (Optional)" + else + to_chat(crewMind.current, "
Your optional objective: [CO.explanation_text] Failed.") + + if (successfulCrew.len) + var/completedObjectives = "The following crew members completed their Crew Objectives:
" + for(var/i in successfulCrew) + completedObjectives += "[i]
" + to_chat(world, "[completedObjectives]
") + else + if(CONFIG_GET(flag/allow_crew_objectives)) + to_chat(world, "Nobody completed their Crew Objectives!
") + + CHECK_TICK + + if (miscreants.len) + var/miscreantObjectives = "The following crew members were miscreants:
" + for(var/i in miscreants) + miscreantObjectives += "[i]
" + to_chat(world, "[miscreantObjectives]
") + + CHECK_TICK + + mode.declare_station_goal_completion() + + CHECK_TICK + //medals, placed far down so that people can actually see the commendations. + if(GLOB.commendations.len) + to_chat(world, "Medal Commendations:") + for (var/com in GLOB.commendations) + to_chat(world, com) + + CHECK_TICK + + //Collects persistence features + if(mode.allow_persistence_save) + SSpersistence.CollectData() + + //stop collecting feedback during grifftime + SSblackbox.Seal() + + sleep(50) + ready_for_reboot = TRUE + standard_reboot() + +/datum/controller/subsystem/ticker/proc/standard_reboot() + if(ready_for_reboot) + if(mode.station_was_nuked) + Reboot("Station destroyed by Nuclear Device.", "nuke") + else + Reboot("Round ended.", "proper completion") + else + CRASH("Attempted standard reboot without ticker roundend completion") + /datum/controller/subsystem/ticker/proc/send_tip_of_the_round() var/m if(selected_tip) @@ -631,7 +829,6 @@ SUBSYSTEM_DEF(ticker) world.Reboot() /datum/controller/subsystem/ticker/Shutdown() - gather_newscaster() //called here so we ensure the log is created even upon admin reboot if(!round_end_sound) round_end_sound = pick(\ 'sound/roundend/newroundsexy.ogg', diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm index 3b19ae31cd..17cfa6fc06 100644 --- a/code/controllers/subsystem/time_track.dm +++ b/code/controllers/subsystem/time_track.dm @@ -35,4 +35,4 @@ SUBSYSTEM_DEF(time_track) last_tick_realtime = current_realtime last_tick_byond_time = current_byondtime last_tick_tickcount = current_tickcount - SSblackbox.record_feedback("associative", "time_dilation_current", 1, list("[SQLtime()]" = list("current" = "[time_dilation_current]", "avg_fast" = "[time_dilation_avg_fast]", "avg" = "[time_dilation_avg]", "avg_slow" = "[time_dilation_avg_slow]"))) + SSblackbox.record_feedback("associative", "time_dilation_current", 1, list("[time_dilation_current]" = "[SQLtime()]")) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 938cd86396..3a2ca82bcd 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -1,6 +1,5 @@ #define BUCKET_LEN (world.fps*1*60) //how many ticks should we keep in the bucket. (1 minutes worth) -#define BUCKET_POS(timer) ((round((timer.timeToRun - SStimer.head_offset) / world.tick_lag) % BUCKET_LEN) + 1) -#define TIMER_MAX (world.time + TICKS2DS(min(BUCKET_LEN-(SStimer.practical_offset-DS2TICKS(world.time - SStimer.head_offset))-1, BUCKET_LEN-1))) +#define BUCKET_POS(timer) (round((timer.timeToRun - SStimer.head_offset) / world.tick_lag) + 1) #define TIMER_ID_MAX (2**24) //max float with integer precision SUBSYSTEM_DEF(timer) @@ -10,11 +9,11 @@ SUBSYSTEM_DEF(timer) flags = SS_TICKER|SS_NO_INIT - var/list/datum/timedevent/second_queue = list() //awe, yes, you've had first queue, but what about second queue? + var/list/datum/timedevent/processing = list() var/list/hashes = list() var/head_offset = 0 //world.time of the first entry in the the bucket. - var/practical_offset = 1 //index of the first non-empty item in the bucket. + var/practical_offset = 0 //index of the first non-empty item in the bucket. var/bucket_resolution = 0 //world.tick_lag the bucket was designed for var/bucket_count = 0 //how many timers are in the buckets @@ -28,19 +27,13 @@ SUBSYSTEM_DEF(timer) var/static/last_invoke_warning = 0 var/static/bucket_auto_reset = TRUE -/datum/controller/subsystem/timer/PreInit() - bucket_list.len = BUCKET_LEN - head_offset = world.time - bucket_resolution = world.tick_lag - /datum/controller/subsystem/timer/stat_entry(msg) - ..("B:[bucket_count] P:[length(second_queue)] H:[length(hashes)] C:[length(clienttime_timers)] S:[length(timer_id_dict)]") + ..("B:[bucket_count] P:[length(processing)] H:[length(hashes)] C:[length(clienttime_timers)]") /datum/controller/subsystem/timer/fire(resumed = FALSE) var/lit = last_invoke_tick var/last_check = world.time - TIMER_NO_INVOKE_WARNING var/list/bucket_list = src.bucket_list - if(!bucket_count) last_invoke_tick = world.time @@ -57,9 +50,9 @@ SUBSYSTEM_DEF(timer) var/datum/timedevent/bucket_head = bucket_list[i] if (!bucket_head) continue - + log_world("Active timers at index [i]:") - + var/datum/timedevent/bucket_node = bucket_head var/anti_loop_check = 1000 do @@ -67,62 +60,50 @@ SUBSYSTEM_DEF(timer) bucket_node = bucket_node.next anti_loop_check-- while(bucket_node && bucket_node != bucket_head && anti_loop_check) - log_world("Active timers in the second_queue queue:") - for(var/I in second_queue) + log_world("Active timers in the processing queue:") + for(var/I in processing) log_world(get_timer_debug_string(I)) - var/next_clienttime_timer_index = 0 - var/len = length(clienttime_timers) - - for (next_clienttime_timer_index in 1 to len) + while(length(clienttime_timers)) + var/datum/timedevent/ctime_timer = clienttime_timers[clienttime_timers.len] + if (ctime_timer.timeToRun <= REALTIMEOFDAY) + --clienttime_timers.len + var/datum/callback/callBack = ctime_timer.callBack + ctime_timer.spent = REALTIMEOFDAY + callBack.InvokeAsync() + qdel(ctime_timer) + else + break //None of the rest are ready to run if (MC_TICK_CHECK) - next_clienttime_timer_index-- - break - var/datum/timedevent/ctime_timer = clienttime_timers[next_clienttime_timer_index] - if (ctime_timer.timeToRun > REALTIMEOFDAY) - next_clienttime_timer_index-- - break - - var/datum/callback/callBack = ctime_timer.callBack - if (!callBack) - clienttime_timers.Cut(next_clienttime_timer_index,next_clienttime_timer_index+1) - CRASH("Invalid timer: [get_timer_debug_string(ctime_timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset], REALTIMEOFDAY: [REALTIMEOFDAY]") - - ctime_timer.spent = REALTIMEOFDAY - callBack.InvokeAsync() - qdel(ctime_timer) - - - if (next_clienttime_timer_index) - clienttime_timers.Cut(1,next_clienttime_timer_index+1) - - if (MC_TICK_CHECK) - return + return var/static/list/spent = list() var/static/datum/timedevent/timer - if (practical_offset > BUCKET_LEN) - head_offset += TICKS2DS(BUCKET_LEN) - practical_offset = 1 - resumed = FALSE + var/static/datum/timedevent/head - if ((length(bucket_list) != BUCKET_LEN) || (world.tick_lag != bucket_resolution)) - reset_buckets() + if (practical_offset > BUCKET_LEN || (!resumed && length(bucket_list) != BUCKET_LEN || world.tick_lag != bucket_resolution)) + shift_buckets() bucket_list = src.bucket_list resumed = FALSE if (!resumed) timer = null + head = null - while (practical_offset <= BUCKET_LEN && head_offset + (practical_offset*world.tick_lag) <= world.time) - var/datum/timedevent/head = bucket_list[practical_offset] + while (practical_offset <= BUCKET_LEN && head_offset + (practical_offset*world.tick_lag) <= world.time && !MC_TICK_CHECK) if (!timer || !head || timer == head) head = bucket_list[practical_offset] + if (!head) + practical_offset++ + if (MC_TICK_CHECK) + break + continue timer = head - while (timer) + do var/datum/callback/callBack = timer.callBack if (!callBack) + qdel(timer) bucket_resolution = null //force bucket recreation CRASH("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") @@ -132,68 +113,15 @@ SUBSYSTEM_DEF(timer) callBack.InvokeAsync() last_invoke_tick = world.time + timer = timer.next + if (MC_TICK_CHECK) return - - timer = timer.next - if (timer == head) - break - - - bucket_list[practical_offset++] = null - - //we freed up a bucket, lets see if anything in second_queue needs to be shifted to that bucket. - var/i = 0 - var/L = length(second_queue) - for (i in 1 to L) - timer = second_queue[i] - if (timer.timeToRun >= TIMER_MAX) - i-- - break - - if (timer.timeToRun < head_offset) - bucket_resolution = null //force bucket recreation - CRASH("[i] Invalid timer state: Timer in long run queue with a time to run less then head_offset. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") - - if (timer.callBack && !timer.spent) - timer.callBack.InvokeAsync() - spent += timer - bucket_count++ - else if(!QDELETED(timer)) - qdel(timer) - continue - - if (timer.timeToRun < head_offset + TICKS2DS(practical_offset)) - bucket_resolution = null //force bucket recreation - CRASH("[i] Invalid timer state: Timer in long run queue that would require a backtrack to transfer to short run queue. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") - if (timer.callBack && !timer.spent) - timer.callBack.InvokeAsync() - spent += timer - bucket_count++ - else if(!QDELETED(timer)) - qdel(timer) - continue - - bucket_count++ - var/bucket_pos = max(1, BUCKET_POS(timer)) - - var/datum/timedevent/bucket_head = bucket_list[bucket_pos] - if (!bucket_head) - bucket_list[bucket_pos] = timer - timer.next = null - timer.prev = null - continue - - if (!bucket_head.prev) - bucket_head.prev = bucket_head - timer.next = bucket_head - timer.prev = bucket_head.prev - timer.next.prev = timer - timer.prev.next = timer - if (i) - second_queue.Cut(1, i+1) - + while (timer && timer != head) timer = null + bucket_list[practical_offset++] = null + if (MC_TICK_CHECK) + return bucket_count -= length(spent) @@ -213,7 +141,7 @@ SUBSYSTEM_DEF(timer) if(!TE.callBack) . += ", NO CALLBACK" -/datum/controller/subsystem/timer/proc/reset_buckets() +/datum/controller/subsystem/timer/proc/shift_buckets() var/list/bucket_list = src.bucket_list var/list/alltimers = list() //collect the timers currently in the bucket @@ -234,7 +162,7 @@ SUBSYSTEM_DEF(timer) head_offset = world.time bucket_resolution = world.tick_lag - alltimers += second_queue + alltimers += processing if (!length(alltimers)) return @@ -245,26 +173,22 @@ SUBSYSTEM_DEF(timer) if (head.timeToRun < head_offset) head_offset = head.timeToRun - var/new_bucket_count - var/i = 1 - for (i in 1 to length(alltimers)) - var/datum/timedevent/timer = alltimers[1] + var/list/timers_to_remove = list() + + for (var/thing in alltimers) + var/datum/timedevent/timer = thing if (!timer) + timers_to_remove += timer continue var/bucket_pos = BUCKET_POS(timer) - if (timer.timeToRun >= TIMER_MAX) - i-- + if (bucket_pos > BUCKET_LEN) break - + timers_to_remove += timer //remove it from the big list once we are done if (!timer.callBack || timer.spent) - WARNING("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]") - if (timer.callBack) - qdel(timer) continue - - new_bucket_count++ + bucket_count++ var/datum/timedevent/bucket_head = bucket_list[bucket_pos] if (!bucket_head) bucket_list[bucket_pos] = timer @@ -278,14 +202,12 @@ SUBSYSTEM_DEF(timer) timer.prev = bucket_head.prev timer.next.prev = timer timer.prev.next = timer - if (i) - alltimers.Cut(1, i+1) - second_queue = alltimers - bucket_count = new_bucket_count + + processing = (alltimers - timers_to_remove) /datum/controller/subsystem/timer/Recover() - second_queue |= SStimer.second_queue + processing |= SStimer.processing hashes |= SStimer.hashes timer_id_dict |= SStimer.timer_id_dict bucket_list |= SStimer.bucket_list @@ -302,6 +224,8 @@ SUBSYSTEM_DEF(timer) var/datum/timedevent/next var/datum/timedevent/prev + var/static/nextid = 1 + /datum/timedevent/New(datum/callback/callBack, timeToRun, flags, hash) id = TIMER_ID_NULL src.callBack = callBack @@ -311,65 +235,56 @@ SUBSYSTEM_DEF(timer) if (flags & TIMER_UNIQUE) SStimer.hashes[hash] = src - if (flags & TIMER_STOPPABLE) - id = GUID() - SStimer.timer_id_dict[id] = src + do + if (nextid >= TIMER_ID_MAX) + nextid = 1 + id = nextid++ + while(SStimer.timer_id_dict["timerid" + num2text(id, 8)]) + SStimer.timer_id_dict["timerid" + num2text(id, 8)] = src - name = "Timer: [id] (\ref[src]), TTR: [timeToRun], Flags: [jointext(bitfield2list(flags, list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT")), ", ")], callBack: \ref[callBack], callBack.object: [callBack.object]\ref[callBack.object]([getcallingtype()]), callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""])" + name = "Timer: " + num2text(id, 8) + ", TTR: [timeToRun], Flags: [jointext(bitfield2list(flags, list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT")), ", ")], callBack: [REF(callBack)], callBack.object: [callBack.object][REF(callBack.object)]([getcallingtype()]), callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""])" - if ((timeToRun < world.time || timeToRun < SStimer.head_offset) && !(flags & TIMER_CLIENT_TIME)) - CRASH("Invalid timer state: Timer created that would require a backtrack to run (addtimer would never let this happen): [SStimer.get_timer_debug_string(src)]") + if (spent) + CRASH("HOLY JESUS. WHAT IS THAT? WHAT THE FUCK IS THAT?") if (callBack.object != GLOBAL_PROC) LAZYADD(callBack.object.active_timers, src) - - var/list/L - if (flags & TIMER_CLIENT_TIME) - L = SStimer.clienttime_timers - else if (timeToRun >= TIMER_MAX) - L = SStimer.second_queue - - - if (L) - //binary search sorted insert - var/cttl = length(L) + //sorted insert + var/list/ctts = SStimer.clienttime_timers + var/cttl = length(ctts) if(cttl) - var/left = 1 - var/right = cttl - var/mid = (left+right) >> 1 //rounded divide by two for hedgehogs - - var/datum/timedevent/item - while (left < right) - item = L[mid] - if (item.timeToRun <= timeToRun) - left = mid+1 - else - right = mid - mid = (left+right) >> 1 - - item = L[mid] - mid = item.timeToRun > timeToRun ? mid : mid+1 - L.Insert(mid, src) - + var/datum/timedevent/Last = ctts[cttl] + if(Last.timeToRun >= timeToRun) + ctts += src + else + for(var/i in cttl to 1 step -1) + var/datum/timedevent/E = ctts[i] + if(E.timeToRun <= timeToRun) + ctts.Insert(i, src) + break else - L += src + ctts += src return //get the list of buckets var/list/bucket_list = SStimer.bucket_list - //calculate our place in the bucket list var/bucket_pos = BUCKET_POS(src) - + //we are too far aways from needing to run to be in the bucket list, shift_buckets() will handle us. + if (bucket_pos > length(bucket_list)) + SStimer.processing += src + return //get the bucket for our tick var/datum/timedevent/bucket_head = bucket_list[bucket_pos] SStimer.bucket_count++ //empty bucket, we will just add ourselves if (!bucket_head) bucket_list[bucket_pos] = src + if (bucket_pos < SStimer.practical_offset) + SStimer.practical_offset = bucket_pos return //other wise, lets do a simplified linked list add. if (!bucket_head.prev) @@ -381,9 +296,10 @@ SUBSYSTEM_DEF(timer) /datum/timedevent/Destroy() ..() - if (flags & TIMER_UNIQUE && hash) + if (flags & TIMER_UNIQUE) SStimer.hashes -= hash + if (callBack && callBack.object && callBack.object != GLOBAL_PROC && callBack.object.active_timers) callBack.object.active_timers -= src UNSETEMPTY(callBack.object.active_timers) @@ -391,33 +307,13 @@ SUBSYSTEM_DEF(timer) callBack = null if (flags & TIMER_STOPPABLE) - SStimer.timer_id_dict -= id + SStimer.timer_id_dict -= "timerid" + num2text(id, 8) if (flags & TIMER_CLIENT_TIME) - if (!spent) - spent = world.time - SStimer.clienttime_timers -= src + SStimer.clienttime_timers -= src return QDEL_HINT_IWILLGC if (!spent) - spent = world.time - var/bucketpos = BUCKET_POS(src) - var/datum/timedevent/buckethead - var/list/bucket_list = SStimer.bucket_list - if (bucketpos > 0) - buckethead = bucket_list[bucketpos] - - if (buckethead == src) - bucket_list[bucketpos] = next - SStimer.bucket_count-- - else if (timeToRun < TIMER_MAX || next || prev) - SStimer.bucket_count-- - else - var/l = length(SStimer.second_queue) - SStimer.second_queue -= src - if (l == length(SStimer.second_queue)) - SStimer.bucket_count-- - if (prev == next && next) next.prev = null prev.next = null @@ -426,6 +322,19 @@ SUBSYSTEM_DEF(timer) prev.next = next if (next) next.prev = prev + + var/bucketpos = BUCKET_POS(src) + var/datum/timedevent/buckethead + var/list/bucket_list = SStimer.bucket_list + + if (bucketpos > 0 && bucketpos <= length(bucket_list)) + buckethead = bucket_list[bucketpos] + SStimer.bucket_count-- + else + SStimer.processing -= src + + if (buckethead == src) + bucket_list[bucketpos] = next else if (prev && prev.next == src) prev.next = next @@ -442,16 +351,9 @@ SUBSYSTEM_DEF(timer) else . = "[callBack.object.type]" -/proc/addtimer(datum/callback/callback, wait = 0, flags = 0) +/proc/addtimer(datum/callback/callback, wait, flags) if (!callback) - CRASH("addtimer called without a callback") - - if (wait < 0) - stack_trace("Addtimer called with a negitive wait. Converting to 0") - - //alot of things add short timers on themselves in their destroy, we ignore those cases - if (wait >= 1 && callback && callback.object && callback.object != GLOBAL_PROC && QDELETED(callback.object)) - stack_trace("Add timer called with a callback assigned to a qdeleted object") + return wait = max(wait, 0) @@ -472,10 +374,11 @@ SUBSYSTEM_DEF(timer) var/datum/timedevent/hash_timer = SStimer.hashes[hash] if(hash_timer) if (hash_timer.spent) //it's pending deletion, pretend it doesn't exist. - hash_timer.hash = null //but keep it from accidentally deleting us + hash_timer.hash = null + SStimer.hashes -= hash else + if (flags & TIMER_OVERRIDE) - hash_timer.hash = null //no need having it delete it's hash if we are going to replace it qdel(hash_timer) else if (hash_timer.flags & TIMER_STOPPABLE) @@ -500,7 +403,7 @@ SUBSYSTEM_DEF(timer) qdel(id) return TRUE //id is string - var/datum/timedevent/timer = SStimer.timer_id_dict[id] + var/datum/timedevent/timer = SStimer.timer_id_dict["timerid[id]"] if (timer && !timer.spent) qdel(timer) return TRUE @@ -509,5 +412,3 @@ SUBSYSTEM_DEF(timer) #undef BUCKET_LEN #undef BUCKET_POS -#undef TIMER_MAX -#undef TIMER_ID_MAX \ No newline at end of file diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index a0bcb5feec..4f1dbc37c7 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -36,7 +36,7 @@ SUBSYSTEM_DEF(title) break file_path = "config/title_screens/images/[pick(title_screens)]" - + icon = new(fcopy_rsc(file_path)) if(splash_turf) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index acb873dd5b..37811c183f 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -206,7 +206,6 @@ SUBSYSTEM_DEF(vote) var/datum/action/vote/V = new if(question) V.name = "Vote: [question]" - C.player_details.player_actions += V V.Grant(C.mob) generated_actions += V return 1 @@ -300,7 +299,6 @@ SUBSYSTEM_DEF(vote) for(var/v in generated_actions) var/datum/action/vote/V = v if(!QDELETED(V)) - V.remove_from_client() V.Remove(V.owner) generated_actions = list() @@ -320,16 +318,7 @@ SUBSYSTEM_DEF(vote) /datum/action/vote/Trigger() if(owner) owner.vote() - remove_from_client() Remove(owner) /datum/action/vote/IsAvailable() return 1 - -/datum/action/vote/proc/remove_from_client() - if(owner.client) - owner.client.player_details.player_actions -= src - else if(owner.ckey) - var/datum/player_details/P = GLOB.player_details[owner.ckey] - if(P) - P.player_actions -= src \ No newline at end of file diff --git a/code/datums/action.dm b/code/datums/action.dm index f14945fa24..f941a00a54 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -170,15 +170,14 @@ ..(current_button) else if(target && current_button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid. var/obj/item/I = target + current_button.appearance_cache = I.appearance var/old_layer = I.layer var/old_plane = I.plane I.layer = FLOAT_LAYER //AAAH I.plane = FLOAT_PLANE //^ what that guy said - current_button.cut_overlays() - current_button.add_overlay(I) + current_button.overlays = list(I) I.layer = old_layer I.plane = old_plane - current_button.appearance_cache = I.appearance /datum/action/item_action/toggle_light name = "Toggle Light" diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index c12a08a792..8d86507271 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -373,9 +373,32 @@ ion = list() /datum/ai_laws/proc/show_laws(who) - var/list/printable_laws = get_law_list(include_zeroth = TRUE) - for(var/law in printable_laws) - to_chat(who,law) + + if (devillaws && devillaws.len) //Yes, devil laws go in FRONT of zeroth laws, as the devil must still obey it's ban/obligation. + for(var/i in devillaws) + to_chat(who, "666. [i]") + + if (zeroth) + to_chat(who, "0. [zeroth]") + + for (var/index = 1, index <= ion.len, index++) + var/law = ion[index] + var/num = ionnum() + to_chat(who, "[num]. [law]") + + var/number = 1 + for (var/index = 1, index <= inherent.len, index++) + var/law = inherent[index] + + if (length(law) > 0) + to_chat(who, "[number]. [law]") + number++ + + for (var/index = 1, index <= supplied.len, index++) + var/law = supplied[index] + if (length(law) > 0) + to_chat(who, "[number]. [law]") + number++ /datum/ai_laws/proc/clear_zeroth_law(force) //only removes zeroth from antag ai if force is 1 if(force) diff --git a/code/datums/antagonists/abductor.dm b/code/datums/antagonists/abductor.dm index 3b8935d9fa..8d13c48e7c 100644 --- a/code/datums/antagonists/abductor.dm +++ b/code/datums/antagonists/abductor.dm @@ -1,6 +1,5 @@ /datum/antagonist/abductor name = "Abductor" - roundend_category = "abductors" job_rank = ROLE_ABDUCTOR var/datum/objective_team/abductor_team/team var/sub_role @@ -71,65 +70,3 @@ var/mob/living/carbon/human/H = owner.current var/datum/species/abductor/A = H.dna.species A.scientist = TRUE - - -/datum/objective_team/abductor_team - member_name = "abductor" - var/team_number - var/list/datum/mind/abductees = list() - -/datum/objective_team/abductor_team/is_solo() - return FALSE - -/datum/objective_team/abductor_team/proc/add_objective(datum/objective/O) - O.team = src - O.update_explanation_text() - objectives += O - -/datum/objective_team/abductor_team/roundend_report() - var/list/result = list() - - var/won = TRUE - for(var/datum/objective/O in objectives) - if(!O.check_completion()) - won = FALSE - if(won) - result += "[name] team fulfilled its mission!" - else - result += "[name] team failed its mission." - - result += "The abductors of [name] were:" - for(var/datum/mind/abductor_mind in members) - result += printplayer(abductor_mind) - result += printobjectives(abductor_mind) - - return result.Join("
") - - -/datum/antagonist/abductee - name = "Abductee" - roundend_category = "abductees" - -/datum/antagonist/abductee/on_gain() - give_objective() - . = ..() - -/datum/antagonist/abductee/greet() - to_chat(owner, "Your mind snaps!") - to_chat(owner, "You can't remember how you got here...") - owner.announce_objectives() - -/datum/antagonist/abductee/proc/give_objective() - var/mob/living/carbon/human/H = owner.current - if(istype(H)) - H.gain_trauma_type(BRAIN_TRAUMA_MILD) - var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) - var/datum/objective/abductee/O = new objtype() - objectives += O - owner.objectives += objectives - -/datum/antagonist/abductee/apply_innate_effects(mob/living/mob_override) - SSticker.mode.update_abductor_icons_added(mob_override ? mob_override.mind : owner) - -/datum/antagonist/abductee/remove_innate_effects(mob/living/mob_override) - SSticker.mode.update_abductor_icons_removed(mob_override ? mob_override.mind : owner) \ No newline at end of file diff --git a/code/datums/antagonists/antag_datum.dm b/code/datums/antagonists/antag_datum.dm index 6b5a573eff..0a7b2aa22f 100644 --- a/code/datums/antagonists/antag_datum.dm +++ b/code/datums/antagonists/antag_datum.dm @@ -2,8 +2,6 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist var/name = "Antagonist" - var/roundend_category = "other antagonists" //Section of roundend report, datums with same category will be displayed together, also default header for the section - var/show_in_roundend = TRUE //Set to false to hide the antagonists from roundend report var/datum/mind/owner //Mind that owns this datum var/silent = FALSE //Silent will prevent the gain/lose texts to show var/can_coexist_with_others = TRUE //Whether or not the person will be able to have more than one datum @@ -11,7 +9,6 @@ GLOBAL_LIST_EMPTY(antagonists) var/delete_on_mind_deletion = TRUE var/job_rank var/replace_banned = TRUE //Should replace jobbaned player with ghosts if granted. - var/list/objectives = list() /datum/antagonist/New(datum/mind/new_owner) GLOB.antagonists += src @@ -99,62 +96,9 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/get_team() return -//Individual roundend report -/datum/antagonist/proc/roundend_report() - var/list/report = list() - - if(!owner) - CRASH("antagonist datum without owner") - - report += printplayer(owner) - - var/objectives_complete = TRUE - if(owner.objectives.len) - report += printobjectives(owner) - for(var/datum/objective/objective in owner.objectives) - if(!objective.check_completion()) - objectives_complete = FALSE - break - - if(owner.objectives.len == 0 || objectives_complete) - report += "The [name] was successful!" - else - report += "The [name] has failed!" - - return report.Join("
") - -//Displayed at the start of roundend_category section, default to roundend_category header -/datum/antagonist/proc/roundend_report_header() - return "The [roundend_category] were:
" - -//Displayed at the end of roundend_category section -/datum/antagonist/proc/roundend_report_footer() - return - //Should probably be on ticker or job ss ? /proc/get_antagonists(antag_type,specific = FALSE) . = list() for(var/datum/antagonist/A in GLOB.antagonists) if(!specific && istype(A,antag_type) || specific && A.type == antag_type) - . += A.owner - - - -//This datum will autofill the name with special_role -//Used as placeholder for minor antagonists, please create proper datums for these -/datum/antagonist/auto_custom - -/datum/antagonist/auto_custom/on_gain() - ..() - name = owner.special_role - //Add all objectives not already owned by other datums to this one. - var/list/already_registered_objectives = list() - for(var/datum/antagonist/A in owner.antag_datums) - if(A == src) - continue - else - already_registered_objectives |= A.objectives - objectives = owner.objectives - already_registered_objectives - -//This one is created by admin tools for custom objectives -/datum/antagonist/custom \ No newline at end of file + . += A.owner \ No newline at end of file diff --git a/code/datums/antagonists/blob.dm b/code/datums/antagonists/blob.dm deleted file mode 100644 index 5689e6a567..0000000000 --- a/code/datums/antagonists/blob.dm +++ /dev/null @@ -1,59 +0,0 @@ -/datum/antagonist/blob - name = "Blob" - roundend_category = "blobs" - job_rank = ROLE_BLOB - - var/datum/action/innate/blobpop/pop_action - var/starting_points_human_blob = 60 - var/point_rate_human_blob = 2 - -/datum/antagonist/blob/roundend_report() - var/basic_report = ..() - //Display max blobpoints for blebs that lost - if(isovermind(owner.current)) //embarrasing if not - var/mob/camera/blob/overmind = owner.current - if(!overmind.victory_in_progress) //if it won this doesn't really matter - var/point_report = "
[owner.name] took over [overmind.max_count] tiles at the height of its growth." - return basic_report+point_report - return basic_report - -/datum/antagonist/blob/greet() - if(!isovermind(owner.current)) - to_chat(owner,"You feel bloated.") - -/datum/antagonist/blob/on_gain() - create_objectives() - . = ..() - -/datum/antagonist/blob/proc/create_objectives() - var/datum/objective/blob_takeover/main = new - main.owner = owner - objectives += main - owner.objectives |= objectives - -/datum/antagonist/blob/apply_innate_effects(mob/living/mob_override) - if(!isovermind(owner.current)) - if(!pop_action) - pop_action = new - pop_action.Grant(owner.current) - -/datum/objective/blob_takeover - explanation_text = "Reach critical mass!" - -//Non-overminds get this on blob antag assignment -/datum/action/innate/blobpop - name = "Pop" - desc = "Unleash the blob" - icon_icon = 'icons/mob/blob.dmi' - button_icon_state = "blob" - -/datum/action/innate/blobpop/Activate() - var/mob/old_body = owner - var/datum/antagonist/blob/blobtag = owner.mind.has_antag_datum(/datum/antagonist/blob) - if(!blobtag) - Remove() - return - var/mob/camera/blob/B = new /mob/camera/blob(get_turf(old_body), blobtag.starting_points_human_blob) - owner.mind.transfer_to(B) - old_body.gib() - B.place_blob_core(blobtag.point_rate_human_blob, pop_override = TRUE) \ No newline at end of file diff --git a/code/datums/antagonists/brother.dm b/code/datums/antagonists/brother.dm index dd3bdef9d2..6458e6da09 100644 --- a/code/datums/antagonists/brother.dm +++ b/code/datums/antagonists/brother.dm @@ -55,71 +55,3 @@ /datum/antagonist/brother/proc/finalize_brother() SSticker.mode.update_brother_icons_added(owner) - - -/datum/objective_team/brother_team - name = "brotherhood" - member_name = "blood brother" - var/meeting_area - -/datum/objective_team/brother_team/is_solo() - return FALSE - -/datum/objective_team/brother_team/proc/update_name() - var/list/last_names = list() - for(var/datum/mind/M in members) - var/list/split_name = splittext(M.name," ") - last_names += split_name[split_name.len] - - name = last_names.Join(" & ") - -/datum/objective_team/brother_team/roundend_report() - var/list/parts = list() - - parts += "The blood brothers of [name] were:" - for(var/datum/mind/M in members) - parts += printplayer(M) - var/win = TRUE - var/objective_count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[objective_count]: [objective.explanation_text] Success!" - else - parts += "Objective #[objective_count]: [objective.explanation_text] Fail." - win = FALSE - objective_count++ - if(win) - parts += "The blood brothers were successful!" - else - parts += "The blood brothers have failed!" - - return "
[parts.Join("
")]
" - -/datum/objective_team/brother_team/proc/add_objective(datum/objective/O, needs_target = FALSE) - O.team = src - if(needs_target) - O.find_target() - O.update_explanation_text() - objectives += O - -/datum/objective_team/brother_team/proc/forge_brother_objectives() - objectives = list() - var/is_hijacker = prob(10) - for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2) - is_hijacker)) - forge_single_objective() - if(is_hijacker) - if(!locate(/datum/objective/hijack) in objectives) - add_objective(new/datum/objective/hijack) - else if(!locate(/datum/objective/escape) in objectives) - add_objective(new/datum/objective/escape) - -/datum/objective_team/brother_team/proc/forge_single_objective() - if(prob(50)) - if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len)) - add_objective(new/datum/objective/destroy, TRUE) - else if(prob(30)) - add_objective(new/datum/objective/maroon, TRUE) - else - add_objective(new/datum/objective/assassinate, TRUE) - else - add_objective(new/datum/objective/steal, TRUE) \ No newline at end of file diff --git a/code/datums/antagonists/changeling.dm b/code/datums/antagonists/changeling.dm index 83886a98ad..e98bfed782 100644 --- a/code/datums/antagonists/changeling.dm +++ b/code/datums/antagonists/changeling.dm @@ -4,11 +4,11 @@ /datum/antagonist/changeling name = "Changeling" - roundend_category = "changelings" job_rank = ROLE_CHANGELING var/you_are_greet = TRUE var/give_objectives = TRUE + var/list/objectives = list() var/team_mode = FALSE //Should assign team objectives ? //Changeling Stuff @@ -78,7 +78,7 @@ . = ..() /datum/antagonist/changeling/on_removal() - remove_changeling_powers() + remove_changeling_powers(FALSE) owner.objectives -= objectives . = ..() @@ -100,11 +100,11 @@ chem_recharge_slowdown = initial(chem_recharge_slowdown) mimicing = "" -/datum/antagonist/changeling/proc/remove_changeling_powers() +/datum/antagonist/changeling/proc/remove_changeling_powers(keep_free_powers=0) if(ishuman(owner.current) || ismonkey(owner.current)) reset_properties() for(var/obj/effect/proc_holder/changeling/p in purchasedpowers) - if(p.always_keep) + if((p.dna_cost == 0 && keep_free_powers) || p.always_keep) continue purchasedpowers -= p p.on_refund(owner.current) @@ -116,13 +116,13 @@ /datum/antagonist/changeling/proc/reset_powers() if(purchasedpowers) - remove_changeling_powers() - //Repurchase free powers. + remove_changeling_powers(TRUE) + //Purchase free powers. for(var/path in all_powers) var/obj/effect/proc_holder/changeling/S = new path() if(!S.dna_cost) if(!has_sting(S)) - purchasedpowers += S + purchasedpowers+=S S.on_purchase(owner.current,TRUE) /datum/antagonist/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power) @@ -478,35 +478,4 @@ /datum/antagonist/changeling/xenobio name = "Xenobio Changeling" give_objectives = FALSE - show_in_roundend = FALSE //These are here for admin tracking purposes only you_are_greet = FALSE - -/datum/antagonist/changeling/roundend_report() - var/list/parts = list() - - var/changelingwin = 1 - if(!owner.current) - changelingwin = 0 - - parts += printplayer(owner) - - //Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed. - parts += "Changeling ID: [changelingID]." - parts += "Genomes Extracted: [absorbedcount]" - parts += " " - if(objectives.len) - var/count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!
" - else - parts += "Objective #[count]: [objective.explanation_text] Fail." - changelingwin = 0 - count++ - - if(changelingwin) - parts += "The changeling was successful!" - else - parts += "The changeling has failed." - - return parts.Join("
") \ No newline at end of file diff --git a/code/datums/antagonists/clockcult.dm b/code/datums/antagonists/clockcult.dm index 5f99ccc5dd..8cc1c9e9a7 100644 --- a/code/datums/antagonists/clockcult.dm +++ b/code/datums/antagonists/clockcult.dm @@ -1,11 +1,8 @@ //CLOCKCULT PROOF OF CONCEPT /datum/antagonist/clockcult name = "Clock Cultist" - roundend_category = "clock cultists" - job_rank = ROLE_SERVANT_OF_RATVAR var/datum/action/innate/hierophant/hierophant_network = new() - var/datum/objective_team/clockcult/clock_team - var/make_team = TRUE //This should be only false for tutorial scarabs + job_rank = ROLE_SERVANT_OF_RATVAR /datum/antagonist/clockcult/silent silent = TRUE @@ -14,22 +11,6 @@ qdel(hierophant_network) return ..() -/datum/antagonist/clockcult/get_team() - return clock_team - -/datum/antagonist/clockcult/create_team(datum/objective_team/clockcult/new_team) - if(!new_team && make_team) - //TODO blah blah same as the others, allow multiple - for(var/datum/antagonist/clockcult/H in GLOB.antagonists) - if(H.clock_team) - clock_team = H.clock_team - return - clock_team = new /datum/objective_team/clockcult - return - if(make_team && !istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - clock_team = new_team - /datum/antagonist/clockcult/can_be_owned(datum/mind/new_owner) . = ..() if(.) @@ -183,35 +164,3 @@ if(iscyborg(owner.current)) to_chat(owner.current, "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.") . = ..() - - -/datum/objective_team/clockcult - name = "Clockcult" - var/list/objective - var/datum/mind/eminence - -/datum/objective_team/clockcult/proc/check_clockwork_victory() - if(GLOB.clockwork_gateway_activated) - return TRUE - return FALSE - -/datum/objective_team/clockcult/roundend_report() - var/list/parts = list() - - if(check_clockwork_victory()) - parts += "Ratvar's servants defended the Ark until its activation!" - else - parts += "The Ark was destroyed! Ratvar will rust away for all eternity!" - parts += " " - parts += "The servants' objective was: [CLOCKCULT_OBJECTIVE]." - parts += "Construction Value(CV) was: [GLOB.clockwork_construction_value]" - for(var/i in SSticker.scripture_states) - if(i != SCRIPTURE_DRIVER) - parts += "[i] scripture was: [SSticker.scripture_states[i] ? "UN":""]LOCKED" - if(eminence) - parts += "The Eminence was: [printplayer(eminence)]" - if(members.len) - parts += "Ratvar's servants were:" - parts += printplayerlist(members - eminence) - - return "
[parts.Join("
")]
" \ No newline at end of file diff --git a/code/datums/antagonists/cult.dm b/code/datums/antagonists/cult.dm index bce9123fb3..c26b0f8108 100644 --- a/code/datums/antagonists/cult.dm +++ b/code/datums/antagonists/cult.dm @@ -2,103 +2,84 @@ /datum/antagonist/cult name = "Cultist" - roundend_category = "cultists" var/datum/action/innate/cult/comm/communion = new var/datum/action/innate/cult/mastervote/vote = new job_rank = ROLE_CULTIST var/ignore_implant = FALSE - var/give_equipment = FALSE - - var/datum/objective_team/cult/cult_team - -/datum/antagonist/cult/get_team() - return cult_team - -/datum/antagonist/cult/create_team(datum/objective_team/cult/new_team) - if(!new_team) - //todo remove this and allow admin buttons to create more than one cult - for(var/datum/antagonist/cult/H in GLOB.antagonists) - if(H.cult_team) - cult_team = H.cult_team - return - cult_team = new /datum/objective_team/cult - cult_team.setup_objectives() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - cult_team = new_team - -/datum/antagonist/cult/proc/add_objectives() - objectives |= cult_team.objectives - owner.objectives |= objectives - -/datum/antagonist/cult/proc/remove_objectives() - owner.objectives -= objectives /datum/antagonist/cult/Destroy() QDEL_NULL(communion) QDEL_NULL(vote) return ..() +/datum/antagonist/cult/proc/add_objectives() + var/list/target_candidates = list() + for(var/mob/living/carbon/human/player in GLOB.player_list) + if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && !is_convertable_to_cult(player) && (player != owner) && player.stat != DEAD) + target_candidates += player.mind + if(target_candidates.len == 0) + message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.") + for(var/mob/living/carbon/human/player in GLOB.player_list) + if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && (player != owner) && player.stat != DEAD) + target_candidates += player.mind + listclearnulls(target_candidates) + if(LAZYLEN(target_candidates)) + GLOB.sac_mind = pick(target_candidates) + if(!GLOB.sac_mind) + message_admins("Cult Sacrifice: ERROR - Null target chosen!") + else + var/datum/job/sacjob = SSjob.GetJob(GLOB.sac_mind.assigned_role) + var/datum/preferences/sacface = GLOB.sac_mind.current.client.prefs + var/icon/reshape = get_flat_human_icon(null, sacjob, sacface) + reshape.Shift(SOUTH, 4) + reshape.Shift(EAST, 1) + reshape.Crop(7,4,26,31) + reshape.Crop(-5,-3,26,30) + GLOB.sac_image = reshape + else + message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!") + GLOB.sac_complete = TRUE + SSticker.mode.cult_objectives += "sacrifice" + if(!GLOB.summon_spots.len) + while(GLOB.summon_spots.len < SUMMON_POSSIBILITIES) + var/area/summon = pick(GLOB.sortedAreas - GLOB.summon_spots) + if(summon && (summon.z in GLOB.station_z_levels) && summon.valid_territory) + GLOB.summon_spots += summon + SSticker.mode.cult_objectives += "eldergod" + +/datum/antagonist/cult/proc/cult_memorization(datum/mind/cult_mind) + var/mob/living/current = cult_mind.current + for(var/obj_count = 1,obj_count <= SSticker.mode.cult_objectives.len,obj_count++) + var/explanation + switch(SSticker.mode.cult_objectives[obj_count]) + if("sacrifice") + if(GLOB.sac_mind) + explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it." + else + explanation = "The veil has already been weakened here, proceed to the final objective." + GLOB.sac_complete = TRUE + if("eldergod") + explanation = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie'. The summoning can only be accomplished in [english_list(GLOB.summon_spots)] - where the veil is weak enough for the ritual to begin." + if(!silent) + to_chat(current, "Objective #[obj_count]: [explanation]") + cult_mind.memory += "Objective #[obj_count]: [explanation]
" + /datum/antagonist/cult/can_be_owned(datum/mind/new_owner) . = ..() if(. && !ignore_implant) - . = is_convertable_to_cult(new_owner.current,cult_team) - -/datum/antagonist/cult/greet() - to_chat(owner, "You are a member of the cult!") - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/bloodcult.ogg', 100, FALSE, pressure_affected = FALSE)//subject to change - owner.announce_objectives() + . = is_convertable_to_cult(new_owner.current) /datum/antagonist/cult/on_gain() . = ..() var/mob/living/current = owner.current - add_objectives() - if(give_equipment) - equip_cultist() + if(!LAZYLEN(SSticker.mode.cult_objectives)) + add_objectives() SSticker.mode.cult += owner // Only add after they've been given objectives + cult_memorization(owner) SSticker.mode.update_cult_icons_added(owner) current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) - - if(cult_team.blood_target && cult_team.blood_target_image && current.client) - current.client.images += cult_team.blood_target_image - - -/datum/antagonist/cult/proc/equip_cultist(tome=FALSE) - var/mob/living/carbon/H = owner.current - if(!istype(H)) - return - if (owner.assigned_role == "Clown") - to_chat(owner, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - H.dna.remove_mutation(CLOWNMUT) - - if(tome) - . += cult_give_item(/obj/item/tome, H) - else - . += cult_give_item(/obj/item/paper/talisman/supply, H) - to_chat(owner, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.") - - -/datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) - var/list/slots = list( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store - ) - - var/T = new item_path(mob) - var/item_name = initial(item_path.name) - var/where = mob.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(mob, "Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).") - return 0 - else - to_chat(mob, "You have a [item_name] in your [where].") - if(where == "backpack") - var/obj/item/storage/B = mob.back - B.orient2hud(mob) - B.show_to(mob) - return 1 + if(GLOB.blood_target && GLOB.blood_target_image && current.client) + current.client.images += GLOB.blood_target_image /datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) . = ..() @@ -108,7 +89,7 @@ current.faction |= "cult" current.grant_language(/datum/language/narsie) current.verbs += /mob/living/proc/cult_help - if(!cult_team.cult_mastered) + if(!GLOB.cult_mastered) vote.Grant(current) communion.Grant(current) current.throw_alert("bloodsense", /obj/screen/alert/bloodsense) @@ -126,7 +107,6 @@ current.clear_alert("bloodsense") /datum/antagonist/cult/on_removal() - remove_objectives() owner.wipe_memory() SSticker.mode.cult -= owner SSticker.mode.update_cult_icons_removed(owner) @@ -134,8 +114,8 @@ owner.current.visible_message("[owner.current] looks like [owner.current.p_they()] just reverted to their old faith!", ignored_mob = owner.current) to_chat(owner.current, "An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.") owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) - if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client) - owner.current.client.images -= cult_team.blood_target_image + if(GLOB.blood_target && GLOB.blood_target_image && owner.current.client) + owner.current.client.images -= GLOB.blood_target_image . = ..() /datum/antagonist/cult/master @@ -165,7 +145,7 @@ var/mob/living/current = owner.current if(mob_override) current = mob_override - if(!cult_team.reckoning_complete) + if(!GLOB.reckoning_complete) reckoning.Grant(current) bloodmark.Grant(current) throwing.Grant(current) @@ -182,118 +162,3 @@ throwing.Remove(current) current.update_action_buttons_icon() current.remove_status_effect(/datum/status_effect/cult_master) - -/datum/objective_team/cult - name = "Cult" - - var/blood_target - var/image/blood_target_image - var/blood_target_reset_timer - - var/cult_vote_called = FALSE - var/cult_mastered = FALSE - var/reckoning_complete = FALSE - - -/datum/objective_team/cult/proc/setup_objectives() - //SAC OBJECTIVE , todo: move this to objective internals - var/list/target_candidates = list() - var/datum/objective/sacrifice/sac_objective = new - sac_objective.team = src - - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && !is_convertable_to_cult(player) && player.stat != DEAD) - target_candidates += player.mind - - if(target_candidates.len == 0) - message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.") - for(var/mob/living/carbon/human/player in GLOB.player_list) - if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && player.stat != DEAD) - target_candidates += player.mind - listclearnulls(target_candidates) - if(LAZYLEN(target_candidates)) - sac_objective.target = pick(target_candidates) - sac_objective.update_explanation_text() - - var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role) - var/datum/preferences/sacface = sac_objective.target.current.client.prefs - var/icon/reshape = get_flat_human_icon(null, sacjob, sacface) - reshape.Shift(SOUTH, 4) - reshape.Shift(EAST, 1) - reshape.Crop(7,4,26,31) - reshape.Crop(-5,-3,26,30) - sac_objective.sac_image = reshape - - objectives += sac_objective - else - message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!") - - - //SUMMON OBJECTIVE - - var/datum/objective/eldergod/summon_objective = new() - summon_objective.team = src - objectives += summon_objective - -/datum/objective/sacrifice - var/sacced = FALSE - var/sac_image - -/datum/objective/sacrifice/check_completion() - return sacced || completed - -/datum/objective/sacrifice/update_explanation_text() - if(target && !sacced) - explanation_text = "Sacrifice [target], the [target.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it." - else - explanation_text = "The veil has already been weakened here, proceed to the final objective." - -/datum/objective/eldergod - var/summoned = FALSE - var/list/summon_spots = list() - -/datum/objective/eldergod/New() - ..() - var/sanity = 0 - while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100) - var/area/summon = pick(GLOB.sortedAreas - summon_spots) - if(summon && (summon.z in GLOB.station_z_levels) && summon.valid_territory) - summon_spots += summon - sanity++ - update_explanation_text() - -/datum/objective/eldergod/update_explanation_text() - explanation_text = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie'. The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin." - -/datum/objective/eldergod/check_completion() - return summoned || completed - -/datum/objective_team/cult/proc/check_cult_victory() - for(var/datum/objective/O in objectives) - if(!O.check_completion()) - return FALSE - return TRUE - -/datum/objective_team/cult/roundend_report() - var/list/parts = list() - - if(check_cult_victory()) - parts += "The cult has succeeded! Nar-sie has snuffed out another torch in the void!" - else - parts += "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!" - - if(objectives.len) - parts += "The cultists' objectives were:" - var/count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!" - else - parts += "Objective #[count]: [objective.explanation_text] Fail." - count++ - - if(members.len) - parts += "The cultists were:" - parts += printplayerlist(members) - - return "
[parts.Join("
")]
" \ No newline at end of file diff --git a/code/datums/antagonists/datum_traitor.dm b/code/datums/antagonists/datum_traitor.dm index 80487f69e8..d386c79c25 100644 --- a/code/datums/antagonists/datum_traitor.dm +++ b/code/datums/antagonists/datum_traitor.dm @@ -1,6 +1,5 @@ /datum/antagonist/traitor name = "Traitor" - roundend_category = "traitors" job_rank = ROLE_TRAITOR var/should_specialise = FALSE //do we split into AI and human, set to true on inital assignment only var/ai_datum = ANTAG_DATUM_TRAITOR_AI @@ -9,6 +8,7 @@ var/employer = "The Syndicate" var/give_objectives = TRUE var/should_give_codewords = TRUE + var/list/objectives_given = list() /datum/antagonist/traitor/human var/should_equip = TRUE @@ -52,9 +52,9 @@ if(should_specialise) return ..()//we never did any of this anyway SSticker.mode.traitors -= owner - for(var/O in objectives) + for(var/O in objectives_given) owner.objectives -= O - objectives = list() + objectives_given = list() if(!silent && owner.current) to_chat(owner.current," You are no longer the [special_role]! ") owner.special_role = null @@ -71,11 +71,11 @@ /datum/antagonist/traitor/proc/add_objective(var/datum/objective/O) owner.objectives += O - objectives += O + objectives_given += O /datum/antagonist/traitor/proc/remove_objective(var/datum/objective/O) owner.objectives -= O - objectives -= O + objectives_given -= O /datum/antagonist/traitor/proc/forge_traitor_objectives() return @@ -127,7 +127,6 @@ if(prob(30)) objective_count += forge_single_objective() - for(var/i = objective_count, i < CONFIG_GET(number/traitor_objectives_amount), i++) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = owner @@ -153,6 +152,11 @@ maroon_objective.owner = owner maroon_objective.find_target() add_objective(maroon_objective) + else if(prob(50)) + var/datum/objective/assassinate/late/late_objective = new + late_objective.owner = owner + late_objective.find_target() + add_objective(late_objective) else var/datum/objective/assassinate/kill_objective = new kill_objective.owner = owner @@ -290,53 +294,3 @@ where = "In your [equipped_slot]" to_chat(mob, "

[where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
") -//TODO Collate -/datum/antagonist/traitor/roundend_report() - var/list/result = list() - - var/traitorwin = TRUE - - result += printplayer(owner) - - var/TC_uses = 0 - var/uplink_true = FALSE - var/purchases = "" - for(var/datum/component/uplink/H in GLOB.uplinks) - if(H.owner && H.owner == owner.key) - TC_uses += H.purchase_log.total_spent - uplink_true = TRUE - purchases += H.purchase_log.generate_render(FALSE) - - var/objectives_text = "" - if(objectives.len)//If the traitor had no objectives, don't need to process this. - var/count = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objectives_text += "
Objective #[count]: [objective.explanation_text] Success!" - else - objectives_text += "
Objective #[count]: [objective.explanation_text] Fail." - traitorwin = FALSE - count++ - - if(uplink_true) - var/uplink_text = "(used [TC_uses] TC) [purchases]" - if(TC_uses==0 && traitorwin) - var/static/icon/badass = icon('icons/badass.dmi', "badass") - uplink_text += "[icon2html(badass, world)]" - result += uplink_text - - result += objectives_text - - var/special_role_text = lowertext(name) - - if(traitorwin) - result += "The [special_role_text] was successful!" - else - result += "The [special_role_text] has failed!" - SEND_SOUND(owner.current, 'sound/ambience/ambifailure.ogg') - - return result.Join("
") - -/datum/antagonist/traitor/roundend_report_footer() - return "
The code phrases were: [GLOB.syndicate_code_phrase]
\ - The code responses were: [GLOB.syndicate_code_response]
" \ No newline at end of file diff --git a/code/datums/antagonists/devil.dm b/code/datums/antagonists/devil.dm index 97e0d8c18a..416a8f3752 100644 --- a/code/datums/antagonists/devil.dm +++ b/code/datums/antagonists/devil.dm @@ -86,7 +86,6 @@ GLOBAL_LIST_INIT(devil_syllable, list("hal", "ve", "odr", "neit", "ci", "quon", GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", ", the Lord of all things", ", Jr.")) /datum/antagonist/devil name = "Devil" - roundend_category = "devils" job_rank = ROLE_DEVIL //Don't delete upon mind destruction, otherwise soul re-selling will break. delete_on_mind_deletion = FALSE @@ -509,35 +508,6 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", owner.RemoveSpell(S) .=..() -/datum/antagonist/devil/proc/printdevilinfo() - var/list/parts = list() - parts += "The devil's true name is: [truename]" - parts += "The devil's bans were:" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][ban]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][bane]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][obligation]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][banish]]" - return parts.Join("
") - -/datum/antagonist/devil/roundend_report() - var/list/parts = list() - parts += printplayer(owner) - parts += printdevilinfo() - parts += printobjectives(owner) - return parts.Join("
") - -/datum/antagonist/devil/roundend_report_footer() - //sintouched go here for now as a hack , TODO proper antag datum for these - var/list/parts = list() - if(SSticker.mode.sintouched.len) - parts += "The sintouched were:" - var/list/sintouchedUnique = uniqueList(SSticker.mode.sintouched) - for(var/S in sintouchedUnique) - var/datum/mind/sintouched_mind = S - parts += printplayer(sintouched_mind) - parts += printobjectives(sintouched_mind) - return parts.Join("
") - //A simple super light weight datum for the codex gigas. /datum/fakeDevil var/truename diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm index 8201cd879d..ab4822dd79 100644 --- a/code/datums/antagonists/ninja.dm +++ b/code/datums/antagonists/ninja.dm @@ -37,20 +37,19 @@ else if(M.assigned_role in GLOB.command_positions) possible_targets[M] = 1 //good-guy - var/list/possible_objectives = list(1,2,3,4) - - while(objectives.len < quantity) - switch(pick_n_take(possible_objectives)) + var/list/objectives = list(1,2,3,4) + while(owner.objectives.len < quantity) + switch(pick_n_take(objectives)) if(1) //research var/datum/objective/download/O = new /datum/objective/download() O.owner = owner O.gen_amount_goal() - objectives += O + owner.objectives += O if(2) //steal var/datum/objective/steal/special/O = new /datum/objective/steal/special() O.owner = owner - objectives += O + owner.objectives += O if(3) //protect/kill if(!possible_targets.len) continue @@ -64,13 +63,13 @@ O.owner = owner O.target = M O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]." - objectives += O + owner.objectives += O else //protect var/datum/objective/protect/O = new /datum/objective/protect() O.owner = owner O.target = M O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm." - objectives += O + owner.objectives += O if(4) //debrain/capture if(!possible_targets.len) continue var/selected = rand(1,possible_targets.len) @@ -83,17 +82,17 @@ O.owner = owner O.target = M O.explanation_text = "Steal the brain of [M.current.real_name]." - objectives += O + owner.objectives += O else //capture var/datum/objective/capture/O = new /datum/objective/capture() O.owner = owner O.gen_amount_goal() - objectives += O + owner.objectives += O else break var/datum/objective/O = new /datum/objective/survive() O.owner = owner - owner.objectives |= objectives + owner.objectives += O /proc/remove_ninja(mob/living/L) diff --git a/code/datums/antagonists/nukeop.dm b/code/datums/antagonists/nukeop.dm deleted file mode 100644 index 30d00ac3dd..0000000000 --- a/code/datums/antagonists/nukeop.dm +++ /dev/null @@ -1,322 +0,0 @@ -#define NUKE_RESULT_FLUKE 0 -#define NUKE_RESULT_NUKE_WIN 1 -#define NUKE_RESULT_CREW_WIN 2 -#define NUKE_RESULT_CREW_WIN_SYNDIES_DEAD 3 -#define NUKE_RESULT_DISK_LOST 4 -#define NUKE_RESULT_DISK_STOLEN 5 -#define NUKE_RESULT_NOSURVIVORS 6 -#define NUKE_RESULT_WRONG_STATION 7 -#define NUKE_RESULT_WRONG_STATION_DEAD 8 - -/datum/antagonist/nukeop - name = "Nuclear Operative" - roundend_category = "syndicate operatives" //just in case - job_rank = ROLE_OPERATIVE - var/datum/objective_team/nuclear/nuke_team - var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. - var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint. - var/nukeop_outfit = /datum/outfit/syndicate - -/datum/antagonist/nukeop/proc/update_synd_icons_added(mob/living/M) - var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] - opshud.join_hud(M) - set_antag_hud(M, "synd") - -/datum/antagonist/nukeop/proc/update_synd_icons_removed(mob/living/M) - var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] - opshud.leave_hud(M) - set_antag_hud(M, null) - -/datum/antagonist/nukeop/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_synd_icons_added(M) - -/datum/antagonist/nukeop/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - update_synd_icons_removed(M) - -/datum/antagonist/nukeop/proc/equip_op() - if(!ishuman(owner.current)) - return - var/mob/living/carbon/human/H = owner.current - - H.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs - - H.equipOutfit(nukeop_outfit) - return TRUE - -/datum/antagonist/nukeop/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) - to_chat(owner, "You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!") - owner.announce_objectives() - return - -/datum/antagonist/nukeop/on_gain() - give_alias() - forge_objectives() - . = ..() - equip_op() - memorize_code() - if(send_to_spawnpoint) - move_to_spawnpoint() - -/datum/antagonist/nukeop/get_team() - return nuke_team - -/datum/antagonist/nukeop/proc/assign_nuke() - if(nuke_team && !nuke_team.tracked_nuke) - nuke_team.memorized_code = random_nukecode() - var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list - if(nuke) - nuke_team.tracked_nuke = nuke - if(nuke.r_code == "ADMIN") - nuke.r_code = nuke_team.memorized_code - else //Already set by admins/something else? - nuke_team.memorized_code = nuke.r_code - else - stack_trace("Syndicate nuke not found during nuke team creation.") - nuke_team.memorized_code = null - -/datum/antagonist/nukeop/proc/give_alias() - if(nuke_team && nuke_team.syndicate_name) - var/number = 1 - number = nuke_team.members.Find(owner) - owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]" - -/datum/antagonist/nukeop/proc/memorize_code() - if(nuke_team && nuke_team.tracked_nuke && nuke_team.memorized_code) - owner.store_memory("[nuke_team.tracked_nuke] Code: [nuke_team.memorized_code]", 0, 0) - to_chat(owner, "The nuclear authorization code is: [nuke_team.memorized_code]") - else - to_chat(owner, "Unfortunately the syndicate was unable to provide you with nuclear authorization code.") - -/datum/antagonist/nukeop/proc/forge_objectives() - if(nuke_team) - owner.objectives |= nuke_team.objectives - -/datum/antagonist/nukeop/proc/move_to_spawnpoint() - var/team_number = 1 - if(nuke_team) - team_number = nuke_team.members.Find(owner) - owner.current.forceMove(GLOB.nukeop_start[((team_number - 1) % GLOB.nukeop_start.len) + 1]) - -/datum/antagonist/nukeop/leader/move_to_spawnpoint() - owner.current.forceMove(pick(GLOB.nukeop_leader_start)) - -/datum/antagonist/nukeop/create_team(datum/objective_team/nuclear/new_team) - if(!new_team) - if(!always_new_team) - for(var/datum/antagonist/nukeop/N in GLOB.antagonists) - if(N.nuke_team) - nuke_team = N.nuke_team - return - nuke_team = new /datum/objective_team/nuclear - nuke_team.update_objectives() - assign_nuke() //This is bit ugly - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - nuke_team = new_team - -/datum/antagonist/nukeop/leader - name = "Nuclear Operative Leader" - nukeop_outfit = /datum/outfit/syndicate/leader - always_new_team = TRUE - var/title - -/datum/antagonist/nukeop/leader/memorize_code() - ..() - if(nuke_team && nuke_team.memorized_code) - var/obj/item/paper/P = new - P.info = "The nuclear authorization code is: [nuke_team.memorized_code]" - P.name = "nuclear bomb code" - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - P.forceMove(get_turf(H)) - else - H.put_in_hands(P, TRUE) - H.update_icons() - -/datum/antagonist/nukeop/leader/give_alias() - title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") - if(nuke_team && nuke_team.syndicate_name) - owner.current.real_name = "[nuke_team.syndicate_name] [title]" - else - owner.current.real_name = "Syndicate [title]" - -/datum/antagonist/nukeop/leader/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) - to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") - to_chat(owner, "If you feel you are not up to this task, give your ID to another operative.") - to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") - owner.announce_objectives() - addtimer(CALLBACK(src, .proc/nuketeam_name_assign), 1) - - -/datum/antagonist/nukeop/leader/proc/nuketeam_name_assign() - if(!nuke_team) - return - nuke_team.rename_team(ask_name()) - -/datum/objective_team/nuclear/proc/rename_team(new_name) - syndicate_name = new_name - name = "[syndicate_name] Team" - for(var/I in members) - var/datum/mind/synd_mind = I - var/mob/living/carbon/human/H = synd_mind.current - if(!istype(H)) - continue - var/chosen_name = H.dna.species.random_name(H.gender,0,syndicate_name) - H.fully_replace_character_name(H.real_name,chosen_name) - -/datum/antagonist/nukeop/leader/proc/ask_name() - var/randomname = pick(GLOB.last_names) - var/newname = stripped_input(owner.current,"You are the nuke operative [title]. Please choose a last name for your family.", "Name change",randomname) - if (!newname) - newname = randomname - else - newname = reject_bad_name(newname) - if(!newname) - newname = randomname - - return capitalize(newname) - -/datum/antagonist/nukeop/lone - name = "Lone Operative" - always_new_team = TRUE - send_to_spawnpoint = FALSE //Handled by event - nukeop_outfit = /datum/outfit/syndicate/full - -/datum/antagonist/nukeop/lone/assign_nuke() - if(nuke_team && !nuke_team.tracked_nuke) - nuke_team.memorized_code = random_nukecode() - var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.nuke_list - if(nuke) - nuke_team.tracked_nuke = nuke - if(nuke.r_code == "ADMIN") - nuke.r_code = nuke_team.memorized_code - else //Already set by admins/something else? - nuke_team.memorized_code = nuke.r_code - else - stack_trace("Station self destruct ot found during lone op team creation.") - nuke_team.memorized_code = null - -/datum/objective_team/nuclear - var/syndicate_name - var/obj/machinery/nuclearbomb/tracked_nuke - var/core_objective = /datum/objective/nuclear - var/memorized_code - -/datum/objective_team/nuclear/New() - ..() - syndicate_name = syndicate_name() - -/datum/objective_team/nuclear/proc/update_objectives() - if(core_objective) - var/datum/objective/O = new core_objective - O.team = src - objectives += O - -/datum/objective_team/nuclear/proc/disk_rescued() - for(var/obj/item/disk/nuclear/D in GLOB.poi_list) - if(!D.onCentCom()) - return FALSE - return TRUE - -/datum/objective_team/nuclear/proc/operatives_dead() - for(var/I in members) - var/datum/mind/operative_mind = I - if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD)) - return FALSE - return TRUE - -/datum/objective_team/nuclear/proc/syndies_escaped() - var/obj/docking_port/mobile/S = SSshuttle.getShuttle("syndicate") - return (S && (S.z == ZLEVEL_CENTCOM || S.z == ZLEVEL_TRANSIT)) - -/datum/objective_team/nuclear/proc/get_result() - var/evacuation = SSshuttle.emergency.mode == SHUTTLE_ENDGAME - var/disk_rescued = disk_rescued() - var/syndies_didnt_escape = !syndies_escaped() - var/station_was_nuked = SSticker.mode.station_was_nuked - var/nuke_off_station = SSticker.mode.nuke_off_station - - if(nuke_off_station == NUKE_SYNDICATE_BASE) - return NUKE_RESULT_FLUKE - else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) - return NUKE_RESULT_NUKE_WIN - else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) - return NUKE_RESULT_NOSURVIVORS - else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) - return NUKE_RESULT_WRONG_STATION - else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) - return NUKE_RESULT_WRONG_STATION_DEAD - else if ((disk_rescued || evacuation) && operatives_dead()) - return NUKE_RESULT_CREW_WIN_SYNDIES_DEAD - else if (disk_rescued) - return NUKE_RESULT_CREW_WIN - else if (!disk_rescued && operatives_dead()) - return NUKE_RESULT_DISK_LOST - else if (!disk_rescued && evacuation) - return NUKE_RESULT_DISK_STOLEN - else - return //Undefined result - -/datum/objective_team/nuclear/roundend_report() - var/list/parts = list() - parts += "[syndicate_name] Operatives:" - - switch(get_result()) - if(NUKE_RESULT_FLUKE) - parts += "Humiliating Syndicate Defeat" - parts += "The crew of [station_name()] gave [syndicate_name] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!" - if(NUKE_RESULT_NUKE_WIN) - parts += "Syndicate Major Victory!" - parts += "[syndicate_name] operatives have destroyed [station_name()]!" - if(NUKE_RESULT_NOSURVIVORS) - parts += "Total Annihilation" - parts += "[syndicate_name] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!" - if(NUKE_RESULT_WRONG_STATION) - parts += "Crew Minor Victory" - parts += "[syndicate_name] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!" - if(NUKE_RESULT_WRONG_STATION_DEAD) - parts += "[syndicate_name] operatives have earned Darwin Award!" - parts += "[syndicate_name] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!" - if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) - parts += "Crew Major Victory!" - parts += "The Research Staff has saved the disk and killed the [syndicate_name] Operatives" - if(NUKE_RESULT_CREW_WIN) - parts += "Crew Major Victory" - parts += "The Research Staff has saved the disk and stopped the [syndicate_name] Operatives!" - if(NUKE_RESULT_DISK_LOST) - parts += "Neutral Victory!" - parts += "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name] Operatives!" - if(NUKE_RESULT_DISK_STOLEN) - parts += "Syndicate Minor Victory!" - parts += "[syndicate_name] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!" - else - parts += "Neutral Victory" - parts += "Mission aborted!" - - var/text = "
The syndicate operatives were:" - var/purchases = "" - var/TC_uses = 0 - for(var/I in members) - var/datum/mind/syndicate = I - for(var/U in GLOB.uplinks) - var/datum/component/uplink/H = U - if(H.owner == syndicate.key) - TC_uses += H.purchase_log.total_spent - if(H.purchase_log) - purchases += H.purchase_log.generate_render(show_key = FALSE) - else - stack_trace("WARNING: Nuke Op uplink with no purchase_log Owner: [H.owner]") - text += printplayerlist(members) - text += "
" - text += "(Syndicates used [TC_uses] TC) [purchases]" - if(TC_uses == 0 && SSticker.mode.station_was_nuked && !operatives_dead()) - text += "[icon2html('icons/badass.dmi', world, "badass")]" - - parts += text - - return "
[parts.Join("
")]
" diff --git a/code/datums/antagonists/pirate.dm b/code/datums/antagonists/pirate.dm index e0ce38c1e4..ad32e09151 100644 --- a/code/datums/antagonists/pirate.dm +++ b/code/datums/antagonists/pirate.dm @@ -1,7 +1,6 @@ /datum/antagonist/pirate name = "Space Pirate" job_rank = ROLE_TRAITOR - roundend_category = "space pirates" var/datum/objective_team/pirate/crew /datum/antagonist/pirate/greet() @@ -37,6 +36,7 @@ /datum/objective_team/pirate name = "Pirate crew" + var/list/objectives = list() /datum/objective_team/pirate/proc/forge_objectives() var/datum/objective/loot/getbooty = new() @@ -84,11 +84,11 @@ GLOBAL_LIST_INIT(pirate_loot_cache, typecacheof(list( loot_table[lootname] = count else loot_table[lootname] += count - var/list/loot_texts = list() + var/text = "" for(var/key in loot_table) var/amount = loot_table[key] - loot_texts += "[amount] [key][amount > 1 ? "s":""]" - return loot_texts.Join(", ") + text += "[amount] [key][amount > 1 ? "s":""], " + return text /datum/objective/loot/proc/get_loot_value() if(!storage_area) @@ -105,26 +105,31 @@ GLOBAL_LIST_INIT(pirate_loot_cache, typecacheof(list( return ..() || get_loot_value() >= target_value +//These need removal ASAP as everything is converted to datum antags. +/datum/game_mode/proc/auto_declare_completion_pirates() + var/list/datum/mind/pirates = get_antagonists(/datum/antagonist/pirate) + var/datum/objective_team/pirate/crew + var/text = "" + if(pirates.len) + text += "
Space Pirates were:" + for(var/datum/mind/M in pirates) + text += printplayer(M) + if(!crew) + var/datum/antagonist/pirate/P = M.has_antag_datum(/datum/antagonist/pirate) + crew = P.crew + if(crew) + text += "
Loot stolen: " + var/datum/objective/loot/L = locate() in crew.objectives + text += L.loot_listing() + text += "
Total loot value : [L.get_loot_value()]/[L.target_value] credits" -/datum/objective_team/pirate/roundend_report() - var/list/parts = list() - - parts += "Space Pirates were:" - - var/all_dead = TRUE - for(var/datum/mind/M in members) - if(considered_alive(M)) - all_dead = FALSE - parts += printplayerlist(members) - - parts += "Loot stolen: " - var/datum/objective/loot/L = locate() in objectives - parts += L.loot_listing() - parts += "Total loot value : [L.get_loot_value()]/[L.target_value] credits" - - if(L.check_completion() && !all_dead) - parts += "The pirate crew was successful!" - else - parts += "The pirate crew has failed." - - return parts.Join("
") \ No newline at end of file + var/all_dead = TRUE + for(var/datum/mind/M in crew.members) + if(considered_alive(M)) + all_dead = FALSE + break + if(L.check_completion() && !all_dead) + text += "
The pirate crew was successful!" + else + text += "
The pirate crew has failed." + to_chat(world, text) \ No newline at end of file diff --git a/code/datums/antagonists/revolution.dm b/code/datums/antagonists/revolution.dm index 14c6d1ab0e..9db86bdf08 100644 --- a/code/datums/antagonists/revolution.dm +++ b/code/datums/antagonists/revolution.dm @@ -3,7 +3,6 @@ /datum/antagonist/rev name = "Revolutionary" - roundend_category = "revolutionaries" // if by some miracle revolutionaries without revolution happen job_rank = ROLE_REV var/hud_type = "rev" var/datum/objective_team/revolution/rev_team @@ -185,6 +184,7 @@ /datum/objective_team/revolution name = "Revolution" + var/list/objectives = list() var/max_headrevs = 3 /datum/objective_team/revolution/proc/update_objectives(initial = FALSE) @@ -227,56 +227,3 @@ rev.promote() addtimer(CALLBACK(src,.proc/update_heads),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) - - -/datum/objective_team/revolution/roundend_report() - if(!members.len) - return - - var/list/result = list() - - result += "
" - - var/num_revs = 0 - var/num_survivors = 0 - for(var/mob/living/carbon/survivor in GLOB.alive_mob_list) - if(survivor.ckey) - num_survivors++ - if(survivor.mind) - if(is_revolutionary(survivor)) - num_revs++ - if(num_survivors) - result += "Command's Approval Rating: [100 - round((num_revs/num_survivors)*100, 0.1)]%
" - - - var/list/targets = list() - var/list/datum/mind/headrevs = get_antagonists(/datum/antagonist/rev/head) - var/list/datum/mind/revs = get_antagonists(/datum/antagonist/rev,TRUE) - if(headrevs.len) - var/list/headrev_part = list() - headrev_part += "The head revolutionaries were:" - headrev_part += printplayerlist(headrevs,TRUE) - result += headrev_part.Join("
") - - if(revs.len) - var/list/rev_part = list() - rev_part += "The revolutionaries were:" - rev_part += printplayerlist(revs,TRUE) - result += rev_part.Join("
") - - var/list/heads = SSjob.get_all_heads() - if(heads.len) - var/head_text = "The heads of staff were:" - head_text += "
    " - for(var/datum/mind/head in heads) - var/target = (head in targets) - head_text += "
  • " - if(target) - head_text += "Target" - head_text += "[printplayer(head, 1)]
  • " - head_text += "

" - result += head_text - - result += "
" - - return result.Join() \ No newline at end of file diff --git a/code/datums/antagonists/wizard.dm b/code/datums/antagonists/wizard.dm index 7f23215d6c..e1e6dc09c8 100644 --- a/code/datums/antagonists/wizard.dm +++ b/code/datums/antagonists/wizard.dm @@ -5,13 +5,13 @@ /datum/antagonist/wizard name = "Space Wizard" - roundend_category = "wizards/witches" job_rank = ROLE_WIZARD var/give_objectives = TRUE var/strip = TRUE //strip before equipping var/allow_rename = TRUE var/hud_version = "wizard" var/datum/objective_team/wizard/wiz_team //Only created if wizard summons apprentices + var/list/objectives = list() //this should be base datum antag proc and list, todo make lazy var/move_to_lair = TRUE var/outfit_type = /datum/outfit/wizard var/wiz_age = WIZARD_AGE_MIN /* Wizards by nature cannot be too young. */ @@ -45,12 +45,10 @@ /datum/objective_team/wizard name = "wizard team" - var/datum/antagonist/wizard/master_wizard /datum/antagonist/wizard/proc/create_wiz_team() wiz_team = new(owner) wiz_team.name = "[owner.current.real_name] team" - wiz_team.master_wizard = src update_wiz_icons_added(owner.current) /datum/antagonist/wizard/proc/send_to_lair() @@ -285,46 +283,4 @@ var/datum/objective/new_objective = new("Protect Wizard Academy from the intruders") new_objective.owner = owner owner.objectives += new_objective - objectives += new_objective - -//Solo wizard report -/datum/antagonist/wizard/roundend_report() - var/list/parts = list() - - parts += printplayer(owner) - - var/count = 1 - var/wizardwin = 1 - for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] Success!" - else - parts += "Objective #[count]: [objective.explanation_text] Fail." - wizardwin = 0 - count++ - - if(wizardwin) - parts += "The wizard was successful!" - else - parts += "The wizard has failed!" - - if(owner.spell_list.len>0) - parts += "[owner.name] used the following spells: " - var/list/spell_names = list() - for(var/obj/effect/proc_holder/spell/S in owner.spell_list) - spell_names += S.name - parts += spell_names.Join(", ") - - return parts.Join("
") - -//Wizard with apprentices report -/datum/objective_team/wizard/roundend_report() - var/list/parts = list() - - parts += "Wizards/witches of [master_wizard.owner.name] team were:" - parts += master_wizard.roundend_report() - parts += " " - parts += "[master_wizard.owner.name] apprentices were:" - parts += printplayerlist(members - master_wizard.owner) - - return "
[parts.Join("
")]
" \ No newline at end of file + objectives += new_objective \ No newline at end of file diff --git a/code/datums/components/spooky.dm b/code/datums/components/spooky.dm index a62b7dcaab..3f3b0341ee 100644 --- a/code/datums/components/spooky.dm +++ b/code/datums/components/spooky.dm @@ -57,4 +57,4 @@ var/t = stripped_input(H, "Enter your new skeleton name", H.real_name, null, MAX_NAME_LEN) if(!t) t = "spooky skeleton" - H.fully_replace_character_name(null, t) + H.fully_replace_character_name(H.real_name, t) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index c22af19396..5f9cf3ad9a 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -1,4 +1,3 @@ - /datum/datacore var/medical[] = list() var/medicalPrintCount = 0 diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 6a3ad57878..4c08b1000d 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -17,7 +17,6 @@ /datum/proc/Destroy(force=FALSE, ...) tag = null weak_reference = null //ensure prompt GCing of weakref. - var/list/timers = active_timers active_timers = null for(var/thing in timers) @@ -25,7 +24,6 @@ if (timer.spent) continue qdel(timer) - var/list/dc = datum_components if(dc) var/all_components = dc[/datum/component] @@ -37,11 +35,4 @@ var/datum/component/C = all_components qdel(C, FALSE, TRUE) dc.Cut() - - var/list/focusers = src.focusers - if(focusers) - for(var/i in 1 to focusers.len) - var/mob/M = focusers[i] - M.set_focus(M) - return QDEL_HINT_QUEUE diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm index d2f6a73365..1a197f0f34 100644 --- a/code/datums/diseases/advance/presets.dm +++ b/code/datums/diseases/advance/presets.dm @@ -1,59 +1,59 @@ -// Cold - +// Cold + /datum/disease/advance/cold/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Cold" - symptoms = list(new/datum/symptom/sneeze) - ..(process, D, copy) - - -// Flu - + if(!D) + name = "Cold" + symptoms = list(new/datum/symptom/sneeze) + ..(process, D, copy) + + +// Flu + /datum/disease/advance/flu/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Flu" - symptoms = list(new/datum/symptom/cough) - ..(process, D, copy) - - -// Voice Changing - + if(!D) + name = "Flu" + symptoms = list(new/datum/symptom/cough) + ..(process, D, copy) + + +// Voice Changing + /datum/disease/advance/voice_change/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Epiglottis Mutation" - symptoms = list(new/datum/symptom/voice_change) - ..(process, D, copy) - - -// Toxin Filter - + if(!D) + name = "Epiglottis Mutation" + symptoms = list(new/datum/symptom/voice_change) + ..(process, D, copy) + + +// Toxin Filter + /datum/disease/advance/heal/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) - name = "Liver Enhancer" - symptoms = list(new/datum/symptom/heal) - ..(process, D, copy) - - + if(!D) + name = "Liver Enhancer" + symptoms = list(new/datum/symptom/heal) + ..(process, D, copy) + + // Hallucigen - + /datum/disease/advance/hallucigen/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) + if(!D) name = "Second Sight" - symptoms = list(new/datum/symptom/hallucigen) - ..(process, D, copy) - -// Sensory Restoration - + symptoms = list(new/datum/symptom/hallucigen) + ..(process, D, copy) + +// Sensory Restoration + /datum/disease/advance/mind_restoration/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) + if(!D) name = "Intelligence Booster" symptoms = list(new/datum/symptom/mind_restoration) - ..(process, D, copy) - -// Sensory Destruction - + ..(process, D, copy) + +// Sensory Destruction + /datum/disease/advance/narcolepsy/New(var/process = TRUE, var/datum/disease/advance/D, var/copy = FALSE) - if(!D) + if(!D) name = "Experimental Insomnia Cure" symptoms = list(new/datum/symptom/narcolepsy) ..(process, D, copy) \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/beard.dm b/code/datums/diseases/advance/symptoms/beard.dm index c7a3ccec89..aa3919f3cf 100644 --- a/code/datums/diseases/advance/symptoms/beard.dm +++ b/code/datums/diseases/advance/symptoms/beard.dm @@ -1,33 +1,33 @@ -/* -////////////////////////////////////// -Facial Hypertrichosis - - Very very Noticable. - Decreases resistance slightly. - Decreases stage speed. - Reduced transmittability - Intense Level. - -BONUS - Makes the mob grow a massive beard, regardless of gender. - -////////////////////////////////////// -*/ - -/datum/symptom/beard - - name = "Facial Hypertrichosis" +/* +////////////////////////////////////// +Facial Hypertrichosis + + Very very Noticable. + Decreases resistance slightly. + Decreases stage speed. + Reduced transmittability + Intense Level. + +BONUS + Makes the mob grow a massive beard, regardless of gender. + +////////////////////////////////////// +*/ + +/datum/symptom/beard + + name = "Facial Hypertrichosis" desc = "The virus increases hair production significantly, causing rapid beard growth." - stealth = -3 - resistance = -1 - stage_speed = -3 - transmittable = -1 - level = 4 - severity = 1 + stealth = -3 + resistance = -1 + stage_speed = -3 + transmittable = -1 + level = 4 + severity = 1 symptom_delay_min = 18 symptom_delay_max = 36 - -/datum/symptom/beard/Activate(datum/disease/advance/A) + +/datum/symptom/beard/Activate(datum/disease/advance/A) if(!..()) return var/mob/living/M = A.affected_mob diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index 4ff69680ce..209c7b0bf6 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -1,30 +1,30 @@ -/* -////////////////////////////////////// - -Confusion - - Little bit hidden. - Lowers resistance. - Decreases stage speed. - Not very transmittable. - Intense Level. - -Bonus - Makes the affected mob be confused for short periods of time. - -////////////////////////////////////// -*/ - -/datum/symptom/confusion - - name = "Confusion" +/* +////////////////////////////////////// + +Confusion + + Little bit hidden. + Lowers resistance. + Decreases stage speed. + Not very transmittable. + Intense Level. + +Bonus + Makes the affected mob be confused for short periods of time. + +////////////////////////////////////// +*/ + +/datum/symptom/confusion + + name = "Confusion" desc = "The virus interferes with the proper function of the neural system, leading to bouts of confusion and erratic movement." - stealth = 1 - resistance = -1 - stage_speed = -3 - transmittable = 0 - level = 4 - severity = 2 + stealth = 1 + resistance = -1 + stage_speed = -3 + transmittable = 0 + level = 4 + severity = 2 base_message_chance = 25 symptom_delay_min = 10 symptom_delay_max = 30 @@ -32,7 +32,7 @@ Bonus threshold_desc = "Resistance 6: Causes brain damage over time.
\ Transmission 6: Increases confusion duration.
\ Stealth 4: The symptom remains hidden until active." - + /datum/symptom/confusion/Start(datum/disease/advance/A) if(!..()) return @@ -42,20 +42,20 @@ Bonus power = 1.5 if(A.properties["stealth"] >= 4) suppress_warning = TRUE - -/datum/symptom/confusion/Activate(datum/disease/advance/A) + +/datum/symptom/confusion/Activate(datum/disease/advance/A) if(!..()) return var/mob/living/carbon/M = A.affected_mob switch(A.stage) if(1, 2, 3, 4) if(prob(base_message_chance) && !suppress_warning) - to_chat(M, "[pick("Your head hurts.", "Your mind blanks for a moment.")]") + to_chat(M, "[pick("Your head hurts.", "Your mind blanks for a moment.")]") else to_chat(M, "You can't think straight!") M.confused = min(100 * power, M.confused + 8) if(brain_damage) M.adjustBrainLoss(3 * power, 80) M.updatehealth() - - return + + return diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm index c7f7198f6b..bb83582425 100644 --- a/code/datums/diseases/advance/symptoms/dizzy.dm +++ b/code/datums/diseases/advance/symptoms/dizzy.dm @@ -50,4 +50,4 @@ Bonus to_chat(M, "A wave of dizziness washes over you!") M.Dizzy(5) if(power >= 2) - M.set_drugginess(5) \ No newline at end of file + M.set_drugginess(5) diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index c38acc8e9e..2d5d22a63a 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -127,4 +127,4 @@ Bonus M.reagents.add_reagent_list(list("heparin" = 2, "lipolicide" = 2)) if(zombie) M.reagents.add_reagent("romerol", 1) - return 1 \ No newline at end of file + return 1 diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm index 973de1455b..3a8c82beed 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -57,4 +57,4 @@ BONUS M.adjustStaminaLoss(25) if(power >= 3 && A.stage >= 5) to_chat(M, "[pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your head!")]") - M.Stun(35) \ No newline at end of file + M.Stun(35) diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm index 1da9f5e8d7..1c356247ee 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -51,4 +51,4 @@ BONUS var/can_scratch = scratch && !M.incapacitated() && get_location_accessible(M, picked_bodypart) M.visible_message("[can_scratch ? "[M] scratches [M.p_their()] [bodypart.name]." : ""]", "Your [bodypart.name] itches. [can_scratch ? " You scratch it." : ""]") if(can_scratch) - bodypart.receive_damage(0.5) \ No newline at end of file + bodypart.receive_damage(0.5) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 3c66e76746..746844f7cb 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -75,4 +75,4 @@ Bonus if(prob(30) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL)) C.cure_trauma_type(BRAIN_TRAUMA_SPECIAL) if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_MILD)) - C.cure_trauma_type(BRAIN_TRAUMA_MILD) \ No newline at end of file + C.cure_trauma_type(BRAIN_TRAUMA_MILD) diff --git a/code/datums/diseases/advance/symptoms/shedding.dm b/code/datums/diseases/advance/symptoms/shedding.dm index c5bbb6bc7b..a578289e17 100644 --- a/code/datums/diseases/advance/symptoms/shedding.dm +++ b/code/datums/diseases/advance/symptoms/shedding.dm @@ -1,39 +1,39 @@ -/* -////////////////////////////////////// -Alopecia - +/* +////////////////////////////////////// +Alopecia + Not Noticeable. Increases resistance slightly. - Reduces stage speed slightly. - Transmittable. - Intense Level. - -BONUS - Makes the mob lose hair. - -////////////////////////////////////// -*/ - -/datum/symptom/shedding - name = "Alopecia" + Reduces stage speed slightly. + Transmittable. + Intense Level. + +BONUS + Makes the mob lose hair. + +////////////////////////////////////// +*/ + +/datum/symptom/shedding + name = "Alopecia" desc = "The virus causes rapid shedding of head and body hair." stealth = 0 resistance = 1 - stage_speed = -1 + stage_speed = -1 transmittable = 3 - level = 4 - severity = 1 + level = 4 + severity = 1 base_message_chance = 50 symptom_delay_min = 45 symptom_delay_max = 90 - -/datum/symptom/shedding/Activate(datum/disease/advance/A) + +/datum/symptom/shedding/Activate(datum/disease/advance/A) if(!..()) return var/mob/living/M = A.affected_mob if(prob(base_message_chance)) - to_chat(M, "[pick("Your scalp itches.", "Your skin feels flakey.")]") + to_chat(M, "[pick("Your scalp itches.", "Your skin feels flakey.")]") if(ishuman(M)) var/mob/living/carbon/human/H = M switch(A.stage) @@ -45,11 +45,11 @@ BONUS if(!(H.facial_hair_style == "Shaved") || !(H.hair_style == "Bald")) to_chat(H, "Your hair starts to fall out in clumps...") addtimer(CALLBACK(src, .proc/Shed, H, TRUE), 50) - -/datum/symptom/shedding/proc/Shed(mob/living/carbon/human/H, fullbald) - if(fullbald) - H.facial_hair_style = "Shaved" - H.hair_style = "Bald" - else - H.hair_style = "Balding Hair" + +/datum/symptom/shedding/proc/Shed(mob/living/carbon/human/H, fullbald) + if(fullbald) + H.facial_hair_style = "Shaved" + H.hair_style = "Bald" + else + H.hair_style = "Balding Hair" H.update_hair() \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm index 591626e530..bad9062eb5 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -56,4 +56,4 @@ Bonus M.bodytemperature = min(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1) else M.bodytemperature -= (get_cold * A.stage) - return 1 \ No newline at end of file + return 1 diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 3648f5d707..8b5b59f71a 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -46,6 +46,7 @@ Bonus if(1, 2, 3) if(!suppress_warning) M.emote("sniff") - else - M.emote("sneeze") - A.spread(4 + power) \ No newline at end of file + else + M.emote("sneeze") + A.spread(5) + return diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index c97667733d..7052e90bf7 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -48,4 +48,4 @@ Bonus else to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]") M.overeatduration = max(M.overeatduration - 100, 0) - M.nutrition = max(M.nutrition - 100, 0) \ No newline at end of file + M.nutrition = max(M.nutrition - 100, 0) diff --git a/code/datums/diseases/advance/symptoms/youth.dm b/code/datums/diseases/advance/symptoms/youth.dm index 927be03ed9..6be34684e7 100644 --- a/code/datums/diseases/advance/symptoms/youth.dm +++ b/code/datums/diseases/advance/symptoms/youth.dm @@ -1,35 +1,35 @@ -/* -////////////////////////////////////// -Eternal Youth - - Moderate stealth boost. - Increases resistance tremendously. - Increases stage speed tremendously. - Reduces transmission tremendously. - Critical Level. - -BONUS - Gives you immortality and eternal youth!!! - Can be used to buff your virus - -////////////////////////////////////// -*/ - -/datum/symptom/youth - - name = "Eternal Youth" +/* +////////////////////////////////////// +Eternal Youth + + Moderate stealth boost. + Increases resistance tremendously. + Increases stage speed tremendously. + Reduces transmission tremendously. + Critical Level. + +BONUS + Gives you immortality and eternal youth!!! + Can be used to buff your virus + +////////////////////////////////////// +*/ + +/datum/symptom/youth + + name = "Eternal Youth" desc = "The virus becomes symbiotically connected to the cells in the host's body, preventing and reversing aging. \ The virus, in turn, becomes more resistant, spreads faster, and is harder to spot, although it doesn't thrive as well without a host." - stealth = 3 - resistance = 4 - stage_speed = 4 - transmittable = -4 - level = 5 + stealth = 3 + resistance = 4 + stage_speed = 4 + transmittable = -4 + level = 5 base_message_chance = 100 symptom_delay_min = 25 symptom_delay_max = 50 - -/datum/symptom/youth/Activate(datum/disease/advance/A) + +/datum/symptom/youth/Activate(datum/disease/advance/A) if(!..()) return var/mob/living/M = A.affected_mob diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index dc848ab622..80ec0abe6b 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -36,4 +36,4 @@ affected_mob.visible_message("[affected_mob] coughs up a swarm of bees!", \ "You cough up a swarm of bees!") new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc) - return \ No newline at end of file + return diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index e9f02b91b6..5915a784ea 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -50,4 +50,4 @@ if(!affected_mob.resistances.Find(/datum/disease/flu)) var/datum/disease/Flu = new /datum/disease/flu(0) affected_mob.ForceContractDisease(Flu) - cure() \ No newline at end of file + cure() diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index 6a21dbfd54..4b65fee700 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -36,4 +36,4 @@ if(prob(1)) to_chat(affected_mob, "Your throat feels sore.") if(prob(10)) - to_chat(affected_mob, "You feel stiff.") \ No newline at end of file + to_chat(affected_mob, "You feel stiff.") diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 77385ebac3..71e4064676 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -38,4 +38,4 @@ if(prob(50)) affected_mob.gib() else - return \ No newline at end of file + return diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm index 91ce1ca71e..4430eee19d 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/magnitis.dm @@ -65,4 +65,4 @@ var/iter = rand(1,3) for(i=0,i" - if(((src in SSticker.mode.traitors) || is_nuclear_operative(current)) && ishuman(current)) + if(((src in SSticker.mode.traitors) || (src in SSticker.mode.syndicates)) && ishuman(current)) text = "Uplink: give" var/datum/component/uplink/U = find_syndicate_uplink() if(U) @@ -767,44 +769,17 @@ var/objective_pos var/def_value - - - var/datum/antagonist/target_antag - if (href_list["obj_edit"]) objective = locate(href_list["obj_edit"]) if (!objective) return - - for(var/datum/antagonist/A in antag_datums) - if(objective in A.objectives) - target_antag = A - objective_pos = A.objectives.Find(objective) - break - - if(!target_antag) //Shouldn't happen - stack_trace("objective without antagonist found") - objective_pos = objectives.Find(objective) + objective_pos = objectives.Find(objective) //Text strings are easy to manipulate. Revised for simplicity. var/temp_obj_type = "[objective.type]"//Convert path into a text string. def_value = copytext(temp_obj_type, 19)//Convert last part of path into an objective keyword. if(!def_value)//If it's a custom objective, it will be an empty string. def_value = "custom" - else - switch(antag_datums.len) - if(0) - target_antag = add_antag_datum(/datum/antagonist/custom) - if(1) - target_antag = antag_datums[1] - else - var/datum/antagonist/target = input("Which antagonist gets the objective:", "Antagonist", def_value) as null|anything in antag_datums + "(new custom antag)" - if (QDELETED(target)) - return - else if(target == "(new custom antag)") - target_antag = add_antag_datum(/datum/antagonist/custom) - else - target_antag = target var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "late-assassinate", "maroon", "debrain", "protect", "destroy", "prevent", "hijack", "escape", "survive", "martyr", "steal", "download", "nuclear", "capture", "absorb", "custom") if (!new_obj_type) @@ -904,7 +879,7 @@ switch(new_obj_type) if("download") new_objective = new /datum/objective/download - new_objective.explanation_text = "Download [target_number] research node\s." + new_objective.explanation_text = "Download [target_number] research levels." if("capture") new_objective = new /datum/objective/capture new_objective.explanation_text = "Capture [target_number] lifeforms with an energy net. Live, rare specimens are worth more." @@ -926,15 +901,11 @@ return if (objective) - if(target_antag) - target_antag.objectives -= objective objectives -= objective - target_antag.objectives.Insert(objective_pos, new_objective) + objectives.Insert(objective_pos, new_objective) message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") else - if(target_antag) - target_antag.objectives += new_objective objectives += new_objective message_admins("[key_name_admin(usr)] added a new objective for [current]: [new_objective.explanation_text]") log_admin("[key_name(usr)] added a new objective for [current]: [new_objective.explanation_text]") @@ -943,11 +914,6 @@ var/datum/objective/objective = locate(href_list["obj_delete"]) if(!istype(objective)) return - - for(var/datum/antagonist/A in antag_datums) - if(objective in A.objectives) - A.objectives -= objective - break objectives -= objective message_admins("[key_name_admin(usr)] removed an objective for [current]: [objective.explanation_text]") log_admin("[key_name(usr)] removed an objective for [current]: [objective.explanation_text]") @@ -1030,13 +996,11 @@ message_admins("[key_name_admin(usr)] has cult'ed [current].") log_admin("[key_name(usr)] has cult'ed [current].") if("tome") - var/datum/antagonist/cult/C = has_antag_datum(/datum/antagonist/cult,TRUE) - if (C.equip_cultist(current,1)) + if (!SSticker.mode.equip_cultist(current,1)) to_chat(usr, "Spawning tome failed!") if("amulet") - var/datum/antagonist/cult/C = has_antag_datum(/datum/antagonist/cult,TRUE) - if (C.equip_cultist(current)) + if (!SSticker.mode.equip_cultist(current)) to_chat(usr, "Spawning amulet failed!") else if(href_list["clockcult"]) @@ -1107,14 +1071,36 @@ message_admins("[key_name_admin(usr)] has de-nuke op'ed [current].") log_admin("[key_name(usr)] has de-nuke op'ed [current].") if("nuclear") - if(!has_antag_datum(/datum/antagonist/nukeop,TRUE)) - add_antag_datum(/datum/antagonist/nukeop) + if(!(src in SSticker.mode.syndicates)) + SSticker.mode.syndicates += src + SSticker.mode.update_synd_icons_added(src) + if (SSticker.mode.syndicates.len==1) + SSticker.mode.prepare_syndicate_leader(src) + else + current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" special_role = "Syndicate" assigned_role = "Syndicate" + to_chat(current, "You are a [syndicate_name()] agent!") + SSticker.mode.forge_syndicate_objectives(src) + SSticker.mode.greet_syndicate(src) message_admins("[key_name_admin(usr)] has nuke op'ed [current].") log_admin("[key_name(usr)] has nuke op'ed [current].") if("lair") current.forceMove(pick(GLOB.nukeop_start)) + if("dressup") + var/mob/living/carbon/human/H = current + qdel(H.belt) + qdel(H.back) + qdel(H.ears) + qdel(H.gloves) + qdel(H.head) + qdel(H.shoes) + qdel(H.wear_id) + qdel(H.wear_suit) + qdel(H.w_uniform) + + if (!SSticker.mode.equip_syndicate(current)) + to_chat(usr, "Equipping a syndicate failed!") if("tellcode") var/code for (var/obj/machinery/nuclearbomb/bombue in GLOB.machines) @@ -1362,6 +1348,50 @@ T.should_specialise = TRUE add_antag_datum(T) + +/datum/mind/proc/make_Nuke(turf/spawnloc, nuke_code, leader=0, telecrystals = TRUE) + if(!(src in SSticker.mode.syndicates)) + SSticker.mode.syndicates += src + SSticker.mode.update_synd_icons_added(src) + assigned_role = "Syndicate" + special_role = "Syndicate" + SSticker.mode.forge_syndicate_objectives(src) + SSticker.mode.greet_syndicate(src) + current.faction |= "syndicate" + + if(spawnloc) + current.forceMove(spawnloc) + + if(ishuman(current)) + var/mob/living/carbon/human/H = current + qdel(H.belt) + qdel(H.back) + qdel(H.ears) + qdel(H.gloves) + qdel(H.head) + qdel(H.shoes) + qdel(H.wear_id) + qdel(H.wear_suit) + qdel(H.w_uniform) + + SSticker.mode.equip_syndicate(current, telecrystals) + + if (nuke_code) + store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) + to_chat(current, "The nuclear authorization code is: [nuke_code]") + else + var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list + if(nuke) + store_memory("Syndicate Nuclear Bomb Code: [nuke.r_code]", 0, 0) + to_chat(current, "The nuclear authorization code is: nuke.r_code") + else + to_chat(current, "You were not provided with a nuclear code. Trying asking your team leader or contacting syndicate command.") + + if (leader) + SSticker.mode.prepare_syndicate_leader(src,nuke_code) + else + current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" + /datum/mind/proc/make_Changling() var/datum/antagonist/changeling/C = has_antag_datum(/datum/antagonist/changeling) if(!C) @@ -1377,11 +1407,16 @@ /datum/mind/proc/make_Cultist() - if(!has_antag_datum(/datum/antagonist/cult,TRUE)) - SSticker.mode.add_cultist(src,FALSE,equip=TRUE) + if(!(src in SSticker.mode.cult)) + SSticker.mode.add_cultist(src,FALSE) special_role = "Cultist" to_chat(current, "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy your world is, you see that it should be open to the knowledge of Nar-Sie.") to_chat(current, "Assist your new bretheren in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") + var/datum/antagonist/cult/C + C.cult_memorization(src) + var/mob/living/carbon/human/H = current + if (!SSticker.mode.equip_cultist(current)) + to_chat(H, "Spawning an amulet from your Master failed.") /datum/mind/proc/make_Rev() var/datum/antagonist/rev/head/head = new(src) diff --git a/code/datums/weakrefs.dm b/code/datums/weakrefs.dm index d8adba652c..2347d0f831 100644 --- a/code/datums/weakrefs.dm +++ b/code/datums/weakrefs.dm @@ -16,4 +16,3 @@ /datum/weakref/proc/resolve() var/datum/D = locate(reference) return (!QDELETED(D) && D.weak_reference == src) ? D : null - diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index ab8f019d7c..995936e429 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -25,7 +25,7 @@ /datum/weather/rad_storm/telegraph() ..() - status_alarm(TRUE) + status_alarm("alert") /datum/weather/rad_storm/weather_act(mob/living/L) @@ -49,19 +49,24 @@ if(..()) return priority_announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert") - status_alarm(FALSE) + status_alarm() + sleep(300) + revoke_maint_all_access() // Need to make this a timer at some point. + +/datum/weather/rad_storm/proc/status_alarm(command) //Makes the status displays show the radiation warning for those who missed the announcement. + var/datum/radio_frequency/frequency = SSradio.return_frequency(1435) -/datum/weather/rad_storm/proc/status_alarm(active) //Makes the status displays show the radiation warning for those who missed the announcement. - var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) if(!frequency) return - var/datum/signal/signal = new - if (active) - signal.data["command"] = "alert" - signal.data["picture_state"] = "radiation" - else - signal.data["command"] = "shuttle" + var/datum/signal/status_signal = new + var/atom/movable/virtualspeaker/virt = new /atom/movable/virtualspeaker(null) + status_signal.source = virt + status_signal.transmission_method = 1 + status_signal.data["command"] = "shuttle" - var/atom/movable/virtualspeaker/virt = new(null) - frequency.post_signal(virt, signal) + if(command == "alert") + status_signal.data["command"] = "alert" + status_signal.data["picture_state"] = "radiation" + + frequency.post_signal(src, status_signal) diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm index 37d44a1bb0..b7b5e0d2c9 100644 --- a/code/datums/wires/radio.dm +++ b/code/datums/wires/radio.dm @@ -11,7 +11,8 @@ /datum/wires/radio/interactable(mob/user) var/obj/item/device/radio/R = holder - return R.unscrewed + if(R.b_stat) + return TRUE /datum/wires/radio/on_pulse(index) var/obj/item/device/radio/R = holder diff --git a/code/game/area/ai_monitored.dm b/code/game/area/ai_monitored.dm index 9d42b67bf9..a5216fb44c 100644 --- a/code/game/area/ai_monitored.dm +++ b/code/game/area/ai_monitored.dm @@ -28,4 +28,4 @@ for(var/X in motioncameras) var/obj/machinery/camera/cam = X cam.lostTargetRef(WEAKREF(O)) - return \ No newline at end of file + return diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index 10e3249d64..51399ca7e1 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -123,4 +123,4 @@ /area/holodeck/rec_center/thunderdome1218 name = "Holodeck - 1218 AD" - restricted = 1 + restricted = 1 \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 7813783ada..3e0f0112ff 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -414,7 +414,7 @@ for(var/m in buckled_mobs) var/mob/living/buckled_mob = m if(!buckled_mob.Move(newloc, direct)) - forceMove(buckled_mob.loc) + loc = buckled_mob.loc last_move = buckled_mob.last_move inertia_dir = last_move buckled_mob.inertia_dir = last_move @@ -712,4 +712,4 @@ return FALSE if(anchored || throwing) return FALSE - return TRUE + return TRUE \ No newline at end of file diff --git a/code/game/communications.dm b/code/game/communications.dm index b7515cf452..d60a5d8301 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -86,55 +86,109 @@ GLOBAL_LIST_EMPTY(all_radios) for(var/freq in GLOB.all_radios) GLOB.all_radios["[freq]"] -= radio -// For information on what objects or departments use what frequencies, -// see __DEFINES/radio.dm. Mappers may also select additional frequencies for -// use in maps, such as in intercoms. +/* +Frequency range: 1200 to 1600 +Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency, even during mapmaking) + +Radio: +1459 - standard radio chat +1351 - Science +1353 - Command +1355 - Medical +1357 - Engineering +1359 - Security +1337 - death squad +1443 - Confession Intercom +1349 - Miners +1347 - Cargo techs +1447 - AI Private + +Devices: +1451 - tracking implant +1457 - RSD default + +On the map: +1311 for prison shuttle console (in fact, it is not used) +1435 for status displays +1437 for atmospherics/fire alerts +1439 for engine components +1439 for air pumps, air scrubbers, atmo control +1441 for atmospherics - supply tanks +1443 for atmospherics - distribution loop/mixed air tank +1445 for bot nav beacons +1447 for mulebot, secbot and ed209 control +1449 for airlock controls, electropack, magnets +1451 for toxin lab access +1453 for engineering access +1455 for AI access +*/ GLOBAL_LIST_INIT(radiochannels, list( - "Common" = FREQ_COMMON, - "Science" = FREQ_SCIENCE, - "Command" = FREQ_COMMAND, - "Medical" = FREQ_MEDICAL, - "Engineering" = FREQ_ENGINEERING, - "Security" = FREQ_SECURITY, - "CentCom" = FREQ_CENTCOM, - "Syndicate" = FREQ_SYNDICATE, - "Supply" = FREQ_SUPPLY, - "Service" = FREQ_SERVICE, - "AI Private" = FREQ_AI_PRIVATE, - "Red Team" = FREQ_CTF_RED, - "Blue Team" = FREQ_CTF_BLUE + "Common" = 1459, + "Science" = 1351, + "Command" = 1353, + "Medical" = 1355, + "Engineering" = 1357, + "Security" = 1359, + "CentCom" = 1337, + "Syndicate" = 1213, + "Supply" = 1347, + "Service" = 1349, + "AI Private" = 1447, + "Red Team" = 1215, + "Blue Team" = 1217 )) GLOBAL_LIST_INIT(reverseradiochannels, list( - "[FREQ_COMMON]" = "Common", - "[FREQ_SCIENCE]" = "Science", - "[FREQ_COMMAND]" = "Command", - "[FREQ_MEDICAL]" = "Medical", - "[FREQ_ENGINEERING]" = "Engineering", - "[FREQ_SECURITY]" = "Security", - "[FREQ_CENTCOM]" = "CentCom", - "[FREQ_SYNDICATE]" = "Syndicate", - "[FREQ_SUPPLY]" = "Supply", - "[FREQ_SERVICE]" = "Service", - "[FREQ_AI_PRIVATE]" = "AI Private", - "[FREQ_CTF_RED]" = "Red Team", - "[FREQ_CTF_BLUE]" = "Blue Team" + "1459" = "Common", + "1351" = "Science", + "1353" = "Command", + "1355" = "Medical", + "1357" = "Engineering", + "1359" = "Security", + "1337" = "CentCom", + "1213" = "Syndicate", + "1347" = "Supply", + "1349" = "Service", + "1447" = "AI Private", + "1215" = "Red Team", + "1217" = "Blue Team" )) +//depenging helpers +GLOBAL_VAR_CONST(SYND_FREQ, 1213) //nuke op frequency, coloured dark brown in chat window +GLOBAL_VAR_CONST(SUPP_FREQ, 1347) //supply, coloured light brown in chat window +GLOBAL_VAR_CONST(SERV_FREQ, 1349) //service, coloured green in chat window +GLOBAL_VAR_CONST(SCI_FREQ, 1351) //science, coloured plum in chat window +GLOBAL_VAR_CONST(COMM_FREQ, 1353) //command, colored gold in chat window +GLOBAL_VAR_CONST(MED_FREQ, 1355) //medical, coloured blue in chat window +GLOBAL_VAR_CONST(ENG_FREQ, 1357) //engineering, coloured orange in chat window +GLOBAL_VAR_CONST(SEC_FREQ, 1359) //security, coloured red in chat window +GLOBAL_VAR_CONST(CENTCOM_FREQ, 1337) //centcom frequency, coloured grey in chat window +GLOBAL_VAR_CONST(AIPRIV_FREQ, 1447) //AI private, colored magenta in chat window +GLOBAL_VAR_CONST(REDTEAM_FREQ, 1215) // red team (CTF) frequency, coloured red +GLOBAL_VAR_CONST(BLUETEAM_FREQ, 1217) // blue team (CTF) frequency, coloured blue + +#define TRANSMISSION_WIRE 0 +#define TRANSMISSION_RADIO 1 + +/* filters */ +GLOBAL_VAR_INIT(RADIO_TO_AIRALARM, "1") +GLOBAL_VAR_INIT(RADIO_FROM_AIRALARM, "2") +GLOBAL_VAR_INIT(RADIO_CHAT, "3") //deprecated +GLOBAL_VAR_INIT(RADIO_ATMOSIA, "4") +GLOBAL_VAR_INIT(RADIO_NAVBEACONS, "5") +GLOBAL_VAR_INIT(RADIO_AIRLOCK, "6") +GLOBAL_VAR_INIT(RADIO_MAGNETS, "9") + /datum/radio_frequency + var/frequency as num var/list/list/obj/devices = list() -/datum/radio_frequency/New(freq) - frequency = freq - //If range > 0, only post to devices on the same z_level and within range //Use range = -1, to restrain to the same z_level without limiting range /datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, filter = null as text|null, range = null as num|null) - // Ensure the signal's data is fully filled - signal.source = source - signal.frequency = frequency //Apply filter to the signal. If none supply, broadcast to every devices //_default channel is always checked @@ -163,7 +217,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( continue if(start_point.z != end_point.z || (range > 0 && get_dist(start_point, end_point) > range)) continue - device.receive_signal(signal) + device.receive_signal(signal, TRANSMISSION_RADIO, frequency) /datum/radio_frequency/proc/add_listener(obj/device, filter as text|null) if (!filter) @@ -171,7 +225,8 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( var/list/devices_line = devices[filter] if(!devices_line) - devices[filter] = devices_line = list() + devices_line = list() + devices[filter] = devices_line devices_line += device @@ -185,15 +240,70 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( devices -= devices_filter -/obj/proc/receive_signal(datum/signal/signal) + + + +/client/proc/print_pointers() + set name = "Debug Signals" + set category = "Debug" + + if(!holder) + return + + var/datum/signal/S + to_chat(src, "There are [S.pointers.len] pointers:") + for(var/p in S.pointers) + to_chat(src, p) + S = locate(p) + if(istype(S)) + to_chat(src, S.debug_print()) + +/obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param) return /datum/signal var/obj/source - var/frequency = 0 - var/transmission_method - var/data -/datum/signal/New(data, transmission_method = TRANSMISSION_RADIO) - src.data = data || list() - src.transmission_method = transmission_method + var/transmission_method = 0 + //0 = wire + //1 = radio transmission + //2 = subspace transmission + + var/data = list() + var/encryption + + var/frequency = 0 + var/static/list/pointers = list() + +/datum/signal/New() + ..() + pointers += "[REF(src)]" + +/datum/signal/Destroy() + pointers -= "[REF(src)]" + return ..() + +/datum/signal/proc/copy_from(datum/signal/model) + source = model.source + transmission_method = model.transmission_method + data = model.data + encryption = model.encryption + frequency = model.frequency + +/datum/signal/proc/debug_print() + if (source) + . = "signal = {source = '[source]' [COORD(source)]\n" + else + . = "signal = {source = '[source]' ()\n" + for (var/i in data) + . += "data\[\"[i]\"\] = \"[data[i]]\"\n" + if(islist(data[i])) + var/list/L = data[i] + for(var/t in L) + . += "data\[\"[i]\"\] list has: [t]" + +/datum/signal/proc/sanitize_data() + for(var/d in data) + var/val = data[d] + if(istext(val)) + data[d] = html_encode(val) diff --git a/code/game/gamemodes/antag_hud.dm b/code/game/gamemodes/antag_hud.dm index 447a87ce20..b047ff92ea 100644 --- a/code/game/gamemodes/antag_hud.dm +++ b/code/game/gamemodes/antag_hud.dm @@ -48,6 +48,4 @@ newhud.join_hud(current) /datum/mind/proc/leave_all_antag_huds() - for(var/datum/atom_hud/antag/hud in GLOB.huds) - if(hud.hudusers[current]) - hud.leave_hud(current) \ No newline at end of file + for(var/datum/atom_hud/antag/hud in GLOB.huds) \ No newline at end of file diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index b6ddd5d8fd..3358052c7f 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -4,7 +4,7 @@ w_class = WEIGHT_CLASS_TINY var/used = 0 -/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) +/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, type = "") return /obj/item/antag_spawner/proc/equip_antag(mob/target) @@ -67,16 +67,18 @@ else to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.") -/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, kind ,datum/mind/user) +/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, school,datum/mind/user) new /obj/effect/particle_effect/smoke(T) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) C.prefs.copy_to(M) M.key = C.key var/datum/mind/app_mind = M.mind + + var/datum/antagonist/wizard/apprentice/app = new(app_mind) app.master = user - app.school = kind + app.school = school var/datum/antagonist/wizard/master_wizard = user.has_antag_datum(/datum/antagonist/wizard) if(master_wizard) @@ -105,7 +107,7 @@ if(used) to_chat(user, "[src] is out of power!") return FALSE - if(!user.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE)) + if(!(user.mind in SSticker.mode.syndicates)) to_chat(user, "AUTHENTICATION FAILURE. ACCESS DENIED.") return FALSE if(user.z != ZLEVEL_CENTCOM) @@ -131,19 +133,19 @@ else to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.") -/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user) +/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) C.prefs.copy_to(M) M.key = C.key - - var/datum/antagonist/nukeop/new_op = new(M.mind) - new_op.send_to_spawnpoint = FALSE - new_op.nukeop_outfit = /datum/outfit/syndicate/no_crystals - - var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE) - if(creator_op) - M.mind.add_antag_datum(new_op,creator_op.nuke_team) - M.mind.special_role = "Nuclear Operative" + var/code = "BOMB-NOT-FOUND" + var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list + if(nuke) + code = nuke.r_code + M.mind.make_Nuke(null, code, 0, FALSE) + var/newname = M.dna.species.random_name(M.gender,0,SSticker.mode.nukeops_lastname) + M.mind.name = newname + M.real_name = newname + M.name = newname //////SYNDICATE BORG /obj/item/antag_spawner/nuke_ops/borg_tele @@ -160,12 +162,8 @@ name = "syndicate medical teleporter" borg_to_spawn = "Medical" -/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, kind, datum/mind/user) +/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T) var/mob/living/silicon/robot/R - var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE) - if(!creator_op) - return - switch(borg_to_spawn) if("Medical") R = new /mob/living/silicon/robot/modules/syndicate/medical(T) @@ -176,8 +174,8 @@ if(prob(50)) brainfirstname = pick(GLOB.first_names_female) var/brainopslastname = pick(GLOB.last_names) - if(creator_op.nuke_team.syndicate_name) //the brain inside the syndiborg has the same last name as the other ops. - brainopslastname = creator_op.nuke_team.syndicate_name + if(SSticker.mode.nukeops_lastname) //the brain inside the syndiborg has the same last name as the other ops. + brainopslastname = SSticker.mode.nukeops_lastname var/brainopsname = "[brainfirstname] [brainopslastname]" R.mmi.name = "Man-Machine Interface: [brainopsname]" @@ -187,11 +185,7 @@ R.real_name = R.name R.key = C.key - - var/datum/antagonist/nukeop/new_borg = new(R.mind) - new_borg.send_to_spawnpoint = FALSE - R.mind.add_antag_datum(new_borg,creator_op.nuke_team) - R.mind.special_role = "Syndicate Cyborg" + R.mind.make_Nuke(null, nuke_code = null,leader=0, telecrystals = TRUE) ///////////SLAUGHTER DEMON @@ -228,7 +222,8 @@ to_chat(user, "You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.") -/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) +/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "", datum/mind/user) + var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) var/mob/living/simple_animal/slaughter/S = new demon_type(holder) S.holder = holder @@ -247,7 +242,6 @@ new_objective2.owner = S.mind new_objective2.explanation_text = "[objective_verb] everyone[user ? " else while you're at it":""]." S.mind.objectives += new_objective2 - S.mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(S, S.playstyle_string) to_chat(S, "You are currently not currently in the same plane of existence as the station. \ Ctrl+Click a blood pool to manifest.") diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 551ec5d418..fedc2eb6ab 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -30,4 +30,4 @@ name = initial(name) desc = initial(desc) atmosblock = TRUE - air_update_turf(1) + air_update_turf(1) \ No newline at end of file diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 61c0365d30..4f26563da1 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -4,7 +4,6 @@ GLOBAL_LIST_EMPTY(blob_cores) GLOBAL_LIST_EMPTY(overminds) GLOBAL_LIST_EMPTY(blob_nodes) - /mob/camera/blob name = "Blob Overmind" real_name = "Blob Overmind" @@ -34,12 +33,10 @@ GLOBAL_LIST_EMPTY(blob_nodes) var/manualplace_min_time = 600 //in deciseconds //a minute, to get bearings var/autoplace_max_time = 3600 //six minutes, as long as should be needed var/list/blobs_legit = list() - var/max_count = 0 //The biggest it got before death var/blobwincount = 400 var/victory_in_progress = FALSE /mob/camera/blob/Initialize(mapload, starting_points = 60) - validate_location() blob_points = starting_points manualplace_min_time += world.time autoplace_max_time += world.time @@ -53,17 +50,10 @@ GLOBAL_LIST_EMPTY(blob_nodes) color = blob_reagent_datum.complementary_color if(blob_core) blob_core.update_icon() - SSshuttle.registerHostileEnvironment(src) - .= ..() -/mob/camera/blob/proc/validate_location() - var/turf/T = get_turf(src) - var/area/A = get_area(T) - if(((A && !A.blob_allowed) || !T || !(T.z in GLOB.station_z_levels)) && LAZYLEN(GLOB.blobstart)) - T = get_turf(pick(GLOB.blobstart)) - if(!T) - CRASH("No blobspawnpoints and blob spawned in nullspace.") - forceMove(T) + SSshuttle.registerHostileEnvironment(src) + + .= ..() /mob/camera/blob/Life() if(!blob_core) @@ -83,9 +73,6 @@ GLOBAL_LIST_EMPTY(blob_nodes) max_blob_points = INFINITY blob_points = INFINITY addtimer(CALLBACK(src, .proc/victory), 450) - - if(!victory_in_progress && max_count < blobs_legit.len) - max_count = blobs_legit.len ..() @@ -124,11 +111,6 @@ GLOBAL_LIST_EMPTY(blob_nodes) A.layer = BELOW_MOB_LAYER A.invisibility = 0 A.blend_mode = 0 - var/datum/antagonist/blob/B = mind.has_antag_datum(/datum/antagonist/blob) - if(B) - var/datum/objective/blob_takeover/main_objective = locate() in B.objectives - if(main_objective) - main_objective.completed = TRUE to_chat(world, "[real_name] consumed the station in an unstoppable tide!") SSticker.news_report = BLOB_WIN SSticker.force_ending = 1 @@ -152,6 +134,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) /mob/camera/blob/Login() ..() + sync_mind() to_chat(src, "You are the overmind!") blob_help() update_health_hud() @@ -232,18 +215,12 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(placed) var/obj/structure/blob/B = locate() in range("3x3", NewLoc) if(B) - forceMove(NewLoc) + loc = NewLoc else return 0 else var/area/A = get_area(NewLoc) if(isspaceturf(NewLoc) || istype(A, /area/shuttle)) //if unplaced, can't go on shuttles or space tiles return 0 - forceMove(NewLoc) + loc = NewLoc return 1 - -/mob/camera/blob/mind_initialize() - . = ..() - var/datum/antagonist/blob/B = mind.has_antag_datum(/datum/antagonist/blob) - if(!B) - mind.add_antag_datum(/datum/antagonist/blob) \ No newline at end of file diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index e88cc8fb96..aa1a3e7046 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -7,23 +7,22 @@ // Power verbs -/mob/camera/blob/proc/place_blob_core(point_rate, placement_override , pop_override = FALSE) +/mob/camera/blob/proc/place_blob_core(point_rate, placement_override) if(placed && placement_override != -1) return 1 if(!placement_override) - if(!pop_override) - for(var/mob/living/M in range(7, src)) - if("blob" in M.faction) - continue - if(M.client) - to_chat(src, "There is someone too close to place your blob core!") - return 0 - for(var/mob/living/M in view(13, src)) - if("blob" in M.faction) - continue - if(M.client) - to_chat(src, "Someone could see your blob core from here!") - return 0 + for(var/mob/living/M in range(7, src)) + if("blob" in M.faction) + continue + if(M.client) + to_chat(src, "There is someone too close to place your blob core!") + return 0 + for(var/mob/living/M in view(13, src)) + if("blob" in M.faction) + continue + if(M.client) + to_chat(src, "Someone could see your blob core from here!") + return 0 var/turf/T = get_turf(src) if(T.density) to_chat(src, "This spot is too dense to place a blob core on!") @@ -38,12 +37,12 @@ else if(O.density) to_chat(src, "This spot is too dense to place a blob core on!") return 0 - if(!pop_override && world.time <= manualplace_min_time && world.time <= autoplace_max_time) + if(world.time <= manualplace_min_time && world.time <= autoplace_max_time) to_chat(src, "It is too early to place your blob core!") return 0 else if(placement_override == 1) var/turf/T = pick(GLOB.blobstart) - forceMove(T) //got overrided? you're somewhere random, motherfucker + loc = T //got overrided? you're somewhere random, motherfucker if(placed && blob_core) blob_core.forceMove(loc) else @@ -75,7 +74,7 @@ var/node_name = input(src, "Choose a node to jump to.", "Node Jump") in nodes var/obj/structure/blob/node/chosen_node = nodes[node_name] if(chosen_node) - forceMove(chosen_node.loc) + loc = chosen_node.loc /mob/camera/blob/proc/createSpecial(price, blobType, nearEquals, needsNode, turf/T) if(!T) diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index b9a8ee6046..0c642692f0 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -348,4 +348,4 @@ icon_state = "blob" name = "blob" desc = "A thick wall of writhing tendrils." - brute_resist = 0.25 + brute_resist = 0.25 \ No newline at end of file diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm index 978f871ba2..c1af1601ce 100644 --- a/code/game/gamemodes/brother/traitor_bro.dm +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -1,3 +1,41 @@ +/datum/objective_team/brother_team + name = "brotherhood" + member_name = "blood brother" + var/list/objectives = list() + var/meeting_area + +/datum/objective_team/brother_team/is_solo() + return FALSE + +/datum/objective_team/brother_team/proc/add_objective(datum/objective/O, needs_target = FALSE) + O.team = src + if(needs_target) + O.find_target() + O.update_explanation_text() + objectives += O + +/datum/objective_team/brother_team/proc/forge_brother_objectives() + objectives = list() + var/is_hijacker = prob(10) + for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2) - is_hijacker)) + forge_single_objective() + if(is_hijacker) + if(!locate(/datum/objective/hijack) in objectives) + add_objective(new/datum/objective/hijack) + else if(!locate(/datum/objective/escape) in objectives) + add_objective(new/datum/objective/escape) + +/datum/objective_team/brother_team/proc/forge_single_objective() + if(prob(50)) + if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len)) + add_objective(new/datum/objective/destroy, TRUE) + else if(prob(30)) + add_objective(new/datum/objective/maroon, TRUE) + else + add_objective(new/datum/objective/assassinate, TRUE) + else + add_objective(new/datum/objective/steal, TRUE) + /datum/game_mode var/list/datum/mind/brothers = list() var/list/datum/objective_team/brother_team/brother_teams = list() @@ -16,7 +54,6 @@ var/list/datum/objective_team/brother_team/pre_brother_teams = list() var/const/team_amount = 2 //hard limit on brother teams if scaling is turned off var/const/min_team_size = 2 - traitors_required = FALSE //Only teams are possible var/meeting_areas = list("The Bar", "Dorms", "Escape Dock", "Arrivals", "Holodeck", "Primary Tool Storage", "Recreation Area", "Chapel", "Library") @@ -55,13 +92,44 @@ team.forge_brother_objectives() for(var/datum/mind/M in team.members) M.add_antag_datum(ANTAG_DATUM_BROTHER, team) - team.update_name() brother_teams += pre_brother_teams return ..() /datum/game_mode/traitor/bros/generate_report() return "It's Syndicate recruiting season. Be alert for potential Syndicate infiltrators, but also watch out for disgruntled employees trying to defect. Unlike Nanotrasen, the Syndicate prides itself in teamwork and will only recruit pairs that share a brotherly trust." +/datum/game_mode/proc/auto_declare_completion_brother() + if(!LAZYLEN(brother_teams)) + return + var/text = "
The blood brothers were:" + var/teamnumber = 1 + for(var/datum/objective_team/brother_team/team in brother_teams) + if(!team.members.len) + continue + text += "
Team #[teamnumber++]" + for(var/datum/mind/M in team.members) + text += printplayer(M) + var/win = TRUE + var/objective_count = 1 + for(var/datum/objective/objective in team.objectives) + if(objective.check_completion()) + text += "
Objective #[objective_count]: [objective.explanation_text] Success! [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" + SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "SUCCESS")) + else + text += "
Objective #[objective_count]: [objective.explanation_text] Fail. [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" + SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "FAIL")) + if(!(istype(objective, /datum/objective/crew))) + win = FALSE + objective_count++ + if(win) + text += "
The blood brothers were successful!" + SSblackbox.record_feedback("tally", "brother_success", 1, "SUCCESS") + else + text += "
The blood brothers have failed!" + SSblackbox.record_feedback("tally", "brother_success", 1, "FAIL") + text += "
" + to_chat(world, text) + /datum/game_mode/proc/update_brother_icons_added(datum/mind/brother_mind) var/datum/atom_hud/antag/brotherhud = GLOB.huds[ANTAG_HUD_BROTHER] brotherhud.join_hud(brother_mind.current) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index ad76d41d47..a70f392d4f 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -94,6 +94,47 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th of the Thing being sent to a station in this sector is highly likely. It may be in the guise of any crew member. Trust nobody - suspect everybody. Do not announce this to the crew, \ as paranoia may spread and inhibit workplace efficiency." +/datum/game_mode/proc/auto_declare_completion_changeling() + var/list/changelings = get_antagonists(/datum/antagonist/changeling,TRUE) //Only real lings get a mention + if(changelings.len) + var/text = "
The changelings were:" + for(var/datum/mind/changeling in changelings) + var/datum/antagonist/changeling/ling = changeling.has_antag_datum(/datum/antagonist/changeling) + var/changelingwin = 1 + if(!changeling.current) + changelingwin = 0 + + text += printplayer(changeling) + + //Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed. + text += "
Changeling ID: [ling.changelingID]." + text += "
Genomes Extracted: [ling.absorbedcount]" + + if(changeling.objectives.len) + var/count = 1 + for(var/datum/objective/objective in changeling.objectives) + if(objective.check_completion()) + text += "
Objective #[count]: [objective.explanation_text] Success! [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" + SSblackbox.record_feedback("nested tally", "changeling_objective", 1, list("[objective.type]", "SUCCESS")) + else + text += "
Objective #[count]: [objective.explanation_text] Fail. [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" + SSblackbox.record_feedback("nested tally", "changeling_objective", 1, list("[objective.type]", "FAIL")) + if(!(istype(objective, /datum/objective/crew))) + changelingwin = 0 + count++ + + if(changelingwin) + text += "
The changeling was successful!" + SSblackbox.record_feedback("tally", "changeling_success", 1, "SUCCESS") + else + text += "
The changeling has failed." + SSblackbox.record_feedback("tally", "changeling_success", 1, "FAIL") + text += "
" + + to_chat(world, text) + + return 1 + /proc/changeling_transform(mob/living/carbon/human/user, datum/changelingprofile/chosen_prof) var/datum/dna/chosen_dna = chosen_prof.dna user.real_name = chosen_prof.name diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 1baabbebec..61bd9bb496 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -65,16 +65,13 @@ Credit where due: return TRUE return FALSE -/proc/add_servant_of_ratvar(mob/L, silent = FALSE, create_team = TRUE) +/proc/add_servant_of_ratvar(mob/L, silent = FALSE) if(!L || !L.mind) return var/update_type = ANTAG_DATUM_CLOCKCULT if(silent) update_type = ANTAG_DATUM_CLOCKCULT_SILENT - var/datum/antagonist/clockcult/C = new update_type(L.mind) - C.make_team = create_team - C.show_in_roundend = create_team //tutorial scarabs begone - . = L.mind.add_antag_datum(C) + . = L.mind.add_antag_datum(update_type) /proc/remove_servant_of_ratvar(mob/L, silent = FALSE) if(!L || !L.mind) @@ -91,6 +88,7 @@ Credit where due: /////////////// /datum/game_mode + var/datum/mind/eminence //The clockwork Eminence var/list/servants_of_ratvar = list() //The Enlightened servants of Ratvar var/clockwork_explanation = "Defend the Ark of the Clockwork Justiciar and free Ratvar." //The description of the current objective @@ -112,8 +110,6 @@ Credit where due: var/servants_to_serve = list() var/roundstart_player_count var/ark_time //In minutes, how long the Ark waits before activation; this is equal to 30 + (number of players / 5) (max 40 mins.) - - var/datum/objective_team/clockcult/main_clockcult /datum/game_mode/clockwork_cult/pre_setup() if(CONFIG_GET(flag/protect_roles_from_antagonist)) @@ -189,21 +185,22 @@ Credit where due: return FALSE /datum/game_mode/clockwork_cult/check_finished() - if(GLOB.ark_of_the_clockwork_justiciar && !GLOB.ratvar_awakens) // Doesn't end until the Ark is destroyed or completed + var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar + if(G && !GLOB.ratvar_awakens) // Doesn't end until the Ark is destroyed or completed return FALSE - return ..() + . = ..() /datum/game_mode/clockwork_cult/proc/check_clockwork_victory() - return main_clockcult.check_clockwork_victory() - -/datum/game_mode/clockwork_cult/set_round_result() - ..() if(GLOB.clockwork_gateway_activated) SSticker.news_report = CLOCK_SUMMON - SSticker.mode_result = "win - servants completed their objective (summon ratvar)" + return TRUE else SSticker.news_report = CULT_FAILURE - SSticker.mode_result = "loss - servants failed their objective (summon ratvar)" + return FALSE + +/datum/game_mode/clockwork_cult/declare_completion() + ..() + return //Doesn't end until the round does /datum/game_mode/clockwork_cult/generate_report() return "Bluespace monitors near your sector have detected a continuous stream of patterned fluctuations since the station was completed. It is most probable that a powerful entity \ @@ -213,6 +210,30 @@ Credit where due: working for this entity and utilizing highly-advanced technology to cross the great distance at will. If they should turn out to be a credible threat, the task falls on you and \ your crew to dispatch it in a timely manner." +/datum/game_mode/proc/auto_declare_completion_clockwork_cult() + var/text = "" + if(istype(SSticker.mode, /datum/game_mode/clockwork_cult)) //Possibly hacky? + var/datum/game_mode/clockwork_cult/C = SSticker.mode + if(C.check_clockwork_victory()) + text += "Ratvar's servants defended the Ark until its activation!" + SSticker.mode_result = "win - servants completed their objective (summon ratvar)" + else + text += "The Ark was destroyed! Ratvar will rust away for all eternity!" + SSticker.mode_result = "loss - servants failed their objective (summon ratvar)" + text += "
The servants' objective was: [CLOCKCULT_OBJECTIVE]." + text += "
Ratvar's servants had [GLOB.clockwork_caches] Tinkerer's Caches." + text += "
Construction Value(CV) was: [GLOB.clockwork_construction_value]" + for(var/i in SSticker.scripture_states) + if(i != SCRIPTURE_DRIVER) + text += "
[i] scripture was: [SSticker.scripture_states[i] ? "UN":""]LOCKED" + if(SSticker.mode.eminence) + text += "
The Eminence was: [printplayer(SSticker.mode.eminence)]" + if(servants_of_ratvar.len) + text += "
Ratvar's servants were:" + for(var/datum/mind/M in servants_of_ratvar - SSticker.mode.eminence) + text += printplayer(M) + to_chat(world, text) + /datum/game_mode/proc/update_servant_icons_added(datum/mind/M) var/datum/atom_hud/antag/A = GLOB.huds[ANTAG_HUD_CLOCKWORK] A.join_hud(M.current) diff --git a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm index 895c38c94a..50076e0919 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm @@ -98,12 +98,12 @@ if(severity == 1 && uses) uses = 0 visible_message("[src] is disrupted!") - animate(src, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW) + animate(src, alpha = 0, transform = matrix()*2, time = 10, flags_1 = ANIMATION_END_NOW) deltimer(timerid) timerid = QDEL_IN(src, 10) linked_gateway.uses = 0 linked_gateway.visible_message("[linked_gateway] is disrupted!") - animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW) + animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10, flags_1 = ANIMATION_END_NOW) deltimer(linked_gateway.timerid) linked_gateway.timerid = QDEL_IN(linked_gateway, 10) return TRUE @@ -144,13 +144,13 @@ uses = max(0, uses - 1) linked_gateway.uses = max(0, linked_gateway.uses - 1) if(!uses) - animate(src, transform = matrix() * 0.1, time = 10, flags = ANIMATION_END_NOW) - animate(linked_gateway, transform = matrix() * 0.1, time = 10, flags = ANIMATION_END_NOW) + animate(src, transform = matrix() * 0.1, time = 10, flags_1 = ANIMATION_END_NOW) + animate(linked_gateway, transform = matrix() * 0.1, time = 10, flags_1 = ANIMATION_END_NOW) density = FALSE linked_gateway.density = FALSE else - animate(src, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW) - animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW) + animate(src, transform = matrix() / 1.5, time = 10, flags_1 = ANIMATION_END_NOW) + animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags_1 = ANIMATION_END_NOW) addtimer(CALLBACK(src, .proc/check_uses), 10) return TRUE diff --git a/code/game/gamemodes/clock_cult/clock_helpers/fabrication_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/fabrication_helpers.dm index 806abe3d52..a5af47ff05 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/fabrication_helpers.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/fabrication_helpers.dm @@ -132,7 +132,7 @@ var/doortype = /obj/machinery/door/airlock/clockwork if(glass) doortype = /obj/machinery/door/airlock/clockwork/brass - return list("operation_time" = 60, "new_obj_type" = doortype, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = dir, "transfer_name" = TRUE) + return list("operation_time" = 60, "new_obj_type" = doortype, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = dir) /obj/machinery/door/airlock/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) return FALSE @@ -188,7 +188,7 @@ //Windoor conversion /obj/machinery/door/window/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) - return list("operation_time" = 30, "new_obj_type" = /obj/machinery/door/window/clockwork, "power_cost" = POWER_STANDARD, "spawn_dir" = dir, "dir_in_new" = TRUE, "transfer_name" = TRUE) + return list("operation_time" = 30, "new_obj_type" = /obj/machinery/door/window/clockwork, "power_cost" = POWER_STANDARD, "spawn_dir" = dir, "dir_in_new" = TRUE) /obj/machinery/door/window/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) return FALSE diff --git a/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm b/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm index 1b2b867aa5..acf6e43974 100644 --- a/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm +++ b/code/game/gamemodes/clock_cult/clock_items/construct_chassis.dm @@ -91,8 +91,7 @@ /obj/item/clockwork/construct_chassis/cogscarab/pre_spawn() if(infinite_resources) - //During rounds where they can't interact with the station, let them experiment with builds - construct_type = /mob/living/simple_animal/drone/cogscarab/ratvar + construct_type = /mob/living/simple_animal/drone/cogscarab/ratvar //During rounds where they can't interact with the station, let them experiment with builds /obj/item/clockwork/construct_chassis/cogscarab/post_spawn(mob/living/construct) if(infinite_resources) //Allow them to build stuff and recite scripture diff --git a/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm b/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm index 24e46e280f..44fa24c134 100644 --- a/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm +++ b/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm @@ -144,14 +144,10 @@ else if(new_thing_type) if(fabrication_values["dir_in_new"]) - var/atom/A = new new_thing_type(get_turf(target), fabrication_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New() - if(fabrication_values["transfer_name"]) - A.name = target.name + new new_thing_type(get_turf(target), fabrication_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New() else var/atom/A = new new_thing_type(get_turf(target)) A.setDir(fabrication_values["spawn_dir"]) - if(fabrication_values["transfer_name"]) - A.name = target.name if(!fabrication_values["no_target_deletion"]) //for some cases where fabrication_vals() modifies the object but doesn't want it deleted qdel(target) adjust_clockwork_power(-fabrication_values["power_cost"]) diff --git a/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm b/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm index 8416e4651d..cc91feeb98 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm @@ -14,6 +14,16 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE var/static/superheated_walls = 0 +/mob/camera/eminence/Initialize() + if(SSticker.mode.eminence) + return INITIALIZE_HINT_QDEL + . = ..() + +/mob/camera/eminence/Destroy(force) + if(!force && mind && SSticker.mode.eminence == mind) + return QDEL_HINT_LETMELIVE + return ..() + /mob/camera/eminence/CanPass(atom/movable/mover, turf/target) return TRUE @@ -29,20 +39,12 @@ /mob/camera/eminence/Login() ..() - var/datum/antagonist/clockcult/C = mind.has_antag_datum(/datum/antagonist/clockcult,TRUE) - if(!C) - add_servant_of_ratvar(src, TRUE) - C = mind.has_antag_datum(/datum/antagonist/clockcult,TRUE) - if(C && C.clock_team) - if(C.clock_team.eminence) - remove_servant_of_ratvar(src,TRUE) - qdel(src) - else - C.clock_team.eminence = src + add_servant_of_ratvar(src, TRUE) to_chat(src, "You have been selected as the Eminence!") to_chat(src, "As the Eminence, you lead the servants. Anything you say will be heard by the entire cult.") to_chat(src, "Though you can move through walls, you're also incorporeal, and largely can't interact with the world except for a few ways.") to_chat(src, "Additionally, unless the herald's beacon is activated, you can't understand any speech while away from Reebe.") + SSticker.mode.eminence = mind eminence_help() for(var/V in actions) var/datum/action/A = V diff --git a/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm b/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm index 495bfaeaa8..8d4e936658 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/eminence_spire.dm @@ -17,11 +17,7 @@ return if(kingmaking) return - - var/datum/antagonist/clockcult/C = user.mind.has_antag_datum(/datum/antagonist/clockcult) - if(!C || !C.clock_team) - return - if(C.clock_team.eminence) + if(SSticker.mode.eminence) to_chat(user, "There's already an Eminence!") return if(!GLOB.servants_active) @@ -38,9 +34,7 @@ /obj/structure/destructible/clockwork/eminence_spire/attack_ghost(mob/user) if(!IsAdminGhost(user)) return - - var/datum/antagonist/clockcult/random_cultist = locate() in GLOB.antagonists //if theres no cultists new team without eminence will be created anyway. - if(random_cultist && random_cultist.clock_team && random_cultist.clock_team.eminence) + if(SSticker.mode.eminence) to_chat(user, "There's already an Eminence - too late!") return if(!GLOB.servants_active) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 67e2225772..f20dd25802 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -2,23 +2,24 @@ /datum/game_mode var/list/datum/mind/cult = list() + var/list/cult_objectives = list() + var/eldergod = 1 //for the summon god objective /proc/iscultist(mob/living/M) return istype(M) && M.mind && M.mind.has_antag_datum(ANTAG_DATUM_CULT) -/datum/objective_team/cult/proc/is_sacrifice_target(datum/mind/mind) - for(var/datum/objective/sacrifice/sac_objective in objectives) - if(mind == sac_objective.target) - return TRUE +/proc/is_sacrifice_target(datum/mind/mind) + if(mind == GLOB.sac_mind) + return TRUE return FALSE - -/proc/is_convertable_to_cult(mob/living/M,datum/objective_team/cult/specific_cult) + +/proc/is_convertable_to_cult(mob/living/M) if(!istype(M)) return FALSE if(M.mind) if(ishuman(M) && (M.mind.assigned_role in list("Captain", "Chaplain"))) return FALSE - if(specific_cult && specific_cult.is_sacrifice_target(M.mind)) + if(is_sacrifice_target(M.mind)) return FALSE if(M.mind.enslaved_to && !iscultist(M.mind.enslaved_to)) return FALSE @@ -54,10 +55,10 @@ var/list/cultists_to_cult = list() //the cultists we'll convert - var/datum/objective_team/cult/main_cult - /datum/game_mode/cult/pre_setup() + cult_objectives += "sacrifice" + if(CONFIG_GET(flag/protect_roles_from_antagonist)) restricted_jobs += protected_jobs @@ -85,19 +86,82 @@ /datum/game_mode/cult/post_setup() + if("sacrifice" in cult_objectives) + var/list/possible_targets = get_unconvertables() + if(!possible_targets.len) + message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.") + for(var/mob/living/carbon/human/player in GLOB.player_list) + if(player.mind && !(player.mind in cultists_to_cult)) + possible_targets += player.mind + if(possible_targets.len > 0) + GLOB.sac_mind = pick(possible_targets) + if(!GLOB.sac_mind) + message_admins("Cult Sacrifice: ERROR - Null target chosen!") + else + var/datum/job/sacjob = SSjob.GetJob(GLOB.sac_mind.assigned_role) + var/datum/preferences/sacface = GLOB.sac_mind.current.client.prefs + var/icon/reshape = get_flat_human_icon(null, sacjob, sacface) + reshape.Shift(SOUTH, 4) + reshape.Shift(EAST, 1) + reshape.Crop(7,4,26,31) + reshape.Crop(-5,-3,26,30) + GLOB.sac_image = reshape + else + message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!") + if(!GLOB.summon_spots.len) + while(GLOB.summon_spots.len < SUMMON_POSSIBILITIES) + var/area/summon = pick(GLOB.sortedAreas - GLOB.summon_spots) + if((summon.z in GLOB.station_z_levels) && summon.valid_territory) + GLOB.summon_spots += summon + cult_objectives += "eldergod" + for(var/datum/mind/cult_mind in cultists_to_cult) - add_cultist(cult_mind, 0, equip=TRUE) + equip_cultist(cult_mind.current) + update_cult_icons_added(cult_mind) + to_chat(cult_mind.current, "You are a member of the cult!") + cult_mind.current.playsound_local(get_turf(cult_mind.current), 'sound/ambience/antag/bloodcult.ogg', 100, FALSE, pressure_affected = FALSE)//subject to change + add_cultist(cult_mind, 0) ..() +/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob,tome = 0) + if(!istype(mob)) + return + if (mob.mind) + if (mob.mind.assigned_role == "Clown") + to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") + mob.dna.remove_mutation(CLOWNMUT) -/datum/game_mode/proc/add_cultist(datum/mind/cult_mind, stun , equip = FALSE) //BASE + if(tome) + . += cult_give_item(/obj/item/tome, mob) + else + . += cult_give_item(/obj/item/paper/talisman/supply, mob) + to_chat(mob, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.") + +/datum/game_mode/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) + var/list/slots = list( + "backpack" = slot_in_backpack, + "left pocket" = slot_l_store, + "right pocket" = slot_r_store + ) + + var/T = new item_path(mob) + var/item_name = initial(item_path.name) + var/where = mob.equip_in_one_of_slots(T, slots) + if(!where) + to_chat(mob, "Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).") + return 0 + else + to_chat(mob, "You have a [item_name] in your [where].") + if(where == "backpack") + var/obj/item/storage/B = mob.back + B.orient2hud(mob) + B.show_to(mob) + return 1 + +/datum/game_mode/proc/add_cultist(datum/mind/cult_mind, stun) //BASE if (!istype(cult_mind)) return 0 - - var/datum/antagonist/cult/new_cultist = new(cult_mind) - new_cultist.give_equipment = equip - - if(cult_mind.add_antag_datum(new_cultist)) + if(cult_mind.add_antag_datum(ANTAG_DATUM_CULT)) if(stun) cult_mind.current.Unconscious(100) return 1 @@ -123,19 +187,25 @@ culthud.leave_hud(cult_mind.current) set_antag_hud(cult_mind.current, null) +/datum/game_mode/cult/proc/get_unconvertables() + var/list/ucs = list() + for(var/mob/living/carbon/human/player in GLOB.player_list) + if(player.mind && !is_convertable_to_cult(player) && !(player.mind in cultists_to_cult)) + ucs += player.mind + return ucs + /datum/game_mode/cult/proc/check_cult_victory() - return main_cult.check_cult_victory() + var/cult_fail = 0 + if(cult_objectives.Find("survive")) + cult_fail += check_survive() //the proc returns 1 if there are not enough cultists on the shuttle, 0 otherwise + if(cult_objectives.Find("eldergod")) + cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once + if(cult_objectives.Find("sacrifice")) + if(GLOB.sac_mind && !GLOB.sac_complete) //if the target has been GLOB.sacrificed, ignore this step. otherwise, add 1 to cult_fail + cult_fail++ + return cult_fail //if any objectives aren't met, failure -/datum/game_mode/cult/set_round_result() - ..() - if(check_cult_victory()) - SSticker.mode_result = "win - cult win" - SSticker.news_report = CULT_SUMMON - else - SSticker.mode_result = "loss - staff stopped the cult" - SSticker.news_report = CULT_FAILURE - /datum/game_mode/cult/proc/check_survive() var/acolytes_survived = 0 for(var/datum/mind/cult_mind in cult) @@ -148,6 +218,57 @@ return 1 +/datum/game_mode/cult/declare_completion() + + if(!check_cult_victory()) + SSticker.mode_result = "win - cult win" + to_chat(world, "The cult has succeeded! Nar-sie has snuffed out another torch in the void!") + else + SSticker.mode_result = "loss - staff stopped the cult" + to_chat(world, "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!") + + var/text = "" + + if(cult_objectives.len) + text += "
The cultists' objectives were:" + for(var/obj_count=1, obj_count <= cult_objectives.len, obj_count++) + var/explanation + switch(cult_objectives[obj_count]) + if("survive") + if(!check_survive()) + explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Success!" + SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_survive", "SUCCESS")) + SSticker.news_report = CULT_ESCAPE + else + explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Fail." + SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_survive", "FAIL")) + SSticker.news_report = CULT_FAILURE + if("sacrifice") + if(GLOB.sac_complete) + explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. Success!" + SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "SUCCESS")) + else + explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. Fail." + SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "FAIL")) + if("eldergod") + if(!eldergod) + explanation = "Summon Nar-Sie. The summoning can only be accomplished in [english_list(GLOB.summon_spots)].Success!" + SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "SUCCESS")) + SSticker.news_report = CULT_SUMMON + else + explanation = "Summon Nar-Sie. The summoning can only be accomplished in [english_list(GLOB.summon_spots)]Fail." + SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "FAIL")) + SSticker.news_report = CULT_FAILURE + + text += "
Objective #[obj_count]: [explanation]" + if(cult.len) + text += "
The cultists were:" + for(var/datum/mind/M in cult) + text += printplayer(M) + to_chat(world, text) + ..() + return 1 + /datum/game_mode/cult/generate_report() return "Some stations in your sector have reported evidence of blood sacrifice and strange magic. Ties to the Wizards' Federation have been proven not to exist, and many employees \ have disappeared; even Central Command employees light-years away have felt strange presences and at times hysterical compulsions. Interrogations point towards this being the work of \ @@ -155,4 +276,41 @@ devoted to stopping this cult. Note that holy water seems to weaken and eventually return the minds of cultists that ingest it, and mindshield implants will prevent conversion \ altogether." +/datum/game_mode/proc/datum_cult_completion() + var/text = "" + var/cult_fail = 0 + cult_fail += eldergod + if(!GLOB.sac_complete) + cult_fail++ + if(!cult_fail) + SSticker.mode_result = "win - cult win" + to_chat(world, "The cult has succeeded! Nar-sie has snuffed out another torch in the void!") + else + SSticker.mode_result = "loss - staff stopped the cult" + to_chat(world, "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!") + if(cult_objectives.len) + text += "
The cultists' objectives were:" + for(var/obj_count in 1 to 2) + var/explanation + switch(cult_objectives[obj_count]) + if("sacrifice") + if(GLOB.sac_mind) + if(GLOB.sac_complete) + explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. Success!" + SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "SUCCESS")) + else + explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. Fail." + SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "FAIL")) + if("eldergod") + if(!eldergod) + explanation = "Summon Nar-Sie. Success!" + SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "SUCCESS")) + SSticker.news_report = CULT_SUMMON + else + explanation = "Summon Nar-Sie. Fail." + SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "FAIL")) + SSticker.news_report = CULT_FAILURE + text += "
Objective #[obj_count]: [explanation]" + to_chat(world, text) + #undef CULT_SCALING_COEFFICIENT diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 2938f5abf4..530b6ebb20 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -88,21 +88,19 @@ button_icon_state = "cultvote" /datum/action/innate/cult/mastervote/IsAvailable() - var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(!C || C.cult_team.cult_vote_called || !ishuman(owner)) + if(GLOB.cult_vote_called || !ishuman(owner)) return FALSE return ..() /datum/action/innate/cult/mastervote/Activate() - var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - pollCultists(owner,C.cult_team) + pollCultists(owner) -/proc/pollCultists(var/mob/living/Nominee,datum/objective_team/cult/team) //Cult Master Poll +/proc/pollCultists(var/mob/living/Nominee) //Cult Master Poll if(world.time < CULT_POLL_WAIT) to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [DisplayTimeText(CULT_POLL_WAIT-world.time)].") return - team.cult_vote_called = TRUE //somebody's trying to be a master, make sure we don't let anyone else try - for(var/datum/mind/B in team.members) + GLOB.cult_vote_called = TRUE //somebody's trying to be a master, make sure we don't let anyone else try + for(var/datum/mind/B in SSticker.mode.cult) if(B.current) B.current.update_action_buttons_icon() if(!B.current.incapacitated()) @@ -110,39 +108,39 @@ to_chat(B.current, "Acolyte [Nominee] has asserted that they are worthy of leading the cult. A vote will be called shortly.") sleep(100) var/list/asked_cultists = list() - for(var/datum/mind/B in team.members) + for(var/datum/mind/B in SSticker.mode.cult) if(B.current && B.current != Nominee && !B.current.incapacitated()) SEND_SOUND(B.current, 'sound/magic/exit_blood.ogg') asked_cultists += B.current var/list/yes_voters = pollCandidates("[Nominee] seeks to lead your cult, do you support [Nominee.p_them()]?", poll_time = 300, group = asked_cultists) if(QDELETED(Nominee) || Nominee.incapacitated()) - team.cult_vote_called = FALSE - for(var/datum/mind/B in team.members) + GLOB.cult_vote_called = FALSE + for(var/datum/mind/B in SSticker.mode.cult) if(B.current) B.current.update_action_buttons_icon() if(!B.current.incapacitated()) to_chat(B.current,"[Nominee] has died in the process of attempting to win the cult's support!") return FALSE if(!Nominee.mind) - team.cult_vote_called = FALSE - for(var/datum/mind/B in team.members) + GLOB.cult_vote_called = FALSE + for(var/datum/mind/B in SSticker.mode.cult) if(B.current) B.current.update_action_buttons_icon() if(!B.current.incapacitated()) to_chat(B.current,"[Nominee] has gone catatonic in the process of attempting to win the cult's support!") return FALSE if(LAZYLEN(yes_voters) <= LAZYLEN(asked_cultists) * 0.5) - team.cult_vote_called = FALSE - for(var/datum/mind/B in team.members) + GLOB.cult_vote_called = FALSE + for(var/datum/mind/B in SSticker.mode.cult) if(B.current) B.current.update_action_buttons_icon() if(!B.current.incapacitated()) to_chat(B.current, "[Nominee] could not win the cult's support and shall continue to serve as an acolyte.") return FALSE - team.cult_mastered = TRUE + GLOB.cult_mastered = TRUE SSticker.mode.remove_cultist(Nominee.mind, TRUE) Nominee.mind.add_antag_datum(ANTAG_DATUM_CULT_MASTER) - for(var/datum/mind/B in team.members) + for(var/datum/mind/B in SSticker.mode.cult) if(B.current) for(var/datum/action/innate/cult/mastervote/vote in B.current.actions) vote.Remove(B.current) @@ -161,9 +159,6 @@ button_icon_state = "sintouch" /datum/action/innate/cult/master/finalreck/Activate() - var/datum/antagonist/cult/antag = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(!antag) - return for(var/i in 1 to 4) chant(i) var/list/destinations = list() @@ -174,7 +169,7 @@ to_chat(owner, "You need more space to summon the cult!") return if(do_after(owner, 30, target = owner)) - for(var/datum/mind/B in antag.cult_team.members) + for(var/datum/mind/B in SSticker.mode.cult) if(B.current && B.current.stat != DEAD) var/turf/mobloc = get_turf(B.current) switch(i) @@ -199,7 +194,7 @@ addtimer(CALLBACK(B.current, /mob/.proc/reckon, final), 10) else return - antag.cult_team.reckoning_complete = TRUE + GLOB.reckoning_complete = TRUE Remove(owner) /mob/proc/reckon(turf/final) @@ -274,37 +269,34 @@ var/turf/T = get_turf(ranged_ability_user) if(!isturf(T)) return FALSE - - var/datum/antagonist/cult/C = caller.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(target in view(7, get_turf(ranged_ability_user))) - C.cult_team.blood_target = target + GLOB.blood_target = target var/area/A = get_area(target) attached_action.cooldown = world.time + attached_action.base_cooldown addtimer(CALLBACK(attached_action.owner, /mob.proc/update_action_buttons_icon), attached_action.base_cooldown) - C.cult_team.blood_target_image = image('icons/effects/cult_target.dmi', target, "glow", ABOVE_MOB_LAYER) - C.cult_team.blood_target_image.appearance_flags = RESET_COLOR - C.cult_team.blood_target_image.pixel_x = -target.pixel_x - C.cult_team.blood_target_image.pixel_y = -target.pixel_y + GLOB.blood_target_image = image('icons/effects/cult_target.dmi', target, "glow", ABOVE_MOB_LAYER) + GLOB.blood_target_image.appearance_flags = RESET_COLOR + GLOB.blood_target_image.pixel_x = -target.pixel_x + GLOB.blood_target_image.pixel_y = -target.pixel_y for(var/datum/mind/B in SSticker.mode.cult) if(B.current && B.current.stat != DEAD && B.current.client) - to_chat(B.current, "Master [ranged_ability_user] has marked [C.cult_team.blood_target] in the [A.name] as the cult's top priority, get there immediately!") + to_chat(B.current, "Master [ranged_ability_user] has marked [GLOB.blood_target] in the [A.name] as the cult's top priority, get there immediately!") SEND_SOUND(B.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75)) - B.current.client.images += C.cult_team.blood_target_image + B.current.client.images += GLOB.blood_target_image attached_action.owner.update_action_buttons_icon() remove_ranged_ability("The marking rite is complete! It will last for 90 seconds.") - C.cult_team.blood_target_reset_timer = addtimer(CALLBACK(GLOBAL_PROC, .proc/reset_blood_target,C.cult_team), 900, TIMER_STOPPABLE) + GLOB.blood_target_reset_timer = addtimer(CALLBACK(GLOBAL_PROC, .proc/reset_blood_target), 900, TIMER_STOPPABLE) return TRUE return FALSE -/proc/reset_blood_target(datum/objective_team/cult/team) - for(var/datum/mind/B in team.members) +/proc/reset_blood_target() + for(var/datum/mind/B in SSticker.mode.cult) if(B.current && B.current.stat != DEAD && B.current.client) - if(team.blood_target) + if(GLOB.blood_target) to_chat(B.current,"The blood mark has expired!") - B.current.client.images -= team.blood_target_image - QDEL_NULL(team.blood_target_image) - team.blood_target = null + B.current.client.images -= GLOB.blood_target_image + QDEL_NULL(GLOB.blood_target_image) + GLOB.blood_target = null diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index ad0b8d91a1..da222fe521 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -163,7 +163,7 @@ /obj/item/twohanded/required/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters) . = ..() - if(dash_toggled) + if(dash_toggled && jaunt.IsAvailable()) jaunt.Teleport(user, target) return if(!proximity) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 8d12343a8d..440dfaede6 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -100,9 +100,10 @@ if(cooldowntime > world.time) to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") return - var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Bastard Sword") + var/option = "Shielded Robe" + option = input(user, "You study the schematics etched into the forge...", "[src]", option) as null|anything in list("Shielded Robe", "Flagellant's Robe", "Bastard Sword", "Nar-Sien Hardsuit") var/pickedtype - switch(choice) + switch(option) if("Shielded Robe") pickedtype = /obj/item/clothing/suit/hooded/cultrobes/cult_shield if("Flagellant's Robe") diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 8aebf1d196..2adaa57a2f 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -179,13 +179,6 @@ This file contains the arcane tome files. var/list/shields = list() var/area/A = get_area(src) - var/datum/antagonist/cult/user_antag = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(!user_antag) - return - - var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team.objectives - var/datum/objective/sacrifice/sac_objective = locate() in user_antag.cult_team.objectives - if(!check_rune_turf(Turf, user)) return entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in GLOB.rune_types @@ -203,20 +196,18 @@ This file contains the arcane tome files. A = get_area(src) if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user)) return - - //AAAAAAAAAAAAAAAH, i'm rewriting enough for now so TODO: remove this shit if(ispath(rune_to_scribe, /obj/effect/rune/narsie)) - if(!summon_objective) + if(!("eldergod" in SSticker.mode.cult_objectives)) to_chat(user, "Nar-Sie does not wish to be summoned!") return - if(sac_objective && !sac_objective.check_completion()) + if(!GLOB.sac_complete) to_chat(user, "The sacrifice is not complete. The portal would lack the power to open if you tried!") return - if(summon_objective.check_completion()) + if(!SSticker.mode.eldergod) to_chat(user, "\"I am already here. There is no need to try to summon me now.\"") return - if(!(A in summon_objective.summon_spots)) - to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!") + if(!(A in GLOB.summon_spots)) + to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(GLOB.summon_spots)]!") return var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie; it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No") if(confirm_final == "No") @@ -224,8 +215,8 @@ This file contains the arcane tome files. return Turf = get_turf(user) A = get_area(src) - if(!(A in summon_objective.summon_spots)) // Check again to make sure they didn't move - to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!") + if(!(A in GLOB.summon_spots)) // Check again to make sure they didn't move + to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(GLOB.summon_spots)]!") return priority_announce("Figments from an eldritch god are being summoned by [user] into [A.map_name] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/ai/spanomalies.ogg') for(var/B in spiral_range_turfs(1, user, 1)) @@ -266,10 +257,8 @@ This file contains the arcane tome files. to_chat(user, "There is already a rune here.") return FALSE - if(!(T.z in GLOB.station_z_levels) && T.z != ZLEVEL_MINING) to_chat(user, "The veil is not weak enough here.") - return FALSE return TRUE diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index fc6a36376b..33d5f49661 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -349,11 +349,7 @@ structure_check() searches for nearby cultist structures required for the invoca color = RUNE_COLOR_DARKRED var/mob/living/L = pick(myriad_targets) var/is_clock = is_servant_of_ratvar(L) - - var/mob/living/F = invokers[1] - var/datum/antagonist/cult/C = F.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - - var/is_convertable = is_convertable_to_cult(L,C.cult_team) + var/is_convertable = is_convertable_to_cult(L) if(L.stat != DEAD && (is_clock || is_convertable)) invocation = "Mah'weyh pleggh at e'ntrath!" ..() @@ -401,27 +397,17 @@ structure_check() searches for nearby cultist structures required for the invoca return 1 /obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers) - var/mob/living/first_invoker = invokers[1] - if(!first_invoker) - return FALSE - var/datum/antagonist/cult/C = first_invoker.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(!C) - return - - var/big_sac = FALSE - if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3) + if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || is_sacrifice_target(sacrificial.mind)) && invokers.len < 3) for(var/M in invokers) to_chat(M, "[sacrificial] is too greatly linked to the world! You need three acolytes!") log_game("Offer rune failed - not enough acolytes and target is living or sac target") return FALSE if(sacrificial.mind) GLOB.sacrificed += sacrificial.mind - for(var/datum/objective/sacrifice/sac_objective in C.cult_team.objectives) - if(sac_objective.target == sacrificial.mind) - sac_objective.sacced = TRUE - sac_objective.update_explanation_text() - big_sac = TRUE + if(is_sacrifice_target(sacrificial.mind)) + GLOB.sac_complete = TRUE + big_sac = TRUE else GLOB.sacrificed += sacrificial @@ -495,6 +481,7 @@ structure_check() searches for nearby cultist structures required for the invoca sleep(40) if(src) color = RUNE_COLOR_RED + SSticker.mode.eldergod = FALSE new /obj/singularity/narsie/large/cult(T) //Causes Nar-Sie to spawn even if the rune has been removed /obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal. diff --git a/code/game/gamemodes/devil/game_mode.dm b/code/game/gamemodes/devil/game_mode.dm index 44f3368feb..957e261933 100644 --- a/code/game/gamemodes/devil/game_mode.dm +++ b/code/game/gamemodes/devil/game_mode.dm @@ -3,6 +3,32 @@ var/list/datum/mind/devils = list() var/devil_ascended = 0 // Number of arch devils on station +/datum/game_mode/proc/auto_declare_completion_sintouched() + var/text = "" + if(sintouched.len) + text += "
The sintouched were:" + var/list/sintouchedUnique = uniqueList(sintouched) + for(var/S in sintouchedUnique) + var/datum/mind/sintouched_mind = S + text += printplayer(sintouched_mind) + text += printobjectives(sintouched_mind) + text += "
" + text += "
" + to_chat(world, text) + +/datum/game_mode/proc/auto_declare_completion_devils() + /var/text = "" + if(devils.len) + text += "
The devils were:" + for(var/D in devils) + var/datum/mind/devil = D + text += printplayer(devil) + text += printdevilinfo(devil.current) + text += printobjectives(devil) + text += "
" + text += "
" + to_chat(world, text) + /datum/game_mode/proc/add_devil_objectives(datum/mind/devil_mind, quantity) var/list/validtypes = list(/datum/objective/devil/soulquantity, /datum/objective/devil/soulquality, /datum/objective/devil/sintouch, /datum/objective/devil/buy_target) for(var/i = 1 to quantity) @@ -15,6 +41,18 @@ else objective.find_target() +/datum/game_mode/proc/printdevilinfo(mob/living/ply) + var/datum/antagonist/devil/devilinfo = is_devil(ply) + if(!devilinfo) + return "Target is not a devil." + var/text = "
The devil's true name is: [devilinfo.truename]
" + text += "The devil's bans were:
" + text += " [GLOB.lawlorify[LORE][devilinfo.ban]]
" + text += " [GLOB.lawlorify[LORE][devilinfo.bane]]
" + text += " [GLOB.lawlorify[LORE][devilinfo.obligation]]
" + text += " [GLOB.lawlorify[LORE][devilinfo.banish]]

" + return text + /datum/game_mode/proc/update_devil_icons_added(datum/mind/devil_mind) var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_DEVIL] hud.join_hud(devil_mind.current) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index a0e5a9f147..803e73b9e0 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -19,7 +19,6 @@ var/probability = 0 var/false_report_weight = 0 //How often will this show up incorrectly in a centcom report? var/station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm - var/nuke_off_station = 0 //Used for tracking where the nuke hit var/round_ends_with_antag_death = 0 //flags the "one verse the station" antags as such var/list/datum/mind/antag_candidates = list() // List of possible starting antags goes here var/list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist @@ -74,6 +73,7 @@ /datum/game_mode/proc/pre_setup() return 1 + ///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things /datum/game_mode/proc/post_setup(report) //Gamemodes can override the intercept report. Passing TRUE as the argument will force a report. if(!report) @@ -241,9 +241,55 @@ return 0 +/datum/game_mode/proc/declare_completion() + var/clients = 0 + var/surviving_humans = 0 + var/surviving_total = 0 + var/ghosts = 0 + var/escaped_humans = 0 + var/escaped_total = 0 + + for(var/mob/M in GLOB.player_list) + if(M.client) + clients++ + if(ishuman(M)) + if(!M.stat) + surviving_humans++ + if(M.z == ZLEVEL_CENTCOM) + escaped_humans++ + if(!M.stat) + surviving_total++ + if(M.z == ZLEVEL_CENTCOM) + escaped_total++ + + + if(isobserver(M)) + ghosts++ + + if(clients) + SSblackbox.record_feedback("nested tally", "round_end_stats", clients, list("clients")) + if(ghosts) + SSblackbox.record_feedback("nested tally", "round_end_stats", ghosts, list("ghosts")) + if(surviving_humans) + SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_humans, list("survivors", "human")) + if(surviving_total) + SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_total, list("survivors", "total")) + if(escaped_humans) + SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_humans, list("escapees", "human")) + if(escaped_total) + SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_total, list("escapees", "total")) + + send2irc("Server", "Round just ended.") + if(cult.len && !istype(SSticker.mode, /datum/game_mode/cult)) + datum_cult_completion() + + return 0 + + /datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere. return 0 + /datum/game_mode/proc/send_intercept() var/intercepttext = "Central Command Status Summary
" intercepttext += "Central Command has intercepted and partially decoded a Syndicate transmission with vital information regarding their movements. The following report outlines the most \ @@ -405,6 +451,34 @@ for (var/C in GLOB.admins) to_chat(C, msg) +/datum/game_mode/proc/printplayer(datum/mind/ply, fleecheck) + var/text = "
[ply.key] was [ply.name] the [ply.assigned_role] and" + if(ply.current) + if(ply.current.stat == DEAD) + text += " died" + else + text += " survived" + if(fleecheck) + var/turf/T = get_turf(ply.current) + if(!T || !(T.z in GLOB.station_z_levels)) + text += " while fleeing the station" + if(ply.current.real_name != ply.name) + text += " as [ply.current.real_name]" + else + text += " had their body destroyed" + return text + +/datum/game_mode/proc/printobjectives(datum/mind/ply) + var/text = "" + var/count = 1 + for(var/datum/objective/objective in ply.objectives) + if(objective.check_completion()) + text += "
Objective #[count]: [objective.explanation_text] Success!" + else + text += "
Objective #[count]: [objective.explanation_text] Fail." + count++ + return text + //If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 /datum/game_mode/proc/age_check(client/C) if(get_remaining_days(C) == 0) @@ -444,25 +518,15 @@ station_goals += new picked +/datum/game_mode/proc/declare_station_goal_completion() + for(var/V in station_goals) + var/datum/station_goal/G = V + G.print_result() + /datum/game_mode/proc/generate_report() //Generates a small text blurb for the gamemode in centcom report return "Gamemode report for [name] not set. Contact a coder." //By default nuke just ends the round /datum/game_mode/proc/OnNukeExplosion(off_station) - nuke_off_station = off_station if(off_station < 2) station_was_nuked = TRUE //Will end the round on next check. - -//Additional report section in roundend report -/datum/game_mode/proc/special_report() - return - -//Set result and news report here -/datum/game_mode/proc/set_round_result() - SSticker.mode_result = "undefined" - if(station_was_nuked) - SSticker.news_report = STATION_DESTROYED_NUKE - if(EMERGENCY_ESCAPED_OR_ENDGAMED) - SSticker.news_report = STATION_EVACUATED - if(SSshuttle.emergency.is_hijacked()) - SSticker.news_report = SHUTTLE_HIJACK \ No newline at end of file diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index ff2ffce7ee..1c17893a28 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -367,12 +367,12 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( var/sec_left = seconds_remaining() if(!sec_left) timing = FALSE - detonate() + detonate(T.z) else if(world.time >= next_announce) minor_announce("[sec_left] SECONDS UNTIL DOOMSDAY DEVICE ACTIVATION!", "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", TRUE) next_announce += DOOMSDAY_ANNOUNCE_INTERVAL -/obj/machinery/doomsday_device/proc/detonate() +/obj/machinery/doomsday_device/proc/detonate(z_level = ZLEVEL_STATION_PRIMARY) sound_to_playing_players('sound/machines/alarm.ogg') sleep(100) for(var/i in GLOB.mob_living_list) diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index f8e0666015..b7a6580570 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -30,29 +30,30 @@ spawn_meteors(ramp_up_final, wavetype) -/datum/game_mode/meteor/special_report() +/datum/game_mode/meteor/declare_completion() + var/text var/survivors = 0 - var/list/survivor_list = list() for(var/mob/living/player in GLOB.player_list) if(player.stat != DEAD) ++survivors if(player.onCentCom()) - survivor_list += "[player.real_name] escaped to the safety of CentCom." + text += "
[player.real_name] escaped to the safety of CentCom." else if(player.onSyndieBase()) - survivor_list += "[player.real_name] escaped to the (relative) safety of Syndicate Space." + text += "
[player.real_name] escaped to the (relative) safety of Syndicate Space." else - survivor_list += "[player.real_name] survived but is stranded without any hope of rescue." + text += "
[player.real_name] survived but is stranded without any hope of rescue." + if(survivors) - return "The following survived the meteor storm:
[survivor_list.Join("
")]" + to_chat(world, "The following survived the meteor storm:[text]") else - return "Nobody survived the meteor storm!" + to_chat(world, "Nobody survived the meteor storm!") -/datum/game_mode/meteor/set_round_result() - ..() SSticker.mode_result = "end - evacuation" + ..() + return 1 /datum/game_mode/meteor/generate_report() return "[pick("Asteroids have", "Meteors have", "Large rocks have", "Stellar minerals have", "Space hail has", "Debris has")] been detected near your station, and a collision is possible, \ diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 289de1aabd..780be71694 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -105,7 +105,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event /obj/effect/meteor/Move() if(z != z_original || loc == dest) qdel(src) - return FALSE + return . = ..() //process movement... diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 12987124ac..4eb8642c02 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -1,5 +1,19 @@ +/datum/objective_team/abductor_team + member_name = "abductor" + var/list/objectives = list() + var/team_number + +/datum/objective_team/abductor_team/is_solo() + return FALSE + +/datum/objective_team/abductor_team/proc/add_objective(datum/objective/O) + O.team = src + O.update_explanation_text() + objectives += O + /datum/game_mode var/list/datum/mind/abductors = list() + var/list/datum/mind/abductees = list() /datum/game_mode/abduction name = "abduction" @@ -50,7 +64,6 @@ antag_candidates -= scientist team.members |= scientist scientist.assigned_role = "Abductor Scientist" - scientist.special_role = "Abductor Scientist" log_game("[scientist.key] (ckey) has been selected as [team.name] abductor scientist.") if(!agent) @@ -58,7 +71,6 @@ antag_candidates -= agent team.members |= agent agent.assigned_role = "Abductor Agent" - agent.special_role = "Abductor Agent" log_game("[agent.key] (ckey) has been selected as [team.name] abductor agent.") abductor_teams += team @@ -87,6 +99,35 @@ return ..() return ..() +/datum/game_mode/abduction/declare_completion() + for(var/datum/objective_team/abductor_team/team in abductor_teams) + var/won = TRUE + for(var/datum/objective/O in team.objectives) + if(!O.check_completion()) + won = FALSE + if(won) + to_chat(world, "[team.name] team fulfilled its mission!") + else + to_chat(world, "[team.name] team failed its mission.") + ..() + return TRUE + +/datum/game_mode/proc/auto_declare_completion_abduction() + var/text = "" + if(abductors.len) + text += "
The abductors were:" + for(var/datum/mind/abductor_mind in abductors) + text += printplayer(abductor_mind) + text += printobjectives(abductor_mind) + text += "
" + if(abductees.len) + text += "
The abductees were:" + for(var/datum/mind/abductee_mind in abductees) + text += printplayer(abductee_mind) + text += printobjectives(abductee_mind) + text += "
" + to_chat(world, text) + // LANDMARKS /obj/effect/landmark/abductor var/team_number = 1 diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 70aecaba5e..22edb79c80 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -236,10 +236,11 @@ /obj/item/organ/heart/gland/plasma/activate() to_chat(owner, "You feel bloated.") - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, "A massive stomachache overcomes you."), 150) - addtimer(CALLBACK(src, .proc/vomit_plasma), 200) - -/obj/item/organ/heart/gland/plasma/proc/vomit_plasma() + sleep(150) + if(!owner) + return + to_chat(owner, "A massive stomachache overcomes you.") + sleep(50) if(!owner) return owner.visible_message("[owner] vomits a cloud of plasma!") diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index cf1329aec9..c3a591a278 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -151,18 +151,13 @@ var/mob/living/mob_occupant = occupant if(mob_occupant.stat != DEAD) if(href_list["experiment"]) - flash = Experiment(occupant,href_list["experiment"],usr) + flash = Experiment(occupant,href_list["experiment"]) updateUsrDialog() add_fingerprint(usr) -/obj/machinery/abductor/experiment/proc/Experiment(mob/occupant,type,mob/user) +/obj/machinery/abductor/experiment/proc/Experiment(mob/occupant,type) LAZYINITLIST(history) var/mob/living/carbon/human/H = occupant - - var/datum/antagonist/abductor/user_abductor = user.mind.has_antag_datum(/datum/antagonist/abductor) - if(!user_abductor) - return "Authorization failure. Contact mothership immidiately." - var/point_reward = 0 if(H in history) return "Specimen already in database." @@ -187,8 +182,15 @@ if(3) to_chat(H, "You feel intensely watched.") sleep(5) - user_abductor.team.abductees += H.mind - H.mind.add_antag_datum(/datum/antagonist/abductee) + to_chat(H, "Your mind snaps!") + H.gain_trauma_type(BRAIN_TRAUMA_MILD) + to_chat(H, "You can't remember how you got here...") + var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) + var/datum/objective/abductee/O = new objtype() + SSticker.mode.abductees += H.mind + H.mind.objectives += O + H.mind.announce_objectives() + SSticker.mode.update_abductor_icons_added(H.mind) for(var/obj/item/organ/heart/gland/G in H.internal_organs) G.Start() diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm index f8a1df3cb8..ff426ab625 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm @@ -1,8 +1,8 @@ /datum/round_event_control/spawn_swarmer name = "Spawn Swarmer Shell" typepath = /datum/round_event/spawn_swarmer - weight = 7 - max_occurrences = 1 //Only once okay fam + weight = 0 + max_occurrences = 0 //Only once okay fam earliest_start = 18000 //30 minutes min_players = 15 diff --git a/code/game/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm index 8e02d41441..379031dce9 100644 --- a/code/game/gamemodes/miniantags/monkey/monkey.dm +++ b/code/game/gamemodes/miniantags/monkey/monkey.dm @@ -105,18 +105,13 @@ monkey_mind.special_role = null -/datum/game_mode/monkey/set_round_result() - ..() +/datum/game_mode/monkey/declare_completion() if(check_monkey_victory()) SSticker.mode_result = "win - monkey win" + to_chat(world, "The monkeys have overthrown their captors! Eeek eeeek!!") else SSticker.mode_result = "loss - staff stopped the monkeys" - -/datum/game_mode/monkey/special_report() - if(check_monkey_victory()) - return "The monkeys have overthrown their captors! Eeek eeeek!!" - else - return "The staff managed to contain the monkey infestation!" + to_chat(world, "The staff managed to contain the monkey infestation!") /datum/game_mode/monkey/generate_report() return "Reports of an ancient [pick("retrovirus", "flesh eating bacteria", "disease", "magical curse blamed on viruses", "banana blight")] outbreak that turn humans into monkeys has been reported in your quadrant. Any such infections may be treated with banana juice. If an outbreak occurs, ensure the station is quarantined to prevent a largescale outbreak at CentCom." diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 2ebc21adac..5e1a97675b 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -227,7 +227,6 @@ player_mind.assigned_role = "Morph" player_mind.special_role = "Morph" SSticker.mode.traitors |= player_mind - player_mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(S, S.playstyle_string) SEND_SOUND(S, sound('sound/magic/mutate.ogg')) message_admins("[key_name_admin(S)] has been made into a morph by an event.") diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 441689fb9b..727203b150 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -87,7 +87,6 @@ mind.assigned_role = "revenant" mind.special_role = "Revenant" SSticker.mode.traitors |= mind //Necessary for announcing - mind.add_antag_datum(/datum/antagonist/auto_custom) AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null)) @@ -375,7 +374,7 @@ return var/key_of_revenant message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.") - forceMove(drop_location()) //In case it's in a backpack or someone's hand + loc = get_turf(src) //In case it's in a backpack or someone's hand revenant.forceMove(loc) if(client_to_revive) for(var/mob/M in GLOB.dead_mob_list) diff --git a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm index e62665f21b..f1f9624380 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm @@ -38,7 +38,6 @@ player_mind.assigned_role = "Slaughter Demon" player_mind.special_role = "Slaughter Demon" SSticker.mode.traitors |= player_mind - player_mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(S, S.playstyle_string) to_chat(S, "You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.") SEND_SOUND(S, 'sound/magic/demon_dies.ogg') diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index f3dee00303..94c372ef23 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -1,3 +1,7 @@ +/datum/game_mode + var/list/datum/mind/syndicates = list() + var/nukeops_lastname = "" + /datum/game_mode/nuclear name = "nuclear emergency" config_tag = "nuclear" @@ -14,10 +18,11 @@ Crew: Defend the nuclear authentication disk and ensure that it leaves with you on the emergency shuttle." var/const/agents_possible = 5 //If we ever need more syndicate agents. - var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! - var/list/pre_nukeops = list() - var/datum/objective_team/nuclear/nuke_team + var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! + var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station + var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level + var/list/pre_nukeops = list() /datum/game_mode/nuclear/pre_setup() var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible) @@ -28,23 +33,120 @@ new_op.special_role = "Nuclear Operative" log_game("[new_op.key] (ckey) has been selected as a nuclear operative") return TRUE + +//////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////// +/datum/game_mode/proc/update_synd_icons_added(datum/mind/synd_mind) + var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] + opshud.join_hud(synd_mind.current) + set_antag_hud(synd_mind.current, "synd") + +/datum/game_mode/proc/update_synd_icons_removed(datum/mind/synd_mind) + var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS] + opshud.leave_hud(synd_mind.current) + set_antag_hud(synd_mind.current, null) + //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// /datum/game_mode/nuclear/post_setup() - //Assign leader - var/datum/mind/leader_mind = pre_nukeops[1] - var/datum/antagonist/nukeop/L = leader_mind.add_antag_datum(/datum/antagonist/nukeop/leader) - nuke_team = L.nuke_team - //Assign the remaining operatives - for(var/i = 2 to pre_nukeops.len) - var/datum/mind/nuke_mind = pre_nukeops[i] - nuke_mind.add_antag_datum(/datum/antagonist/nukeop,nuke_team) + var/nuke_code = random_nukecode() + var/agent_number = 1 + var/datum/mind/leader = pick(pre_nukeops) + syndicates += pre_nukeops + for(var/i = 1 to pre_nukeops.len) + var/datum/mind/op = pre_nukeops[i] + + forge_syndicate_objectives(op) + greet_syndicate(op) + equip_syndicate(op.current) + + if(nuke_code) + op.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) + to_chat(op.current, "The nuclear authorization code is: [nuke_code]") + + if(op == leader) + op.current.forceMove(pick(GLOB.nukeop_leader_start)) + prepare_syndicate_leader(op, nuke_code) + else + op.current.forceMove(GLOB.nukeop_start[((i - 1) % GLOB.nukeop_start.len) + 1]) + op.current.real_name = "[syndicate_name()] Operative #[agent_number++]" + + update_synd_icons_added(op) + op.current.playsound_local(get_turf(op.current), 'sound/ambience/antag/ops.ogg',100,0) + + var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list + if(nuke) + nuke.r_code = nuke_code return ..() +/datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code) + var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") + addtimer(CALLBACK(src, .proc/nuketeam_name_assign, synd_mind), 1) + synd_mind.current.real_name = "[syndicate_name()] [leader_title]" + to_chat(synd_mind.current, "You are the Syndicate [leader_title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") + to_chat(synd_mind.current, "If you feel you are not up to this task, give your ID to another operative.") + to_chat(synd_mind.current, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") + + var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge + synd_mind.current.put_in_hands(challenge, TRUE) + + var/static/id_cache = typecacheof(/obj/item/card/id) + var/list/foundIDs = typecache_filter_list(synd_mind.current.GetAllContents(), id_cache) + if(foundIDs.len) + for(var/i in 1 to foundIDs.len) + var/obj/item/card/id/ID = foundIDs[i] + ID.name = "lead agent card" + ID.access += ACCESS_SYNDICATE_LEADER + else + message_admins("Warning: Nuke Ops spawned without access to leave their spawn area!") + + var/obj/item/device/radio/headset/syndicate/alt/A = locate() in synd_mind.current + if(A) + A.command = TRUE + + if(nuke_code) + var/obj/item/paper/P = new + P.info = "The nuclear authorization code is: [nuke_code]" + P.name = "nuclear bomb code" + var/mob/living/carbon/human/H = synd_mind.current + H.put_in_hands(P, TRUE) + H.update_icons() + else + nuke_code = "code will be provided later" + return + +/datum/game_mode/proc/nuketeam_name_assign(datum/mind/synd_mind) + nukeops_lastname = nukelastname(synd_mind.current) + NukeNameAssign(nukeops_lastname, syndicates) + + +/datum/game_mode/proc/forge_syndicate_objectives(datum/mind/syndicate) + var/datum/objective/nuclear/syndobj = new + syndobj.owner = syndicate + syndicate.objectives += syndobj + + +/datum/game_mode/proc/greet_syndicate(datum/mind/syndicate, you_are=1) + if(you_are) + to_chat(syndicate.current, "You are a [syndicate_name()] agent!") + syndicate.announce_objectives() + +/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob, telecrystals = TRUE) + synd_mob.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs + + if(telecrystals) + synd_mob.equipOutfit(/datum/outfit/syndicate) + else + synd_mob.equipOutfit(/datum/outfit/syndicate/no_crystals) + return TRUE + /datum/game_mode/nuclear/OnNukeExplosion(off_station) ..() nukes_left-- + var/obj/docking_port/mobile/Shuttle = SSshuttle.getShuttle("syndicate") + syndies_didnt_escape = (Shuttle && (Shuttle.z == ZLEVEL_CENTCOM || Shuttle.z == ZLEVEL_TRANSIT)) ? 0 : 1 + nuke_off_station = off_station /datum/game_mode/nuclear/check_win() if (nukes_left == 0) @@ -52,8 +154,8 @@ return ..() /datum/game_mode/proc/are_operatives_dead() - for(var/datum/mind/operative_mind in get_antagonists(/datum/antagonist/nukeop)) - if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD)) + for(var/datum/mind/operative_mind in syndicates) + if(ishuman(operative_mind.current) && (operative_mind.current.stat!=2)) return FALSE return TRUE @@ -62,55 +164,142 @@ return replacementmode.check_finished() if((SSshuttle.emergency.mode == SHUTTLE_ENDGAME) || station_was_nuked) return TRUE - if(nuke_team.operatives_dead()) + if(are_operatives_dead()) var/obj/machinery/nuclearbomb/N pass(N) //suppress unused warning if(N.bomb_set) //snaaaaaaaaaake! It's not over yet! return FALSE //its a static var btw ..() -/datum/game_mode/nuclear/set_round_result() +/datum/game_mode/nuclear/declare_completion() + var/disk_rescued = 1 + for(var/obj/item/disk/nuclear/D in GLOB.poi_list) + if(!D.onCentCom()) + disk_rescued = 0 + break + var/crew_evacuated = (SSshuttle.emergency.mode == SHUTTLE_ENDGAME) + + if(nuke_off_station == NUKE_SYNDICATE_BASE) + SSticker.mode_result = "loss - syndicate nuked - disk secured" + to_chat(world, "Humiliating Syndicate Defeat") + to_chat(world, "The crew of [station_name()] gave [syndicate_name()] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!") + + SSticker.news_report = NUKE_SYNDICATE_BASE + + else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) + SSticker.mode_result = "win - syndicate nuke" + to_chat(world, "Syndicate Major Victory!") + to_chat(world, "[syndicate_name()] operatives have destroyed [station_name()]!") + + SSticker.news_report = STATION_NUKED + + else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) + SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" + to_chat(world, "Total Annihilation") + to_chat(world, "[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!") + + SSticker.news_report = STATION_NUKED + + else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) + SSticker.mode_result = "halfwin - blew wrong station" + to_chat(world, "Crew Minor Victory") + to_chat(world, "[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!") + + SSticker.news_report = NUKE_MISS + + else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) + SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" + to_chat(world, "[syndicate_name()] operatives have earned Darwin Award!") + to_chat(world, "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!") + + SSticker.news_report = NUKE_MISS + + else if ((disk_rescued || SSshuttle.emergency.mode != SHUTTLE_ENDGAME) && are_operatives_dead()) + SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" + to_chat(world, "Crew Major Victory!") + to_chat(world, "The Research Staff has saved the disk and killed the [syndicate_name()] Operatives") + + SSticker.news_report = OPERATIVES_KILLED + + else if (disk_rescued) + SSticker.mode_result = "loss - evacuation - disk secured" + to_chat(world, "Crew Major Victory") + to_chat(world, "The Research Staff has saved the disk and stopped the [syndicate_name()] Operatives!") + + SSticker.news_report = OPERATIVES_KILLED + + else if (!disk_rescued && are_operatives_dead()) + SSticker.mode_result = "halfwin - evacuation - disk not secured" + to_chat(world, "Neutral Victory!") + to_chat(world, "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!") + + SSticker.news_report = OPERATIVE_SKIRMISH + + else if (!disk_rescued && crew_evacuated) + SSticker.mode_result = "halfwin - detonation averted" + to_chat(world, "Syndicate Minor Victory!") + to_chat(world, "[syndicate_name()] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!") + + SSticker.news_report = OPERATIVE_SKIRMISH + + else if (!disk_rescued && !crew_evacuated) + SSticker.mode_result = "halfwin - interrupted" + to_chat(world, "Neutral Victory") + to_chat(world, "Round was mysteriously interrupted!") + + SSticker.news_report = OPERATIVE_SKIRMISH + ..() - var result = nuke_team.get_result() - switch(result) - if(NUKE_RESULT_FLUKE) - SSticker.mode_result = "loss - syndicate nuked - disk secured" - SSticker.news_report = NUKE_SYNDICATE_BASE - if(NUKE_RESULT_NUKE_WIN) - SSticker.mode_result = "win - syndicate nuke" - SSticker.news_report = STATION_NUKED - if(NUKE_RESULT_NOSURVIVORS) - SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" - SSticker.news_report = STATION_NUKED - if(NUKE_RESULT_WRONG_STATION) - SSticker.mode_result = "halfwin - blew wrong station" - SSticker.news_report = NUKE_MISS - if(NUKE_RESULT_WRONG_STATION_DEAD) - SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" - SSticker.news_report = NUKE_MISS - if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) - SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" - SSticker.news_report = OPERATIVES_KILLED - if(NUKE_RESULT_CREW_WIN) - SSticker.mode_result = "loss - evacuation - disk secured" - SSticker.news_report = OPERATIVES_KILLED - if(NUKE_RESULT_DISK_LOST) - SSticker.mode_result = "halfwin - evacuation - disk not secured" - SSticker.news_report = OPERATIVE_SKIRMISH - if(NUKE_RESULT_DISK_STOLEN) - SSticker.mode_result = "halfwin - detonation averted" - SSticker.news_report = OPERATIVE_SKIRMISH - else - SSticker.mode_result = "halfwin - interrupted" - SSticker.news_report = OPERATIVE_SKIRMISH + return /datum/game_mode/nuclear/generate_report() return "One of Central Command's trading routes was recently disrupted by a raid carried out by the Gorlex Marauders. They seemed to only be after one ship - a highly-sensitive \ transport containing a nuclear fission explosive, although it is useless without the proper code and authorization disk. While the code was likely found in minutes, the only disk that \ can activate this explosive is on your station. Ensure that it is protected at all times, and remain alert for possible intruders." +/datum/game_mode/proc/auto_declare_completion_nuclear() + if( syndicates.len || (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear)) ) + var/text = "
The syndicate operatives were:" + var/purchases = "" + var/TC_uses = 0 + for(var/datum/mind/syndicate in syndicates) + text += printplayer(syndicate) + for(var/datum/component/uplink/H in GLOB.uplinks) + if(H.purchase_log) + purchases += H.purchase_log.generate_render() + else + stack_trace("WARNING: Uplink with no purchase_log in nuclear mode! Owner: [H.owner]") + text += "
" + text += "(Syndicates used [TC_uses] TC) [purchases]" + if(TC_uses == 0 && station_was_nuked && !are_operatives_dead()) + text += "[icon2html('icons/badass.dmi', world, "badass")]" + to_chat(world, text) + return TRUE + + +/proc/nukelastname(mob/M) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho. + var/randomname = pick(GLOB.last_names) + var/newname = copytext(sanitize(input(M,"You are the nuke operative [pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")]. Please choose a last name for your family.", "Name change",randomname)),1,MAX_NAME_LEN) + + if (!newname) + newname = randomname + + else + if (newname == "Unknown" || newname == "floor" || newname == "wall" || newname == "rwall" || newname == "_") + to_chat(M, "That name is reserved.") + return nukelastname(M) + + return capitalize(newname) + +/proc/NukeNameAssign(lastname,list/syndicates) + for(var/datum/mind/synd_mind in syndicates) + var/mob/living/carbon/human/H = synd_mind.current + synd_mind.name = H.dna.species.random_name(H.gender,0,lastname) + synd_mind.current.real_name = synd_mind.name + return + /proc/is_nuclear_operative(mob/M) - return M && istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/nukeop) + return M && istype(M) && M.mind && SSticker && SSticker.mode && M.mind in SSticker.mode.syndicates /datum/outfit/syndicate name = "Syndicate Operative - Basic" @@ -123,28 +312,18 @@ l_pocket = /obj/item/pinpointer/nuke/syndicate id = /obj/item/card/id/syndicate belt = /obj/item/gun/ballistic/automatic/pistol - backpack_contents = list(/obj/item/storage/box/syndie=1,\ - /obj/item/kitchen/knife/combat/survival) + backpack_contents = list(/obj/item/storage/box/syndie=1) var/tc = 25 - var/command_radio = FALSE - - -/datum/outfit/syndicate/leader - name = "Syndicate Leader - Basic" - id = /obj/item/card/id/syndicate/nuke_leader - r_hand = /obj/item/device/nuclear_challenge - command_radio = TRUE /datum/outfit/syndicate/no_crystals tc = 0 + /datum/outfit/syndicate/post_equip(mob/living/carbon/human/H) var/obj/item/device/radio/R = H.ears - R.set_frequency(FREQ_SYNDICATE) - R.freqlock = TRUE - if(command_radio) - R.command = TRUE + R.set_frequency(GLOB.SYND_FREQ) + R.freqlock = 1 if(tc) var/obj/item/device/radio/uplink/nuclear/U = new(H, H.key, tc) @@ -169,5 +348,4 @@ r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog backpack_contents = list(/obj/item/storage/box/syndie=1,\ /obj/item/tank/jetpack/oxygen/harness=1,\ - /obj/item/gun/ballistic/automatic/pistol=1,\ - /obj/item/kitchen/knife/combat/survival) + /obj/item/gun/ballistic/automatic/pistol=1) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 94d8478cbb..908ecd797f 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -77,16 +77,16 @@ icon = 'icons/obj/machines/nuke_terminal.dmi' icon_state = "nuclearbomb_base" anchored = TRUE //stops it being moved + use_tag = TRUE /obj/machinery/nuclearbomb/syndicate - use_tag = TRUE //ui_style = "syndicate" // actually the nuke op bomb is a stole nt bomb /obj/machinery/nuclearbomb/syndicate/get_cinematic_type(off_station) var/datum/game_mode/nuclear/NM = SSticker.mode switch(off_station) if(0) - if(istype(NM) && !NM.nuke_team.syndies_escaped()) + if(istype(NM) && NM.syndies_didnt_escape) return CINEMATIC_ANNIHILATION else return CINEMATIC_NUKE_WIN diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 7047729294..2df573dc6d 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -71,9 +71,9 @@ target = null var/list/possible_targets = list() var/turf/here = get_turf(src) - for(var/V in get_antagonists(/datum/antagonist/nukeop)) + for(var/V in SSticker.mode.syndicates) var/datum/mind/M = V - if(ishuman(M.current) && M.current.stat != DEAD) + if(M.current && M.current.stat != DEAD) possible_targets |= M.current var/mob/living/closest_operative = get_closest_atom(/mob/living/carbon/human, possible_targets, here) if(closest_operative) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 0c25895ab3..46f96961c9 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -47,9 +47,9 @@ . = list() for(var/V in GLOB.data_core.locked) var/datum/data/record/R = V - var/datum/mind/M = R.fields["mindref"] - if(M) - . += M + var/mob/M = R.fields["reference"] + if(M && M.mind) + . += M.mind /datum/objective/proc/find_target() var/list/datum/mind/owners = get_owners() @@ -537,25 +537,25 @@ GLOBAL_LIST_EMPTY(possible_items_special) var/captured_amount = 0 var/area/centcom/holding/A = locate() in GLOB.sortedAreas for(var/mob/living/carbon/human/M in A)//Humans. - if(M.stat == DEAD)//Dead folks are worth less. + if(M.stat==2)//Dead folks are worth less. captured_amount+=0.5 continue captured_amount+=1 for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure. captured_amount+=0.1 for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research. - if(M.stat == DEAD) + if(M.stat==2) captured_amount+=0.5 continue captured_amount+=1 for(var/mob/living/carbon/alien/humanoid/M in A)//Aliens are worth twice as much as humans. if(istype(M, /mob/living/carbon/alien/humanoid/royal/queen))//Queens are worth three times as much as humans. - if(M.stat == DEAD) + if(M.stat==2) captured_amount+=1.5 else captured_amount+=3 continue - if(M.stat == DEAD) + if(M.stat==2) captured_amount+=1 continue captured_amount+=2 diff --git a/code/game/gamemodes/objective_team.dm b/code/game/gamemodes/objective_team.dm index 1483f356d2..7789a167c7 100644 --- a/code/game/gamemodes/objective_team.dm +++ b/code/game/gamemodes/objective_team.dm @@ -3,7 +3,6 @@ var/list/datum/mind/members = list() var/name = "team" var/member_name = "member" - var/list/objectives = list() //common objectives, these won't be added or removed automatically, subtypes handle this, this is here for bookkeeping purposes. /datum/objective_team/New(starting_members) . = ..() @@ -13,6 +12,7 @@ add_member(M) else add_member(starting_members) + members += starting_members /datum/objective_team/proc/is_solo() return members.len == 1 @@ -21,14 +21,4 @@ members |= new_member /datum/objective_team/proc/remove_member(datum/mind/member) - members -= member - -//Display members/victory/failure/objectives for the team -/datum/objective_team/proc/roundend_report() - var/list/report = list() - - report += "[name]:" - report += "The [member_name]s were:" - report += printplayerlist(members) - - return report.Join("
") \ No newline at end of file + members -= member \ No newline at end of file diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index cbfdb98c69..4fa9532b42 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -169,22 +169,62 @@ return FALSE return TRUE - -/datum/game_mode/revolution/set_round_result() - ..() +////////////////////////////////////////////////////////////////////// +//Announces the end of the game with all relavent information stated// +////////////////////////////////////////////////////////////////////// +/datum/game_mode/revolution/declare_completion() if(finished == 1) SSticker.mode_result = "win - heads killed" + to_chat(world, "The heads of staff were killed or exiled! The revolutionaries win!") + SSticker.news_report = REVS_WIN + else if(finished == 2) SSticker.mode_result = "loss - rev heads killed" - SSticker.news_report = REVS_LOSE + to_chat(world, "The heads of staff managed to stop the revolution!") -//TODO What should be displayed for revs in non-rev rounds -/datum/game_mode/revolution/special_report() - if(finished == 1) - return "The heads of staff were killed or exiled! The revolutionaries win!" - else if(finished == 2) - return "The heads of staff managed to stop the revolution!" + SSticker.news_report = REVS_LOSE + ..() + return TRUE + +/datum/game_mode/proc/auto_declare_completion_revolution() + var/list/targets = list() + var/list/datum/mind/headrevs = get_antagonists(/datum/antagonist/rev/head) + var/list/datum/mind/revs = get_antagonists(/datum/antagonist/rev,TRUE) + if(headrevs.len) + var/num_revs = 0 + var/num_survivors = 0 + for(var/mob/living/carbon/survivor in GLOB.alive_mob_list) + if(survivor.ckey) + num_survivors++ + if(survivor.mind) + if(is_revolutionary(survivor)) + num_revs++ + if(num_survivors) + to_chat(world, "[GLOB.TAB]Command's Approval Rating: [100 - round((num_revs/num_survivors)*100, 0.1)]%" ) + var/text = "
The head revolutionaries were:" + for(var/datum/mind/headrev in headrevs) + text += printplayer(headrev, 1) + text += "
" + to_chat(world, text) + + if(revs.len) + var/text = "
The revolutionaries were:" + for(var/datum/mind/rev in revs) + text += printplayer(rev, 1) + text += "
" + to_chat(world, text) + + if(revs.len || headrevs.len) + var/text = "
The heads of staff were:" + var/list/heads = SSjob.get_all_heads() + for(var/datum/mind/head in heads) + var/target = (head in targets) + if(target) + text += "Target" + text += printplayer(head, 1) + text += "
" + to_chat(world, text) /datum/game_mode/revolution/generate_report() return "Employee unrest has spiked in recent weeks, with several attempted mutinies on heads of staff. Some crew have been observed using flashbulb devices to blind their colleagues, \ diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 13b4234622..101a33e551 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -27,7 +27,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE) //items that shouldn't spawn on the floor because they would bug or act weird var/global/list/spawn_forbidden = list( /obj/item/tk_grab, /obj/item/implant, // not implanter, the actual thing that is inside you - /obj/item/assembly, /obj/item/device/onetankbomb, /obj/item/device/pda/ai, + /obj/item/assembly, /obj/item/device/onetankbomb, /obj/item/radio, /obj/item/device/pda/ai, /obj/item/smallDelivery, /obj/item/projectile, /obj/item/borg/sight, /obj/item/borg/stun, /obj/item/robot_module) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 42c96cb5c0..7c93a89a36 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -27,7 +27,6 @@ var/traitors_possible = 4 //hard limit on traitors if scaling is turned off var/num_modifier = 0 // Used for gamemodes, that are a child of traitor, that need more than the usual. var/antag_datum = ANTAG_DATUM_TRAITOR //what type of antag to create - var/traitors_required = TRUE //Will allow no traitors /datum/game_mode/traitor/pre_setup() @@ -56,7 +55,7 @@ log_game("[traitor.key] (ckey) has been selected as a [traitor_name]") antag_candidates.Remove(traitor) - return !traitors_required || pre_traitors.len > 0 + return pre_traitors.len > 0 /datum/game_mode/traitor/post_setup() @@ -86,10 +85,80 @@ new_antag.should_specialise = TRUE character.add_antag_datum(new_antag) + + +/datum/game_mode/traitor/declare_completion() + ..() + return//Traitors will be checked as part of check_extra_completion. Leaving this here as a reminder. + + +/datum/game_mode/proc/auto_declare_completion_traitor() + if(traitors.len) + var/text = "
The [traitor_name]s were:" + for(var/datum/mind/traitor in traitors) + var/traitorwin = TRUE + + text += printplayer(traitor) + + var/TC_uses = 0 + var/uplink_true = FALSE + var/purchases = "" + for(var/datum/component/uplink/H in GLOB.uplinks) + if(H && H.owner && H.owner == traitor.key) + TC_uses += H.spent_telecrystals + uplink_true = TRUE + purchases += H.purchase_log.generate_render(FALSE) + + var/objectives = "" + if(traitor.objectives.len)//If the traitor had no objectives, don't need to process this. + var/count = 1 + for(var/datum/objective/objective in traitor.objectives) + if(objective.check_completion()) + objectives += "
Objective #[count]: [objective.explanation_text] Success! [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" + SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "SUCCESS")) + else + objectives += "
Objective #[count]: [objective.explanation_text] Fail. [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" + SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "FAIL")) + if(!(istype(objective, /datum/objective/crew))) + traitorwin = FALSE + count++ + + if(uplink_true) + text += " (used [TC_uses] TC) [purchases]" + if(TC_uses==0 && traitorwin) + var/static/icon/badass = icon('icons/badass.dmi', "badass") + text += "[icon2html(badass, world)]" + + text += objectives + + var/special_role_text + if(traitor.special_role) + special_role_text = lowertext(traitor.special_role) + else + special_role_text = "antagonist" + + + if(traitorwin) + text += "
The [special_role_text] was successful!" + SSblackbox.record_feedback("tally", "traitor_success", 1, "SUCCESS") + else + text += "
The [special_role_text] has failed!" + SSblackbox.record_feedback("tally", "traitor_success", 1, "FAIL") + SEND_SOUND(traitor.current, 'sound/ambience/ambifailure.ogg') + + text += "
" + + text += "
The code phrases were: [GLOB.syndicate_code_phrase]
\ + The code responses were: [GLOB.syndicate_code_response]
" + to_chat(world, text) + + return TRUE + /datum/game_mode/traitor/generate_report() return "Although more specific threats are commonplace, you should always remain vigilant for Syndicate agents aboard your station. Syndicate communications have implied that many \ Nanotrasen employees are Syndicate agents with hidden memories that may be activated at a moment's notice, so it's possible that these agents might not even know their positions." + /datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) var/datum/atom_hud/antag/traitorhud = GLOB.huds[ANTAG_HUD_TRAITOR] traitorhud.join_hud(traitor_mind.current) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 21de0fc2f9..c59ad05cd5 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -213,7 +213,7 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' var/mob/living/carbon/human/target = null var/list/mob/living/carbon/human/possible = list() - var/obj/item/linked_item = null + var/obj/item/link = null var/cooldown_time = 30 //3s var/cooldown = 0 max_integrity = 10 @@ -237,10 +237,10 @@ cooldown = world.time +cooldown_time return - if(!linked_item) + if(!link) if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL) if (user.transferItemToLoc(I,src)) - linked_item = I + link = I to_chat(user, "You attach [I] to the doll.") update_targets() @@ -255,11 +255,11 @@ return if(user.zone_selected == "chest") - if(linked_item) + if(link) target = null - linked_item.forceMove(drop_location()) - to_chat(user, "You remove the [linked_item] from the doll.") - linked_item = null + link.loc = get_turf(src) + to_chat(user, "You remove the [link] from the doll.") + link = null update_targets() return @@ -291,10 +291,10 @@ /obj/item/voodoo/proc/update_targets() possible = list() - if(!linked_item) + if(!link) return for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(md5(H.dna.uni_identity) in linked_item.fingerprints) + if(md5(H.dna.uni_identity) in link.fingerprints) possible |= H /obj/item/voodoo/proc/GiveHint(mob/victim,force=0) diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 8b80b9ab69..6b6780e6be 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -64,6 +64,7 @@ to_chat(user, "\"Come now, do not capture your bretheren's soul.\"") return add_logs(user, M, "captured [M.name]'s soul", src) + transfer_soul("VICTIM", M, user) ///////////////////Options for using captured souls/////////////////////////////////////// @@ -141,8 +142,7 @@ if("VICTIM") var/mob/living/carbon/human/T = target - var/datum/antagonist/cult/C = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE) - if(C && C.cult_team.is_sacrifice_target(T.mind)) + if(is_sacrifice_target(T.mind)) if(iscultist(user)) to_chat(user, "\"This soul is mine. SACRIFICE THEM!\"") else diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 1d423802d1..5302ebd39b 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -47,7 +47,7 @@ for(var/datum/mind/wizard in wizards) if(isliving(wizard.current) && wizard.current.stat!=DEAD) return FALSE - + for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead() if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard)) return FALSE @@ -55,19 +55,68 @@ if(SSevents.wizardmode) //If summon events was active, turn it off SSevents.toggleWizardmode() SSevents.resetFrequency() - + return TRUE -/datum/game_mode/wizard/set_round_result() - ..() +/datum/game_mode/wizard/declare_completion() if(finished) SSticker.mode_result = "loss - wizard killed" + to_chat(world, "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!") + SSticker.news_report = WIZARD_KILLED + ..() + return 1 -/datum/game_mode/wizard/special_report() - if(finished) - return "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!" +/datum/game_mode/proc/auto_declare_completion_wizard() + if(wizards.len) + var/text = "
the wizards/witches were:" + + for(var/datum/mind/wizard in wizards) + + text += "
[wizard.key] was [wizard.name] (" + if(wizard.current) + if(wizard.current.stat == DEAD) + text += "died" + else + text += "survived" + if(wizard.current.real_name != wizard.name) + text += " as [wizard.current.real_name]" + else + text += "body destroyed" + text += ")" + + var/count = 1 + var/wizardwin = 1 + for(var/datum/objective/objective in wizard.objectives) + if(objective.check_completion()) + text += "
Objective #[count]: [objective.explanation_text] Success! [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" + SSblackbox.record_feedback("nested tally", "wizard_objective", 1, list("[objective.type]", "SUCCESS")) + else + text += "
Objective #[count]: [objective.explanation_text] Fail. [istype(objective, /datum/objective/crew) ? "(Optional)" : ""]" + SSblackbox.record_feedback("nested tally", "wizard_objective", 1, list("[objective.type]", "FAIL")) + if(!(istype(objective, /datum/objective/crew))) + wizardwin = 0 + count++ + + if(wizard.current && wizardwin) + text += "
The wizard was successful!" + SSblackbox.record_feedback("tally", "wizard_success", 1, "SUCCESS") + else + text += "
The wizard has failed!" + SSblackbox.record_feedback("tally", "wizard_success", 1, "FAIL") + if(wizard.spell_list.len>0) + text += "
[wizard.name] used the following spells: " + var/i = 1 + for(var/obj/effect/proc_holder/spell/S in wizard.spell_list) + text += "[S.name]" + if(wizard.spell_list.len > i) + text += ", " + i++ + text += "
" + + to_chat(world, text) + return 1 //returns whether the mob is a wizard (or apprentice) /proc/iswizard(mob/living/M) return M.mind && M.mind.has_antag_datum(/datum/antagonist/wizard,TRUE) diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 6156ee1d86..61d5627354 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -134,7 +134,7 @@ return if(storedpda) - storedpda.forceMove(drop_location()) + storedpda.loc = get_turf(src.loc) storedpda = null update_icon() else diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 14a4ed7f94..61a5d7271d 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -15,7 +15,7 @@ state_open = TRUE circuit = /obj/item/circuitboard/machine/sleeper var/efficiency = 1 - var/min_health = -25 + var/min_health = 30 var/list/available_chems var/controls_inside = FALSE var/list/possible_chems = list( @@ -42,7 +42,7 @@ I += M.rating efficiency = initial(efficiency)* E - min_health = initial(min_health) * E + min_health = initial(min_health) - (10*E) available_chems = list() for(var/i in 1 to I) available_chems |= possible_chems[i] diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index 2170636f43..01651e6e08 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -8,7 +8,7 @@ /obj/machinery/door/airlock/receive_signal(datum/signal/signal) - if(!signal) + if(!signal || signal.encryption) return if(id_tag != signal.data["tag"] || !signal.data["command"]) @@ -52,13 +52,15 @@ /obj/machinery/door/airlock/proc/send_status() if(radio_connection) - var/datum/signal/signal = new(list( - "tag" = id_tag, - "timestamp" = world.time, - "door_status" = density ? "closed" : "open", - "lock_status" = locked ? "locked" : "unlocked" - )) - radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.data["tag"] = id_tag + signal.data["timestamp"] = world.time + + signal.data["door_status"] = density?("closed"):("open") + signal.data["lock_status"] = locked?("locked"):("unlocked") + + radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = GLOB.RADIO_AIRLOCK) /obj/machinery/door/airlock/open(surpress_send) @@ -77,10 +79,10 @@ SSradio.remove_object(src, frequency) if(new_frequency) frequency = new_frequency - radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK) + radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_AIRLOCK) /obj/machinery/door/airlock/Destroy() - if(frequency) + if(frequency && SSradio) SSradio.remove_object(src,frequency) return ..() @@ -95,7 +97,7 @@ var/id_tag var/master_tag - var/frequency = FREQ_AIRLOCK_CONTROL + var/frequency = 1449 var/datum/radio_frequency/radio_connection @@ -113,34 +115,36 @@ icon_state = "airlock_sensor_off" /obj/machinery/airlock_sensor/attack_hand(mob/user) - var/datum/signal/signal = new(list( - "tag" = master_tag, - "command" = "cycle" - )) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.data["tag"] = master_tag + signal.data["command"] = "cycle" - radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK) + radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = GLOB.RADIO_AIRLOCK) flick("airlock_sensor_cycle", src) /obj/machinery/airlock_sensor/process() if(on) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.data["tag"] = id_tag + signal.data["timestamp"] = world.time + var/datum/gas_mixture/air_sample = return_air() + var/pressure = round(air_sample.return_pressure(),0.1) alert = (pressure < ONE_ATMOSPHERE*0.8) - var/datum/signal/signal = new(list( - "tag" = id_tag, - "timestamp" = world.time, - "pressure" = num2text(pressure) - )) + signal.data["pressure"] = num2text(pressure) - radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK) + radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = GLOB.RADIO_AIRLOCK) update_icon() /obj/machinery/airlock_sensor/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK) + radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_AIRLOCK) /obj/machinery/airlock_sensor/Initialize() . = ..() @@ -148,4 +152,4 @@ /obj/machinery/airlock_sensor/Destroy() SSradio.remove_object(src,frequency) - return ..() \ No newline at end of file + return ..() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b216d1752f..4cd7e7f0fe 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -53,7 +53,7 @@ radio = new(src) radio.keyslot = new radio_key - radio.subspace_transmission = TRUE + radio.subspace_transmission = 1 radio.canhear_range = 0 radio.recalculateChannels() diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 3b6e423d93..89a4e8b130 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -280,7 +280,7 @@ playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) usr.gib() - SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "hp", (emagged ? "emagged":"normal"))) + SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "hp", (emagged ? "emagged":"normal"))) blocked = FALSE return diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 94f5e63afb..f5115c7e2a 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -6,7 +6,7 @@ icon_keyboard = "atmos_key" var/list/priority_alarms = list() var/list/minor_alarms = list() - var/receive_frequency = FREQ_ATMOS_ALARMS + var/receive_frequency = 1437 var/datum/radio_frequency/radio_connection light_color = LIGHT_COLOR_CYAN @@ -57,10 +57,10 @@ /obj/machinery/computer/atmos_alert/proc/set_frequency(new_frequency) SSradio.remove_object(src, receive_frequency) receive_frequency = new_frequency - radio_connection = SSradio.add_object(src, receive_frequency, RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, receive_frequency, GLOB.RADIO_ATMOSIA) /obj/machinery/computer/atmos_alert/receive_signal(datum/signal/signal) - if(!signal) + if(!signal || signal.encryption) return var/zone = signal.data["zone"] diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 968ebbf5cb..2d1d771203 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -11,7 +11,7 @@ var/on = TRUE var/id_tag - var/frequency = FREQ_ATMOS_STORAGE + var/frequency = 1441 var/datum/radio_frequency/radio_connection /obj/machinery/air_sensor/update_icon() @@ -19,29 +19,31 @@ /obj/machinery/air_sensor/process_atmos() if(on) + var/datum/signal/signal = new var/datum/gas_mixture/air_sample = return_air() - var/datum/signal/signal = new(list( + signal.transmission_method = 1 //radio signal + signal.data = list( "sigtype" = "status", "id_tag" = id_tag, "timestamp" = world.time, "pressure" = air_sample.return_pressure(), "temperature" = air_sample.temperature, "gases" = list() - )) + ) var/total_moles = air_sample.total_moles() if(total_moles) for(var/gas_id in air_sample.gases) var/gas_name = air_sample.gases[gas_id][GAS_META][META_GAS_NAME] signal.data["gases"][gas_name] = air_sample.gases[gas_id][MOLES] / total_moles * 100 - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA) /obj/machinery/air_sensor/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA) /obj/machinery/air_sensor/Initialize() . = ..() @@ -64,7 +66,7 @@ icon_keyboard = "atmos_key" circuit = /obj/item/circuitboard/computer/atmos_control - var/frequency = FREQ_ATMOS_STORAGE + var/frequency = 1441 var/list/sensors = list( "n2_sensor" = "Nitrogen Tank", "o2_sensor" = "Oxygen Tank", @@ -115,7 +117,7 @@ return data /obj/machinery/computer/atmos_control/receive_signal(datum/signal/signal) - if(!signal) + if(!signal || signal.encryption) return var/id_tag = signal.data["id_tag"] @@ -127,7 +129,7 @@ /obj/machinery/computer/atmos_control/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA) ///////////////////////////////////////////////////////////// // LARGE TANK CONTROL @@ -136,7 +138,7 @@ /obj/machinery/computer/atmos_control/tank var/input_tag var/output_tag - frequency = FREQ_ATMOS_STORAGE + frequency = 1441 circuit = /obj/item/circuitboard/computer/atmos_control/tank var/list/input_info @@ -145,7 +147,7 @@ // This hacky madness is the evidence of the fact that a lot of machines were never meant to be constructable, im so sorry you had to see this /obj/machinery/computer/atmos_control/tank/proc/reconnect(mob/user) var/list/IO = list() - var/datum/radio_frequency/freq = SSradio.return_frequency(FREQ_ATMOS_STORAGE) + var/datum/radio_frequency/freq = SSradio.return_frequency(1441) var/list/devices = freq.devices["_default"] for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in devices) var/list/text = splittext(U.id_tag, "_") @@ -192,7 +194,10 @@ /obj/machinery/computer/atmos_control/tank/ui_act(action, params) if(..() || !radio_connection) return - var/datum/signal/signal = new(list("sigtype" = "command")) + var/datum/signal/signal = new + signal.transmission_method = 1 + signal.source = src + signal.data = list("sigtype" = "command") switch(action) if("reconnect") reconnect(usr) @@ -209,10 +214,10 @@ target = Clamp(target, 0, 50 * ONE_ATMOSPHERE) signal.data += list("tag" = output_tag, "set_internal_pressure" = target) . = TRUE - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA) /obj/machinery/computer/atmos_control/tank/receive_signal(datum/signal/signal) - if(!signal) + if(!signal || signal.encryption) return var/id_tag = signal.data["tag"] @@ -222,4 +227,4 @@ else if(output_tag == id_tag) output_info = signal.data else - ..(signal) + ..(signal) \ No newline at end of file diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index f77de02d1a..6223011736 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -28,6 +28,7 @@ var/const/STATE_TOGGLE_EMERGENCY = 10 var/const/STATE_PURCHASE = 11 + var/status_display_freq = "1435" var/stat_msg1 var/stat_msg2 @@ -227,7 +228,7 @@ log_game("[key_name(usr)] answered [currmsg.title] comm message. Answer : [currmsg.answered]") if(currmsg) currmsg.answer_callback.Invoke() - + state = STATE_VIEWMESSAGE if("status") state = STATE_STATUSDISPLAY @@ -463,9 +464,8 @@ if (authenticated==2) dat += "

Captain Functions" dat += "
\[ Make a Captain's Announcement \]" - var/cross_servers_count = length(CONFIG_GET(keyed_string_list/cross_server)) - if(cross_servers_count) - dat += "
\[ Send a message to [cross_servers_count == 1 ? "an " : ""]allied station[cross_servers_count > 1 ? "s" : ""] \]" + if(CONFIG_GET(string/cross_server_address)) + dat += "
\[ Send a message to an allied station \]" if(SSmapping.config.allow_custom_shuttles) dat += "
\[ Purchase Shuttle \]" dat += "
\[ Change Alert Level \]" @@ -693,12 +693,16 @@ /obj/machinery/computer/communications/proc/post_status(command, data1, data2) - var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) + var/datum/radio_frequency/frequency = SSradio.return_frequency(1435) if(!frequency) return - var/datum/signal/status_signal = new(list("command" = command)) + var/datum/signal/status_signal = new + status_signal.source = src + status_signal.transmission_method = 1 + status_signal.data["command"] = command + switch(command) if("message") status_signal.data["msg1"] = data1 diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 2f446948da..a3ec6ba6ec 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -1,4 +1,3 @@ - // Allows you to monitor messages that passes the server. diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index e2b6f9152a..959253036b 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/uplinker/proc/ejectuplink() if(uplinkholder) - uplinkholder.forceMove(drop_location()) + uplinkholder.loc = get_turf(src.loc) uplinkholder = null update_icon() @@ -154,8 +154,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population. ..() - var/list/nukeops = get_antagonists(/datum/antagonist/nukeop) - var/danger = GLOB.joined_player_list.len - nukeops.len + var/danger = GLOB.joined_player_list.len - SSticker.mode.syndicates.len danger = Ceiling(danger, 10) scaleTC(danger) @@ -224,4 +223,4 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E src.updateUsrDialog() return -#undef NUKESCALINGMODIFIER +#undef NUKESCALINGMODIFIER \ No newline at end of file diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index fda8964609..7261c44fc5 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -161,8 +161,12 @@ var/list/areaindex = list() if(regime_set == "Teleporter") for(var/obj/item/device/radio/beacon/R in GLOB.teleportbeacons) - if(is_eligible(R)) - L[avoid_assoc_duplicate_keys(R.loc.loc.name, areaindex)] = R + var/turf/T = get_turf(R) + if(!T) + continue + if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX) + continue + L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R for(var/obj/item/implant/tracking/I in GLOB.tracked_implants) if(!I.imp_in || !ismob(I.loc)) @@ -172,8 +176,12 @@ if(M.stat == DEAD) if(M.timeofdeath + 6000 < world.time) continue - if(is_eligible(I)) - L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I + var/turf/T = get_turf(M) + if(!T) + continue + if(T.z == ZLEVEL_CENTCOM) + continue + L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L target = L[desc] @@ -184,8 +192,12 @@ to_chat(user, "No connected stations located.") return for(var/obj/machinery/teleport/station/R in S) - if(is_eligible(R)) - L[avoid_assoc_duplicate_keys(R.loc.loc.name, areaindex)] = R + var/turf/T = get_turf(R) + if(!T || !R.teleporter_hub || !R.teleporter_console) + continue + if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX) + continue + L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L target = L[desc] if(target) @@ -197,15 +209,4 @@ trg.teleporter_hub.update_icon() if(trg.teleporter_console) trg.teleporter_console.stat &= ~NOPOWER - trg.teleporter_console.update_icon() - -/obj/machinery/computer/teleporter/proc/is_eligible(atom/movable/AM) - var/turf/T = get_turf(AM) - if(!T) - return FALSE - if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX) - return FALSE - var/area/A = get_area(T) - if(!A || A.noteleport) - return FALSE - return TRUE + trg.teleporter_console.update_icon() \ No newline at end of file diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 97830393bd..99cbded13a 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -157,15 +157,15 @@ if(istype(P, /obj/item/crowbar)) playsound(src.loc, P.usesound, 50, 1) state = 2 - circuit.forceMove(drop_location()) + circuit.loc = src.loc components.Remove(circuit) circuit = null if(components.len == 0) to_chat(user, "You remove the circuit board.") else to_chat(user, "You remove the circuit board and other components.") - for(var/atom/movable/AM in components) - AM.forceMove(drop_location()) + for(var/atom/movable/A in components) + A.loc = src.loc desc = initial(desc) req_components = null components = null @@ -186,9 +186,9 @@ qdel(O) new_machine.component_parts = list() for(var/obj/O in src) - O.moveToNullspace() + O.loc = null new_machine.component_parts += O - circuit.moveToNullspace() + circuit.loc = null new_machine.RefreshParts() qdel(src) return @@ -257,5 +257,4 @@ for(var/X in components) var/obj/item/I = X I.forceMove(loc) - ..() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 9be9d8db6b..d30554d258 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -209,27 +209,23 @@ /obj/machinery/door/airlock/narsie_act() var/turf/T = get_turf(src) var/runed = prob(20) - var/obj/machinery/door/airlock/cult/A if(glass) if(runed) - A = new/obj/machinery/door/airlock/cult/glass(T) + new/obj/machinery/door/airlock/cult/glass(T) else - A = new/obj/machinery/door/airlock/cult/unruned/glass(T) + new/obj/machinery/door/airlock/cult/unruned/glass(T) else if(runed) - A = new/obj/machinery/door/airlock/cult(T) + new/obj/machinery/door/airlock/cult(T) else - A = new/obj/machinery/door/airlock/cult/unruned(T) - A.name = name + new/obj/machinery/door/airlock/cult/unruned(T) qdel(src) /obj/machinery/door/airlock/ratvar_act() //Airlocks become pinion airlocks that only allow servants - var/obj/machinery/door/airlock/clockwork/A if(glass) - A = new/obj/machinery/door/airlock/clockwork/brass(get_turf(src)) + new/obj/machinery/door/airlock/clockwork/brass(get_turf(src)) else - A = new/obj/machinery/door/airlock/clockwork(get_turf(src)) - A.name = name + new/obj/machinery/door/airlock/clockwork(get_turf(src)) qdel(src) /obj/machinery/door/airlock/Destroy() @@ -1040,7 +1036,7 @@ panel_open = TRUE update_icon(AIRLOCK_OPENING) visible_message("[src]'s panel is blown off in a spray of deadly shrapnel!") - charge.forceMove(drop_location()) + charge.loc = get_turf(src) charge.ex_act(EXPLODE_DEVASTATE) detonated = 1 charge = null @@ -1344,7 +1340,7 @@ else ae = electronics electronics = null - ae.forceMove(drop_location()) + ae.loc = src.loc qdel(src) /obj/machinery/door/airlock/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm index 1649082138..5630b3ffb0 100644 --- a/code/game/machinery/doors/alarmlock.dm +++ b/code/game/machinery/doors/alarmlock.dm @@ -7,7 +7,7 @@ glass = TRUE var/datum/radio_frequency/air_connection - var/air_frequency = FREQ_ATMOS_ALARMS + var/air_frequency = 1437 autoclose = FALSE /obj/machinery/door/airlock/alarmlock/New() @@ -22,7 +22,7 @@ /obj/machinery/door/airlock/alarmlock/Initialize() . = ..() SSradio.remove_object(src, air_frequency) - air_connection = SSradio.add_object(src, air_frequency, RADIO_TO_AIRALARM) + air_connection = SSradio.add_object(src, air_frequency, GLOB.RADIO_TO_AIRALARM) open() /obj/machinery/door/airlock/alarmlock/receive_signal(datum/signal/signal) @@ -41,4 +41,4 @@ close() if("minor", "clear") autoclose = FALSE - open() \ No newline at end of file + open() diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 13cd90210c..4c0d4a1804 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -112,8 +112,8 @@ return 0 if(!forced) - Radio.set_frequency(FREQ_SECURITY) - Radio.talk_into(src, "Timer has expired. Releasing prisoner.", FREQ_SECURITY) + Radio.set_frequency(GLOB.SEC_FREQ) + Radio.talk_into(src, "Timer has expired. Releasing prisoner.", GLOB.SEC_FREQ, get_default_language()) timing = FALSE activation_time = null diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 0b3a51466d..30ae436289 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -96,7 +96,7 @@ /obj/machinery/door/Move() var/turf/T = loc - . = ..() + ..() move_update_air(T) /obj/machinery/door/CanPass(atom/movable/mover, turf/target) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index bd98e687b4..fd66892048 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -1,66 +1,66 @@ -/obj/machinery/door/poddoor - name = "blast door" - desc = "A heavy duty blast door that opens mechanically." - icon = 'icons/obj/doors/blastdoor.dmi' - icon_state = "closed" - var/id = 1 +/obj/machinery/door/poddoor + name = "blast door" + desc = "A heavy duty blast door that opens mechanically." + icon = 'icons/obj/doors/blastdoor.dmi' + icon_state = "closed" + var/id = 1 sub_door = TRUE - explosion_block = 3 + explosion_block = 3 heat_proof = TRUE safe = FALSE - max_integrity = 600 - armor = list(melee = 50, bullet = 100, laser = 100, energy = 100, bomb = 50, bio = 100, rad = 100, fire = 100, acid = 70) - resistance_flags = FIRE_PROOF - damage_deflection = 70 - -/obj/machinery/door/poddoor/preopen - icon_state = "open" + max_integrity = 600 + armor = list(melee = 50, bullet = 100, laser = 100, energy = 100, bomb = 50, bio = 100, rad = 100, fire = 100, acid = 70) + resistance_flags = FIRE_PROOF + damage_deflection = 70 + +/obj/machinery/door/poddoor/preopen + icon_state = "open" density = FALSE - opacity = 0 - -/obj/machinery/door/poddoor/ert - desc = "A heavy duty blast door that only opens for dire emergencies." - -//special poddoors that open when emergency shuttle docks at centcom -/obj/machinery/door/poddoor/shuttledock - var/checkdir = 4 //door won't open if turf in this dir is `turftype` - var/turftype = /turf/open/space - -/obj/machinery/door/poddoor/shuttledock/proc/check() - var/turf/T = get_step(src, checkdir) - if(!istype(T, turftype)) - INVOKE_ASYNC(src, .proc/open) - else - INVOKE_ASYNC(src, .proc/close) - + opacity = 0 + +/obj/machinery/door/poddoor/ert + desc = "A heavy duty blast door that only opens for dire emergencies." + +//special poddoors that open when emergency shuttle docks at centcom +/obj/machinery/door/poddoor/shuttledock + var/checkdir = 4 //door won't open if turf in this dir is `turftype` + var/turftype = /turf/open/space + +/obj/machinery/door/poddoor/shuttledock/proc/check() + var/turf/T = get_step(src, checkdir) + if(!istype(T, turftype)) + INVOKE_ASYNC(src, .proc/open) + else + INVOKE_ASYNC(src, .proc/close) + /obj/machinery/door/poddoor/CollidedWith(atom/movable/AM) - if(density) - return 0 - else - return ..() - -//"BLAST" doors are obviously stronger than regular doors when it comes to BLASTS. -/obj/machinery/door/poddoor/ex_act(severity, target) - if(severity == 3) - return - ..() - -/obj/machinery/door/poddoor/do_animate(animation) - switch(animation) - if("opening") - flick("opening", src) - if("closing") - flick("closing", src) - -/obj/machinery/door/poddoor/update_icon() - if(density) - icon_state = "closed" - else - icon_state = "open" - -/obj/machinery/door/poddoor/try_to_activate_door(mob/user) - return - -/obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user) - if(stat & NOPOWER) - open(1) + if(density) + return 0 + else + return ..() + +//"BLAST" doors are obviously stronger than regular doors when it comes to BLASTS. +/obj/machinery/door/poddoor/ex_act(severity, target) + if(severity == 3) + return + ..() + +/obj/machinery/door/poddoor/do_animate(animation) + switch(animation) + if("opening") + flick("opening", src) + if("closing") + flick("closing", src) + +/obj/machinery/door/poddoor/update_icon() + if(density) + icon_state = "closed" + else + icon_state = "open" + +/obj/machinery/door/poddoor/try_to_activate_door(mob/user) + return + +/obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user) + if(stat & NOPOWER) + open(1) diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 77267a49a4..0cd33b1925 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -26,4 +26,4 @@ /obj/machinery/door/poddoor/shutters/close(ignorepower = 0) ..() - layer = CLOSED_DOOR_LAYER \ No newline at end of file + layer = CLOSED_DOOR_LAYER diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm index 2960335813..4b7ec4b3dd 100644 --- a/code/game/machinery/doors/unpowered.dm +++ b/code/game/machinery/doors/unpowered.dm @@ -1,25 +1,25 @@ -/obj/machinery/door/unpowered - +/obj/machinery/door/unpowered + /obj/machinery/door/unpowered/CollidedWith(atom/movable/AM) - if(src.locked) - return - ..() - return - - -/obj/machinery/door/unpowered/attackby(obj/item/I, mob/user, params) - if(locked) - return - else - return ..() - -/obj/machinery/door/unpowered/emag_act() - return - -/obj/machinery/door/unpowered/shuttle - icon = 'icons/turf/shuttle.dmi' - name = "door" - icon_state = "door1" - opacity = 1 + if(src.locked) + return + ..() + return + + +/obj/machinery/door/unpowered/attackby(obj/item/I, mob/user, params) + if(locked) + return + else + return ..() + +/obj/machinery/door/unpowered/emag_act() + return + +/obj/machinery/door/unpowered/shuttle + icon = 'icons/turf/shuttle.dmi' + name = "door" + icon_state = "door1" + opacity = 1 density = TRUE explosion_block = 1 \ No newline at end of file diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index bd1a553863..2313afec3b 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -192,8 +192,7 @@ add_atom_colour("#7D1919", FIXED_COLOUR_PRIORITY) /obj/machinery/door/window/ratvar_act() - var/obj/machinery/door/window/clockwork/C = new(loc, dir) - C.name = name + new/obj/machinery/door/window/clockwork(src.loc, dir) qdel(src) /obj/machinery/door/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -276,7 +275,7 @@ else ae = electronics electronics = null - ae.forceMove(drop_location()) + ae.loc = src.loc qdel(src) return @@ -496,4 +495,4 @@ /obj/machinery/door/window/brigdoor/security/holding/southright dir = SOUTH icon_state = "rightsecure" - base_state = "rightsecure" + base_state = "rightsecure" \ No newline at end of file diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index cdfb72a6ef..c13dfc9b88 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -19,10 +19,6 @@ GLOBAL_LIST_EMPTY(doppler_arrays) GLOB.doppler_arrays -= src return ..() -/obj/machinery/doppler_array/examine(mob/user) - ..() - to_chat(user, "Its dish is facing to the [dir2text(dir)].") - /obj/machinery/doppler_array/process() return PROCESS_KILL diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm index 35b700801d..f34191370d 100644 --- a/code/game/machinery/embedded_controller/airlock_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_controller.dm @@ -17,7 +17,7 @@ var/target_state = AIRLOCK_STATE_CLOSED var/sensor_pressure = null -/datum/computer/file/embedded_program/airlock_controller/receive_signal(datum/signal/signal) +/datum/computer/file/embedded_program/airlock_controller/receive_signal(datum/signal/signal, receive_method, receive_param) var/receive_tag = signal.data["tag"] if(!receive_tag) return @@ -68,17 +68,19 @@ state = AIRLOCK_STATE_CLOSED process_again = 1 else - post_signal(new /datum/signal(list( - "tag" = interior_door_tag, - "command" = "secure_close" - ))) + var/datum/signal/signal = new + signal.data["tag"] = interior_door_tag + signal.data["command"] = "secure_close" + post_signal(signal) else if(memory["pump_status"] != "off") - post_signal(new /datum/signal(list( + var/datum/signal/signal = new + signal.data = list( "tag" = airpump_tag, "power" = 0, - "sigtype" = "command" - ))) + "sigtype"="command" + ) + post_signal(signal) if(AIRLOCK_STATE_PRESSURIZE) if(target_state < state) @@ -87,15 +89,16 @@ state = AIRLOCK_STATE_INOPEN process_again = 1 else - post_signal(new /datum/signal(list( - "tag" = interior_door_tag, - "command" = "secure_open" - ))) + var/datum/signal/signal = new + signal.data["tag"] = interior_door_tag + signal.data["command"] = "secure_open" + post_signal(signal) else - var/datum/signal/signal = new(list( + var/datum/signal/signal = new + signal.data = list( "tag" = airpump_tag, - "sigtype" = "command" - )) + "sigtype"="command" + ) if(memory["pump_status"] == "siphon") signal.data["stabalize"] = 1 else if(memory["pump_status"] != "release") @@ -111,27 +114,29 @@ state = AIRLOCK_STATE_DEPRESSURIZE process_again = 1 else - post_signal(new /datum/signal(list( - "tag" = interior_door_tag, - "command" = "secure_close" - ))) + var/datum/signal/signal = new + signal.data["tag"] = interior_door_tag + signal.data["command"] = "secure_close" + post_signal(signal) else if(target_state < state) if(memory["exterior_status"] == "closed") state = AIRLOCK_STATE_PRESSURIZE process_again = 1 else - post_signal(new /datum/signal(list( - "tag" = exterior_door_tag, - "command" = "secure_close" - ))) + var/datum/signal/signal = new + signal.data["tag"] = exterior_door_tag + signal.data["command"] = "secure_close" + post_signal(signal) else if(memory["pump_status"] != "off") - post_signal(new /datum/signal(list( + var/datum/signal/signal = new + signal.data = list( "tag" = airpump_tag, "power" = 0, - "sigtype" = "command" - ))) + "sigtype"="command" + ) + post_signal(signal) if(AIRLOCK_STATE_DEPRESSURIZE) var/target_pressure = ONE_ATMOSPHERE*0.05 @@ -143,10 +148,10 @@ if(memory["exterior_status"] == "open") state = AIRLOCK_STATE_OUTOPEN else - post_signal(new /datum/signal(list( - "tag" = exterior_door_tag, - "command" = "secure_open" - ))) + var/datum/signal/signal = new + signal.data["tag"] = exterior_door_tag + signal.data["command"] = "secure_open" + post_signal(signal) else if(target_state < state) state = AIRLOCK_STATE_CLOSED process_again = 1 @@ -154,10 +159,12 @@ state = AIRLOCK_STATE_CLOSED process_again = 1 else - var/datum/signal/signal = new(list( + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.data = list( "tag" = airpump_tag, - "sigtype" = "command" - )) + "sigtype"="command" + ) if(memory["pump_status"] == "release") signal.data["purge"] = 1 else if(memory["pump_status"] != "siphon") @@ -174,17 +181,19 @@ state = AIRLOCK_STATE_CLOSED process_again = 1 else - post_signal(new /datum/signal(list( - "tag" = exterior_door_tag, - "command" = "secure_close" - ))) + var/datum/signal/signal = new + signal.data["tag"] = exterior_door_tag + signal.data["command"] = "secure_close" + post_signal(signal) else if(memory["pump_status"] != "off") - post_signal(new /datum/signal(list( + var/datum/signal/signal = new + signal.data = list( "tag" = airpump_tag, "power" = 0, - "sigtype" = "command" - ))) + "sigtype"="command" + ) + post_signal(signal) memory["sensor_pressure"] = sensor_pressure memory["processing"] = state != target_state @@ -200,7 +209,7 @@ name = "airlock console" density = FALSE - frequency = FREQ_AIRLOCK_CONTROL + frequency = 1449 power_channel = ENVIRON // Setup parameters only @@ -284,4 +293,4 @@
[state_options]"} - return output \ No newline at end of file + return output diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 2ead1d99d7..16691160f2 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -11,7 +11,7 @@ /datum/computer/file/embedded_program/proc/receive_user_command(command) -/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal) +/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal, receive_method, receive_param) return null /datum/computer/file/embedded_program/process() @@ -43,9 +43,13 @@ /obj/machinery/embedded_controller/proc/post_signal(datum/signal/signal, comm_line) return 0 -/obj/machinery/embedded_controller/receive_signal(datum/signal/signal) - if(istype(signal) && program) - program.receive_signal(signal) +/obj/machinery/embedded_controller/receive_signal(datum/signal/signal, receive_method, receive_param) + if(!signal || signal.encryption) + return + + if(program) + program.receive_signal(signal, receive_method, receive_param) + //spawn(5) program.process() //no, program.process sends some signals and machines respond and we here again and we lag -rastaf0 /obj/machinery/embedded_controller/Topic(href, href_list) if(..()) diff --git a/code/game/machinery/embedded_controller/simple_vent_controller.dm b/code/game/machinery/embedded_controller/simple_vent_controller.dm index 2a5faef0e1..af945c7ccb 100644 --- a/code/game/machinery/embedded_controller/simple_vent_controller.dm +++ b/code/game/machinery/embedded_controller/simple_vent_controller.dm @@ -5,27 +5,34 @@ /datum/computer/file/embedded_program/simple_vent_controller/receive_user_command(command) switch(command) if("vent_inactive") - post_signal(new /datum/signal(list( + var/datum/signal/signal = new + signal.data = list( "tag" = airpump_tag, - "sigtype" = "command", - "power" = 0 - ))) + "sigtype"="command" + ) + signal.data["power"] = 0 + post_signal(signal) if("vent_pump") - post_signal(new /datum/signal(list( + var/datum/signal/signal = new + signal.data = list( "tag" = airpump_tag, - "sigtype" = "command", - "stabalize" = 1, - "power" = 1 - ))) + "sigtype"="command" + ) + signal.data["stabalize"] = 1 + signal.data["power"] = 1 + post_signal(signal) if("vent_clear") - post_signal(new /datum/signal(list( + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.data = list( "tag" = airpump_tag, - "sigtype" = "command", - "purge" = 1, - "power" = 1 - ))) + "sigtype"="command" + ) + signal.data["purge"] = 1 + signal.data["power"] = 1 + post_signal(signal) /datum/computer/file/embedded_program/simple_vent_controller/process() return 0 @@ -38,7 +45,7 @@ name = "vent controller" density = FALSE - frequency = FREQ_ATMOS_CONTROL + frequency = 1229 power_channel = ENVIRON // Setup parameters only diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 10a552564b..d6d8c93ed1 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -75,7 +75,7 @@ Possible to do for anyone motivated enough: replay_stop() if(record_mode) record_stop() - + QDEL_NULL(disk) holopads -= src @@ -256,12 +256,12 @@ Possible to do for anyone motivated enough: temp = "" if(outgoing_call) outgoing_call.Disconnect() - + else if(href_list["disk_eject"]) if(disk && !replay_mode) disk.forceMove(drop_location()) disk = null - + else if(href_list["replay_stop"]) replay_stop() else if(href_list["replay_start"]) @@ -424,7 +424,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(masters[user]) var/obj/effect/overlay/holo_pad_hologram/H = masters[user] step_to(H, new_turf) - H.forceMove(new_turf) + H.loc = new_turf var/area/holo_area = get_area(src) var/area/eye_area = new_turf.loc @@ -505,7 +505,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ current_delay += entry[2] var/time_delta = world.time - record_start - current_delay - + if(time_delta >= 1) disk.record.entries += list(list(HOLORECORD_DELAY,time_delta)) disk.record.entries += list(list(HOLORECORD_SAY,message)) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 7aa3859cdf..198d368d59 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -213,4 +213,4 @@ to_chat(user, "[attached ? attached : "No one"] is attached.") #undef IV_TAKING -#undef IV_INJECTING \ No newline at end of file +#undef IV_INJECTING diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 8263795c60..aa3bf465f2 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -15,7 +15,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 50 - var/freq = FREQ_MAGNETS // radio frequency + var/freq = 1449 // radio frequency var/electricity_level = 1 // intensity of the magnetic pull var/magnetic_field = 1 // the range of magnetic attraction var/code = 0 // frequency code, they should be different unless you have a group of magnets working together or something @@ -33,7 +33,7 @@ var/turf/T = loc hide(T.intact) center = T - SSradio.add_object(src, freq, RADIO_MAGNETS) + SSradio.add_object(src, freq, GLOB.RADIO_MAGNETS) return INITIALIZE_HINT_LATELOAD /obj/machinery/magnetic_module/LateInitialize() @@ -198,7 +198,7 @@ anchored = TRUE use_power = IDLE_POWER_USE idle_power_usage = 45 - var/frequency = FREQ_MAGNETS + var/frequency = 1449 var/code = 0 var/list/magnets = list() var/title = "Magnetic Control Console" @@ -224,7 +224,7 @@ if(path) // check for default path filter_path() // renders rpath - radio_connection = SSradio.add_object(src, frequency, RADIO_MAGNETS) + radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_MAGNETS) /obj/machinery/magnetic_controller/Destroy() SSradio.remove_object(src, frequency) @@ -278,7 +278,11 @@ if(href_list["radio-op"]) // Prepare signal beforehand, because this is a radio operation - var/datum/signal/signal = new(list("code" = code)) + var/datum/signal/signal = new + signal.transmission_method = 1 // radio transmission + signal.source = src + signal.frequency = frequency + signal.data["code"] = code // Apply any necessary commands switch(href_list["radio-op"]) @@ -298,7 +302,7 @@ // Broadcast the signal - radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) + radio_connection.post_signal(src, signal, filter = GLOB.RADIO_MAGNETS) spawn(1) updateUsrDialog() // pretty sure this increases responsiveness @@ -341,7 +345,11 @@ looping = 1 // Prepare the radio signal - var/datum/signal/signal = new(list("code" = code)) + var/datum/signal/signal = new + signal.transmission_method = 1 // radio transmission + signal.source = src + signal.frequency = frequency + signal.data["code"] = code if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list! pathpos = 1 @@ -362,7 +370,7 @@ // Broadcast the signal spawn() - radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) + radio_connection.post_signal(src, signal, filter = GLOB.RADIO_MAGNETS) if(speed == 10) sleep(1) @@ -385,4 +393,4 @@ if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore rpath += copytext(path, i, i+1) // else, add to list - // there doesn't HAVE to be separators but it makes paths syntatically visible + // there doesn't HAVE to be separators but it makes paths syntatically visible \ No newline at end of file diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index fe2926f150..e62d25e5fa 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -15,7 +15,7 @@ var/open = FALSE // true if cover is open var/locked = TRUE // true if controls are locked - var/freq = FREQ_NAV_BEACON + var/freq = 1445 // radio frequency var/location = "" // location response text var/list/codes // assoc. list of transponder codes var/codes_txt = "" // codes as set on map: "tag1;tag2" or "tag1=value;tag2=value" @@ -205,4 +205,4 @@ Transponder Codes:
    "} codes[newkey] = newval - updateDialog() \ No newline at end of file + updateDialog() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 541c931593..18acd9ece7 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -22,7 +22,6 @@ GLOBAL_LIST_EMPTY(allCasters) var/creationTime var/authorCensor var/bodyCensor - var/photo_file /datum/newscaster/feed_message/proc/returnAuthor(censor) if(censor == -1) @@ -98,7 +97,6 @@ GLOBAL_LIST_EMPTY(allCasters) var/scannedUser var/isAdminMsg var/icon/img - var/photo_file /datum/newscaster/feed_network var/list/datum/newscaster/feed_channel/network_channels = list() @@ -128,7 +126,6 @@ GLOBAL_LIST_EMPTY(allCasters) if(photo) newMsg.img = photo.img newMsg.caption = photo.scribble - newMsg.photo_file = save_photo(photo.img) for(var/datum/newscaster/feed_channel/FC in network_channels) if(FC.channel_name == channel_name) FC.messages += newMsg @@ -146,7 +143,6 @@ GLOBAL_LIST_EMPTY(allCasters) wanted_issue.isAdminMsg = adminMsg if(photo) wanted_issue.img = photo.img - wanted_issue.photo_file = save_photo(photo.img) if(newMessage) for(var/obj/machinery/newscaster/N in GLOB.allCasters) N.newsAlert() @@ -161,12 +157,7 @@ GLOBAL_LIST_EMPTY(allCasters) for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters) NEWSCASTER.update_icon() -/datum/newscaster/feed_network/proc/save_photo(icon/photo) - var/photo_file = copytext(md5("\icon[photo]"), 1, 6) - if(!fexists("[GLOB.log_directory]/photos/[photo_file].png")) - var/icon/p = icon(photo, frame = 1) - fcopy(p, "[GLOB.log_directory]/photos/[photo_file].png") - return photo_file + /obj/item/wallframe/newscaster name = "newscaster frame" @@ -789,7 +780,7 @@ GLOBAL_LIST_EMPTY(allCasters) /obj/machinery/newscaster/proc/AttachPhoto(mob/user) if(photo) if(!photo.sillynewscastervar) - photo.forceMove(drop_location()) + photo.loc = loc if(!issilicon(user)) user.put_in_inactive_hand(photo) else @@ -865,7 +856,7 @@ GLOBAL_LIST_EMPTY(allCasters) NEWSPAPER.wantedBody = GLOB.news_network.wanted_issue.body if(GLOB.news_network.wanted_issue.img) NEWSPAPER.wantedPhoto = GLOB.news_network.wanted_issue.img - NEWSPAPER.forceMove(drop_location()) + NEWSPAPER.loc = get_turf(src) NEWSPAPER.creationTime = GLOB.news_network.lastAction paper_remaining-- diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 6a04ca0886..bf3c94646c 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -15,17 +15,17 @@ var/teleporting = 0 //if it's in the process of teleporting var/power_efficiency = 1 var/obj/machinery/quantumpad/linked_pad - + //mapping var/static/list/mapped_quantum_pads = list() var/map_pad_id = "" as text //what's my name var/map_pad_link_id = "" as text //who's my friend - + /obj/machinery/quantumpad/Initialize() . = ..() if(map_pad_id) mapped_quantum_pads[map_pad_id] = src - + /obj/machinery/quantumpad/Destroy() mapped_quantum_pads -= map_pad_id return ..() diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 827093d759..f0e6eb2df0 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -315,13 +315,13 @@ GLOBAL_LIST_EMPTY(allConsoles) var/radio_freq switch(text2num(href_list["emergency"])) if(1) //Security - radio_freq = FREQ_SECURITY + radio_freq = GLOB.SEC_FREQ emergency = "Security" if(2) //Engineering - radio_freq = FREQ_ENGINEERING + radio_freq = GLOB.ENG_FREQ emergency = "Engineering" if(3) //Medical - radio_freq = FREQ_MEDICAL + radio_freq = GLOB.MED_FREQ emergency = "Medical" if(radio_freq) Radio.set_frequency(radio_freq) @@ -352,17 +352,17 @@ GLOBAL_LIST_EMPTY(allConsoles) var/radio_freq = 0 switch(href_list["department"]) if("bridge") - radio_freq = FREQ_COMMAND + radio_freq = GLOB.COMM_FREQ if("medbay") - radio_freq = FREQ_MEDICAL + radio_freq = GLOB.MED_FREQ if("science") - radio_freq = FREQ_SCIENCE + radio_freq = GLOB.SCI_FREQ if("engineering") - radio_freq = FREQ_ENGINEERING + radio_freq = GLOB.ENG_FREQ if("security") - radio_freq = FREQ_SECURITY + radio_freq = GLOB.SEC_FREQ if("cargobay" || "mining") - radio_freq = FREQ_SUPPLY + radio_freq = GLOB.SUPP_FREQ Radio.set_frequency(radio_freq) var/authentic if(msgVerified || msgStamped) diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index c01c72d7a8..606f64c7f3 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -137,7 +137,7 @@ Please wait until completion...
    spawn (build_time) if (!isnull(src.being_built)) - src.being_built.forceMove(drop_location()) + src.being_built.loc = get_turf(src) src.being_built = null src.use_power = IDLE_POWER_USE operating = FALSE diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 900413a2b5..9356314973 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -22,7 +22,7 @@ /obj/structure/emergency_shield/Move() var/turf/T = loc - . = ..() + ..() move_update_air(T) /obj/structure/emergency_shield/emp_act(severity) @@ -180,25 +180,19 @@ anchored = FALSE else if(W.GetID()) - if(allowed(user) && !emagged) + if(allowed(user)) locked = !locked to_chat(user, "You [locked ? "lock" : "unlock"] the controls.") - else if(emagged) - to_chat(user, "Error, access controller damaged!") else to_chat(user, "Access denied.") else return ..() -/obj/machinery/shieldgen/emag_act(mob/user) - if(emagged) - to_chat(user, "The access controller is damaged!") - return - emagged = TRUE - locked = FALSE - playsound(src, "sparks", 100, 1) - to_chat(user, "You short out the access controller.") +/obj/machinery/shieldgen/emag_act() + if(!(stat & BROKEN)) + stat |= BROKEN + update_icon() /obj/machinery/shieldgen/update_icon() if(active) @@ -343,11 +337,9 @@ default_unfasten_wrench(user, W, 0) else if(W.GetID()) - if(allowed(user) && !emagged) + if(allowed(user)) locked = !locked to_chat(user, "You [src.locked ? "lock" : "unlock"] the controls.") - else if(emagged) - to_chat(user, "Error, access controller damaged!") else to_chat(user, "Access denied.") @@ -380,14 +372,6 @@ update_activity() add_fingerprint(user) -/obj/machinery/shieldwallgen/emag_act(mob/user) - if(emagged) - to_chat(user, "The access controller is damaged!") - return - emagged = TRUE - locked = FALSE - playsound(src, "sparks", 100, 1) - to_chat(user, "You short out the access controller.") //////////////Containment Field START /obj/machinery/shieldwall diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 3d3911581d..b45b393ab2 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -228,7 +228,7 @@ settableTemperatureMedian + settableTemperatureRange) if("eject") if(panel_open && cell) - cell.forceMove(drop_location()) + cell.loc = get_turf(src) cell = null . = TRUE diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index edcf422b58..83681475fd 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -32,7 +32,7 @@ var/index1 // display index for scrolling messages or 0 if non-scrolling var/index2 - var/frequency = FREQ_STATUS_DISPLAYS + var/frequency = 1435 // radio frequency var/supply_display = 0 // true if a supply shuttle display var/shuttle_id // Id used for "generic shuttle timer" mode diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index ceabbe1d43..aebccdddd2 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -86,7 +86,7 @@ if(data == 1) for(var/obj/item/device/radio/intercom/R in GLOB.all_radios["[freq]"]) - if(R.can_receive(freq, level)) + if(R.receive_range(freq, level) > -1) radios += R // --- Broadcast only to intercoms and station-bounced radios --- @@ -97,7 +97,7 @@ if(R.subspace_transmission) continue - if(R.can_receive(freq, level)) + if(R.receive_range(freq, level) > -1) radios += R // --- This space left blank for Syndicate data --- @@ -110,19 +110,19 @@ if(!R.independent) continue - if(R.can_receive(freq, level)) + if(R.receive_range(freq, level) > -1) radios += R // --- Broadcast to ALL radio devices --- else for(var/obj/item/device/radio/R in GLOB.all_radios["[freq]"]) - if(R.can_receive(freq, level)) + if(R.receive_range(freq, level) > -1) radios += R var/freqtext = num2text(freq) - for(var/obj/item/device/radio/R in GLOB.all_radios["[FREQ_SYNDICATE]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving. - if(R.can_receive(FREQ_SYNDICATE, list(R.z)) && freqtext in GLOB.reverseradiochannels) + for(var/obj/item/device/radio/R in GLOB.all_radios["[GLOB.SYND_FREQ]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving. + if(R.receive_range(GLOB.SYND_FREQ, list(R.z)) > -1 && freqtext in GLOB.reverseradiochannels) radios |= R // Get a list of mobs who can hear from the radios we collected. @@ -150,11 +150,16 @@ //Use this to test if an obj can communicate with a Telecommunications Network +/atom/proc/test_telecomms() + var/datum/signal/signal = telecomms_process() + var/turf/position = get_turf(src) + return (position.z in signal.data["level"] && signal.data["done"]) + /atom/proc/telecomms_process() // First, we want to generate a new radio signal var/datum/signal/signal = new - signal.transmission_method = TRANSMISSION_SUBSPACE + signal.transmission_method = 2 // 2 would be a subspace transmission. var/turf/pos = get_turf(src) // --- Finally, tag the actual signal with the appropriate values --- @@ -168,7 +173,7 @@ "done" = 0, "level" = pos.z // The level it is being broadcasted at. ) - signal.frequency = FREQ_COMMON + signal.frequency = 1459// Common channel //#### Sending the signal to all subspace receivers ####// for(var/obj/machinery/telecomms/receiver/R in GLOB.telecomms_list) diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 9cbe8689fc..74774f2670 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -234,7 +234,7 @@ if(newfreq && canAccess(usr)) if(findtext(num2text(newfreq), ".")) newfreq *= 10 // shift the decimal one place - if(newfreq == FREQ_SYNDICATE) + if(newfreq == GLOB.SYND_FREQ) temp = "-% Error: Interference preventing filtering frequency: \"[newfreq] GHz\" %-" else if(!(newfreq in freq_listening) && newfreq < 10000) diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index b08e2c2056..f881e18d35 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -36,12 +36,12 @@ /* ###### Copy all syndie communications to the Syndicate Frequency ###### */ - if(intercept && signal.frequency == FREQ_SYNDICATE) + if(intercept && signal.frequency == GLOB.SYND_FREQ) Broadcast_Message(signal.data["mob"], signal.data["vmask"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"],, signal.data["compression"], list(0, z), FREQ_SYNDICATE, signal.data["spans"], + signal.data["realname"],, signal.data["compression"], list(0, z), GLOB.SYND_FREQ, signal.data["spans"], signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"], signal.data["language"]) /* ###### Broadcast a message using signal.data ###### */ diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm index d05c4f34f8..252a285d2a 100644 --- a/code/game/machinery/telecomms/machines/bus.dm +++ b/code/game/machinery/telecomms/machines/bus.dm @@ -25,7 +25,7 @@ if(is_freq_listening(signal)) if(change_frequency) - if(signal.frequency != FREQ_SYNDICATE) + if(signal.frequency != GLOB.SYND_FREQ) signal.frequency = change_frequency if(!istype(machine_from, /obj/machinery/telecomms/processor) && machine_from != src) // Signal must be ready (stupid assuming machine), let's send it @@ -54,30 +54,30 @@ /obj/machinery/telecomms/bus/preset_one id = "Bus 1" network = "tcommsat" - freq_listening = list(FREQ_SCIENCE, FREQ_MEDICAL) + freq_listening = list(GLOB.SCI_FREQ, GLOB.MED_FREQ) autolinkers = list("processor1", "science", "medical") /obj/machinery/telecomms/bus/preset_two id = "Bus 2" network = "tcommsat" - freq_listening = list(FREQ_SUPPLY, FREQ_SERVICE) + freq_listening = list(GLOB.SUPP_FREQ,GLOB.SERV_FREQ) autolinkers = list("processor2", "supply", "service") /obj/machinery/telecomms/bus/preset_three id = "Bus 3" network = "tcommsat" - freq_listening = list(FREQ_SECURITY, FREQ_COMMAND) + freq_listening = list(GLOB.SEC_FREQ, GLOB.COMM_FREQ) autolinkers = list("processor3", "security", "command") /obj/machinery/telecomms/bus/preset_four id = "Bus 4" network = "tcommsat" - freq_listening = list(FREQ_ENGINEERING) + freq_listening = list(GLOB.ENG_FREQ) autolinkers = list("processor4", "engineering", "common") /obj/machinery/telecomms/bus/preset_four/Initialize() . = ..() - for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2) + for(var/i = 1441, i < 1489, i += 2) freq_listening |= i /obj/machinery/telecomms/bus/preset_one/birdstation diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm index 8dab3b41f4..79ab125878 100644 --- a/code/game/machinery/telecomms/machines/receiver.dm +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -26,7 +26,7 @@ return if(!check_receive_level(signal)) return - if(signal.transmission_method == TRANSMISSION_SUBSPACE) + if(signal.transmission_method == 2) if(is_freq_listening(signal)) // detect subspace signals @@ -58,7 +58,7 @@ id = "Receiver A" network = "tcommsat" autolinkers = list("receiverA") // link to relay - freq_listening = list(FREQ_SCIENCE, FREQ_MEDICAL, FREQ_SUPPLY, FREQ_SERVICE) + freq_listening = list(GLOB.SCI_FREQ, GLOB.MED_FREQ, GLOB.SUPP_FREQ, GLOB.SERV_FREQ) // science, medical, supply, service //--PRESET RIGHT--// @@ -67,12 +67,12 @@ id = "Receiver B" network = "tcommsat" autolinkers = list("receiverB") // link to relay - freq_listening = list(FREQ_COMMAND, FREQ_ENGINEERING, FREQ_SECURITY) + freq_listening = list(GLOB.COMM_FREQ, GLOB.ENG_FREQ, GLOB.SEC_FREQ) //command, engineering, security //Common and other radio frequencies for people to freely use /obj/machinery/telecomms/receiver/preset_right/Initialize() . = ..() - for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2) + for(var/i = 1441, i < 1489, i += 2) freq_listening |= i /obj/machinery/telecomms/receiver/preset_left/birdstation diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm index ad7400137e..a328333b36 100644 --- a/code/game/machinery/telecomms/machines/server.dm +++ b/code/game/machinery/telecomms/machines/server.dm @@ -131,22 +131,22 @@ /obj/machinery/telecomms/server/presets/science id = "Science Server" - freq_listening = list(FREQ_SCIENCE) + freq_listening = list(GLOB.SCI_FREQ) autolinkers = list("science") /obj/machinery/telecomms/server/presets/medical id = "Medical Server" - freq_listening = list(FREQ_MEDICAL) + freq_listening = list(GLOB.MED_FREQ) autolinkers = list("medical") /obj/machinery/telecomms/server/presets/supply id = "Supply Server" - freq_listening = list(FREQ_SUPPLY) + freq_listening = list(GLOB.SUPP_FREQ) autolinkers = list("supply") /obj/machinery/telecomms/server/presets/service id = "Service Server" - freq_listening = list(FREQ_SERVICE) + freq_listening = list(GLOB.SERV_FREQ) autolinkers = list("service") /obj/machinery/telecomms/server/presets/common @@ -154,25 +154,26 @@ freq_listening = list() autolinkers = list("common") -//Common and other radio frequencies for people to freely use + //Common and other radio frequencies for people to freely use + // 1441 to 1489 /obj/machinery/telecomms/server/presets/common/Initialize() . = ..() - for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2) + for(var/i = 1441, i < 1489, i += 2) freq_listening |= i /obj/machinery/telecomms/server/presets/command id = "Command Server" - freq_listening = list(FREQ_COMMAND) + freq_listening = list(GLOB.COMM_FREQ) autolinkers = list("command") /obj/machinery/telecomms/server/presets/engineering id = "Engineering Server" - freq_listening = list(FREQ_ENGINEERING) + freq_listening = list(GLOB.ENG_FREQ) autolinkers = list("engineering") /obj/machinery/telecomms/server/presets/security id = "Security Server" - freq_listening = list(FREQ_SECURITY) + freq_listening = list(GLOB.SEC_FREQ) autolinkers = list("security") /obj/machinery/telecomms/server/presets/common/birdstation/Initialize() diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 80d1cefaf9..62f53f73ad 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -61,7 +61,7 @@ GLOBAL_LIST_EMPTY(telecomms_list) var/datum/signal/copy = new if(copysig) - copy.transmission_method = TRANSMISSION_SUBSPACE + copy.transmission_method = 2 copy.frequency = signal.frequency // Copy the main data contents! Workaround for some nasty bug where the actual array memory is copied and not its contents. copy.data = list( diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 7624312f84..fe18365a9c 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -57,7 +57,7 @@ var/move_dir = get_dir(loc, AM.loc) var/mob/living/carbon/human/H = AM if((transform_standing || H.lying) && move_dir == EAST)// || move_dir == WEST) - AM.forceMove(drop_location()) + AM.loc = src.loc do_transform(AM) /obj/machinery/transformer/CanPass(atom/movable/mover, turf/target) diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index 59465cf5b2..fdb481401e 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -45,7 +45,6 @@ var/datum/objective/hijack/hijack = new hijack.owner = user.mind user.mind.objectives += hijack - user.mind.add_antag_datum(/datum/antagonist/auto_custom) user.mind.announce_objectives() diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 5e7ddb6497..626c405284 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -24,5 +24,3 @@ if(occupant && occupant.client && occupant.client.mouse_pointer_icon == 'icons/mecha/mecha_mouse.dmi') occupant.client.mouse_pointer_icon = initial(occupant.client.mouse_pointer_icon) ..() - - diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 56e3ccc6c3..d5228b9130 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -63,4 +63,3 @@ /obj/mecha/combat/gygax/dark/RemoveActions(mob/living/user, human_occupant = 0) ..() thrusters_action.Remove(user) - diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index 7424a30fcc..ceb88aa9b0 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -141,5 +141,3 @@ for (var/i=0;i<6;i++) color = color+pick(colors) return color - - diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 7be8fb6246..731aa2cec9 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -1,90 +1,90 @@ -/obj/mecha/combat/marauder - desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations." - name = "\improper Marauder" - icon_state = "marauder" - step_in = 5 - max_integrity = 500 - deflect_chance = 25 - armor = list(melee = 50, bullet = 55, laser = 40, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100) - max_temperature = 60000 - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - infra_luminosity = 3 +/obj/mecha/combat/marauder + desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations." + name = "\improper Marauder" + icon_state = "marauder" + step_in = 5 + max_integrity = 500 + deflect_chance = 25 + armor = list(melee = 50, bullet = 55, laser = 40, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100) + max_temperature = 60000 + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + infra_luminosity = 3 operation_req_access = list(ACCESS_CENT_SPECOPS) - wreckage = /obj/structure/mecha_wreckage/marauder - add_req_access = 0 - internal_damage_threshold = 25 - force = 45 - max_equip = 4 - bumpsmash = 1 - -/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0) - ..() - smoke_action.Grant(user, src) - thrusters_action.Grant(user, src) - zoom_action.Grant(user, src) - -/obj/mecha/combat/marauder/RemoveActions(mob/living/user, human_occupant = 0) - ..() - smoke_action.Remove(user) - thrusters_action.Remove(user) - zoom_action.Remove(user) - -/obj/mecha/combat/marauder/loaded/New() - ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src) - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src) - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) - ME.attach(src) - -/obj/mecha/combat/marauder/seraph - desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel." - name = "\improper Seraph" - icon_state = "seraph" + wreckage = /obj/structure/mecha_wreckage/marauder + add_req_access = 0 + internal_damage_threshold = 25 + force = 45 + max_equip = 4 + bumpsmash = 1 + +/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0) + ..() + smoke_action.Grant(user, src) + thrusters_action.Grant(user, src) + zoom_action.Grant(user, src) + +/obj/mecha/combat/marauder/RemoveActions(mob/living/user, human_occupant = 0) + ..() + smoke_action.Remove(user) + thrusters_action.Remove(user) + zoom_action.Remove(user) + +/obj/mecha/combat/marauder/loaded/New() + ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME.attach(src) + +/obj/mecha/combat/marauder/seraph + desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel." + name = "\improper Seraph" + icon_state = "seraph" operation_req_access = list(ACCESS_CENT_SPECOPS) - step_in = 3 + step_in = 3 max_integrity = 550 - wreckage = /obj/structure/mecha_wreckage/seraph - internal_damage_threshold = 20 - force = 55 - max_equip = 5 - -/obj/mecha/combat/marauder/seraph/New() - ..() - var/obj/item/mecha_parts/mecha_equipment/ME - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src) - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src) - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) - ME.attach(src) - -/obj/mecha/combat/marauder/mauler - desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model." - name = "\improper Mauler" - icon_state = "mauler" + wreckage = /obj/structure/mecha_wreckage/seraph + internal_damage_threshold = 20 + force = 55 + max_equip = 5 + +/obj/mecha/combat/marauder/seraph/New() + ..() + var/obj/item/mecha_parts/mecha_equipment/ME + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME.attach(src) + +/obj/mecha/combat/marauder/mauler + desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model." + name = "\improper Mauler" + icon_state = "mauler" operation_req_access = list(ACCESS_SYNDICATE) - wreckage = /obj/structure/mecha_wreckage/mauler - max_equip = 5 - -/obj/mecha/combat/marauder/mauler/loaded/New() - ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src) - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src) - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) - ME.attach(src) - - + wreckage = /obj/structure/mecha_wreckage/mauler + max_equip = 5 + +/obj/mecha/combat/marauder/mauler/loaded/New() + ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME.attach(src) + + diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm index 14891835c5..26384824d0 100644 --- a/code/game/mecha/combat/reticence.dm +++ b/code/game/mecha/combat/reticence.dm @@ -1,28 +1,28 @@ -/obj/mecha/combat/reticence - desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins." - name = "\improper reticence" - icon_state = "reticence" - step_in = 2 - dir_in = 1 //Facing North. - max_integrity = 100 - deflect_chance = 3 - armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100) - max_temperature = 15000 - wreckage = /obj/structure/mecha_wreckage/reticence +/obj/mecha/combat/reticence + desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins." + name = "\improper reticence" + icon_state = "reticence" + step_in = 2 + dir_in = 1 //Facing North. + max_integrity = 100 + deflect_chance = 3 + armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100) + max_temperature = 15000 + wreckage = /obj/structure/mecha_wreckage/reticence operation_req_access = list(ACCESS_THEATRE) - add_req_access = 0 - internal_damage_threshold = 25 - max_equip = 2 - step_energy_drain = 3 - color = "#87878715" - stepsound = null - turnsound = null - opacity = 0 - -/obj/mecha/combat/reticence/loaded/New() - ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced - ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/rcd //HAHA IT MAKES WALLS GET IT - ME.attach(src) - return + add_req_access = 0 + internal_damage_threshold = 25 + max_equip = 2 + step_energy_drain = 3 + color = "#87878715" + stepsound = null + turnsound = null + opacity = 0 + +/obj/mecha/combat/reticence/loaded/New() + ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/rcd //HAHA IT MAKES WALLS GET IT + ME.attach(src) + return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 54530d368c..e2a35ac591 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -104,7 +104,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/attach(obj/mecha/M) M.equipment += src chassis = M - forceMove(M) + src.loc = M M.log_message("[src] initialized.") if(!M.selected && selectable) M.selected = src diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index f076b723ae..d456642633 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -39,7 +39,7 @@ O.anchored = TRUE if(do_after_cooldown(target)) cargo_holder.cargo += O - O.forceMove(chassis) + O.loc = chassis O.anchored = FALSE occupant_message("[target] successfully loaded.") log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") @@ -91,7 +91,7 @@ O.anchored = TRUE if(do_after_cooldown(target)) cargo_holder.cargo += O - O.forceMove(chassis) + O.loc = chassis O.anchored = FALSE occupant_message("[target] successfully loaded.") log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 20b29c968b..1766a8cc3a 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -34,13 +34,15 @@ "Misc" ) + var/datum/component/material_container/materials + /obj/machinery/mecha_part_fabricator/Initialize() - var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, - list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0, - FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) - materials.precise_insertion = TRUE - stored_research = new - return ..() + materials = AddComponent(/datum/component/material_container, + list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0, + FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) + materials.precise_insertion = TRUE + stored_research = new + return ..() /obj/machinery/mecha_part_fabricator/RefreshParts() var/T = 0 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 83d3b509ce..e50da70c5d 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -247,7 +247,7 @@ radio.name = "[src] radio" radio.icon = icon radio.icon_state = icon_state - radio.subspace_transmission = TRUE + radio.subspace_transmission = 1 /obj/mecha/proc/can_use(mob/user) if(user != occupant) diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index de50d6f86f..272d3530a6 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -542,7 +542,7 @@ else user.visible_message("[user] removes the capacitor from the [holder].", "You remove the capacitor from the [holder].") var/obj/item/I = locate(/obj/item/stock_parts/capacitor) in holder - I.forceMove(holder.drop_location()) + I.loc = get_turf(holder) holder.icon_state = "gygax12" if(9) if(diff==FORWARD) @@ -1155,7 +1155,7 @@ else user.visible_message("[user] removes the scanner module from the [holder].", "You remove the scanner module from the [holder].") var/obj/item/I = locate(/obj/item/stock_parts/scanning_module) in holder - I.forceMove(holder.drop_location()) + I.loc = get_turf(holder) holder.icon_state = "durand10" if(11) if(diff==FORWARD) @@ -1173,7 +1173,7 @@ else user.visible_message("[user] removes the super capacitor from the [holder].", "You remove the capacitor from the [holder].") var/obj/item/I = locate(/obj/item/stock_parts/capacitor) in holder - I.forceMove(holder.drop_location()) + I.loc = get_turf(holder) holder.icon_state = "durand12" if(9) if(diff==FORWARD) @@ -1480,7 +1480,7 @@ else user.visible_message("[user] removes the phasic scanner module from the [holder].", "You remove the scanner module from the [holder].") var/obj/item/I = locate(/obj/item/stock_parts/scanning_module) in holder - I.forceMove(holder.drop_location()) + I.loc = get_turf(holder) holder.icon_state = "phazon10" if(15) if(diff==FORWARD) @@ -1498,7 +1498,7 @@ else user.visible_message("[user] removes the super capacitor from the [holder].", "You remove the capacitor from the [holder].") var/obj/item/I = locate(/obj/item/stock_parts/capacitor) in holder - I.forceMove(holder.drop_location()) + I.loc = get_turf(holder) holder.icon_state = "phazon12" if(13) if(diff==FORWARD) diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 4c1bceca28..54b44f89f9 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -284,7 +284,7 @@ if(href_list["rfreq"]) var/new_frequency = (radio.frequency + afilter.getNum("rfreq")) - if (!radio.freerange || (radio.frequency < MIN_FREE_FREQ || radio.frequency > MAX_FREE_FREQ)) + if (!radio.freerange || (radio.frequency < 1200 || radio.frequency > 1600)) new_frequency = sanitize_frequency(new_frequency) radio.set_frequency(new_frequency) send_byjax(src.occupant,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]") diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index de8f8ecb3a..67e5c1dbd1 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -68,7 +68,7 @@ if(crowbar_salvage && crowbar_salvage.len) var/obj/S = pick(crowbar_salvage) if(S) - S.forceMove(user.drop_location()) + S.loc = get_turf(user) crowbar_salvage -= S user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].") return diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 88be32c545..04737f2e4c 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -27,7 +27,7 @@ aSignal.name = "[name] core" aSignal.code = rand(1,100) - aSignal.frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ) + aSignal.frequency = rand(1200, 1599) if(IsMultiple(aSignal.frequency, 2))//signaller frequencies are always uneven! aSignal.frequency++ diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm index 42f59cc535..8eb4c986de 100644 --- a/code/game/objects/effects/bump_teleporter.dm +++ b/code/game/objects/effects/bump_teleporter.dm @@ -19,7 +19,6 @@ LAZYREMOVE(AllTeleporters, src) return ..() - /obj/effect/bump_teleporter/singularity_act() return diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index f06525863d..0e0c7c606e 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -47,8 +47,10 @@ return else var/hotness = W.is_hot() - reagents.expose_temperature(hotness) - to_chat(user, "You heat [name] with [W]!") + var/added_heat = (hotness / 100) + src.reagents.chem_temp = min(src.reagents.chem_temp + added_heat, hotness) + src.reagents.handle_reactions() + to_chat(user, "You heat [src] with [W]!") else return ..() @@ -60,7 +62,8 @@ /obj/effect/decal/cleanable/fire_act(exposed_temperature, exposed_volume) if(reagents) - reagents.expose_temperature(exposed_temperature) + reagents.chem_temp += 30 + reagents.handle_reactions() ..() diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index baad713675..4362957a76 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -14,6 +14,7 @@ if(e_name) name = e_name desc = "A [name] vandalizing the station." + if(alt_icon) icon = alt_icon if(type) @@ -27,4 +28,3 @@ if(main) paint_colour = main add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY) - diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index a290049249..3459bfc954 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -236,7 +236,7 @@ /obj/structure/foamedmetal/Move() var/turf/T = loc - . = ..() + ..() move_update_air(T) /obj/structure/foamedmetal/attack_paw(mob/user) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 13b0fb3d65..caeb1f168c 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -358,4 +358,4 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/ruin/Destroy() GLOB.ruin_landmarks -= src ruin_template = null - . = ..() + . = ..() \ No newline at end of file diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 1178cd43f8..d7d36acde1 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -65,4 +65,3 @@ /obj/effect/abstract/marker/at name = "active turf marker" - diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 8b6bf70588..427e9eefe2 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -1,4 +1,3 @@ - /proc/create_portal_pair(turf/source, turf/destination, _creator = null, _lifespan = 300, accuracy = 0, newtype = /obj/effect/portal) if(!istype(source) || !istype(destination)) return @@ -170,4 +169,3 @@ else real_target = get_turf(linked) return real_target - diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index bd6e4d934b..43f10dc45e 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -43,7 +43,7 @@ /obj/effect/gibspawner/generic - gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core) + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core) gibamounts = list(2,2,1) /obj/effect/gibspawner/generic/Initialize() @@ -52,7 +52,7 @@ . = ..() /obj/effect/gibspawner/human - gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up, /obj/effect/decal/cleanable/blood/gibs/down, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/body, /obj/effect/decal/cleanable/blood/gibs/limb, /obj/effect/decal/cleanable/blood/gibs/core) + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood/gibs/core) gibamounts = list(1,1,1,1,1,1,1) /obj/effect/gibspawner/human/Initialize() @@ -62,7 +62,7 @@ /obj/effect/gibspawner/humanbodypartless //only the gibs that don't look like actual full bodyparts (except torso). - gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/torso) + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core,/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/torso) gibamounts = list(1, 1, 1, 1, 1, 1) /obj/effect/gibspawner/humanbodypartless/Initialize() @@ -72,7 +72,7 @@ /obj/effect/gibspawner/xeno - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/up, /obj/effect/decal/cleanable/xenoblood/xgibs/down, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/body, /obj/effect/decal/cleanable/xenoblood/xgibs/limb, /obj/effect/decal/cleanable/xenoblood/xgibs/core) + gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/up,/obj/effect/decal/cleanable/xenoblood/xgibs/down,/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/body, /obj/effect/decal/cleanable/xenoblood/xgibs/limb, /obj/effect/decal/cleanable/xenoblood/xgibs/core) gibamounts = list(1,1,1,1,1,1,1) /obj/effect/gibspawner/xeno/Initialize() @@ -82,7 +82,7 @@ /obj/effect/gibspawner/xenobodypartless //only the gibs that don't look like actual full bodyparts (except torso). - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/torso) + gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core,/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/torso) gibamounts = list(1, 1, 1, 1, 1, 1) @@ -111,7 +111,7 @@ /obj/effect/gibspawner/robot sparks = 1 - gibtypes = list(/obj/effect/decal/cleanable/robot_debris/up, /obj/effect/decal/cleanable/robot_debris/down, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris/limb) + gibtypes = list(/obj/effect/decal/cleanable/robot_debris/up,/obj/effect/decal/cleanable/robot_debris/down,/obj/effect/decal/cleanable/robot_debris,/obj/effect/decal/cleanable/robot_debris,/obj/effect/decal/cleanable/robot_debris,/obj/effect/decal/cleanable/robot_debris/limb) gibamounts = list(1,1,1,1,1,1) /obj/effect/gibspawner/robot/Initialize() diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index e21da57476..34e6793d5b 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -193,4 +193,4 @@ /obj/item/aiModule/core/full/balance, /obj/item/aiModule/core/full/tyrant, /obj/item/aiModule/core/full/thermurderdynamic - ) \ No newline at end of file + ) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 4ecba7c982..89a5ce7353 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -150,7 +150,7 @@ spawn(travel_time) if(!exit_vent || exit_vent.welded) - forceMove(entry_vent) + loc = entry_vent entry_vent = null return @@ -162,7 +162,7 @@ forceMove(entry_vent) entry_vent = null return - forceMove(exit_vent.loc) + loc = exit_vent.loc entry_vent = null var/area/new_area = get_area(loc) if(new_area) diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm index 59c4e23283..d9861d827d 100644 --- a/code/game/objects/effects/temporary_visuals/clockcult.dm +++ b/code/game/objects/effects/temporary_visuals/clockcult.dm @@ -86,8 +86,8 @@ transform = matrix()*2 var/matrix/M = transform M.Turn(90) - animate(src, alpha = 20, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL) - animate(src, transform = M, time = duration, flags = ANIMATION_PARALLEL) + animate(src, alpha = 20, time = duration, easing = BOUNCE_EASING, flags_1 = ANIMATION_PARALLEL) + animate(src, transform = M, time = duration, flags_1 = ANIMATION_PARALLEL) /obj/effect/temp_visual/ratvar/ocular_warden name = "warden's gaze" diff --git a/code/game/objects/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm index a649763435..125904604f 100644 --- a/code/game/objects/effects/temporary_visuals/cult.dm +++ b/code/game/objects/effects/temporary_visuals/cult.dm @@ -65,8 +65,8 @@ var/matrix/M = transform M.Turn(turnedness) transform = M - animate(src, alpha = 255, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL) - animate(src, transform = oldtransform, time = duration, flags = ANIMATION_PARALLEL) + animate(src, alpha = 255, time = duration, easing = BOUNCE_EASING, flags_1 = ANIMATION_PARALLEL) + animate(src, transform = oldtransform, time = duration, flags_1 = ANIMATION_PARALLEL) /obj/effect/temp_visual/cult/rune_spawn/rune1 icon_state = "rune1words" diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 0203cb66c3..0928fd9ca6 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -378,7 +378,7 @@ M = size_matrix*0.1 else M = size_matrix*2 - animate(src, alpha = 20, transform = M, time = duration, flags = ANIMATION_PARALLEL) + animate(src, alpha = 20, transform = M, time = duration, flags_1 = ANIMATION_PARALLEL) /obj/effect/temp_visual/bleed/explode icon_state = "bleed10" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 721db3dd25..f4dd741695 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -117,12 +117,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/trigger_guard = TRIGGER_GUARD_NONE - //Grinder vars - var/list/grind_results //A reagent list containing the reagents this item produces when ground up in a grinder - this can be an empty list to allow for reagent transferring only - var/list/juice_results //A reagent list containing blah blah... but when JUICED in a grinder! - - //CITADEL - var/icon_override + var/icon_override = null /obj/item/Initialize() if (!materials) @@ -203,39 +198,31 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(!user.research_scanner) return + var/list/input = techweb_item_boost_check(src) + if(input) + var/list/output = list("Research Boost Data:") + var/list/res = list("Already researched:") + var/list/boosted = list("Already boosted:") + for(var/datum/techweb_node/N in input) + var/str = "[N.display_name]: [input[N]] points.
    " + if(SSresearch.science_tech.researched_nodes[N]) + res += str + else if(SSresearch.science_tech.boosted_nodes[N]) + boosted += str + if(SSresearch.science_tech.visible_nodes[N]) //JOY OF DISCOVERY! + output += str + var/list/combine = output + res + boosted + var/strout = combine.Join("
    ") + to_chat(user, strout) - // Research prospects, including boostable nodes and point values. - // Deliver to a console to know whether the boosts have already been used. - var/list/research_msg = list("Research prospects: ") - var/sep = "" - var/list/boostable_nodes = techweb_item_boost_check(src) - if (boostable_nodes) - for(var/id in boostable_nodes) - var/datum/techweb_node/node = SSresearch.techweb_nodes[id] - research_msg += sep - research_msg += node.display_name - sep = ", " - var/points = techweb_item_point_check(src) - if (points) - research_msg += sep - research_msg += "[points] points" - sep = ", " - - if (!sep) // nothing was shown - research_msg += "None" - - // Extractable materials. Only shows the names, not the amounts. - research_msg += ".
    Extractable materials: " - if (materials.len) - sep = "" + var/list/msg = list("*--------*
    Extractable materials:") + if(materials.len) for(var/mat in materials) - research_msg += sep - research_msg += CallMaterialName(mat) - sep = ", " + msg += "[CallMaterialName(mat)]" //Capitize first word, remove the "$" else - research_msg += "None" - research_msg += "." - to_chat(user, research_msg.Join()) + msg += "No extractable materials detected." + msg += "*--------*" + to_chat(user, msg.Join("
    ")) /obj/item/proc/speechModification(message) //for message modding by mask slot. return message @@ -691,15 +678,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/proc/on_mob_death(mob/living/L, gibbed) -/obj/item/proc/grind_requirements(obj/machinery/reagentgrinder/R) //Used to check for extra requirements for grinding an object - return TRUE - - //Called BEFORE the object is ground up - use this to change grind results based on conditions - //Use "return -1" to prevent the grinding from occurring -/obj/item/proc/on_grind() - -/obj/item/proc/on_juice() - /obj/item/proc/set_force_string() switch(force) if(0 to 4) @@ -735,3 +713,4 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/MouseExited() deltimer(tip_timer)//delete any in-progress timer if the mouse is moved off the item before it finishes closeToolTip(usr) + diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index f842c579c1..8958ade484 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -169,20 +169,15 @@ loaded.item_color = colors[current_color_index] last = loaded.place_turf(get_turf(src), user, turn(user.dir, 180)) is_empty(user) //If we've run out, display message - update_icon() -/obj/item/twohanded/rcl/pre_loaded/Initialize() //Comes preloaded with cable, for testing stuff +/obj/item/twohanded/rcl/pre_loaded/Initialize () //Comes preloaded with cable, for testing stuff . = ..() loaded = new() loaded.max_amount = max_amount loaded.amount = max_amount update_icon() -/obj/item/twohanded/rcl/Initialize() - . = ..() - update_icon() - /obj/item/twohanded/rcl/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/rcl)) current_color_index++; @@ -208,4 +203,4 @@ item_state = "rcl" else icon_state = "rclg-1" - item_state = "rclg-1" + item_state = "rclg-1" \ No newline at end of file diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index 5048f6ed2d..4c8d342c16 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -120,5 +120,4 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' flags_1 = CONDUCT_1 w_class = WEIGHT_CLASS_SMALL - materials = list(MAT_METAL=50, MAT_GLASS=50) - grind_results = list("iron" = 10, "silicon" = 10) + materials = list(MAT_METAL=50, MAT_GLASS=50) \ No newline at end of file diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 72481f335d..6e515264ca 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -1,4 +1,3 @@ - /obj/item/bodybag name = "body bag" desc = "A folded bag designed for the storage and transportation of cadavers." @@ -80,3 +79,4 @@ return loc.visible_message("[user] suddenly appears in front of [loc]!", "[user] breaks free of [src]!") qdel(src) + diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 0358aa3188..ed9a6712a8 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -197,10 +197,6 @@ update_label("John Doe", "Clowny") /obj/item/card/id/syndicate/anyone anyone = TRUE -/obj/item/card/id/syndicate/nuke_leader - name = "lead agent card" - access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER) - /obj/item/card/id/syndicate_command name = "syndicate ID card" desc = "An ID straight from the Syndicate." @@ -354,4 +350,4 @@ update_label("John Doe", "Clowny") name = "APC Access ID" desc = "Special ID card to allow access to APCs." icon_state = "centcom" - access = list(ACCESS_ENGINE_EQUIP) \ No newline at end of file + access = list(ACCESS_ENGINE_EQUIP) diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 5d4c85ac4d..8ac9643c39 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -163,7 +163,7 @@ /obj/effect/chrono_field/New(loc, var/mob/living/target, var/obj/item/gun/energy/chrono_gun/G) if(target && isliving(target) && G) - target.forceMove(src) + target.loc = src src.captured = target var/icon/mob_snapshot = getFlatIcon(target) var/icon/cached_icon = new() @@ -198,7 +198,7 @@ if(captured) if(tickstokill > initial(tickstokill)) for(var/atom/movable/AM in contents) - AM.forceMove(drop_location()) + AM.loc = loc qdel(src) else if(tickstokill <= 0) to_chat(captured, "As the last essence of your being is erased from time, you begin to re-experience your most enjoyable memory. You feel happy...") @@ -213,7 +213,7 @@ else captured.Unconscious(80) if(captured.loc != src) - captured.forceMove(src) + captured.loc = src update_icon() if(gun) if(gun.field_check(src)) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 9c7c34510c..491feb91ce 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -25,7 +25,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/smoketime = 5 w_class = WEIGHT_CLASS_TINY heat = 1000 - grind_results = list("phosphorus" = 2) /obj/item/match/process() smoketime-- @@ -105,7 +104,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM container_type = INJECTABLE_1 w_class = WEIGHT_CLASS_TINY body_parts_covered = null - grind_results = list() var/lit = FALSE var/starts_lit = FALSE var/icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi @@ -365,7 +363,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_state = "cigbutt" w_class = WEIGHT_CLASS_TINY throwforce = 0 - grind_results = list("carbon" = 2) /obj/item/cigbutt/cigarbutt name = "cigar butt" @@ -487,7 +484,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM heat = 1500 resistance_flags = FIRE_PROOF light_color = LIGHT_COLOR_FIRE - grind_results = list("iron" = 1, "welding_fuel" = 5, "oil" = 5) /obj/item/lighter/update_icon() if(lit) diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index 12b54a3751..82350e37f9 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -12,7 +12,6 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' materials = list(MAT_GLASS=1000) w_class = WEIGHT_CLASS_SMALL - grind_results = list("silicon" = 20, "sacid" = 0.5) //Retrieving acid this way is extremely inefficient var/build_path = null /obj/item/circuitboard/proc/apply_default_parts(obj/machinery/M) diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 1228cf2011..e033670880 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -261,29 +261,28 @@ /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/glass = 1) -#define PATH_FREEZER /obj/machinery/atmospherics/components/unary/thermomachine/freezer -#define PATH_HEATER /obj/machinery/atmospherics/components/unary/thermomachine/heater - /obj/item/circuitboard/machine/thermomachine/Initialize() . = ..() - if(!build_path) - if(prob(50)) - name = "Freezer (Machine Board)" - build_path = PATH_FREEZER - else - name = "Heater (Machine Board)" - build_path = PATH_HEATER + if(prob(50)) + name = "Freezer (Machine Board)" + build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer + else + name = "Heater (Machine Board)" + build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater + +#define FREEZER /obj/item/circuitboard/machine/thermomachine/freezer +#define HEATER /obj/item/circuitboard/machine/thermomachine/heater /obj/item/circuitboard/machine/thermomachine/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) var/obj/item/circuitboard/new_type var/new_setting switch(build_path) - if(PATH_FREEZER) - new_type = /obj/item/circuitboard/machine/thermomachine/heater + if(FREEZER) + new_type = HEATER new_setting = "Heater" - if(PATH_HEATER) - new_type = /obj/item/circuitboard/machine/thermomachine/freezer + if(HEATER) + new_type = FREEZER new_setting = "Freezer" name = initial(new_type.name) build_path = initial(new_type.build_path) @@ -292,16 +291,16 @@ else return ..() +#undef FREEZER +#undef HEATER + /obj/item/circuitboard/machine/thermomachine/heater name = "Heater (Machine Board)" - build_path = PATH_HEATER + build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater /obj/item/circuitboard/machine/thermomachine/freezer name = "Freezer (Machine Board)" - build_path = PATH_FREEZER - -#undef PATH_FREEZER -#undef PATH_HEATER + build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer /obj/item/circuitboard/machine/deep_fryer name = "circuit board (Deep Fryer)" diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index f2a804e9e9..c96ec4167a 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -21,7 +21,6 @@ throwforce = 0 throw_speed = 3 throw_range = 7 - grind_results = list("lye" = 10) var/cleanspeed = 50 //slower than mop force_string = "robust... against germs" diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index 916e6ba500..a3ad685406 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -188,4 +188,4 @@ else ..() else - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 3cdc3eae47..7b2d730daf 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -26,7 +26,6 @@ item_color = "red" w_class = WEIGHT_CLASS_TINY attack_verb = list("attacked", "coloured") - grind_results = list() var/paint_color = "#FF0000" //RGB var/drawtype @@ -276,7 +275,6 @@ else if(drawing in numerals) temp = "number" - var/graf_rot if(drawing in oriented) switch(user.dir) @@ -618,6 +616,9 @@ spray_overlay.color = paint_color add_overlay(spray_overlay) + pre_noise = FALSE + post_noise = TRUE + /obj/item/toy/crayon/spraycan/borg name = "cyborg spraycan" desc = "A metallic container containing shiny synthesised paint." diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index e501e24c6a..bbeed24168 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -328,7 +328,7 @@ O.unwield() to_chat(user, "The paddles snap back into the main unit.") defib.on = 0 - forceMove(defib) + loc = defib defib.update_icon() return unwield(user) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 4b1a5ed1b5..1f7fd77c4a 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -245,7 +245,7 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "
  • Bots Access
  • " if (cartridge.access & CART_JANITOR) dat += "
  • Custodial Locator
  • " - if (istype(cartridge.radio)) + if (istype(cartridge.radio, /obj/item/radio/integrated/signal)) dat += "
  • Signaler System
  • " if (cartridge.access & CART_NEWSCASTER) dat += "
  • Newscaster Access
  • " @@ -543,7 +543,7 @@ GLOBAL_LIST_EMPTY(PDAs) if("2") // Eject pAI device var/turf/T = get_turf(src.loc) if(T) - pai.forceMove(T) + pai.loc = T //LINK FUNCTIONS=================================== @@ -578,7 +578,7 @@ GLOBAL_LIST_EMPTY(PDAs) M.put_in_hands(id) to_chat(usr, "You remove the ID from the [name].") else - id.forceMove(drop_location()) + id.loc = get_turf(src) id = null update_icon() diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 62bc4cb175..bfcda7d271 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -25,13 +25,13 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' w_class = WEIGHT_CLASS_TINY - var/obj/item/integrated_signaler/radio = null + var/obj/item/radio/integrated/radio = null - var/access = 0 //Bit flags for cartridge access + var/access = 0 //Bit flags_1 for cartridge access var/remote_door_id = "" - var/bot_access_flags = 0 //Bit flags. Selection: SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT + var/bot_access_flags = 0 //Bit flags_1. Selection: SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT var/spam_enabled = 0 //Enables "Send to All" Option var/obj/item/device/pda/host_pda = null @@ -127,7 +127,7 @@ /obj/item/cartridge/signal/Initialize() . = ..() - radio = new(src) + radio = new /obj/item/radio/integrated/signal(src) @@ -176,7 +176,7 @@ /obj/item/cartridge/rd/Initialize() . = ..() - radio = new(src) + radio = new /obj/item/radio/integrated/signal(src) /obj/item/cartridge/captain name = "\improper Value-PAK cartridge" @@ -188,16 +188,20 @@ /obj/item/cartridge/captain/New() ..() - radio = new(src) + radio = new /obj/item/radio/integrated/signal(src) /obj/item/cartridge/proc/post_status(command, data1, data2) - var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) + var/datum/radio_frequency/frequency = SSradio.return_frequency(1435) if(!frequency) return - var/datum/signal/status_signal = new(list("command" = command)) + var/datum/signal/status_signal = new + status_signal.source = src + status_signal.transmission_method = 1 + status_signal.data["command"] = command + switch(command) if("message") status_signal.data["msg1"] = data1 @@ -213,6 +217,7 @@ return switch(host_pda.mode) if(40) //signaller + var/obj/item/radio/integrated/signal/S = radio menu = "

    Remote Signaling System

    " menu += {" @@ -220,14 +225,14 @@ Frequency: - - -[format_frequency(radio.frequency)] +[format_frequency(S.frequency)] + +

    Code: - - -[radio.code] +[S.code] + +
    "} if (41) //crew manifest @@ -566,17 +571,22 @@ Code: active1 = null if("Send Signal") - INVOKE_ASYNC(radio, /obj/item/integrated_signaler.proc/send_activation) + spawn( 0 ) + var/obj/item/radio/integrated/signal/S = radio + S.send_signal("ACTIVATE") + return if("Signal Frequency") - var/new_frequency = sanitize_frequency(radio.frequency + text2num(href_list["sfreq"])) - radio.set_frequency(new_frequency) + var/obj/item/radio/integrated/signal/S = radio + var/new_frequency = sanitize_frequency(S.frequency + text2num(href_list["sfreq"])) + S.set_frequency(new_frequency) if("Signal Code") - radio.code += text2num(href_list["scode"]) - radio.code = round(radio.code) - radio.code = min(100, radio.code) - radio.code = max(1, radio.code) + var/obj/item/radio/integrated/signal/S = radio + S.code += text2num(href_list["scode"]) + S.code = round(S.code) + S.code = min(100, S.code) + S.code = max(1, S.code) if("Status") switch(href_list["statdisp"]) diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm index 7e1a1be7e3..2c4fc8fa48 100644 --- a/code/game/objects/items/devices/PDA/radio.dm +++ b/code/game/objects/items/devices/PDA/radio.dm @@ -1,31 +1,48 @@ -// Radio Cartridge, essentially a remote signaler with limited spectrum. -/obj/item/integrated_signaler +/obj/item/radio/integrated name = "\improper PDA radio module" - desc = "An electronic radio system of Nanotrasen origin." + desc = "An electronic radio system of nanotrasen origin." icon = 'icons/obj/module.dmi' icon_state = "power_mod" -/obj/item/integrated_signaler - var/frequency = FREQ_SIGNALER - var/code = DEFAULT_SIGNALER_CODE + var/on = FALSE //Are we currently active?? + var/menu_message = "" + +/obj/item/radio/integrated/Initialize() + . = ..() + +/obj/item/radio/integrated/Destroy() + return ..() + +/* + * Radio Cartridge, essentially a signaler. + */ + + +/obj/item/radio/integrated/signal + var/frequency = 1457 + var/code = 30 var/last_transmission var/datum/radio_frequency/radio_connection -/obj/item/integrated_signaler/Destroy() +/obj/item/radio/integrated/signal/Destroy() + SSradio.remove_object(src, frequency) radio_connection = null return ..() -/obj/item/integrated_signaler/Initialize() +/obj/item/radio/integrated/signal/Initialize() . = ..() - if (frequency < MIN_FREE_FREQ || frequency > MAX_FREE_FREQ) - frequency = sanitize_frequency(frequency) + if (src.frequency < 1200 || src.frequency > 1600) + src.frequency = sanitize_frequency(src.frequency) + set_frequency(frequency) -/obj/item/integrated_signaler/proc/set_frequency(new_frequency) +/obj/item/radio/integrated/signal/proc/set_frequency(new_frequency) + SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = SSradio.return_frequency(frequency) + radio_connection = SSradio.add_object(src, frequency) + +/obj/item/radio/integrated/signal/proc/send_signal(message="ACTIVATE") -/obj/item/integrated_signaler/proc/send_activation() if(last_transmission && world.time < (last_transmission + 5)) return last_transmission = world.time @@ -34,5 +51,11 @@ var/turf/T = get_turf(src) GLOB.lastsignalers.Add("[time] : [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) : [format_frequency(frequency)]/[code]") - var/datum/signal/signal = new(list("code" = code)) - radio_connection.post_signal(src, signal, filter = RADIO_SIGNALER) + var/datum/signal/signal = new + signal.source = src + signal.encryption = code + signal.data["message"] = message + + radio_connection.post_signal(src, signal) + + return diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 87163dea1e..1b9978f472 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -1,4 +1,3 @@ - #define BUGMODE_LIST 0 #define BUGMODE_MONITOR 1 #define BUGMODE_TRACK 2 diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index a07d8d8d60..b405e21ca6 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -85,7 +85,7 @@ /obj/item/device/chameleon/proc/eject_all() for(var/atom/movable/A in active_dummy) - A.forceMove(active_dummy.loc) + A.loc = active_dummy.loc if(ismob(A)) var/mob/M = A M.reset_perspective(null) @@ -106,7 +106,7 @@ VRD.force_dismount(M) else V.unbuckle_mob(M, force = TRUE) - M.forceMove(src) + M.loc = src master = C master.active_dummy = src diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index f656d55afd..08c570a786 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -256,7 +256,6 @@ var/produce_heat = 1500 heat = 1000 light_color = LIGHT_COLOR_FLARE - grind_results = list("sulfur" = 15) /obj/item/device/flashlight/flare/New() fuel = rand(800, 1000) // Sorry for changing this so much but I keep under-estimating how long X number of ticks last in seconds. @@ -405,7 +404,6 @@ color = LIGHT_COLOR_GREEN icon_state = "glowstick" item_state = "glowstick" - grind_results = list("phenol" = 15, "hydrogen" = 10, "oxygen" = 5) //Meth-in-a-stick var/fuel = 0 /obj/item/device/flashlight/glowstick/Initialize() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index eb1ccd15f4..b1b200f489 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -50,7 +50,7 @@ else if(istype(W, /obj/item/screwdriver)) if(diode) to_chat(user, "You remove the [diode.name] from \the [src].") - diode.forceMove(drop_location()) + diode.loc = get_turf(src.loc) diode = null else return ..() diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index a2b1ce2056..8f3eeeec71 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -158,4 +158,4 @@ desc = "An omni-technological interface." icon = 'icons/obj/abductor.dmi' icon_state = "multitool" - toolspeed = 0.1 \ No newline at end of file + toolspeed = 0.1 diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm index d1ecf9ee28..183e960a08 100644 --- a/code/game/objects/items/devices/pressureplates.dm +++ b/code/game/objects/items/devices/pressureplates.dm @@ -11,7 +11,7 @@ var/sound/trigger_sound = 'sound/effects/pressureplate.ogg' var/obj/item/device/assembly/signaler/sigdev = null var/roundstart_signaller = FALSE - var/roundstart_signaller_freq = FREQ_PRESSURE_PLATE + var/roundstart_signaller_freq = 1447 var/roundstart_signaller_code = 30 var/roundstart_hide = FALSE var/removable_signaller = TRUE diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index e7d3d9d9e6..69b603d213 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -19,6 +19,10 @@ /obj/item/device/radio/beacon/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode) return +/obj/item/device/radio/beacon/send_hear() + return null + + /obj/item/device/radio/beacon/verb/alter_signal(t as text) set name = "Alter Beacon's Signal" set category = "Object" diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 015b64aa22..19226e5d9a 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -12,7 +12,7 @@ materials = list(MAT_METAL=10000, MAT_GLASS=2500) var/on = TRUE var/code = 2 - var/frequency = FREQ_ELECTROPACK + var/frequency = 1449 var/shock_cooldown = 0 /obj/item/device/electropack/suicide_act(mob/user) @@ -21,7 +21,7 @@ /obj/item/device/electropack/Initialize() . = ..() - SSradio.add_object(src, frequency, RADIO_SIGNALER) + SSradio.add_object(src, frequency, GLOB.RADIO_CHAT) /obj/item/device/electropack/Destroy() SSradio.remove_object(src, frequency) @@ -67,7 +67,7 @@ if(href_list["freq"]) SSradio.remove_object(src, frequency) frequency = sanitize_frequency(frequency + text2num(href_list["freq"])) - SSradio.add_object(src, frequency, RADIO_SIGNALER) + SSradio.add_object(src, frequency, GLOB.RADIO_CHAT) else if(href_list["code"]) code += text2num(href_list["code"]) @@ -98,7 +98,7 @@ return /obj/item/device/electropack/receive_signal(datum/signal/signal) - if(!signal || signal.data["code"] != code) + if(!signal || signal.encryption != code) return if(isliving(loc) && on) @@ -144,7 +144,7 @@ Code: user << browse(dat, "window=radio") onclose(user, "radio") return - + /obj/item/device/electropack/shockcollar name = "shock collar" desc = "A reinforced metal collar. It seems to have some form of wiring near the front. Strange.." @@ -168,7 +168,7 @@ Code: ..() /obj/item/device/electropack/shockcollar/receive_signal(datum/signal/signal) - if(!signal || signal.data["code"] != code) + if(!signal || signal.encryption != code) return if(isliving(loc) && on) diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 2d3d869676..028c6ba27f 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -4,8 +4,8 @@ icon = 'icons/obj/radio.dmi' icon_state = "cypherkey" w_class = WEIGHT_CLASS_TINY - var/translate_binary = FALSE - var/syndie = FALSE + var/translate_binary = 0 + var/syndie = 0 var/independent = FALSE var/list/channels = list() @@ -20,7 +20,7 @@ name = "binary translator key" desc = "An encryption key for a radio headset. To access the binary channel, use :b." icon_state = "bin_cypherkey" - translate_binary = TRUE + translate_binary = 1 /obj/item/device/encryptionkey/headset_sec name = "security radio encryption key" diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 13846a84fd..9ff19ba57c 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -4,7 +4,7 @@ icon_state = "headset" item_state = "headset" materials = list(MAT_METAL=75) - subspace_transmission = TRUE + subspace_transmission = 1 canhear_range = 0 // can't hear headsets from very far away slot_flags = SLOT_EARS @@ -22,7 +22,10 @@ recalculateChannels() /obj/item/device/radio/headset/Destroy() - QDEL_NULL(keyslot2) + qdel(keyslot) + qdel(keyslot2) + keyslot = null + keyslot2 = null return ..() /obj/item/device/radio/headset/talk_into(mob/living/M, message, channel, list/spans,datum/language/language) @@ -30,14 +33,14 @@ return ITALICS | REDUCE_RANGE return ..() -/obj/item/device/radio/headset/can_receive(freq, level, AIuser) +/obj/item/device/radio/headset/receive_range(freq, level, AIuser) if(ishuman(src.loc)) var/mob/living/carbon/human/H = src.loc if(H.ears == src) return ..(freq, level) else if(AIuser) return ..(freq, level) - return FALSE + return -1 /obj/item/device/radio/headset/syndicate //disguised to look like a normal headset for stealth ops @@ -206,25 +209,33 @@ keyslot2 = new /obj/item/device/encryptionkey/ai command = TRUE -/obj/item/device/radio/headset/ai/can_receive(freq, level) - return ..(freq, level, TRUE) +/obj/item/device/radio/headset/ai/receive_range(freq, level) + return ..(freq, level, 1) /obj/item/device/radio/headset/attackby(obj/item/W, mob/user, params) user.set_machine(src) if(istype(W, /obj/item/screwdriver)) if(keyslot || keyslot2) + + for(var/ch_name in channels) SSradio.remove_object(src, GLOB.radiochannels[ch_name]) secure_radio_connections[ch_name] = null - var/turf/T = user.drop_location() - if(T) - if(keyslot) - keyslot.forceMove(T) + + if(keyslot) + var/turf/T = get_turf(user) + if(T) + keyslot.loc = T keyslot = null - if(keyslot2) - keyslot2.forceMove(T) + + + + if(keyslot2) + var/turf/T = get_turf(user) + if(T) + keyslot2.loc = T keyslot2 = null recalculateChannels() @@ -233,7 +244,7 @@ else to_chat(user, "This headset doesn't have any unique encryption keys! How useless...") - else if(istype(W, /obj/item/device/encryptionkey)) + else if(istype(W, /obj/item/device/encryptionkey/)) if(keyslot && keyslot2) to_chat(user, "The headset can't hold another key!") return @@ -258,19 +269,26 @@ ..() if(keyslot2) for(var/ch_name in keyslot2.channels) - if(!(ch_name in src.channels)) - channels[ch_name] = keyslot2.channels[ch_name] + if(ch_name in src.channels) + continue + src.channels += ch_name + src.channels[ch_name] = keyslot2.channels[ch_name] if(keyslot2.translate_binary) - translate_binary = TRUE + src.translate_binary = 1 + if(keyslot2.syndie) - syndie = TRUE + src.syndie = 1 + if (keyslot2.independent) independent = TRUE + for(var/ch_name in channels) secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name]) + return + /obj/item/device/radio/headset/AltClick(mob/living/user) if(!istype(user) || !Adjacent(user) || user.incapacitated()) return diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 680839c20d..3e9ce8c341 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -101,22 +101,22 @@ ..() ui_interact(user, state = GLOB.default_state) -/obj/item/device/radio/intercom/can_receive(freq, level) +/obj/item/device/radio/intercom/receive_range(freq, level) if(!on) - return FALSE + return -1 if(wires.is_cut(WIRE_RX)) - return FALSE + return -1 if(!(0 in level)) var/turf/position = get_turf(src) if(isnull(position) || !(position.z in level)) - return FALSE + return -1 if(!src.listening) - return FALSE - if(freq == FREQ_SYNDICATE) + return -1 + if(freq == GLOB.SYND_FREQ) if(!(src.syndie)) - return FALSE//Prevents broadcast of messages over devices lacking the encryption + return -1//Prevents broadcast of messages over devices lacking the encryption - return TRUE + return canhear_range /obj/item/device/radio/intercom/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 515b5f5707..236f3df93e 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -1,11 +1,32 @@ /obj/item/device/radio icon = 'icons/obj/radio.dmi' name = "station bounced radio" + suffix = "\[3\]" icon_state = "walkietalkie" item_state = "walkietalkie" desc = "A basic handheld radio that communicates with local telecommunication networks." dog_fashion = /datum/dog_fashion/back - + var/on = TRUE // 0 for off + var/last_transmission + var/frequency = 1459 //common chat + var/traitor_frequency = 0 //tune to frequency to unlock traitor supplies + var/canhear_range = 3 // the range which mobs can hear this radio from + var/list/secure_radio_connections + var/prison_radio = 0 + var/b_stat = 0 + var/broadcasting = 0 + var/listening = 1 + var/translate_binary = 0 + var/freerange = 0 // 0 - Sanitize frequencies, 1 - Full range + var/list/channels = list() //see communications.dm for full list. First channes is a "default" for :h + var/obj/item/device/encryptionkey/keyslot //To allow the radio to accept encryption keys. + var/subspace_switchable = 0 + var/subspace_transmission = 0 + var/syndie = 0//Holder to see if it's a syndicate encrpyed radio + var/independent = FALSE // If true, bypasses any tcomms machinery. + var/freqlock = 0 //Frequency lock to stop the user from untuning specialist radios. + var/emped = 0 //Highjacked to track the number of consecutive EMPs on the radio, allowing consecutive EMP's to stack properly. +// "Example" = FREQ_LISTENING|FREQ_BROADCASTING flags_1 = CONDUCT_1 | HEAR_1 flags_2 = NO_EMP_WIRES_2 slot_flags = SLOT_BELT @@ -14,33 +35,12 @@ w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=75, MAT_GLASS=25) - var/on = TRUE - var/frequency = FREQ_COMMON - var/traitor_frequency = 0 // If tuned to this frequency, uplink will be unlocked. - var/canhear_range = 3 // The range around the radio in which mobs can hear what it receives. - var/emped = 0 // Tracks the number of EMPs currently stacked. - - var/broadcasting = FALSE // Whether the radio will transmit dialogue it hears nearby. - var/listening = TRUE // Whether the radio is currently receiving. - var/prison_radio = FALSE // If true, the transmit wire starts cut. - var/unscrewed = FALSE // Whether wires are accessible. Toggleable by screwdrivering. - var/freerange = FALSE // If true, the radio has access to the full spectrum. - var/subspace_transmission = FALSE // If true, the radio transmits and receives on subspace exclusively. - var/subspace_switchable = FALSE // If true, subspace_transmission can be toggled at will. - var/freqlock = FALSE // Frequency lock to stop the user from untuning specialist radios. - var/use_command = FALSE // If true, broadcasts will be large and BOLD. - var/command = FALSE // If true, use_command can be toggled at will. - - // Encryption key handling - var/obj/item/device/encryptionkey/keyslot - var/translate_binary = FALSE // If true, can hear the special binary channel. - var/independent = FALSE // If true, can say/hear on the special CentCom channel. - var/syndie = FALSE // If true, hears all well-known channels automatically, and can say/hear on the Syndicate channel. - var/list/channels = list() // Map from name (see communications.dm) to on/off. First entry is current department (:h). - var/list/secure_radio_connections - + var/const/TRANSMISSION_DELAY = 5 // only 2/second/radio var/const/FREQ_LISTENING = 1 - //FREQ_BROADCASTING = 2 + //FREQ_BROADCASTING = 2 + + var/command = FALSE //If we are speaking into a command headset, our text can be BOLD + var/use_command = FALSE /obj/item/device/radio/proc/set_frequency(new_frequency) remove_radio(src, frequency) @@ -48,19 +48,23 @@ /obj/item/device/radio/proc/recalculateChannels() channels = list() - translate_binary = FALSE - syndie = FALSE + translate_binary = 0 + syndie = 0 independent = FALSE if(keyslot) for(var/ch_name in keyslot.channels) - if(!(ch_name in channels)) - channels[ch_name] = keyslot.channels[ch_name] + if(ch_name in src.channels) + continue + channels += ch_name + channels[ch_name] = keyslot.channels[ch_name] if(keyslot.translate_binary) - translate_binary = TRUE + translate_binary = 1 + if(keyslot.syndie) - syndie = TRUE + syndie = 1 + if(keyslot.independent) independent = TRUE @@ -74,9 +78,10 @@ recalculateChannels() /obj/item/device/radio/Destroy() + qdel(wires) + wires = null remove_radio_all(src) //Just to be sure - QDEL_NULL(wires) - QDEL_NULL(keyslot) + keyslot = null return ..() /obj/item/device/radio/Initialize() @@ -94,7 +99,7 @@ /obj/item/device/radio/interact(mob/user) if (..()) return - if(unscrewed && !isAI(user)) + if(b_stat && !isAI(user)) wires.interact(user) else ui_interact(user) @@ -301,7 +306,7 @@ if(independent) var/datum/signal/signal = new - signal.transmission_method = TRANSMISSION_SUBSPACE + signal.transmission_method = 2 signal.data = list( "mob" = M, // store a reference to the mob "mobtype" = M.type, // the mob's type @@ -339,8 +344,9 @@ if(subspace_transmission) // First, we want to generate a new radio signal var/datum/signal/signal = new - signal.transmission_method = TRANSMISSION_SUBSPACE - // --- Finally, tag the actual signal with the appropriate values --- + signal.transmission_method = 2 // 2 would be a subspace transmission. + // transmission_method could probably be enumerated through #define. Would be neater. + // --- Finally, tag the actual signal with the appropriate values --- signal.data = list( // Identity-associated tags: "mob" = M, // store a reference to the mob @@ -391,7 +397,7 @@ var/filter_type = 2 var/datum/signal/signal = new - signal.transmission_method = TRANSMISSION_SUBSPACE + signal.transmission_method = 2 /* --- Try to send a normal subspace broadcast first */ @@ -451,30 +457,30 @@ raw_message = stars(raw_message) talk_into(speaker, raw_message, , spans, language=message_language) -/obj/item/device/radio/proc/can_receive(freq, level) +/obj/item/device/radio/proc/receive_range(freq, level) // check if this radio can receive on the given frequency, and if so, // what the range is in which mobs will hear the radio // returns: -1 if can't receive, range otherwise if (wires.is_cut(WIRE_RX)) - return FALSE + return -1 if(!listening) - return FALSE + return -1 if(!(0 in level)) var/turf/position = get_turf(src) if(!position || !(position.z in level)) - return FALSE - if(freq == FREQ_SYNDICATE) + return -1 + if(freq == GLOB.SYND_FREQ) if(!(src.syndie)) //Checks to see if it's allowed on that frequency, based on the encryption keys - return FALSE - if(freq == FREQ_CENTCOM) + return -1 + if(freq == GLOB.CENTCOM_FREQ) if(!independent) - return FALSE + return -1 if (!on) - return FALSE + return -1 if (!freq) //received on main frequency if (!listening) - return FALSE + return -1 else var/accept = (freq==frequency && listening) if (!accept) @@ -484,13 +490,19 @@ accept = 1 break if (!accept) - return FALSE - return TRUE + return -1 + return canhear_range + +/obj/item/device/radio/proc/send_hear(freq, level) + + var/range = receive_range(freq, level) + if(range > -1) + return get_hearers_in_view(canhear_range, src) /obj/item/device/radio/examine(mob/user) ..() - if (unscrewed) + if (b_stat) to_chat(user, "It can be attached and modified.") else to_chat(user, "It cannot be modified or attached.") @@ -498,8 +510,8 @@ /obj/item/device/radio/attackby(obj/item/W, mob/user, params) add_fingerprint(user) if(istype(W, /obj/item/screwdriver)) - unscrewed = !unscrewed - if(unscrewed) + b_stat = !b_stat + if(b_stat) to_chat(user, "The radio can now be attached and modified!") else to_chat(user, "The radio can no longer be modified or attached!") @@ -511,8 +523,8 @@ var/curremp = emped //Remember which EMP this was if (listening && ismob(loc)) // if the radio is turned on and on someone's person they notice to_chat(loc, "\The [src] overloads.") - broadcasting = FALSE - listening = FALSE + broadcasting = 0 + listening = 0 for (var/ch_name in channels) channels[ch_name] = 0 on = FALSE @@ -530,7 +542,7 @@ /obj/item/device/radio/borg name = "cyborg radio" - subspace_switchable = TRUE + subspace_switchable = 1 dog_fashion = null flags_2 = NO_EMP_WIRES_2 @@ -543,7 +555,7 @@ /obj/item/device/radio/borg/syndicate/Initialize() . = ..() - set_frequency(FREQ_SYNDICATE) + set_frequency(GLOB.SYND_FREQ) /obj/item/device/radio/borg/attackby(obj/item/W, mob/user, params) @@ -557,7 +569,7 @@ if(keyslot) var/turf/T = get_turf(user) if(T) - keyslot.forceMove(T) + keyslot.loc = T keyslot = null recalculateChannels() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 1cfa355cbb..3f17485550 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -335,7 +335,6 @@ GAS ANALYZER throw_speed = 3 throw_range = 7 materials = list(MAT_METAL=30, MAT_GLASS=20) - grind_results = list("mercury" = 5, "iron" = 5, "silicon" = 5) /obj/item/device/analyzer/attack_self(mob/user) @@ -396,7 +395,6 @@ GAS ANALYZER to_chat(user, "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %") to_chat(user, "Temperature: [round(environment.temperature-T0C)] °C") - /obj/item/device/slime_scanner name = "slime scanner" desc = "A device that analyzes a slime's internal composition and measures its stats." diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 879f069f6a..d334d12193 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -1,3 +1,4 @@ + /obj/item/extinguisher name = "fire extinguisher" desc = "A traditional red fire extinguisher." diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 8698594555..e791a74541 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -110,12 +110,12 @@ else if(stage == WIRED && istype(I, /obj/item/wrench)) if(beakers.len) for(var/obj/O in beakers) - O.forceMove(drop_location()) + O.loc = get_turf(src) beakers = list() to_chat(user, "You open the [initial(name)] assembly and remove the payload.") return // First use of the wrench remove beakers, then use the wrench to remove the activation mechanism. if(nadeassembly) - nadeassembly.forceMove(drop_location()) + nadeassembly.loc = get_turf(src) nadeassembly.master = null nadeassembly = null else // If "nadeassembly = null && stage == WIRED", then it most have been cable_coil that was used. @@ -167,7 +167,7 @@ playsound(loc, 'sound/items/screwdriver2.ogg', 50, 1) if(beakers.len) for(var/obj/O in beakers) - O.forceMove(drop_location()) + O.loc = get_turf(src) beakers = list() stage_change(EMPTY) return diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm index 5b96b74f41..fadf9d34de 100644 --- a/code/game/objects/items/grenades/ghettobomb.dm +++ b/code/game/objects/items/grenades/ghettobomb.dm @@ -1,60 +1,60 @@ -//improvised explosives// - -/obj/item/grenade/iedcasing - name = "improvised firebomb" - desc = "A weak, improvised incendiary device." - w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/grenade.dmi' - icon_state = "improvised_grenade" - item_state = "flashbang" - lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - throw_speed = 3 - throw_range = 7 - flags_1 = CONDUCT_1 - slot_flags = SLOT_BELT - active = 0 - det_time = 50 - display_timer = 0 - var/range = 3 - var/list/times - -/obj/item/grenade/iedcasing/Initialize() - . = ..() - add_overlay("improvised_grenade_filled") - add_overlay("improvised_grenade_wired") - times = list("5" = 10, "-1" = 20, "[rand(30,80)]" = 50, "[rand(65,180)]" = 20)// "Premature, Dud, Short Fuse, Long Fuse"=[weighting value] - det_time = text2num(pickweight(times)) - if(det_time < 0) //checking for 'duds' - range = 1 - det_time = rand(30,80) - else - range = pick(2,2,2,3,3,3,4) - -/obj/item/grenade/iedcasing/CheckParts(list/parts_list) - ..() - var/obj/item/reagent_containers/food/drinks/soda_cans/can = locate() in contents - if(can) - can.pixel_x = 0 //Reset the sprite's position to make it consistent with the rest of the IED - can.pixel_y = 0 - var/mutable_appearance/can_underlay = new(can) - can_underlay.layer = FLOAT_LAYER - can_underlay.plane = FLOAT_PLANE - underlays += can_underlay - - -/obj/item/grenade/iedcasing/attack_self(mob/user) // - if(!active) - if(clown_check(user)) - to_chat(user, "You light the [name]!") - cut_overlay("improvised_grenade_filled") +//improvised explosives// + +/obj/item/grenade/iedcasing + name = "improvised firebomb" + desc = "A weak, improvised incendiary device." + w_class = WEIGHT_CLASS_SMALL + icon = 'icons/obj/grenade.dmi' + icon_state = "improvised_grenade" + item_state = "flashbang" + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + throw_speed = 3 + throw_range = 7 + flags_1 = CONDUCT_1 + slot_flags = SLOT_BELT + active = 0 + det_time = 50 + display_timer = 0 + var/range = 3 + var/list/times + +/obj/item/grenade/iedcasing/Initialize() + . = ..() + add_overlay("improvised_grenade_filled") + add_overlay("improvised_grenade_wired") + times = list("5" = 10, "-1" = 20, "[rand(30,80)]" = 50, "[rand(65,180)]" = 20)// "Premature, Dud, Short Fuse, Long Fuse"=[weighting value] + det_time = text2num(pickweight(times)) + if(det_time < 0) //checking for 'duds' + range = 1 + det_time = rand(30,80) + else + range = pick(2,2,2,3,3,3,4) + +/obj/item/grenade/iedcasing/CheckParts(list/parts_list) + ..() + var/obj/item/reagent_containers/food/drinks/soda_cans/can = locate() in contents + if(can) + can.pixel_x = 0 //Reset the sprite's position to make it consistent with the rest of the IED + can.pixel_y = 0 + var/mutable_appearance/can_underlay = new(can) + can_underlay.layer = FLOAT_LAYER + can_underlay.plane = FLOAT_PLANE + underlays += can_underlay + + +/obj/item/grenade/iedcasing/attack_self(mob/user) // + if(!active) + if(clown_check(user)) + to_chat(user, "You light the [name]!") + cut_overlay("improvised_grenade_filled") preprime(user, null, FALSE) - -/obj/item/grenade/iedcasing/prime() //Blowing that can up - update_mob() - explosion(src.loc,-1,-1,2, flame_range = 4) // small explosion, plus a very large fireball. - qdel(src) - -/obj/item/grenade/iedcasing/examine(mob/user) - ..() - to_chat(user, "You can't tell when it will explode!") + +/obj/item/grenade/iedcasing/prime() //Blowing that can up + update_mob() + explosion(src.loc,-1,-1,2, flame_range = 4) // small explosion, plus a very large fireball. + qdel(src) + +/obj/item/grenade/iedcasing/examine(mob/user) + ..() + to_chat(user, "You can't tell when it will explode!") diff --git a/code/game/objects/items/grenades/syndieminibomb.dm b/code/game/objects/items/grenades/syndieminibomb.dm index 723c578a68..e1866a3e69 100644 --- a/code/game/objects/items/grenades/syndieminibomb.dm +++ b/code/game/objects/items/grenades/syndieminibomb.dm @@ -48,4 +48,4 @@ for(var/mob/living/carbon/L in T) L.adjustStaminaLoss(stamina_damage) L.bodytemperature -= 230 - qdel(src) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index af2a3af597..886a248c8c 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -379,3 +379,4 @@ B.Crossed(hit_atom) qdel(src) ..() + diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 21e3f26cd7..cde3f127ed 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -9,8 +9,8 @@ throw_speed = 3 throw_range = 4 throwforce = 10 - w_class = WEIGHT_CLASS_TINY unique_rename = TRUE + w_class = WEIGHT_CLASS_TINY var/reskinned = FALSE /obj/item/nullrod/suicide_act(mob/user) @@ -354,11 +354,6 @@ w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP -/obj/item/nullrod/armblade/tentacle - name = "unholy blessing" - icon_state = "tentacle" - item_state = "tentacle" - /obj/item/nullrod/carp name = "carp-sie plushie" desc = "An adorable stuffed toy that resembles the god of all carp. The teeth look pretty sharp. Activate it to receive the blessing of Carp-Sie." diff --git a/code/game/objects/items/implants/implantcase.dm b/code/game/objects/items/implants/implantcase.dm index 12d8641211..7c363fe052 100644 --- a/code/game/objects/items/implants/implantcase.dm +++ b/code/game/objects/items/implants/implantcase.dm @@ -13,7 +13,6 @@ var/obj/item/implant/imp = null var/imp_type - /obj/item/implantcase/update_icon() if(imp) icon_state = "implantcase-[imp.item_color]" @@ -39,7 +38,7 @@ if(I.imp) if(imp || I.imp.imp_in) return - I.imp.forceMove(src) + I.imp.loc = src imp = I.imp I.imp = null update_icon() @@ -48,7 +47,7 @@ if(imp) if(I.imp) return - imp.forceMove(I) + imp.loc = I I.imp = imp imp = null update_icon() diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 62a354995b..e47cafdea9 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -3,8 +3,6 @@ name = "mop" icon = 'icons/obj/janitor.dmi' icon_state = "mop" - lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' force = 3 throwforce = 5 throw_speed = 3 diff --git a/code/game/objects/items/paiwire.dm b/code/game/objects/items/paiwire.dm index 994082c5fa..a20f89bc2b 100644 --- a/code/game/objects/items/paiwire.dm +++ b/code/game/objects/items/paiwire.dm @@ -10,4 +10,4 @@ if(!user.transferItemToLoc(src, M)) return user.visible_message("[user] inserts [src] into a data port on [M].", "You insert [src] into a data port on [M].", "You hear the satisfying click of a wire jack fastening into place.") - machine = M \ No newline at end of file + machine = M diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index a6d0d285bf..d291a7ca7d 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -54,7 +54,6 @@ return if(!target) add_overlay("pinon[alert ? "alert" : ""]null") - return var/turf/here = get_turf(src) var/turf/there = get_turf(target) if(here.z != there.z) @@ -111,8 +110,7 @@ var/crewmember_name = "Unknown" if(H.wear_id) var/obj/item/card/id/I = H.wear_id.GetID() - if(I && I.registered_name) - crewmember_name = I.registered_name + crewmember_name = I.registered_name while(crewmember_name in name_counts) name_counts[crewmember_name]++ diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 649293a7de..8bd5d570e2 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -504,4 +504,4 @@ item_state = "plushie_slime" attack_verb = list("blorbled", "slimed", "absorbed") squeak_override = list('sound/effects/blobattack.ogg' = 1) - gender = FEMALE //given all the jokes and drawings, I'm not sure the xenobiologists would make a slimeboy \ No newline at end of file + gender = FEMALE //given all the jokes and drawings, I'm not sure the xenobiologists would make a slimeboy diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 3d0c9ed8e7..e4485266b5 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -703,4 +703,4 @@ /obj/item/borg/sight/hud/sec/New() ..() hud = new /obj/item/clothing/glasses/hud/security(src) - return + return \ No newline at end of file diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 339b7fbf4b..09e3ccdeb0 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -69,7 +69,7 @@ if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) if (M.use(1)) var/obj/item/ed209_assembly/B = new /obj/item/ed209_assembly - B.forceMove(drop_location()) + B.loc = get_turf(src) to_chat(user, "You arm the robot frame.") var/holding_this = user.get_inactive_held_item()==src qdel(src) @@ -227,7 +227,7 @@ O.job = "Cyborg" O.cell = chest.cell - chest.cell.forceMove(O) + chest.cell.loc = O chest.cell = null W.forceMove(O)//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. if(O.mmi) //we delete the mmi created by robot/New() @@ -271,7 +271,7 @@ O.cell = chest.cell - chest.cell.forceMove(O) + chest.cell.loc = O chest.cell = null O.locked = panel_locked O.job = "Cyborg" diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index c0500f5d21..586d21555c 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -21,7 +21,7 @@ cut_overlays() /obj/item/target/Move() - . = ..() + ..() if(pinnedLoc) pinnedLoc.forceMove(loc) diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 978966706e..5276050b03 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -9,7 +9,6 @@ points = 50 var/blink_range = 8 // The teleport range when crushed/thrown at someone. refined_type = /obj/item/stack/sheet/bluespace_crystal - grind_results = list("bluespace" = 2) /obj/item/ore/bluespace_crystal/refined name = "refined bluespace crystal" @@ -49,7 +48,6 @@ blink_range = 4 // Not as good as the organic stuff! points = 0 //nice try refined_type = null - grind_results = list("bluespace" = 1, "silicon" = 2) //Polycrystals, aka stacks /obj/item/stack/sheet/bluespace_crystal @@ -60,7 +58,6 @@ materials = list(MAT_BLUESPACE=MINERAL_MATERIAL_AMOUNT) attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed") novariants = TRUE - grind_results = list("bluespace" = 2) var/crystal_type = /obj/item/ore/bluespace_crystal/refined /obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 7a0f85a8f2..560182d9c7 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -111,7 +111,6 @@ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' heal_brute = 40 self_delay = 20 - grind_results = list("styptic_powder" = 1) /obj/item/stack/medical/bruise_pack/suicide_act(mob/user) user.visible_message("[user] is bludgeoning [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -148,4 +147,3 @@ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' heal_burn = 40 self_delay = 20 - grind_results = list("silver_sulfadiazine" = 1) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 8cc6a60efa..0544598246 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -22,7 +22,6 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/glass - grind_results = list("silicon" = 1) /obj/item/stack/sheet/glass/cyborg materials = list() @@ -80,7 +79,6 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmaglass - grind_results = list("silicon" = 1, "plasma" = 1) /obj/item/stack/sheet/plasmaglass/fifty amount = 50 @@ -130,7 +128,6 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 70, acid = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass - grind_results = list("silicon" = 1, "iron" = 1) /obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params) add_fingerprint(user) @@ -171,7 +168,6 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmarglass - grind_results = list("silicon" = 1, "plasma" = 1, "iron" = 1) /obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.prglass_recipes diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index 051d8326b8..a02d182f1c 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -1,38 +1,37 @@ -/obj/item/stack/light_w - name = "wired glass tile" - singular_name = "wired glass floor tile" - desc = "A glass tile, which is wired, somehow." - icon = 'icons/obj/tiles.dmi' - icon_state = "glass_wire" - w_class = WEIGHT_CLASS_NORMAL - force = 3 - throwforce = 5 - throw_speed = 3 - throw_range = 7 +/obj/item/stack/light_w + name = "wired glass tile" + singular_name = "wired glass floor tile" + desc = "A glass tile, which is wired, somehow." + icon = 'icons/obj/tiles.dmi' + icon_state = "glass_wire" + w_class = WEIGHT_CLASS_NORMAL + force = 3 + throwforce = 5 + throw_speed = 3 + throw_range = 7 flags_1 = CONDUCT_1 - max_amount = 60 - grind_results = list("silicon" = 1, "copper" = 1) - -/obj/item/stack/light_w/attackby(obj/item/O, mob/user, params) - + max_amount = 60 + +/obj/item/stack/light_w/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/wirecutters)) - var/obj/item/stack/cable_coil/CC = new (user.loc) - CC.amount = 5 - CC.add_fingerprint(user) - amount-- - var/obj/item/stack/sheet/glass/G = new (user.loc) - G.add_fingerprint(user) - if(amount <= 0) - qdel(src) - - else if(istype(O, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = O - if (M.use(1)) - use(1) - var/obj/item/L = new /obj/item/stack/tile/light(user.loc) - to_chat(user, "You make a light tile.") - L.add_fingerprint(user) - else - to_chat(user, "You need one metal sheet to finish the light tile!") - else - return ..() + var/obj/item/stack/cable_coil/CC = new (user.loc) + CC.amount = 5 + CC.add_fingerprint(user) + amount-- + var/obj/item/stack/sheet/glass/G = new (user.loc) + G.add_fingerprint(user) + if(amount <= 0) + qdel(src) + + else if(istype(O, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/M = O + if (M.use(1)) + use(1) + var/obj/item/L = new /obj/item/stack/tile/light(user.loc) + to_chat(user, "You make a light tile.") + L.add_fingerprint(user) + else + to_chat(user, "You need one metal sheet to finish the light tile!") + else + return ..() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index e44366daec..e2ae00d06c 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -126,7 +126,6 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ sheettype = "uranium" materials = list(MAT_URANIUM=MINERAL_MATERIAL_AMOUNT) novariants = TRUE - grind_results = list("uranium" = 20) GLOBAL_LIST_INIT(uranium_recipes, list ( \ new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \ @@ -150,7 +149,6 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ resistance_flags = FLAMMABLE max_integrity = 100 materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) - grind_results = list("plasma" = 20) GLOBAL_LIST_INIT(plasma_recipes, list ( \ new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \ @@ -184,7 +182,6 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ singular_name = "gold bar" sheettype = "gold" materials = list(MAT_GOLD=MINERAL_MATERIAL_AMOUNT) - grind_results = list("gold" = 20) GLOBAL_LIST_INIT(gold_recipes, list ( \ new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \ @@ -210,7 +207,6 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ singular_name = "silver bar" sheettype = "silver" materials = list(MAT_SILVER=MINERAL_MATERIAL_AMOUNT) - grind_results = list("silver" = 20) GLOBAL_LIST_INIT(silver_recipes, list ( \ new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \ @@ -236,7 +232,6 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ sheettype = "clown" materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT) novariants = TRUE - grind_results = list("banana" = 20) GLOBAL_LIST_INIT(clown_recipes, list ( \ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \ @@ -307,7 +302,6 @@ GLOBAL_LIST_INIT(plastitanium_recipes, list ( \ singular_name = "snow block" force = 1 throwforce = 2 - grind_results = list("ice" = 20) GLOBAL_LIST_INIT(snow_recipes, list ( \ new/datum/stack_recipe("Snow Wall", /turf/closed/wall/mineral/snow, 5, one_per_turf = 1, on_floor = 1), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 940750bac3..d8019d98a3 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -19,6 +19,10 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \ + new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = TRUE, on_floor = TRUE), \ + new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, one_per_turf = TRUE, on_floor = TRUE), \ + new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, one_per_turf = TRUE, on_floor = TRUE), \ + new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, one_per_turf = TRUE, on_floor = TRUE), \ null, \ new/datum/stack_recipe_list("office chairs", list( \ new/datum/stack_recipe("dark office chair", /obj/structure/chair/office/dark, 5, one_per_turf = TRUE, on_floor = TRUE), \ @@ -95,7 +99,6 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ flags_1 = CONDUCT_1 resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/metal - grind_results = list("iron" = 20) /obj/item/stack/sheet/metal/ratvar_act() new /obj/item/stack/tile/brass(loc, amount) @@ -148,7 +151,6 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 80) resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/plasteel - grind_results = list("iron" = 20, "plasma" = 20) /obj/item/stack/sheet/plasteel/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.plasteel_recipes @@ -200,7 +202,6 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/wood novariants = TRUE - grind_results = list("carbon" = 20) /obj/item/stack/sheet/mineral/wood/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.wood_recipes @@ -321,7 +322,6 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \ sheettype = "runed" merge_type = /obj/item/stack/sheet/runed_metal novariants = TRUE - grind_results = list("iron" = 0.5, "blood" = 1.5) /obj/item/stack/sheet/runed_metal/ratvar_act() new /obj/item/stack/tile/brass(loc, amount) @@ -385,7 +385,6 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ throw_range = 3 turf_type = /turf/open/floor/clockwork novariants = FALSE - grind_results = list("iron" = 0.5, "teslium" = 1.5) /obj/item/stack/tile/brass/narsie_act() new /obj/item/stack/sheet/runed_metal(loc, amount) @@ -436,7 +435,6 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \ w_class = WEIGHT_CLASS_NORMAL throw_speed = 1 throw_range = 3 - grind_results = list("carbon" = 1) GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d50239f79d..1faad3462b 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -21,17 +21,6 @@ var/merge_type = null // This path and its children should merge with this stack, defaults to src.type var/full_w_class = WEIGHT_CLASS_NORMAL //The weight class the stack should have at amount > 2/3rds max_amount var/novariants = TRUE //Determines whether the item should update it's sprites based on amount. - //NOTE: When adding grind_results, the amounts should be for an INDIVIDUAL ITEM - these amounts will be multiplied by the stack size in on_grind() - -/obj/item/stack/on_grind() - for(var/i in 1 to grind_results.len) //This should only call if it's ground, so no need to check if grind_results exists - grind_results[grind_results[i]] *= amount //Gets the key at position i, then the reagent amount of that key, then multiplies it by stack size - -/obj/item/stack/grind_requirements() - if(is_cyborg) - to_chat(usr, "[src] is electronically synthesized in your chassis and can't be ground up!") - return - return TRUE /obj/item/stack/Initialize(mapload, new_amount=null , merge = TRUE) . = ..() diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index 0703eba47a..df40b2898c 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -54,4 +54,3 @@ new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) new /obj/item/suppressor/specialoffer(src) - diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index 3c1789fb7f..6ea3529b3b 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -182,8 +182,6 @@ var/cy = ty boxes.screen_loc = "[tx]:,[ty] to [mx],[my]" for(var/obj/O in contents) - if(QDELETED(O)) - continue O.screen_loc = "[cx],[cy]" O.layer = ABOVE_HUD_LAYER O.plane = ABOVE_HUD_PLANE @@ -213,8 +211,6 @@ cy-- else for(var/obj/O in contents) - if(QDELETED(O)) - continue O.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" O.screen_loc = "[cx]:16,[cy]:16" O.maptext = "" @@ -248,8 +244,6 @@ numbered_contents = list() adjusted_contents = 0 for(var/obj/item/I in contents) - if(QDELETED(I)) - continue var/found = 0 for(var/datum/numbered_display/ND in numbered_contents) if(ND.sample_object.type == I.type) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index e084c0ae1c..58aadadce0 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -131,7 +131,7 @@ ..() to_chat(user, "The mister snaps back onto the watertank.") tank.on = 0 - forceMove(tank) + loc = tank /obj/item/reagent_containers/spray/mister/attack_self() return @@ -236,13 +236,13 @@ tank = parent_tank reagents = tank.reagents max_water = tank.volume - forceMove(tank) + loc = tank /obj/item/extinguisher/mini/nozzle/Move() ..() if(loc != tank.loc) - forceMove(tank) + loc = tank return /obj/item/extinguisher/mini/nozzle/attack_self(mob/user) @@ -268,7 +268,7 @@ ..() to_chat(user, "The nozzle snaps back onto the tank!") tank.on = 0 - forceMove(tank) + loc = tank /obj/item/extinguisher/mini/nozzle/afterattack(atom/target, mob/user) if(nozzle_mode == EXTINGUISHER) @@ -327,7 +327,7 @@ /obj/effect/resin_container/proc/Smoke() var/obj/effect/particle_effect/foam/metal/resin/S = new /obj/effect/particle_effect/foam/metal/resin(get_turf(loc)) - S.amount = 4 + S.amount = 3 playsound(src,'sound/effects/bamf.ogg',100,1) qdel(src) diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index 49aa5b5363..93876164b4 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -1,4 +1,3 @@ - #define SOURCE_PORTAL 1 #define DESTINATION_PORTAL 2 @@ -17,7 +16,7 @@ icon = 'icons/obj/device.dmi' icon_state = "locator" var/temp = null - var/frequency = FREQ_LOCATOR_IMPLANT + var/frequency = 1451 var/broadcasting = null var/listening = 1 flags_1 = CONDUCT_1 @@ -208,7 +207,7 @@ Frequency: current_area = current_location.loc if(!current_location || current_area.noteleport || current_location.z > ZLEVEL_SPACEMAX || !isturf(user.loc))//If turf was not found or they're on z level 2 or >7 which does not currently exist. or if user is not located on a turf to_chat(user, "\The [src] is malfunctioning.") - return + return user.show_message("Locked In.", 2) var/list/obj/effect/portal/created = create_portal_pair(current_location, get_teleport_turf(get_turf(T)), src, 300, 1) if(!(LAZYLEN(created) == 2)) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index 95d209585f..e00513a47a 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -138,7 +138,7 @@ return FALSE forceMove(tongs) tongs.sliver = src - tongs.update_icon() + tongs.icon_state = "supermatter_tongs_loaded" to_chat(user, "You carefully pick up [src] with [tongs].") else if(istype(W, /obj/item/scalpel/supermatter) || istype(W, /obj/item/nuke_core_container/supermatter/)) // we don't want it to dust return @@ -217,12 +217,6 @@ QDEL_NULL(sliver) return ..() -/obj/item/hemostat/supermatter/update_icon() - if(sliver) - icon_state = "supermatter_tongs_loaded" - else - icon_state = "supermatter_tongs" - /obj/item/hemostat/supermatter/afterattack(atom/O, mob/user, proximity) if(!sliver) return @@ -230,14 +224,12 @@ Consume(O) to_chat(usr, "\The [sliver] is dusted along with \the [O]!") QDEL_NULL(sliver) - update_icon() /obj/item/hemostat/supermatter/throw_impact(atom/hit_atom) // no instakill supermatter javelins if(sliver) sliver.forceMove(loc) to_chat(usr, "\The [sliver] falls out of \the [src] as you throw them.") sliver = null - update_icon() ..() /obj/item/hemostat/supermatter/proc/Consume(atom/movable/AM, mob/user) @@ -255,5 +247,6 @@ radiation_pulse(user, 500, 2) playsound(src, 'sound/effects/supermatter.ogg', 50, 1) user.dust() + icon_state = "supermatter_tongs" QDEL_NULL(sliver) - update_icon() + diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 20f123d319..1c20c95e93 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -1,345 +1,339 @@ -#define WELDER_FUEL_BURN_INTERVAL 13 -/obj/item/weldingtool - name = "welding tool" - desc = "A standard edition welder provided by Nanotrasen." - icon = 'icons/obj/tools.dmi' - icon_state = "welder" - item_state = "welder" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - flags_1 = CONDUCT_1 - slot_flags = SLOT_BELT - force = 3 - throwforce = 5 - hitsound = "swing_hit" - usesound = 'sound/items/welder.ogg' - var/acti_sound = 'sound/items/welderactivate.ogg' - var/deac_sound = 'sound/items/welderdeactivate.ogg' - throw_speed = 3 - throw_range = 5 - w_class = WEIGHT_CLASS_SMALL - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30) - resistance_flags = FIRE_PROOF - - materials = list(MAT_METAL=70, MAT_GLASS=30) - var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2) - var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower) - var/max_fuel = 20 //The max amount of fuel the welder can hold - var/change_icons = 1 - var/can_off_process = 0 - var/light_intensity = 2 //how powerful the emitted light is when used. - var/burned_fuel_for = 0 //when fuel was last removed - heat = 3800 - toolspeed = 1 - -/obj/item/weldingtool/Initialize() - . = ..() - create_reagents(max_fuel) - reagents.add_reagent("welding_fuel", max_fuel) - update_icon() - - -/obj/item/weldingtool/proc/update_torch() - if(welding) - add_overlay("[initial(icon_state)]-on") - item_state = "[initial(item_state)]1" - else - item_state = "[initial(item_state)]" - - -/obj/item/weldingtool/update_icon() - cut_overlays() - if(change_icons) - var/ratio = get_fuel() / max_fuel - ratio = Ceiling(ratio*4) * 25 - add_overlay("[initial(icon_state)][ratio]") - update_torch() - return - - -/obj/item/weldingtool/process() - switch(welding) - if(0) - force = 3 - damtype = "brute" - update_icon() - if(!can_off_process) - STOP_PROCESSING(SSobj, src) - return - //Welders left on now use up fuel, but lets not have them run out quite that fast - if(1) - force = 15 - damtype = "fire" - ++burned_fuel_for - if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL) - remove_fuel(1) - update_icon() - - //This is to start fires. process() is only called if the welder is on. - open_flame() - - -/obj/item/weldingtool/suicide_act(mob/user) - user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!") - return (FIRELOSS) - - -/obj/item/weldingtool/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) - flamethrower_screwdriver(I, user) - else if(istype(I, /obj/item/stack/rods)) - flamethrower_rods(I, user) - else - . = ..() - update_icon() - -/obj/item/weldingtool/proc/explode() - var/turf/T = get_turf(loc) - var/plasmaAmount = reagents.get_reagent_amount("plasma") - dyn_explosion(T, plasmaAmount/5)//20 plasma in a standard welder has a 4 power explosion. no breaches, but enough to kill/dismember holder - qdel(src) - -/obj/item/weldingtool/attack(mob/living/carbon/human/H, mob/user) - if(!istype(H)) - return ..() - - var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) - - if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM) - if(src.remove_fuel(1)) - playsound(loc, usesound, 50, 1) - if(user == H) - user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name].", "You start fixing some of the dents on [H]'s [affecting.name].") - if(!do_mob(user, H, 50)) - return - item_heal_robotic(H, user, 15, 0) - else - return ..() - - -/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity) - if(!proximity) - return - if(!status && istype(O, /obj/item/reagent_containers) && O.is_open_container()) - reagents.trans_to(O, reagents.total_volume) - to_chat(user, "You empty [src]'s fuel tank into [O].") - update_icon() - if(welding) - remove_fuel(1) - var/turf/location = get_turf(user) - location.hotspot_expose(700, 50, 1) - if(get_fuel() <= 0) - set_light(0) - - if(isliving(O)) - var/mob/living/L = O - if(L.IgniteMob()) - message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire") - log_game("[key_name(user)] set [key_name(L)] on fire") - - -/obj/item/weldingtool/attack_self(mob/user) - if(src.reagents.has_reagent("plasma")) - message_admins("[key_name_admin(user)] activated a rigged welder.") - explode() - switched_on(user) - if(welding) - set_light(light_intensity) - - update_icon() - - -//Returns the amount of fuel in the welder -/obj/item/weldingtool/proc/get_fuel() - return reagents.get_reagent_amount("welding_fuel") - - -//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use() -/obj/item/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null) - if(!welding || !check_fuel()) - return 0 - if(amount) - burned_fuel_for = 0 - if(get_fuel() >= amount) - reagents.remove_reagent("welding_fuel", amount) - check_fuel() - if(M) - M.flash_act(light_intensity) - return TRUE - else - if(M) - to_chat(M, "You need more welding fuel to complete this task!") - return FALSE - - -//Turns off the welder if there is no more fuel (does this really need to be its own proc?) -/obj/item/weldingtool/proc/check_fuel(mob/user) - if(get_fuel() <= 0 && welding) - switched_on(user) - update_icon() - //mob icon update - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands(0) - - return 0 - return 1 - -//Switches the welder on -/obj/item/weldingtool/proc/switched_on(mob/user) - if(!status) - to_chat(user, "[src] can't be turned on while unsecured!") - return - welding = !welding - if(welding) - if(get_fuel() >= 1) - to_chat(user, "You switch [src] on.") - playsound(loc, acti_sound, 50, 1) - force = 15 - damtype = "fire" - hitsound = 'sound/items/welder.ogg' - update_icon() - START_PROCESSING(SSobj, src) - else - to_chat(user, "You need more fuel!") - switched_off(user) - else - to_chat(user, "You switch [src] off.") - playsound(loc, deac_sound, 50, 1) - switched_off(user) - -//Switches the welder off -/obj/item/weldingtool/proc/switched_off(mob/user) - welding = 0 - set_light(0) - - force = 3 - damtype = "brute" - hitsound = "swing_hit" - update_icon() - - -/obj/item/weldingtool/examine(mob/user) - ..() - to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].") - -/obj/item/weldingtool/is_hot() - return welding * heat - -//Returns whether or not the welding tool is currently on. -/obj/item/weldingtool/proc/isOn() - return welding - - -/obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) - if(welding) - to_chat(user, "Turn it off first!") - return - status = !status - if(status) - to_chat(user, "You resecure [src] and close the fuel tank.") - container_type = NONE - else - to_chat(user, "[src] can now be attached, modified, and refuelled.") - container_type = OPENCONTAINER_1 - add_fingerprint(user) - -/obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user) - if(!status) - var/obj/item/stack/rods/R = I - if (R.use(1)) - var/obj/item/flamethrower/F = new /obj/item/flamethrower(user.loc) - if(!remove_item_from_storage(F)) - user.transferItemToLoc(src, F, TRUE) - F.weldtool = src - add_fingerprint(user) - to_chat(user, "You add a rod to a welder, starting to build a flamethrower.") - user.put_in_hands(F) - else - to_chat(user, "You need one rod to start building a flamethrower!") - -/obj/item/weldingtool/ignition_effect(atom/A, mob/user) - if(welding && remove_fuel(1, user)) - . = "[user] casually lights [A] with [src], what a badass." - else - . = "" - -/obj/item/weldingtool/largetank - name = "industrial welding tool" - desc = "A slightly larger welder with a larger tank." - icon_state = "indwelder" - max_fuel = 40 - materials = list(MAT_GLASS=60) - -/obj/item/weldingtool/largetank/cyborg - name = "integrated welding tool" - desc = "An advanced welder designed to be used in robotic systems." - toolspeed = 0.5 - -/obj/item/weldingtool/largetank/flamethrower_screwdriver() - return - - -/obj/item/weldingtool/mini - name = "emergency welding tool" - desc = "A miniature welder used during emergencies." - icon_state = "miniwelder" - max_fuel = 10 - w_class = WEIGHT_CLASS_TINY - materials = list(MAT_METAL=30, MAT_GLASS=10) - change_icons = 0 - -/obj/item/weldingtool/mini/flamethrower_screwdriver() - return - -/obj/item/weldingtool/abductor - name = "alien welding tool" - desc = "An alien welding tool. Whatever fuel it uses, it never runs out." - icon = 'icons/obj/abductor.dmi' - icon_state = "welder" - toolspeed = 0.1 - light_intensity = 0 - change_icons = 0 - -/obj/item/weldingtool/abductor/process() - if(get_fuel() <= max_fuel) - reagents.add_reagent("welding_fuel", 1) - ..() - -/obj/item/weldingtool/hugetank - name = "upgraded industrial welding tool" - desc = "An upgraded welder based of the industrial welder." - icon_state = "upindwelder" - item_state = "upindwelder" - max_fuel = 80 - materials = list(MAT_METAL=70, MAT_GLASS=120) - -/obj/item/weldingtool/experimental - name = "experimental welding tool" - desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes." - icon_state = "exwelder" - item_state = "exwelder" - max_fuel = 40 - materials = list(MAT_METAL=70, MAT_GLASS=120) - var/last_gen = 0 - change_icons = 0 - can_off_process = 1 - light_intensity = 1 - toolspeed = 0.5 - var/nextrefueltick = 0 - -/obj/item/weldingtool/experimental/brass - name = "brass welding tool" - desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch." - resistance_flags = FIRE_PROOF | ACID_PROOF - icon_state = "brasswelder" - item_state = "brasswelder" - - -/obj/item/weldingtool/experimental/process() - ..() - if(get_fuel() < max_fuel && nextrefueltick < world.time) - nextrefueltick = world.time + 10 - reagents.add_reagent("welding_fuel", 1) - +#define WELDER_FUEL_BURN_INTERVAL 13 +/obj/item/weldingtool + name = "welding tool" + desc = "A standard edition welder provided by Nanotrasen." + icon = 'icons/obj/tools.dmi' + icon_state = "welder" + item_state = "welder" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + flags_1 = CONDUCT_1 + slot_flags = SLOT_BELT + force = 3 + throwforce = 5 + hitsound = "swing_hit" + usesound = 'sound/items/welder.ogg' + var/acti_sound = 'sound/items/welderactivate.ogg' + var/deac_sound = 'sound/items/welderdeactivate.ogg' + throw_speed = 3 + throw_range = 5 + w_class = WEIGHT_CLASS_SMALL + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30) + resistance_flags = FIRE_PROOF + + materials = list(MAT_METAL=70, MAT_GLASS=30) + var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2) + var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower) + var/max_fuel = 20 //The max amount of fuel the welder can hold + var/change_icons = 1 + var/can_off_process = 0 + var/light_intensity = 2 //how powerful the emitted light is when used. + var/burned_fuel_for = 0 //when fuel was last removed + heat = 3800 + toolspeed = 1 + +/obj/item/weldingtool/Initialize() + . = ..() + create_reagents(max_fuel) + reagents.add_reagent("welding_fuel", max_fuel) + update_icon() + + +/obj/item/weldingtool/proc/update_torch() + if(welding) + add_overlay("[initial(icon_state)]-on") + item_state = "[initial(item_state)]1" + else + item_state = "[initial(item_state)]" + + +/obj/item/weldingtool/update_icon() + cut_overlays() + if(change_icons) + var/ratio = get_fuel() / max_fuel + ratio = Ceiling(ratio*4) * 25 + add_overlay("[initial(icon_state)][ratio]") + update_torch() + return + + +/obj/item/weldingtool/process() + switch(welding) + if(0) + force = 3 + damtype = "brute" + update_icon() + if(!can_off_process) + STOP_PROCESSING(SSobj, src) + return + //Welders left on now use up fuel, but lets not have them run out quite that fast + if(1) + force = 15 + damtype = "fire" + ++burned_fuel_for + if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL) + remove_fuel(1) + update_icon() + + //This is to start fires. process() is only called if the welder is on. + open_flame() + + +/obj/item/weldingtool/suicide_act(mob/user) + user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!") + return (FIRELOSS) + + +/obj/item/weldingtool/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/screwdriver)) + flamethrower_screwdriver(I, user) + else if(istype(I, /obj/item/stack/rods)) + flamethrower_rods(I, user) + else if(istype(I, /obj/item/reagent_containers) && I.is_open_container()) + var/amountNeeded = max_fuel - get_fuel() + var/obj/item/reagent_containers/container = I + if(length(container.reagents.reagent_list) > 1) + to_chat(user, "[container] has too many chemicals mixed into it. You wouldn't want to put the wrong chemicals into [src].") + return ..() + if(amountNeeded > 0 && container.reagents.has_reagent("welding_fuel")) + container.reagents.trans_id_to(src, "welding_fuel", amountNeeded) + to_chat(user, "You transfer some fuel from [container] to [src].") + else + return ..() + + +/obj/item/weldingtool/attack(mob/living/carbon/human/H, mob/user) + if(!istype(H)) + return ..() + + var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) + + if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM) + if(src.remove_fuel(1)) + playsound(loc, usesound, 50, 1) + if(user == H) + user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name].", "You start fixing some of the dents on [H]'s [affecting.name].") + if(!do_mob(user, H, 50)) + return + item_heal_robotic(H, user, 15, 0) + else + return ..() + + +/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity) + if(!proximity) + return + + if(welding) + remove_fuel(1) + var/turf/location = get_turf(user) + location.hotspot_expose(700, 50, 1) + if(get_fuel() <= 0) + set_light(0) + + if(isliving(O)) + var/mob/living/L = O + if(L.IgniteMob()) + message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire") + log_game("[key_name(user)] set [key_name(L)] on fire") + + +/obj/item/weldingtool/attack_self(mob/user) + switched_on(user) + if(welding) + set_light(light_intensity) + + update_icon() + + +//Returns the amount of fuel in the welder +/obj/item/weldingtool/proc/get_fuel() + return reagents.get_reagent_amount("welding_fuel") + + +//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use() +/obj/item/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null) + if(!welding || !check_fuel()) + return 0 + if(amount) + burned_fuel_for = 0 + if(get_fuel() >= amount) + reagents.remove_reagent("welding_fuel", amount) + check_fuel() + if(M) + M.flash_act(light_intensity) + return TRUE + else + if(M) + to_chat(M, "You need more welding fuel to complete this task!") + return FALSE + + +//Turns off the welder if there is no more fuel (does this really need to be its own proc?) +/obj/item/weldingtool/proc/check_fuel(mob/user) + if(get_fuel() <= 0 && welding) + switched_on(user) + update_icon() + //mob icon update + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands(0) + + return 0 + return 1 + +//Switches the welder on +/obj/item/weldingtool/proc/switched_on(mob/user) + if(!status) + to_chat(user, "[src] can't be turned on while unsecured!") + return + welding = !welding + if(welding) + if(get_fuel() >= 1) + to_chat(user, "You switch [src] on.") + playsound(loc, acti_sound, 50, 1) + force = 15 + damtype = "fire" + hitsound = 'sound/items/welder.ogg' + update_icon() + START_PROCESSING(SSobj, src) + else + to_chat(user, "You need more fuel!") + switched_off(user) + else + to_chat(user, "You switch [src] off.") + playsound(loc, deac_sound, 50, 1) + switched_off(user) + +//Switches the welder off +/obj/item/weldingtool/proc/switched_off(mob/user) + welding = 0 + set_light(0) + + force = 3 + damtype = "brute" + hitsound = "swing_hit" + update_icon() + + +/obj/item/weldingtool/examine(mob/user) + ..() + to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].") + +/obj/item/weldingtool/is_hot() + return welding * heat + +//Returns whether or not the welding tool is currently on. +/obj/item/weldingtool/proc/isOn() + return welding + + +/obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) + if(welding) + to_chat(user, "Turn it off first!") + return + status = !status + if(status) + to_chat(user, "You resecure [src].") + else + to_chat(user, "[src] can now be attached and modified.") + add_fingerprint(user) + +/obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user) + if(!status) + var/obj/item/stack/rods/R = I + if (R.use(1)) + var/obj/item/flamethrower/F = new /obj/item/flamethrower(user.loc) + if(!remove_item_from_storage(F)) + user.transferItemToLoc(src, F, TRUE) + F.weldtool = src + add_fingerprint(user) + to_chat(user, "You add a rod to a welder, starting to build a flamethrower.") + user.put_in_hands(F) + else + to_chat(user, "You need one rod to start building a flamethrower!") + +/obj/item/weldingtool/ignition_effect(atom/A, mob/user) + if(welding && remove_fuel(1, user)) + . = "[user] casually lights [A] with [src], what a badass." + else + . = "" + +/obj/item/weldingtool/largetank + name = "industrial welding tool" + desc = "A slightly larger welder with a larger tank." + icon_state = "indwelder" + max_fuel = 40 + materials = list(MAT_GLASS=60) + +/obj/item/weldingtool/largetank/cyborg + name = "integrated welding tool" + desc = "An advanced welder designed to be used in robotic systems." + toolspeed = 0.5 + +/obj/item/weldingtool/largetank/flamethrower_screwdriver() + return + + +/obj/item/weldingtool/mini + name = "emergency welding tool" + desc = "A miniature welder used during emergencies." + icon_state = "miniwelder" + max_fuel = 10 + w_class = WEIGHT_CLASS_TINY + materials = list(MAT_METAL=30, MAT_GLASS=10) + change_icons = 0 + +/obj/item/weldingtool/mini/flamethrower_screwdriver() + return + +/obj/item/weldingtool/abductor + name = "alien welding tool" + desc = "An alien welding tool. Whatever fuel it uses, it never runs out." + icon = 'icons/obj/abductor.dmi' + icon_state = "welder" + toolspeed = 0.1 + light_intensity = 0 + change_icons = 0 + +/obj/item/weldingtool/abductor/process() + if(get_fuel() <= max_fuel) + reagents.add_reagent("welding_fuel", 1) + ..() + +/obj/item/weldingtool/hugetank + name = "upgraded industrial welding tool" + desc = "An upgraded welder based of the industrial welder." + icon_state = "upindwelder" + item_state = "upindwelder" + max_fuel = 80 + materials = list(MAT_METAL=70, MAT_GLASS=120) + +/obj/item/weldingtool/experimental + name = "experimental welding tool" + desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes." + icon_state = "exwelder" + item_state = "exwelder" + max_fuel = 40 + materials = list(MAT_METAL=70, MAT_GLASS=120) + var/last_gen = 0 + change_icons = 0 + can_off_process = 1 + light_intensity = 1 + toolspeed = 0.5 + var/nextrefueltick = 0 + +/obj/item/weldingtool/experimental/brass + name = "brass welding tool" + desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch." + resistance_flags = FIRE_PROOF | ACID_PROOF + icon_state = "brasswelder" + item_state = "brasswelder" + + +/obj/item/weldingtool/experimental/process() + ..() + if(get_fuel() < max_fuel && nextrefueltick < world.time) + nextrefueltick = world.time + 10 + reagents.add_reagent("welding_fuel", 1) #undef WELDER_FUEL_BURN_INTERVAL \ No newline at end of file diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 7d371102c3..c9552a3d39 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -66,7 +66,6 @@ name = "crushed can" icon_state = "cola" resistance_flags = NONE - grind_results = list("aluminum" = 10) /obj/item/trash/attack(mob/M, mob/living/user) return @@ -76,9 +75,8 @@ icon = 'icons/obj/mining.dmi' icon_state = "slag" desc = "Someone's gotten on the naughty list." - grind_results = list("carbon" = 20) /obj/item/trash/coal/burn() visible_message("[src] fuses into a diamond! Someone wasn't so naughty after all...") new /obj/item/ore/diamond(loc) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index c11d41eaa8..9058e837ab 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -447,7 +447,7 @@ return if(explosive && wielded) user.say("[war_cry]") - explosive.forceMove(AM) + explosive.loc = AM explosive.prime() qdel(src) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 2656079557..37d0c6cb0e 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -409,7 +409,7 @@ righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' flags_1 = NODROP_1 | ABSTRACT_1 | DROPDEL_1 w_class = WEIGHT_CLASS_HUGE - force = 24 + force = 21 throwforce = 0 throw_range = 0 throw_speed = 0 diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index b053b987ca..ae79c7e86d 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -70,7 +70,7 @@ /obj/structure/alien/resin/Move() var/turf/T = loc - . = ..() + ..() move_update_air(T) /obj/structure/alien/resin/wall diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index f4af05c9c9..39fbbe3335 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -20,7 +20,7 @@ var/obj/item/canvas/C = I user.dropItemToGround(C) painting = C - C.forceMove(get_turf(src)) + C.loc = get_turf(src) C.layer = layer+0.1 user.visible_message("[user] puts \the [C] on \the [src].","You place \the [C] on \the [src].") else @@ -30,9 +30,9 @@ //Stick to the easel like glue /obj/structure/easel/Move() var/turf/T = get_turf(src) - . = ..() + ..() if(painting && painting.loc == T) //Only move if it's near us. - painting.forceMove(get_turf(src)) + painting.loc = get_turf(src) else painting = null diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 56a38cb688..1a09c9c4c2 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -21,10 +21,6 @@ var/buildstacktype = /obj/item/stack/sheet/metal var/buildstackamount = 2 -/obj/structure/bed/examine(mob/user) - ..() - to_chat(user, "It's held together by a couple of bolts.") - /obj/structure/bed/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) if(buildstacktype) @@ -149,7 +145,7 @@ /obj/item/roller/robo/examine(mob/user) ..() - to_chat(user, "The dock is [loaded ? "loaded" : "empty"].") + to_chat(user, "The dock is [loaded ? "loaded" : "empty"]") /obj/item/roller/robo/deploy_roller(mob/user, atom/location) if(loaded) diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index c56a0c5008..1dc4764bcf 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -1,107 +1,107 @@ -/obj/structure/closet/cabinet - name = "cabinet" - desc = "Old will forever be in fashion." - icon_state = "cabinet" - resistance_flags = FLAMMABLE - max_integrity = 70 - -/obj/structure/closet/acloset - name = "strange closet" - desc = "It looks alien!" - icon_state = "alien" - - -/obj/structure/closet/gimmick - name = "administrative supply closet" - desc = "It's a storage unit for things that have no right being here." - icon_state = "syndicate" - -/obj/structure/closet/gimmick/russian - name = "russian surplus closet" - desc = "It's a storage unit for Russian standard-issue surplus." - -/obj/structure/closet/gimmick/russian/PopulateContents() - ..() - for(var/i in 1 to 5) - new /obj/item/clothing/head/ushanka(src) - for(var/i in 1 to 5) - new /obj/item/clothing/under/soviet(src) - -/obj/structure/closet/gimmick/tacticool - name = "tacticool gear closet" - desc = "It's a storage unit for Tacticool gear." - -/obj/structure/closet/gimmick/tacticool/PopulateContents() - ..() - new /obj/item/clothing/glasses/eyepatch(src) - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/gloves/combat(src) - new /obj/item/clothing/gloves/combat(src) - new /obj/item/clothing/head/helmet/swat(src) - new /obj/item/clothing/head/helmet/swat(src) - new /obj/item/clothing/mask/gas/sechailer/swat(src) - new /obj/item/clothing/mask/gas/sechailer/swat(src) - new /obj/item/clothing/shoes/combat/swat(src) - new /obj/item/clothing/shoes/combat/swat(src) - new /obj/item/clothing/suit/space/hardsuit/deathsquad(src) - new /obj/item/clothing/suit/space/hardsuit/deathsquad(src) - new /obj/item/clothing/under/syndicate/tacticool(src) - new /obj/item/clothing/under/syndicate/tacticool(src) - - -/obj/structure/closet/thunderdome - name = "\improper Thunderdome closet" - desc = "Everything you need!" +/obj/structure/closet/cabinet + name = "cabinet" + desc = "Old will forever be in fashion." + icon_state = "cabinet" + resistance_flags = FLAMMABLE + max_integrity = 70 + +/obj/structure/closet/acloset + name = "strange closet" + desc = "It looks alien!" + icon_state = "alien" + + +/obj/structure/closet/gimmick + name = "administrative supply closet" + desc = "It's a storage unit for things that have no right being here." + icon_state = "syndicate" + +/obj/structure/closet/gimmick/russian + name = "russian surplus closet" + desc = "It's a storage unit for Russian standard-issue surplus." + +/obj/structure/closet/gimmick/russian/PopulateContents() + ..() + for(var/i in 1 to 5) + new /obj/item/clothing/head/ushanka(src) + for(var/i in 1 to 5) + new /obj/item/clothing/under/soviet(src) + +/obj/structure/closet/gimmick/tacticool + name = "tacticool gear closet" + desc = "It's a storage unit for Tacticool gear." + +/obj/structure/closet/gimmick/tacticool/PopulateContents() + ..() + new /obj/item/clothing/glasses/eyepatch(src) + new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/clothing/gloves/combat(src) + new /obj/item/clothing/gloves/combat(src) + new /obj/item/clothing/head/helmet/swat(src) + new /obj/item/clothing/head/helmet/swat(src) + new /obj/item/clothing/mask/gas/sechailer/swat(src) + new /obj/item/clothing/mask/gas/sechailer/swat(src) + new /obj/item/clothing/shoes/combat/swat(src) + new /obj/item/clothing/shoes/combat/swat(src) + new /obj/item/clothing/suit/space/hardsuit/deathsquad(src) + new /obj/item/clothing/suit/space/hardsuit/deathsquad(src) + new /obj/item/clothing/under/syndicate/tacticool(src) + new /obj/item/clothing/under/syndicate/tacticool(src) + + +/obj/structure/closet/thunderdome + name = "\improper Thunderdome closet" + desc = "Everything you need!" anchored = TRUE - -/obj/structure/closet/thunderdome/tdred - name = "red-team Thunderdome closet" - icon_door = "red" - -/obj/structure/closet/thunderdome/tdred/PopulateContents() - ..() - for(var/i in 1 to 3) - new /obj/item/clothing/suit/armor/tdome/red(src) - for(var/i in 1 to 3) + +/obj/structure/closet/thunderdome/tdred + name = "red-team Thunderdome closet" + icon_door = "red" + +/obj/structure/closet/thunderdome/tdred/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/clothing/suit/armor/tdome/red(src) + for(var/i in 1 to 3) new /obj/item/melee/transforming/energy/sword/saber(src) - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser(src) - for(var/i in 1 to 3) - new /obj/item/melee/baton/loaded(src) - for(var/i in 1 to 3) - new /obj/item/storage/box/flashbangs(src) - for(var/i in 1 to 3) - new /obj/item/clothing/head/helmet/thunderdome(src) - -/obj/structure/closet/thunderdome/tdgreen - name = "green-team Thunderdome closet" - icon_door = "green" - -/obj/structure/closet/thunderdome/tdgreen/PopulateContents() - ..() - for(var/i in 1 to 3) - new /obj/item/clothing/suit/armor/tdome/green(src) - for(var/i in 1 to 3) + for(var/i in 1 to 3) + new /obj/item/gun/energy/laser(src) + for(var/i in 1 to 3) + new /obj/item/melee/baton/loaded(src) + for(var/i in 1 to 3) + new /obj/item/storage/box/flashbangs(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/helmet/thunderdome(src) + +/obj/structure/closet/thunderdome/tdgreen + name = "green-team Thunderdome closet" + icon_door = "green" + +/obj/structure/closet/thunderdome/tdgreen/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/clothing/suit/armor/tdome/green(src) + for(var/i in 1 to 3) new /obj/item/melee/transforming/energy/sword/saber(src) - for(var/i in 1 to 3) - new /obj/item/gun/energy/laser(src) - for(var/i in 1 to 3) - new /obj/item/melee/baton/loaded(src) - for(var/i in 1 to 3) - new /obj/item/storage/box/flashbangs(src) - for(var/i in 1 to 3) - new /obj/item/clothing/head/helmet/thunderdome(src) - -/obj/structure/closet/malf/suits - desc = "It's a storage unit for operational gear." - icon_state = "syndicate" - -/obj/structure/closet/malf/suits/PopulateContents() - ..() - new /obj/item/tank/jetpack/void(src) - new /obj/item/clothing/mask/breath(src) - new /obj/item/clothing/head/helmet/space/nasavoid(src) - new /obj/item/clothing/suit/space/nasavoid(src) - new /obj/item/crowbar(src) - new /obj/item/stock_parts/cell(src) - new /obj/item/device/multitool(src) + for(var/i in 1 to 3) + new /obj/item/gun/energy/laser(src) + for(var/i in 1 to 3) + new /obj/item/melee/baton/loaded(src) + for(var/i in 1 to 3) + new /obj/item/storage/box/flashbangs(src) + for(var/i in 1 to 3) + new /obj/item/clothing/head/helmet/thunderdome(src) + +/obj/structure/closet/malf/suits + desc = "It's a storage unit for operational gear." + icon_state = "syndicate" + +/obj/structure/closet/malf/suits/PopulateContents() + ..() + new /obj/item/tank/jetpack/void(src) + new /obj/item/clothing/mask/breath(src) + new /obj/item/clothing/head/helmet/space/nasavoid(src) + new /obj/item/clothing/suit/space/nasavoid(src) + new /obj/item/crowbar(src) + new /obj/item/stock_parts/cell(src) + new /obj/item/device/multitool(src) diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index a41710ea7d..42fd4d2374 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -365,4 +365,3 @@ new /obj/item/clothing/under/rank/curator/treasure_hunter(src) new /obj/item/clothing/shoes/workboots/mining(src) new /obj/item/storage/backpack/satchel/explorer(src) - diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index f0c1495281..fb9732c3f7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -1,11 +1,11 @@ -/obj/structure/closet/secure_closet/bar - name = "booze storage" +/obj/structure/closet/secure_closet/bar + name = "booze storage" req_access = list(ACCESS_BAR) - icon_state = "cabinet" - resistance_flags = FLAMMABLE - max_integrity = 70 - -/obj/structure/closet/secure_closet/bar/PopulateContents() - ..() - for(var/i in 1 to 10) - new /obj/item/reagent_containers/food/drinks/beer( src ) + icon_state = "cabinet" + resistance_flags = FLAMMABLE + max_integrity = 70 + +/obj/structure/closet/secure_closet/bar/PopulateContents() + ..() + for(var/i in 1 to 10) + new /obj/item/reagent_containers/food/drinks/beer( src ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm index 37fe71a3f5..adcb8cb498 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm @@ -1,13 +1,13 @@ -/obj/structure/closet/secure_closet/hydroponics - name = "botanist's locker" +/obj/structure/closet/secure_closet/hydroponics + name = "botanist's locker" req_access = list(ACCESS_HYDROPONICS) - icon_state = "hydro" - -/obj/structure/closet/secure_closet/hydroponics/PopulateContents() - ..() - new /obj/item/storage/bag/plants/portaseeder(src) - new /obj/item/device/plant_analyzer(src) - new /obj/item/device/radio/headset/headset_srv(src) - new /obj/item/cultivator(src) - new /obj/item/hatchet(src) + icon_state = "hydro" + +/obj/structure/closet/secure_closet/hydroponics/PopulateContents() + ..() + new /obj/item/storage/bag/plants/portaseeder(src) + new /obj/item/device/plant_analyzer(src) + new /obj/item/device/radio/headset/headset_srv(src) + new /obj/item/cultivator(src) + new /obj/item/hatchet(src) new /obj/item/storage/box/disks_plantgene(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index dcee41585d..dff240e1da 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -73,8 +73,8 @@ new /obj/item/device/autosurgeon/cmo(src) new /obj/item/door_remote/chief_medical_officer(src) new /obj/item/clothing/neck/petcollar(src) - new /obj/item/pet_carrier(src) new /obj/item/circuitboard/machine/protolathe/department/medical(src) + new /obj/item/pet_carrier(src) /obj/structure/closet/secure_closet/animal name = "animal control" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index 51f2c96c3a..00b74305aa 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -1,53 +1,53 @@ -/obj/structure/closet/secure_closet/personal - desc = "It's a secure locker for personnel. The first card swiped gains control." - name = "personal closet" +/obj/structure/closet/secure_closet/personal + desc = "It's a secure locker for personnel. The first card swiped gains control." + name = "personal closet" req_access = list(ACCESS_ALL_PERSONAL_LOCKERS) - var/registered_name = null - -/obj/structure/closet/secure_closet/personal/PopulateContents() - ..() - if(prob(50)) - new /obj/item/storage/backpack/duffelbag(src) - if(prob(50)) - new /obj/item/storage/backpack(src) - else - new /obj/item/storage/backpack/satchel(src) - new /obj/item/device/radio/headset( src ) - -/obj/structure/closet/secure_closet/personal/patient - name = "patient's closet" - -/obj/structure/closet/secure_closet/personal/patient/PopulateContents() - new /obj/item/clothing/under/color/white( src ) - new /obj/item/clothing/shoes/sneakers/white( src ) - -/obj/structure/closet/secure_closet/personal/cabinet - icon_state = "cabinet" - resistance_flags = FLAMMABLE - max_integrity = 70 - -/obj/structure/closet/secure_closet/personal/cabinet/PopulateContents() - new /obj/item/storage/backpack/satchel/leather/withwallet( src ) + var/registered_name = null + +/obj/structure/closet/secure_closet/personal/PopulateContents() + ..() + if(prob(50)) + new /obj/item/storage/backpack/duffelbag(src) + if(prob(50)) + new /obj/item/storage/backpack(src) + else + new /obj/item/storage/backpack/satchel(src) + new /obj/item/device/radio/headset( src ) + +/obj/structure/closet/secure_closet/personal/patient + name = "patient's closet" + +/obj/structure/closet/secure_closet/personal/patient/PopulateContents() + new /obj/item/clothing/under/color/white( src ) + new /obj/item/clothing/shoes/sneakers/white( src ) + +/obj/structure/closet/secure_closet/personal/cabinet + icon_state = "cabinet" + resistance_flags = FLAMMABLE + max_integrity = 70 + +/obj/structure/closet/secure_closet/personal/cabinet/PopulateContents() + new /obj/item/storage/backpack/satchel/leather/withwallet( src ) new /obj/item/device/instrument/piano_synth(src) - new /obj/item/device/radio/headset( src ) - -/obj/structure/closet/secure_closet/personal/attackby(obj/item/W, mob/user, params) - var/obj/item/card/id/I = W.GetID() - if(istype(I)) - if(broken) - to_chat(user, "It appears to be broken.") - return - if(!I || !I.registered_name) - return - if(allowed(user) || !registered_name || (istype(I) && (registered_name == I.registered_name))) - //they can open all lockers, or nobody owns this, or they own this locker - locked = !locked - update_icon() - - if(!registered_name) - registered_name = I.registered_name - desc = "Owned by [I.registered_name]." - else - to_chat(user, "Access Denied.") - else + new /obj/item/device/radio/headset( src ) + +/obj/structure/closet/secure_closet/personal/attackby(obj/item/W, mob/user, params) + var/obj/item/card/id/I = W.GetID() + if(istype(I)) + if(broken) + to_chat(user, "It appears to be broken.") + return + if(!I || !I.registered_name) + return + if(allowed(user) || !registered_name || (istype(I) && (registered_name == I.registered_name))) + //they can open all lockers, or nobody owns this, or they own this locker + locked = !locked + update_icon() + + if(!registered_name) + registered_name = I.registered_name + desc = "Owned by [I.registered_name]." + else + to_chat(user, "Access Denied.") + else return ..() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 158e4d348d..8b1e82ed81 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -1,5 +1,5 @@ -/obj/structure/closet/secure_closet/RD - name = "\proper research director's locker" +/obj/structure/closet/secure_closet/RD + name = "\proper research director's locker" req_access = list(ACCESS_RD) icon_state = "rd" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 215384054b..4dccd78bca 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -1,13 +1,13 @@ -/obj/structure/closet/secure_closet - name = "secure locker" - desc = "It's a card-locked storage unit." +/obj/structure/closet/secure_closet + name = "secure locker" + desc = "It's a card-locked storage unit." locked = TRUE - icon_state = "secure" - max_integrity = 250 - armor = list(melee = 30, bullet = 50, laser = 50, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80) + icon_state = "secure" + max_integrity = 250 + armor = list(melee = 30, bullet = 50, laser = 50, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 80, acid = 80) secure = TRUE - -/obj/structure/closet/secure_closet/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < 20) - return 0 + +/obj/structure/closet/secure_closet/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) + if(damage_flag == "melee" && damage_amount < 20) + return 0 . = ..() \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 05b5da47f0..6491306600 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -90,7 +90,6 @@ new /obj/item/gun/energy/e_gun/hos(src) new /obj/item/device/flashlight/seclite(src) new /obj/item/pinpointer/nuke(src) - new /obj/item/circuitboard/machine/protolathe/department/security(src) /obj/structure/closet/secure_closet/warden name = "\proper warden's locker" @@ -123,6 +122,7 @@ /obj/structure/closet/secure_closet/security/PopulateContents() ..() + new /obj/item/clothing/under/rank/security/skirt(src) new /obj/item/clothing/suit/armor/vest(src) new /obj/item/clothing/head/helmet/sec(src) new /obj/item/device/radio/headset/headset_sec(src) diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm index b9f0f4b4a7..5261bb5332 100644 --- a/code/game/objects/structures/crates_lockers/crates/critter.dm +++ b/code/game/objects/structures/crates_lockers/crates/critter.dm @@ -35,4 +35,4 @@ if(tank) return tank.air_contents else - return loc.return_air() \ No newline at end of file + return loc.return_air() diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index 30da3add67..61b9998233 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -1,34 +1,34 @@ -/obj/structure/closet/crate/large - name = "large crate" - desc = "A hefty wooden crate." - icon_state = "largecrate" +/obj/structure/closet/crate/large + name = "large crate" + desc = "A hefty wooden crate." + icon_state = "largecrate" density = TRUE - material_drop = /obj/item/stack/sheet/mineral/wood - delivery_icon = "deliverybox" - -/obj/structure/closet/crate/large/attack_hand(mob/user) - add_fingerprint(user) - if(manifest) - tear_manifest(user) - else - to_chat(user, "You need a crowbar to pry this open!") - -/obj/structure/closet/crate/large/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/crowbar)) - var/turf/T = get_turf(src) - if(manifest) - tear_manifest(user) - - user.visible_message("[user] pries \the [src] open.", \ - "You pry open \the [src].", \ - "You hear splitting wood.") - playsound(src.loc, 'sound/weapons/slashmiss.ogg', 75, 1) - - for(var/i in 1 to rand(2, 5)) - new material_drop(src) - for(var/atom/movable/AM in contents) - AM.forceMove(T) - - qdel(src) - else - return ..() + material_drop = /obj/item/stack/sheet/mineral/wood + delivery_icon = "deliverybox" + +/obj/structure/closet/crate/large/attack_hand(mob/user) + add_fingerprint(user) + if(manifest) + tear_manifest(user) + else + to_chat(user, "You need a crowbar to pry this open!") + +/obj/structure/closet/crate/large/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/crowbar)) + var/turf/T = get_turf(src) + if(manifest) + tear_manifest(user) + + user.visible_message("[user] pries \the [src] open.", \ + "You pry open \the [src].", \ + "You hear splitting wood.") + playsound(src.loc, 'sound/weapons/slashmiss.ogg', 75, 1) + + for(var/i in 1 to rand(2, 5)) + new material_drop(src) + for(var/atom/movable/AM in contents) + AM.forceMove(T) + + qdel(src) + else + return ..() diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 0f8ad84252..241d7ea41c 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -115,7 +115,7 @@ /obj/structure/displaycase/attackby(obj/item/W, mob/user, params) if(W.GetID() && !broken && openable) if(allowed(user)) - to_chat(user, "You [open ? "close":"open"] [src].") + to_chat(user, "You [open ? "close":"open"] the [src]") toggle_lock(user) else to_chat(user, "Access denied.") @@ -140,9 +140,9 @@ to_chat(user, "You remove the destroyed case") qdel(src) else - to_chat(user, "You start to [open ? "close":"open"] [src].") + to_chat(user, "You start to [open ? "close":"open"] the [src]") if(do_after(user, 20*W.toolspeed, target = src)) - to_chat(user, "You [open ? "close":"open"] [src].") + to_chat(user, "You [open ? "close":"open"] the [src]") toggle_lock(user) else if(open && !showpiece) if(user.transferItemToLoc(W, src)) @@ -224,7 +224,7 @@ G.use(10) var/obj/structure/displaycase/display = new(src.loc) if(electronics) - electronics.forceMove(display) + electronics.loc = display display.electronics = electronics if(electronics.one_access) display.req_one_access = electronics.accesses diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index f2b0efb6b7..81c9e9cc63 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -15,7 +15,7 @@ var/obj/structure/chair/C = new /obj/structure/chair(loc) playsound(loc, W.usesound, 50, 1) C.setDir(dir) - part.forceMove(loc) + part.loc = loc part.master = null part = null qdel(src) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 7d3fafb079..fe6a8c69c2 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -43,8 +43,7 @@ death = FALSE anchored = FALSE density = FALSE - flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. \ - You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest." + flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest. You do not know how their magic works, nor where they come from, or the significance of their items." assignedrole = "Ash Walker" /obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn) @@ -470,7 +469,7 @@ mob_species = /datum/species/human flavour_text = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling sweels in your gut as you climb out of your pod." + your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." uniform = /obj/item/clothing/under/rank/security shoes = /obj/item/clothing/shoes/jackboots id = /obj/item/card/id/away/old/sec @@ -494,7 +493,7 @@ mob_species = /datum/species/human flavour_text = "You are an engineer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling sweels in your gut as you climb out of your pod." + your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." uniform = /obj/item/clothing/under/rank/engineer shoes = /obj/item/clothing/shoes/workboots id = /obj/item/card/id/away/old/eng @@ -518,7 +517,7 @@ mob_species = /datum/species/human flavour_text = "You are a scientist working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \ cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artifical Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling sweels in your gut as you climb out of your pod." + your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." uniform = /obj/item/clothing/under/rank/scientist shoes = /obj/item/clothing/shoes/laceup id = /obj/item/card/id/away/old/sci diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 5cdadb186c..5f1fa2ebb7 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -81,7 +81,7 @@ return playsound(src.loc, 'sound/effects/splat.ogg', 25, 1) L.visible_message("[user] slams [L] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") - L.forceMove(drop_location()) + L.loc = src.loc L.emote("scream") L.add_splatter_floor() L.adjustBruteLoss(30) @@ -148,4 +148,4 @@ new /obj/item/stack/rods(loc, 4) qdel(src) -#undef VIABLE_MOB_CHECK +#undef VIABLE_MOB_CHECK \ No newline at end of file diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 2c91a5d770..c0dcd866d8 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -14,7 +14,7 @@ /turf/closed/wall, /obj/structure/falsewall) smooth = SMOOTH_MORE - // flags = CONDUCT_1 + // flags_1 = CONDUCT_1 /obj/structure/lattice/examine(mob/user) ..() diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index f0a83cc70e..ceef3ef0c0 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -211,4 +211,4 @@ var/obj/machinery/manned_turret/E = user.buckled E.calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(user, params) E.direction_track(user, targeted_atom) - E.checkfire(targeted_atom, user) + E.checkfire(targeted_atom, user) \ No newline at end of file diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 259c72647d..c124540d7d 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -37,7 +37,7 @@ /obj/structure/mineral_door/Move() var/turf/T = loc - . = ..() + ..() move_update_air(T) /obj/structure/mineral_door/CollidedWith(atom/movable/AM) diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 491034170a..b2dc64fec7 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -1,24 +1,24 @@ -/obj/structure/mopbucket - name = "mop bucket" - desc = "Fill it with water, but don't forget a mop!" - icon = 'icons/obj/janitor.dmi' - icon_state = "mopbucket" +/obj/structure/mopbucket + name = "mop bucket" + desc = "Fill it with water, but don't forget a mop!" + icon = 'icons/obj/janitor.dmi' + icon_state = "mopbucket" density = TRUE container_type = OPENCONTAINER_1 - var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite - - -/obj/structure/mopbucket/New() - create_reagents(100) - ..() - -/obj/structure/mopbucket/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/mop)) - if(reagents.total_volume < 1) - to_chat(user, "[src] is out of water!
    ") - else - reagents.trans_to(I, 5) - to_chat(user, "You wet [I] in [src].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - else + var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite + + +/obj/structure/mopbucket/New() + create_reagents(100) + ..() + +/obj/structure/mopbucket/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/mop)) + if(reagents.total_volume < 1) + to_chat(user, "[src] is out of water!") + else + reagents.trans_to(I, 5) + to_chat(user, "You wet [I] in [src].") + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + else return ..() \ No newline at end of file diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index f667832843..aeca1453e3 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -18,7 +18,7 @@ if(notices > 4) break if(istype(I, /obj/item/paper)) - I.forceMove(src) + I.loc = src notices++ icon_state = "nboard0[notices]" @@ -58,7 +58,7 @@ return var/obj/item/I = locate(href_list["remove"]) in contents if(istype(I) && I.loc == src) - I.forceMove(usr.loc) + I.loc = usr.loc usr.put_in_hands(I) notices-- icon_state = "nboard0[notices]" diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 550c89d1ae..9df47743a4 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -33,7 +33,7 @@ FLOOR SAFES /obj/structure/safe/Initialize(mapload) - . = ..() + ..() if(!mapload) return diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index ae853b4aed..254ec956c3 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -135,6 +135,11 @@ Cargo(brown), Science(purple), Escape(red and white), and Medbay(blue).\nIn the center of the station, you see the Bridge(dark blue).\n\ Around those, you see Hallways/Entrances(light grey), Public Areas(grey), and Maintenance(dark grey)." +/obj/structure/sign/map/left/ceres + icon_state = "map-CS" + desc = "A framed picture of the station.\nClockwise from the top, you see Security (red), Dorms (light-green), Bridge (dark-blue), AI Core (gray), \ + Cargo (brown), Medbay (blue), Arrivals/Departures(orange/cyan), Research (purple), Service (dark-green), and Engineering in the center (yellow)." + /obj/structure/sign/securearea name = "\improper SECURE AREA" desc = "A warning sign which reads 'SECURE AREA'." @@ -241,7 +246,7 @@ desc = "This plaque commemorates those who have fallen in glorious combat. For all the charred, dizzy, and beaten men who have died in its hands." /obj/structure/sign/nanotrasen - name = "\improper Nanotrasen Logo" + name = "\improper NanoTrasen Logo " desc = "A sign with the Nanotrasen Logo on it. Glory to Nanotrasen!" icon_state = "nanotrasen" @@ -349,4 +354,4 @@ /obj/structure/sign/logo name = "nanotrasen logo" desc = "The Nanotrasen corporate logo." - icon_state = "nanotrasen_sign1" + icon_state = "ss13sign-1" diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 299409b3a3..26582515f8 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -121,7 +121,7 @@ T.quick_empty() for(var/obj/item/C in oldContents) - C.forceMove(drop_location()) + C.loc = src.loc user.visible_message("[user] empties [I] on [src].") return diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 2ff0d5ef7a..c3496678c2 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -16,9 +16,9 @@ pinned_target = null /obj/structure/target_stake/Move() - . = ..() + ..() if(pinned_target) - pinned_target.forceMove(loc) + pinned_target.loc = loc /obj/structure/target_stake/attackby(obj/item/target/T, mob/user) if(pinned_target) @@ -36,7 +36,7 @@ /obj/structure/target_stake/proc/removeTarget(mob/user) pinned_target.layer = OBJ_LAYER - pinned_target.forceMove(user.loc) + pinned_target.loc = user.loc pinned_target.nullPinnedLoc() nullPinnedTarget() if(ishuman(user)) @@ -44,7 +44,7 @@ user.put_in_hands(pinned_target) to_chat(user, "You take the target out of the stake.") else - pinned_target.forceMove(user.drop_location()) + pinned_target.loc = get_turf(user) to_chat(user, "You take the target out of the stake.") /obj/structure/target_stake/bullet_act(obj/item/projectile/P) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 58212e94e8..9009a7171d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -572,6 +572,7 @@ qdel(src) + //Shower Curtains// //Defines used are pre-existing in layers.dm// diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 0949f540c7..b29df0aaf4 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -47,7 +47,7 @@ /obj/structure/windoor_assembly/Move() var/turf/T = loc - . = ..() + ..() setDir(ini_dir) move_update_air(T) @@ -216,13 +216,13 @@ if(do_after(user, 40, target = src)) if(!src || electronics) - W.forceMove(drop_location()) + W.loc = src.loc return to_chat(user, "You install the airlock electronics.") name = "near finished windoor assembly" electronics = W else - W.forceMove(drop_location()) + W.loc = loc //Screwdriver to remove airlock electronics. Step 6 undone. else if(istype(W, /obj/item/screwdriver)) @@ -240,7 +240,7 @@ var/obj/item/electronics/airlock/ae ae = electronics electronics = null - ae.forceMove(drop_location()) + ae.loc = loc else if(istype(W, /obj/item/pen)) var/t = stripped_input(user, "Enter the name for the door.", name, created_name,MAX_NAME_LEN) @@ -285,7 +285,7 @@ else windoor.req_access = electronics.accesses windoor.electronics = electronics - electronics.forceMove(windoor) + electronics.loc = windoor if(created_name) windoor.name = created_name qdel(src) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index cc6b0e54d6..2b9494c535 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -283,10 +283,11 @@ return if(!disassembled) playsound(src, breaksound, 70, 1) + var/turf/T = loc if(!(flags_1 & NODECONSTRUCT_1)) for(var/i in debris) var/obj/item/I = i - I.forceMove(drop_location()) + I.loc = T transfer_fingerprints_to(I) qdel(src) update_nearby_icons() @@ -357,7 +358,7 @@ /obj/structure/window/Move() var/turf/T = loc - . = ..() + ..() setDir(ini_dir) move_update_air(T) diff --git a/code/game/say.dm b/code/game/say.dm index 284b77d54d..570974c0bc 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -4,18 +4,18 @@ And the base of the send_speech() proc, which is the core of saycode. */ GLOBAL_LIST_INIT(freqtospan, list( - "[FREQ_SCIENCE]" = "sciradio", - "[FREQ_MEDICAL]" = "medradio", - "[FREQ_ENGINEERING]" = "engradio", - "[FREQ_SUPPLY]" = "suppradio", - "[FREQ_SERVICE]" = "servradio", - "[FREQ_SECURITY]" = "secradio", - "[FREQ_COMMAND]" = "comradio", - "[FREQ_AI_PRIVATE]" = "aiprivradio", - "[FREQ_SYNDICATE]" = "syndradio", - "[FREQ_CENTCOM]" = "centcomradio", - "[FREQ_CTF_RED]" = "redteamradio", - "[FREQ_CTF_BLUE]" = "blueteamradio" + "1351" = "sciradio", + "1355" = "medradio", + "1357" = "engradio", + "1347" = "suppradio", + "1349" = "servradio", + "1359" = "secradio", + "1353" = "comradio", + "1447" = "aiprivradio", + "1213" = "syndradio", + "1337" = "centcomradio", + "1215" = "redteamradio", + "1217" = "blueteamradio" )) /atom/movable/proc/say(message, datum/language/language = null) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 90a8b787be..1dc749dc70 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -59,6 +59,21 @@ if("icon") SStitle.icon = icon +/turf/closed/indestructible/reebe + name = "void" + icon_state = "reebe" + opacity = FALSE + baseturf = /turf/closed/indestructible/reebe + +/turf/closed/indestructible/reebe/ratvar_act() + return + +/turf/closed/indestructible/reebe/narsie_act() + return + +/turf/closed/indestructible/reebe/CollidedWith(atom/movable/AM) + playsound(src, 'sound/effects/bamf.ogg', 25, TRUE) + /turf/closed/indestructible/riveted icon = 'icons/turf/walls/riveted.dmi' icon_state = "riveted" diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index b1e8215592..1d7b32e3a2 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -141,7 +141,7 @@ var/mob/living/L = A if(L.pulling) var/turf/T = get_step(L.loc,turn(A.dir, 180)) - L.pulling.forceMove(T) + L.pulling.loc = T //now we're on the new z_level, proceed the space drifting stoplag()//Let a diagonal move finish, if necessary @@ -202,3 +202,4 @@ destination_x = dest_x destination_y = dest_y destination_z = dest_z + diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index fedd8794fb..36ba033eef 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -506,7 +506,7 @@ return if(has_gravity(src)) playsound(src, "bodyfall", 50, 1) - faller.drop_all_held_items() + /turf/proc/add_decal(decal,group) LAZYINITLIST(decals) diff --git a/code/game/world.dm b/code/game/world.dm index 8fb61e8b2b..2853bb2ef6 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -40,6 +40,7 @@ GLOBAL_PROTECT(security_mode) Master.Initialize(10, FALSE) + /world/proc/SetupExternalRSC() #if (PRELOAD_RSC == 0) external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") @@ -127,7 +128,6 @@ GLOBAL_PROTECT(security_mode) SERVER_TOOLS_ON_TOPIC //redirect to server tools if necessary var/static/list/topic_handlers = TopicHandlers() - var/list/input = params2list(T) var/datum/world_topic/handler for(var/I in topic_handlers) diff --git a/code/modules/admin/DB_ban/functions.dm b/code/modules/admin/DB_ban/functions.dm index 752131369b..5047b31641 100644 --- a/code/modules/admin/DB_ban/functions.dm +++ b/code/modules/admin/DB_ban/functions.dm @@ -1,5 +1,4 @@ #define MAX_ADMIN_BANS_PER_ADMIN 1 -#define MAX_ADMIN_BANS_PER_HEADMIN 3 //Either pass the mob you wish to ban in the 'banned_mob' attribute, or the banckey, banip and bancid variables. If both are passed, the mob takes priority! If a mob is not passed, banckey is the minimum that needs to be passed! banip and bancid are optional. /datum/admins/proc/DB_ban_record(bantype, mob/banned_mob, duration = -1, reason, job = "", banckey = null, banip = null, bancid = null) @@ -119,11 +118,8 @@ return if(query_check_adminban_amt.NextRow()) var/adm_bans = text2num(query_check_adminban_amt.item[1]) - var/max_bans = MAX_ADMIN_BANS_PER_ADMIN - if (check_rights(R_PERMISSIONS, FALSE)) - max_bans = MAX_ADMIN_BANS_PER_HEADMIN - if(adm_bans >= max_bans) - to_chat(usr, "You already logged [max_bans] admin ban(s) or more. Do not abuse this function!") + if(adm_bans >= MAX_ADMIN_BANS_PER_ADMIN) + to_chat(usr, "You already logged [MAX_ADMIN_BANS_PER_ADMIN] admin ban(s) or more. Do not abuse this function!") return if(!computerid) computerid = "0" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 84b784f141..22365c4584 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -508,7 +508,8 @@ toggle_ooc() log_admin("[key_name(usr)] toggled OOC.") message_admins("[key_name_admin(usr)] toggled OOC.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle OOC", "[GLOB.ooc_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle OOC", "[GLOB.ooc_allowed]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle OOC", "[GLOB.ooc_allowed]")) /datum/admins/proc/toggleoocdead() set category = "Server" @@ -518,7 +519,7 @@ log_admin("[key_name(usr)] toggled OOC.") message_admins("[key_name_admin(usr)] toggled Dead OOC.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Dead OOC", "[GLOB.dooc_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Dead OOC", "[GLOB.dooc_allowed]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/startnow() set category = "Server" @@ -552,7 +553,7 @@ log_admin("[key_name(usr)] toggled new player game entering.") message_admins("[key_name_admin(usr)] toggled new player game entering.") world.update_status() - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Entering", "[GLOB.enter_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Entering", "[GLOB.enter_allowed]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleAI() set category = "Server" @@ -566,7 +567,7 @@ to_chat(world, "The AI job is chooseable now.") log_admin("[key_name(usr)] toggled AI allowed.") world.update_status() - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle AI", "[!alai ? "Disabled" : "Enabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle AI", "[!alai]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleaban() set category = "Server" @@ -581,7 +582,7 @@ message_admins("[key_name_admin(usr)] toggled respawn to [!new_nores ? "On" : "Off"].") log_admin("[key_name(usr)] toggled respawn to [!new_nores ? "On" : "Off"].") world.update_status() - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Respawn", "[!new_nores ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Respawn", "[!new_nores]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/delay() set category = "Server" @@ -664,7 +665,7 @@ to_chat(world, "The tinted_weldhelh has been disabled!") log_admin("[key_name(usr)] toggled tinted_weldhelh.") message_admins("[key_name_admin(usr)] toggled tinted_weldhelh.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Tinted Welding Helmets", "[GLOB.tinted_weldhelh ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Tinted Welding Helmets", "[GLOB.tinted_weldhelh]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleguests() set category = "Server" @@ -678,7 +679,7 @@ to_chat(world, "Guests may now enter the game.") log_admin("[key_name(usr)] toggled guests game entering [!new_guest_ban ? "" : "dis"]allowed.") message_admins("[key_name_admin(usr)] toggled guests game entering [!new_guest_ban ? "" : "dis"]allowed.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Guests", "[!new_guest_ban ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Guests", "[!new_guest_ban]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/output_ai_laws() var/ai_number = 0 @@ -704,17 +705,15 @@ /datum/admins/proc/output_all_devil_info() var/devil_number = 0 - for(var/datum/mind/D in SSticker.mode.devils) + for(var/D in SSticker.mode.devils) devil_number++ - var/datum/antagonist/devil/devil = D.has_antag_datum(/datum/antagonist/devil) - to_chat(usr, "Devil #[devil_number]:

    " + devil.printdevilinfo()) + to_chat(usr, "Devil #[devil_number]:

    " + SSticker.mode.printdevilinfo(D)) if(!devil_number) to_chat(usr, "No Devils located" ) /datum/admins/proc/output_devil_info(mob/living/M) if(is_devil(M)) - var/datum/antagonist/devil/devil = M.mind.has_antag_datum(/datum/antagonist/devil) - to_chat(usr, devil.printdevilinfo()) + to_chat(usr, SSticker.mode.printdevilinfo(M)) else to_chat(usr, "[M] is not a devil.") diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index f259e9b1e9..6e327db6b5 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -11,8 +11,6 @@ return switch(subject) if("notes, memos, watchlist") - if(!check_rights(R_ADMIN)) - return browse_messages() else var/F = file("[GLOB.log_directory]/[subject].html") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 91d06e0339..8b8da5baa4 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -18,6 +18,7 @@ GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault()) /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ /client/proc/cmd_admin_pm_panel, /*admin-pm list*/ /client/proc/cmd_admin_ticket_panel, + /client/proc/panicbunker, /client/proc/stop_sounds ) GLOBAL_PROTECT(admin_verbs_admin) @@ -117,7 +118,6 @@ GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /client/proc/toggle_random_events, /client/proc/forcerandomrotate, /client/proc/adminchangemap, - /client/proc/panicbunker, /client/proc/toggle_hub ) GLOBAL_PROTECT(admin_verbs_debug) diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index b577a84a1d..16bd79f74a 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -1,4 +1,3 @@ - /datum/admins/proc/create_mob(mob/user) var/static/create_mob_html if (!create_mob_html) @@ -24,4 +23,4 @@ H.dna.blood_type = random_blood_type() H.update_body() H.update_hair() - H.update_body_parts() \ No newline at end of file + H.update_body_parts() diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 480ba20b4d..3336f3d0a8 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -95,7 +95,7 @@ var/obj/docking_port/stationary/SM = S if(SM.id == "emergency_home") var/new_dir = turn(SM.dir, 180) - SM.forceMove(get_ranged_target_turf(SM, new_dir, rand(3,15))) + SM.loc = get_ranged_target_turf(SM, new_dir, rand(3,15)) break qdel(src) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 82b60ca933..e9d4462c0a 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -173,4 +173,4 @@ you will have to do something like if(client.rights & R_ADMIN) yourself. return "admin_token=[RawHrefToken(forceGlobal)]" /proc/HrefTokenFormField(forceGlobal = FALSE) - return "" \ No newline at end of file + return "" diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index af31f471da..fa6e184ab4 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -384,10 +384,9 @@ dat += "
    [other_players] players in invalid state or the statistics code is bugged!" dat += "
    " - var/list/nukeops = get_antagonists(/datum/antagonist/nukeop) - if(nukeops.len) + if(SSticker.mode.syndicates.len) dat += "
    " - for(var/datum/mind/N in nukeops) + for(var/datum/mind/N in SSticker.mode.syndicates) var/mob/M = N.current if(M) dat += "" @@ -611,20 +610,6 @@ dat += "" dat += "
    Syndicates
    [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""]PM
    " - - var/list/pirates = get_antagonists(/datum/antagonist/pirate) - if(pirates.len > 0) - dat += "
    " - for(var/datum/mind/N in pirates) - var/mob/M = N.current - if(!M) - dat += "" - dat += "" - else - dat += "" - dat += "" - dat += "" - dat += "
    Pirates
    [N.name]([N.key])No body.PM
    [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""]PMFLW
    " if(istype(SSticker.mode, /datum/game_mode/monkey)) var/datum/game_mode/monkey/mode = SSticker.mode diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 577470a746..0753f942dc 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -43,8 +43,6 @@ if(check_rights(R_FUN,0)) dat += {" - Fun Secrets
    -
    Trigger a Virus Outbreak
    Turn all humans into monkeys
    Chinese Cartoons
    @@ -54,7 +52,6 @@ Power all SMES
    Triple AI mode (needs to be used in the lobby)
    Everyone is the traitor
    - AK47s for everyone!
    Summon Guns
    Summon Magic
    Summon Events (Toggle)
    @@ -197,7 +194,7 @@ if("moveminingshuttle") if(!check_rights(R_ADMIN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Send Mining Shuttle")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Mining Shuttle") if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away")) message_admins("[key_name_admin(usr)] moved mining shuttle") log_admin("[key_name(usr)] moved the mining shuttle") @@ -205,7 +202,7 @@ if("movelaborshuttle") if(!check_rights(R_ADMIN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Send Labor Shuttle")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Labor Shuttle") if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away")) message_admins("[key_name_admin(usr)] moved labor shuttle") log_admin("[key_name(usr)] moved the labor shuttle") @@ -213,7 +210,7 @@ if("moveferry") if(!check_rights(R_ADMIN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Send CentCom Ferry")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send CentCom Ferry") if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away")) message_admins("[key_name_admin(usr)] moved the CentCom ferry") log_admin("[key_name(usr)] moved the CentCom ferry") @@ -225,7 +222,7 @@ if(A) var/new_perma = !A.perma_docked A.perma_docked = new_perma - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Permadock Arrivals Shuttle", "[new_perma ? "Enabled" : "Disabled"]")) + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Permadock Arrivals Shuttle", "[new_perma]")) message_admins("[key_name_admin(usr)] [new_perma ? "stopped" : "started"] the arrivals shuttle") log_admin("[key_name(usr)] [new_perma ? "stopped" : "started"] the arrivals shuttle") else @@ -275,7 +272,7 @@ if("monkey") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Monkeyize All Humans")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Monkeyize All Humans") for(var/mob/living/carbon/human/H in GLOB.carbon_list) spawn(0) H.monkeyize() @@ -286,7 +283,7 @@ return var/result = input(usr, "Please choose a new species","Species") as null|anything in GLOB.species_list if(result) - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Species Change", "[result]")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Mass Species Change([result])") log_admin("[key_name(usr)] turned all humans into [result]", 1) message_admins("\blue [key_name_admin(usr)] turned all humans into [result]") var/newtype = GLOB.species_list[result] @@ -297,12 +294,12 @@ if(!check_rights(R_FUN)) return usr.client.triple_ai() - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Triple AI")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Triple AI") if("power") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Power All APCs")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Power All APCs") log_admin("[key_name(usr)] made all areas powered", 1) message_admins("[key_name_admin(usr)] made all areas powered") power_restore() @@ -310,7 +307,7 @@ if("unpower") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Depower All APCs")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Depower All APCs") log_admin("[key_name(usr)] made all areas unpowered", 1) message_admins("[key_name_admin(usr)] made all areas unpowered") power_failure() @@ -318,7 +315,7 @@ if("quickpower") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Power All SMESs")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Power All SMESs") log_admin("[key_name(usr)] made all SMESs powered", 1) message_admins("[key_name_admin(usr)] made all SMESs powered") power_restore_quick() @@ -332,7 +329,7 @@ var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN) if(!objective) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Traitor All", "[objective]")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Traitor All ([objective])") for(var/mob/living/H in GLOB.player_list) if(!(ishuman(H)||istype(H, /mob/living/silicon/))) continue @@ -353,7 +350,7 @@ if("changebombcap") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Bomb Cap")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Bomb Cap") var/newBombCap = input(usr,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be above 4)", "New Bomb Cap", GLOB.MAX_EX_LIGHT_RANGE) as num|null if (!CONFIG_SET(number/bombcap, newBombCap)) @@ -365,7 +362,7 @@ if("blackout") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Break All Lights")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Break All Lights") message_admins("[key_name_admin(usr)] broke all lights") for(var/obj/machinery/light/L in GLOB.machines) L.break_light_tube() @@ -381,7 +378,7 @@ if(animetype == "Cancel" || droptype == "Cancel") return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Chinese Cartoons")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Chinese Cartoons") message_admins("[key_name_admin(usr)] made everything kawaii.") for(var/mob/living/carbon/human/H in GLOB.carbon_list) SEND_SOUND(H, sound('sound/ai/animes.ogg')) @@ -411,7 +408,7 @@ if("whiteout") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Fix All Lights")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Fix All Lights") message_admins("[key_name_admin(usr)] fixed all lights") for(var/obj/machinery/light/L in GLOB.machines) L.fix() @@ -422,7 +419,7 @@ if("virus") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Virus Outbreak")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Virus Outbreak") switch(alert("Do you want this to be a random disease or do you have something in mind?",,"Make Your Own","Random","Choose")) if("Make Your Own") AdminCreateVirus(usr.client) @@ -437,7 +434,7 @@ if("retardify") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Braindamage")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Mass Braindamage") for(var/mob/living/carbon/human/H in GLOB.player_list) to_chat(H, "You suddenly feel stupid.") H.adjustBrainLoss(60, 80) @@ -446,7 +443,7 @@ if("eagles")//SCRAW if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Egalitarian Station")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Egalitarian Station") for(var/obj/machinery/door/airlock/W in GLOB.machines) if((W.z in GLOB.station_z_levels) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison)) W.req_access = list() @@ -463,7 +460,7 @@ if("guns") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Guns")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Summon Guns") var/survivor_probability = 0 switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!")) if("Some Antags") @@ -476,7 +473,7 @@ if("magic") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Magic")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Summon Magic") var/survivor_probability = 0 switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!")) if("Some Antags") @@ -492,22 +489,22 @@ if(!SSevents.wizardmode) if(alert("Do you want to toggle summon events on?",,"Yes","No") == "Yes") summonevents() - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Events", "Activate")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Activate Summon Events") else switch(alert("What would you like to do?",,"Intensify Summon Events","Turn Off Summon Events","Nothing")) if("Intensify Summon Events") summonevents() - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Events", "Intensify")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Intensify Summon Events") if("Turn Off Summon Events") SSevents.toggleWizardmode() SSevents.resetFrequency() - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Events", "Disable")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Disable Summon Events") if("dorf") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Dwarf Beards")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Dwarf Beards") for(var/mob/living/carbon/human/B in GLOB.carbon_list) B.facial_hair_style = "Dward Beard" B.update_hair() @@ -516,14 +513,14 @@ if("onlyone") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("There Can Be Only One")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "There Can Be Only One") usr.client.only_one() sound_to_playing_players('sound/misc/highlander.ogg') if("delayed_onlyone") if(!check_rights(R_FUN)) return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("There Can Be Only One")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "There Can Be Only One") usr.client.only_one_delayed() sound_to_playing_players('sound/misc/highlander_delayed.ogg') diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 3fd36806e6..de8dff1518 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -58,8 +58,6 @@ toggle_exempt_status(C) else if(href_list["makeAntag"]) - if(!check_rights(R_ADMIN)) - return if (!SSticker.mode) to_chat(usr, "Not until the round starts!") return @@ -203,8 +201,7 @@ return else if(href_list["dbbanaddtype"]) - if(!check_rights(R_BAN)) - return + var/bantype = text2num(href_list["dbbanaddtype"]) var/banckey = href_list["dbbanaddckey"] var/banip = href_list["dbbanaddip"] @@ -602,8 +599,6 @@ return else if(href_list["jobban2"]) - if(!check_rights(R_BAN)) - return var/mob/M = locate(href_list["jobban2"]) if(!ismob(M)) to_chat(usr, "This can only be used on instances of type /mob.") @@ -866,6 +861,12 @@ else dat += "Abductor" + //Borer + if(jobban_isbanned(M, "borer") || isbanned_dept) + dat += "Borer" + else + dat += "Borer" + //Alien if(jobban_isbanned(M, "alien candidate") || isbanned_dept) dat += "Alien" @@ -1028,8 +1029,6 @@ return 0 //we didn't do anything! else if(href_list["boot2"]) - if(!check_rights(R_ADMIN)) - return var/mob/M = locate(href_list["boot2"]) if (ismob(M)) if(!check_if_greater_rights_than(M.client)) @@ -1042,110 +1041,72 @@ qdel(M.client) else if(href_list["addmessage"]) - if(!check_rights(R_ADMIN)) - return var/target_ckey = href_list["addmessage"] create_message("message", target_ckey, secret = 0) else if(href_list["addnote"]) - if(!check_rights(R_ADMIN)) - return var/target_ckey = href_list["addnote"] create_message("note", target_ckey) else if(href_list["addwatch"]) - if(!check_rights(R_ADMIN)) - return var/target_ckey = href_list["addwatch"] create_message("watchlist entry", target_ckey, secret = 1) else if(href_list["addmemo"]) - if(!check_rights(R_ADMIN)) - return create_message("memo", secret = 0, browse = 1) else if(href_list["addmessageempty"]) - if(!check_rights(R_ADMIN)) - return create_message("message", secret = 0) else if(href_list["addnoteempty"]) - if(!check_rights(R_ADMIN)) - return create_message("note") else if(href_list["addwatchempty"]) - if(!check_rights(R_ADMIN)) - return create_message("watchlist entry", secret = 1) else if(href_list["deletemessage"]) - if(!check_rights(R_ADMIN)) - return var/message_id = href_list["deletemessage"] delete_message(message_id) else if(href_list["deletemessageempty"]) - if(!check_rights(R_ADMIN)) - return var/message_id = href_list["deletemessageempty"] delete_message(message_id, browse = 1) else if(href_list["editmessage"]) - if(!check_rights(R_ADMIN)) - return var/message_id = href_list["editmessage"] edit_message(message_id) else if(href_list["editmessageempty"]) - if(!check_rights(R_ADMIN)) - return var/message_id = href_list["editmessageempty"] edit_message(message_id, browse = 1) else if(href_list["secretmessage"]) - if(!check_rights(R_ADMIN)) - return var/message_id = href_list["secretmessage"] toggle_message_secrecy(message_id) else if(href_list["searchmessages"]) - if(!check_rights(R_ADMIN)) - return var/target = href_list["searchmessages"] browse_messages(index = target) else if(href_list["nonalpha"]) - if(!check_rights(R_ADMIN)) - return var/target = href_list["nonalpha"] target = text2num(target) browse_messages(index = target) else if(href_list["showmessages"]) - if(!check_rights(R_ADMIN)) - return var/target = href_list["showmessages"] browse_messages(index = target) else if(href_list["showmemo"]) - if(!check_rights(R_ADMIN)) - return browse_messages("memo") else if(href_list["showwatch"]) - if(!check_rights(R_ADMIN)) - return browse_messages("watchlist entry") else if(href_list["showwatchfilter"]) - if(!check_rights(R_ADMIN)) - return browse_messages("watchlist entry", filter = 1) else if(href_list["showmessageckey"]) - if(!check_rights(R_ADMIN)) - return var/target = href_list["showmessageckey"] var/agegate = TRUE if (href_list["showall"]) @@ -1157,8 +1118,6 @@ browse_messages(target_ckey = target, linkless = 1) else if(href_list["messageedits"]) - if(!check_rights(R_ADMIN)) - return var/message_id = sanitizeSQL("[href_list["messageedits"]]") var/datum/DBQuery/query_get_message_edits = SSdbcore.NewQuery("SELECT edits FROM [format_table_name("messages")] WHERE id = '[message_id]'") if(!query_get_message_edits.warn_execute()) @@ -1348,7 +1307,7 @@ if(alert(usr, "Send [key_name(M)] to Prison?", "Message", "Yes", "No") != "Yes") return - M.forceMove(pick(GLOB.prisonwarp)) + M.loc = pick(GLOB.prisonwarp) to_chat(M, "You have been sent to Prison!") log_admin("[key_name(usr)] has sent [key_name(M)] to Prison!") @@ -1584,7 +1543,7 @@ C.admin_ghost() var/mob/dead/observer/A = C.mob A.ManualFollow(AM) - + else if(href_list["admingetmovable"]) if(!check_rights(R_ADMIN)) return @@ -1609,13 +1568,9 @@ C.jumptocoord(x,y,z) else if(href_list["adminchecklaws"]) - if(!check_rights(R_ADMIN)) - return output_ai_laws() else if(href_list["admincheckdevilinfo"]) - if(!check_rights(R_ADMIN)) - return var/mob/M = locate(href_list["admincheckdevilinfo"]) output_devil_info(M) @@ -1649,7 +1604,7 @@ var/mob/living/L = M var/status switch (M.stat) - if(CONSCIOUS) + if (CONSCIOUS) status = "Alive" if(SOFT_CRIT) status = "Dying" @@ -2024,28 +1979,20 @@ Secrets_topic(href_list["secrets"],href_list) else if(href_list["ac_view_wanted"]) //Admin newscaster Topic() stuff be here - if(!check_rights(R_ADMIN)) - return src.admincaster_screen = 18 //The ac_ prefix before the hrefs stands for AdminCaster. src.access_news_network() else if(href_list["ac_set_channel_name"]) - if(!check_rights(R_ADMIN)) - return src.admincaster_feed_channel.channel_name = stripped_input(usr, "Provide a Feed Channel Name.", "Network Channel Handler", "") while (findtext(src.admincaster_feed_channel.channel_name," ") == 1) src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,lentext(src.admincaster_feed_channel.channel_name)+1) src.access_news_network() else if(href_list["ac_set_channel_lock"]) - if(!check_rights(R_ADMIN)) - return src.admincaster_feed_channel.locked = !src.admincaster_feed_channel.locked src.access_news_network() else if(href_list["ac_submit_new_channel"]) - if(!check_rights(R_ADMIN)) - return var/check = 0 for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels) if(FC.channel_name == src.admincaster_feed_channel.channel_name) @@ -2063,8 +2010,6 @@ src.access_news_network() else if(href_list["ac_set_channel_receiving"]) - if(!check_rights(R_ADMIN)) - return var/list/available_channels = list() for(var/datum/newscaster/feed_channel/F in GLOB.news_network.network_channels) available_channels += F.channel_name @@ -2072,16 +2017,12 @@ src.access_news_network() else if(href_list["ac_set_new_message"]) - if(!check_rights(R_ADMIN)) - return src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story.", "Network Channel Handler", "")) while (findtext(src.admincaster_feed_message.returnBody(-1)," ") == 1) src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.returnBody(-1),2,lentext(src.admincaster_feed_message.returnBody(-1))+1) src.access_news_network() else if(href_list["ac_submit_new_message"]) - if(!check_rights(R_ADMIN)) - return if(src.admincaster_feed_message.returnBody(-1) =="" || src.admincaster_feed_message.returnBody(-1) =="\[REDACTED\]" || src.admincaster_feed_channel.channel_name == "" ) src.admincaster_screen = 6 else @@ -2096,32 +2037,22 @@ src.access_news_network() else if(href_list["ac_create_channel"]) - if(!check_rights(R_ADMIN)) - return src.admincaster_screen=2 src.access_news_network() else if(href_list["ac_create_feed_story"]) - if(!check_rights(R_ADMIN)) - return src.admincaster_screen=3 src.access_news_network() else if(href_list["ac_menu_censor_story"]) - if(!check_rights(R_ADMIN)) - return src.admincaster_screen=10 src.access_news_network() else if(href_list["ac_menu_censor_channel"]) - if(!check_rights(R_ADMIN)) - return src.admincaster_screen=11 src.access_news_network() else if(href_list["ac_menu_wanted"]) - if(!check_rights(R_ADMIN)) - return var/already_wanted = 0 if(GLOB.news_network.wanted_issue.active) already_wanted = 1 @@ -2133,24 +2064,18 @@ src.access_news_network() else if(href_list["ac_set_wanted_name"]) - if(!check_rights(R_ADMIN)) - return src.admincaster_wanted_message.criminal = adminscrub(input(usr, "Provide the name of the Wanted person.", "Network Security Handler", "")) while(findtext(src.admincaster_wanted_message.criminal," ") == 1) src.admincaster_wanted_message.criminal = copytext(admincaster_wanted_message.criminal,2,lentext(admincaster_wanted_message.criminal)+1) src.access_news_network() else if(href_list["ac_set_wanted_desc"]) - if(!check_rights(R_ADMIN)) - return src.admincaster_wanted_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important.", "Network Security Handler", "")) while (findtext(src.admincaster_wanted_message.body," ") == 1) src.admincaster_wanted_message.body = copytext(src.admincaster_wanted_message.body,2,lentext(src.admincaster_wanted_message.body)+1) src.access_news_network() else if(href_list["ac_submit_wanted"]) - if(!check_rights(R_ADMIN)) - return var/input_param = text2num(href_list["ac_submit_wanted"]) if(src.admincaster_wanted_message.criminal == "" || src.admincaster_wanted_message.body == "") src.admincaster_screen = 16 @@ -2167,8 +2092,6 @@ src.access_news_network() else if(href_list["ac_cancel_wanted"]) - if(!check_rights(R_ADMIN)) - return var/choice = alert("Please confirm Wanted Issue removal.","Network Security Handler","Confirm","Cancel") if(choice=="Confirm") GLOB.news_network.deleteWanted() @@ -2176,50 +2099,36 @@ src.access_news_network() else if(href_list["ac_censor_channel_author"]) - if(!check_rights(R_ADMIN)) - return var/datum/newscaster/feed_channel/FC = locate(href_list["ac_censor_channel_author"]) FC.toggleCensorAuthor() src.access_news_network() else if(href_list["ac_censor_channel_story_author"]) - if(!check_rights(R_ADMIN)) - return var/datum/newscaster/feed_message/MSG = locate(href_list["ac_censor_channel_story_author"]) MSG.toggleCensorAuthor() src.access_news_network() else if(href_list["ac_censor_channel_story_body"]) - if(!check_rights(R_ADMIN)) - return var/datum/newscaster/feed_message/MSG = locate(href_list["ac_censor_channel_story_body"]) MSG.toggleCensorBody() src.access_news_network() else if(href_list["ac_pick_d_notice"]) - if(!check_rights(R_ADMIN)) - return var/datum/newscaster/feed_channel/FC = locate(href_list["ac_pick_d_notice"]) src.admincaster_feed_channel = FC src.admincaster_screen=13 src.access_news_network() else if(href_list["ac_toggle_d_notice"]) - if(!check_rights(R_ADMIN)) - return var/datum/newscaster/feed_channel/FC = locate(href_list["ac_toggle_d_notice"]) FC.toggleCensorDclass() src.access_news_network() else if(href_list["ac_view"]) - if(!check_rights(R_ADMIN)) - return src.admincaster_screen=1 src.access_news_network() else if(href_list["ac_setScreen"]) //Brings us to the main menu and resets all fields~ - if(!check_rights(R_ADMIN)) - return src.admincaster_screen = text2num(href_list["ac_setScreen"]) if (src.admincaster_screen == 0) if(src.admincaster_feed_channel) @@ -2231,35 +2140,25 @@ src.access_news_network() else if(href_list["ac_show_channel"]) - if(!check_rights(R_ADMIN)) - return var/datum/newscaster/feed_channel/FC = locate(href_list["ac_show_channel"]) src.admincaster_feed_channel = FC src.admincaster_screen = 9 src.access_news_network() else if(href_list["ac_pick_censor_channel"]) - if(!check_rights(R_ADMIN)) - return var/datum/newscaster/feed_channel/FC = locate(href_list["ac_pick_censor_channel"]) src.admincaster_feed_channel = FC src.admincaster_screen = 12 src.access_news_network() else if(href_list["ac_refresh"]) - if(!check_rights(R_ADMIN)) - return src.access_news_network() else if(href_list["ac_set_signature"]) - if(!check_rights(R_ADMIN)) - return src.admin_signature = adminscrub(input(usr, "Provide your desired signature.", "Network Identity Handler", "")) src.access_news_network() else if(href_list["ac_del_comment"]) - if(!check_rights(R_ADMIN)) - return var/datum/newscaster/feed_comment/FC = locate(href_list["ac_del_comment"]) var/datum/newscaster/feed_message/FM = locate(href_list["ac_del_comment_msg"]) FM.comments -= FC @@ -2267,8 +2166,6 @@ src.access_news_network() else if(href_list["ac_lock_comment"]) - if(!check_rights(R_ADMIN)) - return var/datum/newscaster/feed_message/FM = locate(href_list["ac_lock_comment"]) FM.locked ^= 1 src.access_news_network() @@ -2365,8 +2262,6 @@ error_viewer.show_to(owner, null, href_list["viewruntime_linear"]) else if(href_list["showrelatedacc"]) - if(!check_rights(R_ADMIN)) - return var/client/C = locate(href_list["client"]) in GLOB.clients var/thing_to_check if(href_list["showrelatedacc"] == "cid") diff --git a/code/modules/admin/verbs/BrokenInhands.dm b/code/modules/admin/verbs/BrokenInhands.dm index 112dff352b..20721077df 100644 --- a/code/modules/admin/verbs/BrokenInhands.dm +++ b/code/modules/admin/verbs/BrokenInhands.dm @@ -31,5 +31,3 @@ fdel(F) WRITE_FILE(F, text) to_chat(world, "Completely successfully and written to [F]") - - diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm index 56faa1f6c4..8a7c030458 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm @@ -114,8 +114,8 @@ /proc/_range(Dist, Center = usr) return range(Dist, Center) -/proc/_regex(pattern, flags) - return regex(pattern, flags) +/proc/_regex(pattern, flags_1) + return regex(pattern, flags_1) /proc/_REGEX_QUOTE(text) return REGEX_QUOTE(text) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 87f33e0fcd..2d57ee0965 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -615,18 +615,15 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) /proc/send2otherserver(source,msg,type = "Ahelp") var/comms_key = CONFIG_GET(string/comms_key) - if(!comms_key) - return - var/list/message = list() - message["message_sender"] = source - message["message"] = msg - message["source"] = "([CONFIG_GET(string/cross_comms_name)])" - message["key"] = comms_key - message["crossmessage"] = type + if(comms_key) + var/list/message = list() + message["message_sender"] = source + message["message"] = msg + message["source"] = "([CONFIG_GET(string/cross_comms_name)])" + message["key"] = comms_key + message["crossmessage"] = type - var/list/servers = CONFIG_GET(keyed_string_list/cross_server) - for(var/I in servers) - world.Export("[servers[I]]?[list2params(message)]") + world.Export("[CONFIG_GET(string/cross_server_address)]?[list2params(message)]") /proc/ircadminwho() diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 779ea64640..1e7f89fc8d 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -34,7 +34,7 @@ log_admin("[key_name(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]") message_admins("[key_name_admin(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]") - usr.forceMove(T) + usr.loc = T SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Turf") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -137,7 +137,7 @@ admin_ticket_log(M, msg) if(M) M.forceMove(get_turf(usr)) - usr.forceMove(M.loc) + usr.loc = M.loc SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/sendmob(mob/M in sortmobs()) diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index 5aa3258f07..7093ee23ea 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -8,4 +8,4 @@ var/datum/cinematic/choice = input(src,"Cinematic","Choose",null) as anything in subtypesof(/datum/cinematic) if(choice) - Cinematic(initial(choice.id),world,null) \ No newline at end of file + Cinematic(initial(choice.id),world,null) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 6f16a816df..b96c8f4bdc 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -739,7 +739,7 @@ GLOBAL_PROTECT(LastAdminCalledProc) Plasma.air_contents.gases[/datum/gas/plasma][MOLES] = 70 Rad.drainratio = 0 Rad.loaded_tank = Plasma - Plasma.forceMove(Rad) + Plasma.loc = Rad if(!Rad.active) Rad.toggle_power() @@ -802,7 +802,7 @@ GLOBAL_PROTECT(LastAdminCalledProc) set category = "Debug" set name = "Display overlay Log" set desc = "Display SSoverlays log of everything that's passed through it." - + render_stats(SSoverlays.stats, src) /client/proc/cmd_display_init_log() diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 6f2bcb6c46..bcf58b1a4c 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -53,6 +53,17 @@ set category = "Debug" set name = "Radio report" + var/filters = list( + "1" = "GLOB.RADIO_TO_AIRALARM", + "2" = "GLOB.RADIO_FROM_AIRALARM", + "3" = "GLOB.RADIO_CHAT", + "4" = "GLOB.RADIO_ATMOSIA", + "5" = "GLOB.RADIO_NAVBEACONS", + "6" = "GLOB.RADIO_AIRLOCK", + "7" = "RADIO_SECBOT", + "8" = "RADIO_MULEBOT", + "_default" = "NO_FILTER" + ) var/output = "Radio Report
    " for (var/fq in SSradio.frequencies) output += "Freq: [fq]
    " @@ -63,9 +74,9 @@ for (var/filter in fqs.devices) var/list/f = fqs.devices[filter] if (!f) - output += "  [filter]: ERROR
    " + output += "  [filters[filter]]: ERROR
    " continue - output += "  [filter]: [f.len]
    " + output += "  [filters[filter]]: [f.len]
    " for (var/device in f) if (istype(device, /atom)) var/atom/A = device diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index cbde59bcb6..5d0c2fe833 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -39,6 +39,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( /client/proc/cmd_admin_rejuvenate, /datum/admins/proc/show_traitor_panel, /client/proc/disable_communication, + /client/proc/print_pointers, /client/proc/cmd_show_at_list, /client/proc/cmd_show_at_markers, /client/proc/manipulate_organs, diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm index db1150fb72..6043d23d62 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/verbs/massmodvar.dm @@ -64,14 +64,14 @@ if(default == VV_NUM) var/dir_text = "" - if(var_value > 0 && var_value < 16) - if(var_value & 1) + if(dir < 0 && dir < 16) + if(dir & 1) dir_text += "NORTH" - if(var_value & 2) + if(dir & 2) dir_text += "SOUTH" - if(var_value & 4) + if(dir & 4) dir_text += "EAST" - if(var_value & 8) + if(dir & 8) dir_text += "WEST" if(dir_text) diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index ea88c90072..3a2e13fdcc 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -441,11 +441,11 @@ GLOBAL_PROTECT(VVpixelmovement) if(tdir > 0 && tdir < 16) if(tdir & 1) dir_text += "NORTH" - if(tdir & 2) + if(dir & 2) dir_text += "SOUTH" - if(tdir & 4) + if(dir & 4) dir_text += "EAST" - if(tdir & 8) + if(dir & 8) dir_text += "WEST" if(dir_text) @@ -560,14 +560,14 @@ GLOBAL_PROTECT(VVpixelmovement) if(default == VV_NUM) var/dir_text = "" - if(var_value > 0 && var_value < 16) - if(var_value & 1) + if(dir < 0 && dir < 16) + if(dir & 1) dir_text += "NORTH" - if(var_value & 2) + if(dir & 2) dir_text += "SOUTH" - if(var_value & 4) + if(dir & 4) dir_text += "EAST" - if(var_value & 8) + if(dir & 8) dir_text += "WEST" if(dir_text) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 2c59ce21f2..8a18dc9ac5 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -238,17 +238,26 @@ if(agentcount < 3) return 0 + var/nuke_code = random_nukecode() + + var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list + if(nuke) + nuke.r_code = nuke_code + //Let's find the spawn locations var/leader_chosen = FALSE - var/datum/objective_team/nuclear/nuke_team + var/spawnpos = 1 //Decides where they'll spawn. 1=leader. + for(var/mob/c in chosen) + if(spawnpos > GLOB.nukeop_start.len) + spawnpos = 1 //Ran out of spawns. Let's loop back to the first non-leader position var/mob/living/carbon/human/new_character=makeBody(c) if(!leader_chosen) leader_chosen = TRUE - var/datum/antagonist/nukeop/N = new_character.mind.add_antag_datum(/datum/antagonist/nukeop/leader) - nuke_team = N.nuke_team + new_character.mind.make_Nuke(pick(GLOB.nukeop_leader_start), nuke_code, TRUE) else - new_character.mind.add_antag_datum(/datum/antagonist/nukeop,nuke_team) + new_character.mind.make_Nuke(GLOB.nukeop_start[spawnpos], nuke_code) + spawnpos++ return 1 else return 0 @@ -308,14 +317,11 @@ //Assign antag status and the mission SSticker.mode.traitors += Commando.mind Commando.mind.special_role = "deathsquad" - var/datum/objective/missionobj = new missionobj.owner = Commando.mind missionobj.explanation_text = mission missionobj.completed = 1 Commando.mind.objectives += missionobj - - Commando.mind.add_antag_datum(/datum/antagonist/auto_custom) //Greet the commando to_chat(Commando, "You are the [numagents==1?"Deathsquad Officer":"Death Commando"].") @@ -363,14 +369,11 @@ //Assign antag status and the mission SSticker.mode.traitors += newmob.mind newmob.mind.special_role = "official" - var/datum/objective/missionobj = new missionobj.owner = newmob.mind missionobj.explanation_text = mission missionobj.completed = 1 newmob.mind.objectives += missionobj - - newmob.mind.add_antag_datum(/datum/antagonist/auto_custom) if(CONFIG_GET(flag/enforce_human_authority)) newmob.set_species(/datum/species/human) @@ -471,15 +474,12 @@ //Assign antag status and the mission SSticker.mode.traitors += ERTOperative.mind ERTOperative.mind.special_role = "ERT" - var/datum/objective/missionobj = new missionobj.owner = ERTOperative.mind missionobj.explanation_text = mission missionobj.completed = 1 ERTOperative.mind.objectives += missionobj - ERTOperative.mind.add_antag_datum(/datum/antagonist/auto_custom) - //Greet the commando to_chat(ERTOperative, "You are [numagents==1?"the Emergency Response Team Commander":"an Emergency Response Officer"].") var/missiondesc = "Your squad is being sent on a Code [alert] mission to [station_name()] by Nanotrasen's Security Division." diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index d09041aaf3..b675815602 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -28,7 +28,6 @@ GLOBAL_VAR_INIT(highlander, FALSE) /mob/living/carbon/human/proc/make_scottish() SSticker.mode.traitors += mind mind.special_role = "highlander" - dna.species.species_traits |= NOGUNS //nice try jackass var/datum/objective/steal/steal_objective = new @@ -41,8 +40,6 @@ GLOBAL_VAR_INIT(highlander, FALSE) hijack_objective.owner = mind mind.objectives += hijack_objective - mind.add_antag_datum(/datum/antagonist/auto_custom) - mind.announce_objectives() for(var/obj/item/I in get_equipped_items()) diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm index fc0cab66c9..f7d1d60aab 100644 --- a/code/modules/admin/verbs/panicbunker.dm +++ b/code/modules/admin/verbs/panicbunker.dm @@ -12,4 +12,5 @@ message_admins("[key_name_admin(usr)] has toggled the Panic Bunker, it is now [new_pb ? "enabled" : "disabled"].") if (new_pb && !SSdbcore.Connect()) message_admins("The Database is not connected! Panic bunker will not work until the connection is reestablished.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Panic Bunker", "[new_pb ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Panic Bunker", "[new_pb]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index a05637571c..6b1edf7709 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -92,7 +92,6 @@ if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) pitch = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5) to_chat(src, "You feel the Honkmother messing with your song...") - SSblackbox.record_feedback("nested tally", "played_url", 1, list("[ckey]", "[web_sound_input]")) log_admin("[key_name(src)] played web sound: [web_sound_input]") message_admins("[key_name(src)] played web sound: [web_sound_input]") diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index a9b5093e99..fc81ca3a02 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -21,26 +21,25 @@ usr.loc = O usr.real_name = O.name usr.name = O.name - usr.reset_perspective(O) + usr.client.eye = O usr.control_object = O SSblackbox.record_feedback("tally", "admin_verb", 1, "Possess Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/proc/release() +/proc/release(obj/O in world) set name = "Release Obj" set category = "Object" //usr.loc = get_turf(usr) if(usr.control_object && usr.name_archive) //if you have a name archived and if you are actually relassing an object usr.real_name = usr.name_archive - usr.name_archive = "" usr.name = usr.real_name if(ishuman(usr)) var/mob/living/carbon/human/H = usr H.name = H.get_visible_name() +// usr.regenerate_icons() //So the name is updated properly - - usr.loc = get_turf(usr.control_object) - usr.reset_perspective() + usr.loc = O.loc + usr.client.eye = usr usr.control_object = null SSblackbox.record_feedback("tally", "admin_verb", 1, "Release Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 01e45e471b..48ba94bb76 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -125,7 +125,7 @@ var/msg = "[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]" message_admins(msg) admin_ticket_log(M, msg) - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Godmode", "[M.status_flags & GODMODE ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Godmode", "[M.status_flags & GODMODE]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /proc/cmd_admin_mute(whom, mute_type, automute = 0) @@ -386,8 +386,7 @@ Traitors and the like can also be revived with the previous role mostly intact. A.equip_wizard() if("Syndicate") new_character.forceMove(pick(GLOB.nukeop_start)) - var/datum/antagonist/nukeop/N = new_character.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE) - N.equip_op() + call(/datum/game_mode/proc/equip_syndicate)(new_character) if("Space Ninja") var/list/ninja_spawn = list() for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) @@ -747,7 +746,7 @@ Traitors and the like can also be revived with the previous role mostly intact. else to_chat(usr, "Random events disabled") message_admins("Admin [key_name_admin(usr)] has disabled random events.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Random Events", "[new_are ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Random Events", "[new_are]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_change_sec_level() @@ -980,7 +979,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits to_chat(usr, "You toggled your admin antag HUD [adding_hud ? "ON" : "OFF"].") message_admins("[key_name_admin(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].") log_admin("[key_name(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Antag HUD", "[adding_hud ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Antag HUD", "[adding_hud]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/has_antag_hud() var/datum/atom_hud/A = GLOB.huds[ANTAG_HUD_TRAITOR] @@ -1199,7 +1198,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if (GLOB.hub_visibility && !world.reachable) message_admins("WARNING: The server will not show up on the hub because byond is detecting that a filewall is blocking incoming connections.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggled Hub Visibility", "[GLOB.hub_visibility ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggled Hub Visibility", "[GLOB.hub_visibility]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/smite(mob/living/carbon/human/target as mob) set name = "Smite" diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 7e0aa59816..315e28df02 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -114,4 +114,3 @@ /obj/item/device/assembly/interact(mob/user) return //HTML MENU FOR WIRES GOES HERE - diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 439ea314bb..b929e83ada 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -68,10 +68,11 @@ a_right.on_found(finder) /obj/item/device/assembly_holder/Move() - . = ..() + ..() if(a_left && a_right) a_left.holder_movement() a_right.holder_movement() + return /obj/item/device/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess if(a_left && a_right) @@ -87,10 +88,10 @@ return 0 if(a_left) a_left.holder = null - a_left.forceMove(T) + a_left.loc = T if(a_right) a_right.holder = null - a_right.forceMove(T) + a_right.loc = T qdel(src) else ..() diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 565465ec6d..0b9d42e42e 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -83,9 +83,10 @@ /obj/item/device/assembly/infra/Move() var/t = dir - . = ..() + ..() setDir(t) qdel(first) + return /obj/item/device/assembly/infra/holder_movement() if(!holder) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 152fa374ee..e8ee742e56 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -20,7 +20,7 @@ if(!armed) if(ishuman(usr)) var/mob/living/carbon/human/user = usr - if((user.disabilities & (CLUMSY | DUMB)) && prob(50)) + if((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY && prob(50)) to_chat(user, "Your hand slips, setting off the trigger!") pulse(0) update_icon() @@ -76,7 +76,7 @@ if(!armed) to_chat(user, "You arm [src].") else - if((user.disabilities & (CLUMSY | DUMB)) && prob(50)) + if(((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY) && prob(50)) var/which_hand = "l_hand" if(!(user.active_hand_index % 2)) which_hand = "r_hand" @@ -92,7 +92,7 @@ /obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user) if(armed) - if((user.disabilities & (CLUMSY | DUMB)) && prob(50)) + if(((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY) && prob(50)) var/which_hand = "l_hand" if(!(user.active_hand_index % 2)) which_hand = "r_hand" @@ -139,4 +139,4 @@ /obj/item/device/assembly/mousetrap/armed icon_state = "mousetraparmed" - armed = 1 + armed = TRUE diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index 174312df1e..1b21738391 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -1,39 +1,42 @@ -/obj/item/assembly/shock_kit - name = "electrohelmet assembly" - desc = "This appears to be made from both an electropack and a helmet." - icon = 'icons/obj/assemblies.dmi' - icon_state = "shock_kit" - var/obj/item/clothing/head/helmet/part1 = null - var/obj/item/device/electropack/part2 = null - w_class = WEIGHT_CLASS_HUGE +/obj/item/assembly/shock_kit + name = "electrohelmet assembly" + desc = "This appears to be made from both an electropack and a helmet." + icon = 'icons/obj/assemblies.dmi' + icon_state = "shock_kit" + var/obj/item/clothing/head/helmet/part1 = null + var/obj/item/device/electropack/part2 = null + w_class = WEIGHT_CLASS_HUGE flags_1 = CONDUCT_1 - -/obj/item/assembly/shock_kit/Destroy() - qdel(part1) - qdel(part2) - return ..() - -/obj/item/assembly/shock_kit/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) - part1.forceMove(drop_location()) - part2.forceMove(drop_location()) - part1.master = null - part2.master = null - part1 = null - part2 = null - qdel(src) - return - add_fingerprint(user) - return - -/obj/item/assembly/shock_kit/attack_self(mob/user) - part1.attack_self(user) - part2.attack_self(user) - add_fingerprint(user) - return - -/obj/item/assembly/shock_kit/receive_signal() - if(istype(loc, /obj/structure/chair/e_chair)) - var/obj/structure/chair/e_chair/C = loc - C.shock() - return + +/obj/item/assembly/shock_kit/Destroy() + qdel(part1) + qdel(part2) + return ..() + +/obj/item/assembly/shock_kit/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/wrench)) + var/turf/T = loc + if(ismob(T)) + T = T.loc + part1.loc = T + part2.loc = T + part1.master = null + part2.master = null + part1 = null + part2 = null + qdel(src) + return + add_fingerprint(user) + return + +/obj/item/assembly/shock_kit/attack_self(mob/user) + part1.attack_self(user) + part2.attack_self(user) + add_fingerprint(user) + return + +/obj/item/assembly/shock_kit/receive_signal() + if(istype(loc, /obj/structure/chair/e_chair)) + var/obj/structure/chair/e_chair/C = loc + C.shock() + return diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 1b0102abdd..d9fdab39be 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -9,8 +9,8 @@ wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE attachable = 1 - var/code = DEFAULT_SIGNALER_CODE - var/frequency = FREQ_SIGNALER + var/code = 30 + var/frequency = 1457 var/delay = 0 var/datum/radio_frequency/radio_connection @@ -73,7 +73,7 @@ Code: if (href_list["freq"]) var/new_frequency = (frequency + text2num(href_list["freq"])) - if(new_frequency < MIN_FREE_FREQ || new_frequency > MAX_FREE_FREQ) + if(new_frequency < 1200 || new_frequency > 1600) new_frequency = sanitize_frequency(new_frequency) set_frequency(new_frequency) @@ -105,7 +105,10 @@ Code: if(!radio_connection) return - var/datum/signal/signal = new(list("code" = code)) + var/datum/signal/signal = new + signal.source = src + signal.encryption = code + signal.data["message"] = "ACTIVATE" radio_connection.post_signal(src, signal) var/time = time2text(world.realtime,"hh:mm:ss") @@ -119,7 +122,7 @@ Code: /obj/item/device/assembly/signaler/receive_signal(datum/signal/signal) if(!signal) return 0 - if(signal.data["code"] != code) + if(signal.encryption != code) return 0 if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0 @@ -129,9 +132,13 @@ Code: /obj/item/device/assembly/signaler/proc/set_frequency(new_frequency) + if(!SSradio) + sleep(20) + if(!SSradio) + return SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = SSradio.add_object(src, frequency, RADIO_SIGNALER) + radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_CHAT) return // Embedded signaller used in grenade construction. @@ -168,7 +175,7 @@ Code: /obj/item/device/assembly/signaler/anomaly/receive_signal(datum/signal/signal) if(!signal) return 0 - if(signal.data["code"] != code) + if(signal.encryption != code) return 0 for(var/obj/effect/anomaly/A in get_turf(src)) A.anomalyNeutralize() diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 913176b662..617f384592 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -1,91 +1,91 @@ -/obj/item/device/assembly/voice - name = "voice analyzer" - desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated." - icon_state = "voice" - materials = list(MAT_METAL=500, MAT_GLASS=50) +/obj/item/device/assembly/voice + name = "voice analyzer" + desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated." + icon_state = "voice" + materials = list(MAT_METAL=500, MAT_GLASS=50) flags_1 = HEAR_1 - attachable = 1 - verb_say = "beeps" - verb_ask = "beeps" - verb_exclaim = "beeps" - var/listening = 0 - var/recorded = "" //the activation message - var/mode = 1 - var/static/list/modes = list("inclusive", - "exclusive", - "recognizer", - "voice sensor") - -/obj/item/device/assembly/voice/examine(mob/user) - ..() - to_chat(user, "Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode.") - -/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - if(speaker == src) - return - - if(listening && !radio_freq) - record_speech(speaker, raw_message, message_language) - else - if(check_activation(speaker, raw_message)) - addtimer(CALLBACK(src, .proc/pulse, 0), 10) - -/obj/item/device/assembly/voice/proc/record_speech(atom/movable/speaker, raw_message, datum/language/message_language) - switch(mode) - if(1) - recorded = raw_message - listening = 0 - say("Activation message is '[recorded]'.", message_language) - if(2) - recorded = raw_message - listening = 0 - say("Activation message is '[recorded]'.", message_language) - if(3) - recorded = speaker.GetVoice() - listening = 0 - say("Your voice pattern is saved.", message_language) - if(4) - if(length(raw_message)) - addtimer(CALLBACK(src, .proc/pulse, 0), 10) - -/obj/item/device/assembly/voice/proc/check_activation(atom/movable/speaker, raw_message) - . = 0 - switch(mode) - if(1) - if(findtext(raw_message, recorded)) - . = 1 - if(2) - if(raw_message == recorded) - . = 1 - if(3) - if(speaker.GetVoice() == recorded) - . = 1 - if(4) - if(length(raw_message)) - . = 1 - -/obj/item/device/assembly/voice/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/device/multitool)) - mode %= modes.len - mode++ - to_chat(user, "You set [src] into a [modes[mode]] mode.") - listening = 0 - recorded = "" - else - return ..() - -/obj/item/device/assembly/voice/activate() - if(secured) - if(!holder) - listening = !listening - say("[listening ? "Now" : "No longer"] recording input.") - -/obj/item/device/assembly/voice/attack_self(mob/user) - if(!user) - return 0 - activate() - return 1 - -/obj/item/device/assembly/voice/toggle_secure() - . = ..() - listening = 0 + attachable = 1 + verb_say = "beeps" + verb_ask = "beeps" + verb_exclaim = "beeps" + var/listening = 0 + var/recorded = "" //the activation message + var/mode = 1 + var/static/list/modes = list("inclusive", + "exclusive", + "recognizer", + "voice sensor") + +/obj/item/device/assembly/voice/examine(mob/user) + ..() + to_chat(user, "Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode.") + +/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + if(speaker == src) + return + + if(listening && !radio_freq) + record_speech(speaker, raw_message, message_language) + else + if(check_activation(speaker, raw_message)) + addtimer(CALLBACK(src, .proc/pulse, 0), 10) + +/obj/item/device/assembly/voice/proc/record_speech(atom/movable/speaker, raw_message, datum/language/message_language) + switch(mode) + if(1) + recorded = raw_message + listening = 0 + say("Activation message is '[recorded]'.", message_language) + if(2) + recorded = raw_message + listening = 0 + say("Activation message is '[recorded]'.", message_language) + if(3) + recorded = speaker.GetVoice() + listening = 0 + say("Your voice pattern is saved.", message_language) + if(4) + if(length(raw_message)) + addtimer(CALLBACK(src, .proc/pulse, 0), 10) + +/obj/item/device/assembly/voice/proc/check_activation(atom/movable/speaker, raw_message) + . = 0 + switch(mode) + if(1) + if(findtext(raw_message, recorded)) + . = 1 + if(2) + if(raw_message == recorded) + . = 1 + if(3) + if(speaker.GetVoice() == recorded) + . = 1 + if(4) + if(length(raw_message)) + . = 1 + +/obj/item/device/assembly/voice/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/device/multitool)) + mode %= modes.len + mode++ + to_chat(user, "You set [src] into a [modes[mode]] mode.") + listening = 0 + recorded = "" + else + return ..() + +/obj/item/device/assembly/voice/activate() + if(secured) + if(!holder) + listening = !listening + say("[listening ? "Now" : "No longer"] recording input.") + +/obj/item/device/assembly/voice/attack_self(mob/user) + if(!user) + return 0 + activate() + return 1 + +/obj/item/device/assembly/voice/toggle_secure() + . = ..() + listening = 0 diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 9e14bcdad1..952ee0e068 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -80,8 +80,8 @@ var/shorted = 0 var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone - var/frequency = FREQ_ATMOS_CONTROL - var/alarm_frequency = FREQ_ATMOS_ALARMS + var/frequency = 1439 + var/alarm_frequency = 1437 var/datum/radio_frequency/radio_connection var/list/TLV = list( // Breathable air. @@ -427,16 +427,21 @@ /obj/machinery/airalarm/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = SSradio.add_object(src, frequency, RADIO_TO_AIRALARM) + radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_TO_AIRALARM) /obj/machinery/airalarm/proc/send_signal(target, list/command)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise if(!radio_connection) return 0 - var/datum/signal/signal = new(command) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = command signal.data["tag"] = target signal.data["sigtype"] = "command" - radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM) + + radio_connection.post_signal(src, signal, GLOB.RADIO_FROM_AIRALARM) return 1 @@ -627,10 +632,12 @@ var/area/A = get_area(src) - var/datum/signal/alert_signal = new(list( - "zone" = A.name, - "type" = "Atmospheric" - )) + var/datum/signal/alert_signal = new + alert_signal.source = src + alert_signal.transmission_method = 1 + alert_signal.data["zone"] = A.name + alert_signal.data["type"] = "Atmospheric" + if(alert_level==2) alert_signal.data["alert"] = "severe" else if (alert_level==1) @@ -638,7 +645,7 @@ else if (alert_level==0) alert_signal.data["alert"] = "clear" - frequency.post_signal(src, alert_signal, range = -1) + frequency.post_signal(src, alert_signal,null,-1) /obj/machinery/airalarm/proc/apply_danger_level() var/area/A = get_area(src) @@ -735,7 +742,7 @@ return return ..() - + /obj/machinery/airalarm/AltClick(mob/user) ..() if(!issilicon(user) && (!user.canUseTopic(src, be_close=TRUE) || !isturf(loc))) @@ -743,7 +750,7 @@ return else togglelock(user) - + /obj/machinery/airalarm/proc/togglelock(mob/living/user) if(stat & (NOPOWER|BROKEN)) to_chat(user, "It does nothing!") diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 0dca88ade0..6c335bf896 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -346,7 +346,10 @@ Pipelines + Other Objects -> Pipe network return list() /obj/machinery/atmospherics/update_remote_sight(mob/user) - user.sight |= (SEE_TURFS|BLIND) + if(isborer(user)) + user.sight |= (SEE_PIXELS) + else + user.sight |= (SEE_TURFS|BLIND) //Used for certain children of obj/machinery/atmospherics to not show pipe vision when mob is inside it. /obj/machinery/atmospherics/proc/can_see_pipes() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 36462a3eb6..ef6dd85afa 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -15,7 +15,6 @@ anchored = TRUE density = TRUE - var/global/const/CIRC_LEFT = 1 var/global/const/CIRC_RIGHT = 2 @@ -40,8 +39,6 @@ var/transfer_moles = pressure_delta*air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION) last_pressure_delta = pressure_delta - - //Actually transfer the gas var/datum/gas_mixture/removed = air2.remove(transfer_moles) update_parents() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index 0bb6c629e0..f8204947f1 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -131,13 +131,17 @@ Acts like a normal vent, but has an input AND output. SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = SSradio.add_object(src, frequency, filter = RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, filter = GLOB.RADIO_ATMOSIA) /obj/machinery/atmospherics/components/binary/dp_vent_pump/proc/broadcast_status() if(!radio_connection) return - var/datum/signal/signal = new(list( + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( "tag" = id, "device" = "ADVP", "power" = on, @@ -147,8 +151,8 @@ Acts like a normal vent, but has an input AND output. "output" = output_pressure_max, "external" = external_pressure_bound, "sigtype" = "status" - )) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + ) + radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA) /obj/machinery/atmospherics/components/binary/dp_vent_pump/atmosinit() ..() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 8470695704..86c5375d07 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -72,20 +72,25 @@ Passive gate is similar to the regular pump except: SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = SSradio.add_object(src, frequency, filter = RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, filter = GLOB.RADIO_ATMOSIA) /obj/machinery/atmospherics/components/binary/passive_gate/proc/broadcast_status() if(!radio_connection) return - var/datum/signal/signal = new(list( + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( "tag" = id, "device" = "AGP", "power" = on, "target_output" = target_pressure, "sigtype" = "status" - )) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + ) + + radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA) /obj/machinery/atmospherics/components/binary/passive_gate/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 176d6792bf..97bba0e534 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -75,20 +75,25 @@ Thus, the two variables affect pump operation are set in New(): SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = SSradio.add_object(src, frequency, filter = RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, filter = GLOB.RADIO_ATMOSIA) /obj/machinery/atmospherics/components/binary/pump/proc/broadcast_status() if(!radio_connection) return - var/datum/signal/signal = new(list( + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( "tag" = id, "device" = "AGP", "power" = on, "target_output" = target_pressure, "sigtype" = "status" - )) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + ) + + radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA) /obj/machinery/atmospherics/components/binary/pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 5860633b28..4baeb3dd3e 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -29,7 +29,7 @@ SSradio.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) + radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA) /obj/machinery/atmospherics/components/trinary/filter/New() ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index b677db89a4..a7123dd97b 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -42,7 +42,7 @@ radio = new(src) radio.keyslot = new radio_key - radio.subspace_transmission = TRUE + radio.subspace_transmission = 1 radio.canhear_range = 0 radio.recalculateChannels() @@ -182,7 +182,7 @@ mob_occupant.Unconscious((mob_occupant.bodytemperature * unconscious_factor) * 2000) if(beaker) if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic. - beaker.reagents.trans_to(occupant, 1, efficiency * 0.25) // Transfer reagents. + beaker.reagents.trans_to(occupant, 1, 10 * efficiency) // Transfer reagents, multiplied because cryo magic. beaker.reagents.reaction(occupant, VAPOR) air1.gases[/datum/gas/oxygen][MOLES] -= 2 / efficiency //Let's use gas for this if(++reagent_transfer >= 10 * efficiency) // Throttle reagent transfer (higher efficiency will transfer the same amount but consume less from the beaker). @@ -348,6 +348,7 @@ else data["occupant"]["temperaturestatus"] = "bad" + var/datum/gas_mixture/air1 = AIR1 data["cellTemperature"] = round(air1.temperature, 1) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 7162499a3f..37bfb5d952 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -93,14 +93,19 @@ if(!radio_connection) return - var/datum/signal/signal = new(list( + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( "tag" = id, "device" = "AO", "power" = on, "volume_rate" = volume_rate, //"timestamp" = world.time, "sigtype" = "status" - )) + ) + radio_connection.post_signal(src, signal) /obj/machinery/atmospherics/components/unary/outlet_injector/atmosinit() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 311bca338a..a05a13217d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -26,7 +26,7 @@ // INT_BOUND: Do not pass internal_pressure_bound // NO_BOUND: Do not pass either - var/frequency = FREQ_ATMOS_CONTROL + var/frequency = 1439 var/datum/radio_frequency/radio_connection var/radio_filter_out var/radio_filter_in @@ -178,7 +178,11 @@ if(!radio_connection) return - var/datum/signal/signal = new(list( + var/datum/signal/signal = new + signal.transmission_method = 1 // radio signal + signal.source = src + + signal.data = list( "tag" = id_tag, "frequency" = frequency, "device" = "VP", @@ -189,7 +193,7 @@ "internal" = internal_pressure_bound, "external" = external_pressure_bound, "sigtype" = "status" - )) + ) var/area/A = get_area(src) if(!A.air_vent_names[id_tag]) @@ -202,8 +206,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/atmosinit() //some vents work his own spesial way - radio_filter_in = frequency==FREQ_ATMOS_CONTROL?(RADIO_FROM_AIRALARM):null - radio_filter_out = frequency==FREQ_ATMOS_CONTROL?(RADIO_TO_AIRALARM):null + radio_filter_in = frequency==1439?(GLOB.RADIO_FROM_AIRALARM):null + radio_filter_out = frequency==1439?(GLOB.RADIO_TO_AIRALARM):null if(frequency) set_frequency(frequency) broadcast_status() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 2deefc17d0..b3ade6f0fb 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -23,7 +23,7 @@ var/widenet = 0 //is this scrubber acting on the 3x3 area around it. var/list/turf/adjacent_turfs = list() - var/frequency = FREQ_ATMOS_CONTROL + var/frequency = 1439 var/datum/radio_frequency/radio_connection var/radio_filter_out var/radio_filter_in @@ -81,7 +81,7 @@ icon_state = "scrub_off" return - if(scrubbing & SCRUBBING) + if(scrubbing & SCRUBBING) if(widenet) icon_state = "scrub_wide" else @@ -98,12 +98,16 @@ if(!radio_connection) return FALSE + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + var/list/f_types = list() for(var/path in GLOB.meta_gas_info) var/list/gas = GLOB.meta_gas_info[path] f_types += list(list("gas_id" = gas[META_GAS_ID], "gas_name" = gas[META_GAS_NAME], "enabled" = (path in filter_types))) - var/datum/signal/signal = new(list( + signal.data = list( "tag" = id_tag, "frequency" = frequency, "device" = "VS", @@ -113,7 +117,7 @@ "widenet" = widenet, "filter_types" = f_types, "sigtype" = "status" - )) + ) var/area/A = get_area(src) if(!A.air_scrub_names[id_tag]) @@ -126,8 +130,8 @@ return TRUE /obj/machinery/atmospherics/components/unary/vent_scrubber/atmosinit() - radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null - radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null + radio_filter_in = frequency==initial(frequency)?(GLOB.RADIO_FROM_AIRALARM):null + radio_filter_out = frequency==initial(frequency)?(GLOB.RADIO_TO_AIRALARM):null if(frequency) set_frequency(frequency) broadcast_status() @@ -201,7 +205,7 @@ return TRUE -//There is no easy way for an object to be notified of changes to atmos can pass flags +//There is no easy way for an object to be notified of changes to atmos can pass flags_1 // So we check every machinery process (2 seconds) /obj/machinery/atmospherics/components/unary/vent_scrubber/process() if(widenet) diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index ccddc8f8ac..a26b379735 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -77,12 +77,15 @@ if(!radio_connection) return - var/datum/signal/signal = new(list( + var/datum/signal/signal = new + signal.source = src + signal.transmission_method = 1 + signal.data = list( "id_tag" = id_tag, "device" = "AM", "pressure" = round(env_pressure), "sigtype" = "status" - )) + ) radio_connection.post_signal(src, signal) /obj/machinery/meter/proc/status() diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index db153d60a4..3f2bceaa04 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -135,7 +135,7 @@ investigate_log("was set to [pump.target_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS) if("eject") if(holding) - holding.forceMove(drop_location()) + holding.loc = get_turf(src) holding = null . = TRUE update_icon() diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 3ba7e0a110..564e6d294f 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -96,7 +96,7 @@ . = TRUE if("eject") if(holding) - holding.forceMove(drop_location()) + holding.loc = get_turf(src) holding = null . = TRUE if("toggle_filter") diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 5627206edf..8b640676ba 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -509,7 +509,7 @@ /datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H) ..() var/obj/item/device/radio/R = H.ears - R.set_frequency(FREQ_CTF_RED) + R.set_frequency(GLOB.REDTEAM_FREQ) R.freqlock = TRUE R.independent = TRUE H.dna.species.stunmod = 0 @@ -517,7 +517,7 @@ /datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H) ..() var/obj/item/device/radio/R = H.ears - R.set_frequency(FREQ_CTF_BLUE) + R.set_frequency(GLOB.BLUETEAM_FREQ) R.freqlock = TRUE R.independent = TRUE H.dna.species.stunmod = 0 @@ -532,6 +532,7 @@ var/team = WHITE_TEAM time_between_triggers = 1 anchored = TRUE + flags_2 = SLOWS_WHILE_IN_HAND_2 alpha = 255 /obj/structure/trap/examine(mob/user) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index db50d0c468..1f5df77be7 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -21,7 +21,6 @@ var/brute_damage = 0 var/oxy_damage = 0 var/burn_damage = 0 - var/datum/disease/disease = null //Do they start with a pre-spawned disease? var/mob_color //Change the mob's color var/assignedrole var/show_flavour = TRUE @@ -71,8 +70,6 @@ M.gender = mob_gender if(faction) M.faction = list(faction) - if(disease) - M.ForceContractDisease(new disease) if(death) M.death(1) //Kills the new mob @@ -262,19 +259,6 @@ ///////////Civilians////////////////////// -/obj/effect/mob_spawn/human/corpse/assistant - name = "Assistant" - outfit = /datum/outfit/job/assistant - -/obj/effect/mob_spawn/human/corpse/assistant/beesease_infection - disease = /datum/disease/beesease - -/obj/effect/mob_spawn/human/corpse/assistant/brainrot_infection - disease = /datum/disease/brainrot - -/obj/effect/mob_spawn/human/corpse/assistant/spanishflu_infection - disease = /datum/disease/fluspanish - /obj/effect/mob_spawn/human/cook name = "Cook" outfit = /datum/outfit/job/cook diff --git a/code/modules/awaymissions/exile.dm b/code/modules/awaymissions/exile.dm index 74a9a30d7c..2c683e91c9 100644 --- a/code/modules/awaymissions/exile.dm +++ b/code/modules/awaymissions/exile.dm @@ -1,13 +1,13 @@ - -/obj/structure/closet/secure_closet/exile - name = "exile implants" + +/obj/structure/closet/secure_closet/exile + name = "exile implants" req_access = list(ACCESS_HOS) - -/obj/structure/closet/secure_closet/exile/New() - ..() - new /obj/item/implanter/exile(src) - new /obj/item/implantcase/exile(src) - new /obj/item/implantcase/exile(src) - new /obj/item/implantcase/exile(src) - new /obj/item/implantcase/exile(src) + +/obj/structure/closet/secure_closet/exile/New() + ..() + new /obj/item/implanter/exile(src) + new /obj/item/implantcase/exile(src) + new /obj/item/implantcase/exile(src) + new /obj/item/implantcase/exile(src) + new /obj/item/implantcase/exile(src) new /obj/item/implantcase/exile(src) \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 462bfa9a80..5af834955f 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -139,7 +139,7 @@ /obj/structure/academy_wizard_spawner/proc/summon_wizard() var/turf/T = src.loc var/mob/living/carbon/human/wizbody = new(T) - wizbody.fully_replace_character_name(wizbody.real_name, "Academy Teacher") + wizbody.fully_replace_character_name("Academy Teacher") wizbody.mind_initialize() var/datum/mind/wizmind = wizbody.mind wizmind.special_role = "Academy Defender" diff --git a/code/modules/awaymissions/mission_code/caves.dm b/code/modules/awaymissions/mission_code/caves.dm index fd2f8f18af..05885fbe19 100644 --- a/code/modules/awaymissions/mission_code/caves.dm +++ b/code/modules/awaymissions/mission_code/caves.dm @@ -42,7 +42,7 @@ /obj/item/paper/fluff/awaymissions/caves/work_notice name = "work notice" - info = "
    Survival Info For Miners


    The caves are an unforgiving place, the only thing you'll have to traverse is the supplies in your locker and your own wit. Travel in packs when mining and try to shut down the monster dens before they overwhelm you. The job is dangerous but the haul is good, so remember this information and hopefully we'll all go home alive.
    " + info = "
    Survival Info For Miners


    The caves are an unforgiving place, the only thing you'll have to traverse is the supplies in your locker and your own wit. Travel in packs when mining and try to shut down the monster dens before they overwhelm you. The job is dangerous but the haul is good, so remember this infomation and hopefully we'll all go home alive.
    " /obj/item/paper/fluff/awaymissions/caves/shipment_notice name = "shipment notice" diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm index 082d2d3c9e..11c3f14012 100644 --- a/code/modules/awaymissions/mission_code/centcomAway.dm +++ b/code/modules/awaymissions/mission_code/centcomAway.dm @@ -60,4 +60,4 @@ teams never did figure out what happened that last time... and I can't wrap my head \ around it myself. Why would a shuttle full of evacuees all snap and beat each other \ to death the moment they reached safety?
    \ - - D. Cereza" \ No newline at end of file + - D. Cereza" diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index 65ed8f95b7..4aa6e88249 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -136,18 +136,41 @@ GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]") /* * Modified Nar-Sie */ -/obj/singularity/narsie/mini +/obj/singularity/narsie/sc_Narsie desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible." move_self = 0 //Contianed narsie does not move! grav_pull = 0 //Contained narsie does not pull stuff in! + var/uneatable = list(/turf/open/space, /obj/effect/overlay, /mob/living/simple_animal/hostile/construct) //Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment -/obj/singularity/narsie/mini/admin_investigate_setup() +/obj/singularity/narsie/sc_Narsie/admin_investigate_setup() return -/obj/singularity/narsie/mini/process() +/obj/singularity/narsie/sc_Narsie/process() eat() if(prob(25)) mezzer() -/obj/singularity/narsie/mini/ex_act() +/obj/singularity/narsie/sc_Narsie/consume(atom/A) + if(is_type_in_list(A, uneatable)) + return 0 + if(isliving(A)) + var/mob/living/L = A + L.gib() + else if(istype(A, /obj/)) + var/obj/O = A + O.ex_act(EXPLODE_DEVASTATE) + if(O) + qdel(O) + else if(isturf(A)) + var/turf/T = A + if(T.intact) + for(var/obj/O in T.contents) + if(O.level != 1) + continue + if(O.invisibility == INVISIBILITY_MAXIMUM) + src.consume(O) + T.ChangeTurf(/turf/open/space) + return + +/obj/singularity/narsie/sc_Narsie/ex_act() return \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 1fe8baba01..3031936d43 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -115,11 +115,9 @@ to_chat(user, "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart.") SSticker.mode.traitors += user.mind user.mind.special_role = "traitor" - var/datum/objective/hijack/hijack = new hijack.owner = user.mind user.mind.objectives += hijack - user.mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(user, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") user.mind.announce_objectives() user.set_species(/datum/species/shadow) diff --git a/code/modules/awaymissions/pamphlet.dm b/code/modules/awaymissions/pamphlet.dm index 94ebb91972..a1d12ae90a 100644 --- a/code/modules/awaymissions/pamphlet.dm +++ b/code/modules/awaymissions/pamphlet.dm @@ -1,39 +1,39 @@ -/obj/item/paper/pamphlet - name = "pamphlet" - icon_state = "pamphlet" +/obj/item/paper/pamphlet + name = "pamphlet" + icon_state = "pamphlet" /obj/item/paper/pamphlet/gateway - info = "Welcome to the Nanotrasen Gateway project...
    \ - Congratulations! If you're reading this, you and your superiors have decided that you're \ - ready to commit to a life spent colonising the rolling hills of far away worlds. You \ - must be ready for a lifetime of adventure, a little bit of hard work, and an award \ - winning dental plan- but that's not all the Nanotrasen Gateway project has to offer.
    \ -
    Because we care about you, we feel it is only fair to make sure you know the risks \ - before you commit to joining the Nanotrasen Gateway project. All away destinations have \ - been fully scanned by a Nanotrasen expeditionary team, and are certified to be 100% safe. \ - We've even left a case of space beer along with the basic materials you'll need to expand \ - Nanotrasen's operational area and start your new life.

    \ - Gateway Operation Basics
    \ - All Nanotrasen approved Gateways operate on the same basic principals. They operate off \ - area equipment power as you would expect, and without this supply, it cannot safely function, \ - causinng it to reject all attempts at operation.

    \ - Once it is correctly setup, and once it has enough power to operate, the Gateway will begin \ - searching for an output location. The amount of time this takes is variable, but the Gateway \ - interface will give you an estimate accurate to the minute. Power loss will not interrupt the \ - searching process. Influenza will not interrupt the searching process. Temporal anomalies \ - may cause the estimate to be inaccurate, but will not interrupt the searching process.

    \ - Life On The Other Side
    \ - Once you have traversed the Gateway, you may experience some disorientation. Do not panic. \ - This is a normal side effect of travelling vast distances in a short period of time. You should \ - survey the immediate area, and attempt to locate your complimentary case of space beer. Our \ - expeditionary teams have ensured the complete safety of all away locations, but in a small \ - number of cases, the Gateway they have established may not be immediately obvious. \ - Do not panic if you cannot locate the return Gateway. Begin colonisation of the destination. \ -

    A New World
    \ - As a participant in the Nanotrasen Gateway Project, you will be on the frontiers of space. \ - Though complete safety is assured, participants are advised to prepare for inhospitable \ - environs." - -//we don't want the silly text overlay! -/obj/item/paper/pamphlet/update_icon() - return + info = "Welcome to the Nanotrasen Gateway project...
    \ + Congratulations! If you're reading this, you and your superiors have decided that you're \ + ready to commit to a life spent colonising the rolling hills of far away worlds. You \ + must be ready for a lifetime of adventure, a little bit of hard work, and an award \ + winning dental plan- but that's not all the Nanotrasen Gateway project has to offer.
    \ +
    Because we care about you, we feel it is only fair to make sure you know the risks \ + before you commit to joining the Nanotrasen Gateway project. All away destinations have \ + been fully scanned by a Nanotrasen expeditionary team, and are certified to be 100% safe. \ + We've even left a case of space beer along with the basic materials you'll need to expand \ + Nanotrasen's operational area and start your new life.

    \ + Gateway Operation Basics
    \ + All Nanotrasen approved Gateways operate on the same basic principals. They operate off \ + area equipment power as you would expect, and without this supply, it cannot safely function, \ + causinng it to reject all attempts at operation.

    \ + Once it is correctly setup, and once it has enough power to operate, the Gateway will begin \ + searching for an output location. The amount of time this takes is variable, but the Gateway \ + interface will give you an estimate accurate to the minute. Power loss will not interrupt the \ + searching process. Influenza will not interrupt the searching process. Temporal anomalies \ + may cause the estimate to be inaccurate, but will not interrupt the searching process.

    \ + Life On The Other Side
    \ + Once you have traversed the Gateway, you may experience some disorientation. Do not panic. \ + This is a normal side effect of travelling vast distances in a short period of time. You should \ + survey the immediate area, and attempt to locate your complimentary case of space beer. Our \ + expeditionary teams have ensured the complete safety of all away locations, but in a small \ + number of cases, the Gateway they have established may not be immediately obvious. \ + Do not panic if you cannot locate the return Gateway. Begin colonisation of the destination. \ +

    A New World
    \ + As a participant in the Nanotrasen Gateway Project, you will be on the frontiers of space. \ + Though complete safety is assured, participants are advised to prepare for inhospitable \ + environs." + +//we don't want the silly text overlay! +/obj/item/paper/pamphlet/update_icon() + return diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index 4b25d768f4..b1f505a27e 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -124,4 +124,4 @@ ..() /obj/effect/landmark/error - name = "error" + name = "error" \ No newline at end of file diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 296c876688..3fcb0648a1 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -201,10 +201,14 @@ /obj/machinery/computer/cargo/proc/post_signal(command) - var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS) + var/datum/radio_frequency/frequency = SSradio.return_frequency(1435) if(!frequency) return - var/datum/signal/status_signal = new(list("command" = command)) + var/datum/signal/status_signal = new + status_signal.source = src + status_signal.transmission_method = 1 + status_signal.data["command"] = command + frequency.post_signal(src, status_signal) diff --git a/code/modules/cargo/exports/research.dm b/code/modules/cargo/exports/research.dm index d2d11cecd1..b1ac30e7f9 100644 --- a/code/modules/cargo/exports/research.dm +++ b/code/modules/cargo/exports/research.dm @@ -12,8 +12,8 @@ if(sold_nodes[V]) //Already sold before, don't want it. continue var/datum/techweb_node/TWN = D.stored_research.researched_nodes[V] - cost += TWN.export_price - return cost + cost += TWN + return ..() * cost /datum/export/tech/sell_object(obj/O) ..() diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 4af0e4dc7f..3704494050 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -324,9 +324,6 @@ GLOBAL_LIST_EMPTY(asset_datums) "chevron.png" = 'html/chevron.png', "chevron-expand.png" = 'html/chevron-expand.png', "scales.png" = 'html/scales.png', - "coding.png" = 'html/coding.png', - "ban.png" = 'html/ban.png', - "chrome-wrench.png" = 'html/chrome-wrench.png', "changelog.css" = 'html/changelog.css' ) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 9ae87488ce..dbbe6ea512 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -68,6 +68,3 @@ var/datum/chatOutput/chatOutput - var/list/credits //lazy list of all credit object bound to this client - - var/datum/player_details/player_details //these persist between logins/logouts during the same round. \ No newline at end of file diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index eec1f6f198..cb1712dff5 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -76,7 +76,6 @@ //Logs all hrefs, except chat pings if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2)) WRITE_FILE(GLOB.world_href_log, "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
    ") - // Admin PM if(href_list["priv_msg"]) cmd_admin_pm(href_list["priv_msg"],null) @@ -196,10 +195,13 @@ GLOBAL_LIST(external_rsc_urls) if(!prefs) prefs = new /datum/preferences(src) GLOB.preferences_datums[ckey] = prefs + else + prefs.parent = src prefs.last_ip = address //these are gonna be used for banning prefs.last_id = computer_id //these are gonna be used for banning if(world.byond_version >= 511 && byond_version >= 511 && prefs.clientfps) vars["fps"] = prefs.clientfps + sethotkeys(1) //set hoykeys from preferences (from_pref = 1) log_access("Login: [key_name(src)] from [address ? address : "localhost"]-[computer_id] || BYOND v[byond_version]") var/alert_mob_dupe_login = FALSE @@ -225,17 +227,8 @@ GLOBAL_LIST(external_rsc_urls) message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(C)] (no longer logged in). ") log_access("Notice: [key_name(src)] has the same [matches] as [key_name(C)] (no longer logged in).") - if(GLOB.player_details[ckey]) - player_details = GLOB.player_details[ckey] - else - player_details = new - GLOB.player_details[ckey] = player_details - - . = ..() //calls mob.Login() - set_macros() - chatOutput.start() // Starts the chat if(alert_mob_dupe_login) @@ -371,8 +364,6 @@ GLOBAL_LIST(external_rsc_urls) ////////////// /client/Del() - if(credits) - QDEL_LIST(credits) log_access("Logout: [key_name(src)]") if(holder) adminGreet(1) @@ -381,18 +372,30 @@ GLOBAL_LIST(external_rsc_urls) if (!GLOB.admins.len && SSticker.IsRoundInProgress()) //Only report this stuff if we are currently playing. var/cheesy_message = pick( "I have no admins online!",\ - "I'm all alone :(",\ - "I'm feeling lonely :(",\ - "I'm so lonely :(",\ + "I'm all alone... :(",\ + "I'm feeling lonely. :(",\ + "I'm so lonely. :(",\ "Why does nobody love me? :(",\ - "I want a man :(",\ + "I want a man. :(",\ "Where has everyone gone?",\ - "I need a hug :(",\ - "Someone come hold me :(",\ + "I need a hug. :(",\ + "Someone come hold me. :(",\ "I need someone on me :(",\ "What happened? Where has everyone gone?",\ - "Forever alone :("\ - ) + "My nipples are so stiff, but Zelda ain't here. :(",\ + "Leon senpai, play more Spessmans. :(",\ + "If only Serdy were here...",\ + "Panic bunker can't keep my love for you out.",\ + "Cebu needs to Awoo herself back into my heart.",\ + "I don't even have a Turry to snuggle viciously here.",\ + "MOM, WHERE ARE YOU??? D:",\ + "It's a beautiful day outside. Birds are singing, flowers are blooming. On days like this...kids like you...SHOULD BE BURNING IN HELL.",\ + "Sometimes when I have sex, I think about putting an entire peanut butter and jelly sandwich in the VCR.",\ + "Oh good, no-one around to watch me lick Goofball's nipples. :D",\ + "I've replaced Beepsky with a fidget spinner, glory be autism abuse.",\ + "i shure hop dere are no PRED arund!!!!",\ + "NO PRED CAN eVER CATCH MI"\ + ) send2irc("Server", "[cheesy_message] (No admins online)") diff --git a/code/modules/client/player_details.dm b/code/modules/client/player_details.dm deleted file mode 100644 index a842607235..0000000000 --- a/code/modules/client/player_details.dm +++ /dev/null @@ -1,2 +0,0 @@ -/datum/player_details - var/list/player_actions = list() \ No newline at end of file diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 255423a4fc..fba2c486ab 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -30,7 +30,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)( usr.client.prefs.chat_toggles ^= CHAT_GHOSTEARS to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Ears", "[usr.client.prefs.chat_toggles & CHAT_GHOSTEARS ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Ears", "[usr.client.prefs.chat_toggles & CHAT_GHOSTEARS]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_ears/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_GHOSTEARS @@ -41,7 +41,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_sight) usr.client.prefs.chat_toggles ^= CHAT_GHOSTSIGHT to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Sight", "[usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Sight", "[usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_sight/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_GHOSTSIGHT @@ -52,7 +52,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_whispe usr.client.prefs.chat_toggles ^= CHAT_GHOSTWHISPER to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"].") usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Whispers", "[usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Whispers", "[usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_whispers/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_GHOSTWHISPER @@ -63,7 +63,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_radio) usr.client.prefs.chat_toggles ^= CHAT_GHOSTRADIO to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO) ? "see radio chatter" : "not see radio chatter"].") usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Radio", "[usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1 + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Radio", "[usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1 /datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_radio/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_GHOSTRADIO @@ -74,7 +74,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_pda)() usr.client.prefs.chat_toggles ^= CHAT_GHOSTPDA to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTPDA) ? "see all pda messages in the world" : "only see pda messages from nearby mobs"].") usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost PDA", "[usr.client.prefs.chat_toggles & CHAT_GHOSTPDA ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost PDA", "[usr.client.prefs.chat_toggles & CHAT_GHOSTPDA]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_pda/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_GHOSTPDA @@ -89,7 +89,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox/Events, toggle_death usr.client.prefs.toggles ^= DISABLE_DEATHRATTLE usr.client.prefs.save_preferences() to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_DEATHRATTLE) ? "no longer" : "now"] get messages when a sentient mob dies.") - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Deathrattle", "[!(usr.client.prefs.toggles & DISABLE_DEATHRATTLE) ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, maybe you should spend some time reading the comments. + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Deathrattle", "[!(usr.client.prefs.toggles & DISABLE_DEATHRATTLE)]")) //If you are copy-pasting this, maybe you should spend some time reading the comments. /datum/verbs/menu/Settings/Ghost/chatterbox/Events/toggle_deathrattle/Get_checked(client/C) return !(C.prefs.toggles & DISABLE_DEATHRATTLE) @@ -100,7 +100,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox/Events, toggle_arriv usr.client.prefs.toggles ^= DISABLE_ARRIVALRATTLE to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE) ? "no longer" : "now"] get messages when someone joins the station.") usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Arrivalrattle", "[!(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE) ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, maybe you should rethink where your life went so wrong. + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Arrivalrattle", "[!(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE)]")) //If you are copy-pasting this, maybe you should rethink where your life went so wrong. /datum/verbs/menu/Settings/Ghost/chatterbox/Events/toggle_arrivalrattle/Get_checked(client/C) return !(C.prefs.toggles & DISABLE_ARRIVALRATTLE) @@ -111,7 +111,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost, togglemidroundantag)() usr.client.prefs.toggles ^= MIDROUND_ANTAG usr.client.prefs.save_preferences() to_chat(usr, "You will [(usr.client.prefs.toggles & MIDROUND_ANTAG) ? "now" : "no longer"] be considered for midround antagonist positions.") - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Midround Antag", "[usr.client.prefs.toggles & MIDROUND_ANTAG ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Midround Antag", "[usr.client.prefs.toggles & MIDROUND_ANTAG]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Ghost/togglemidroundantag/Get_checked(client/C) return C.prefs.toggles & MIDROUND_ANTAG @@ -128,7 +128,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggletitlemusic)() else to_chat(usr, "You will no longer hear music in the game lobby.") usr.stop_sound_channel(CHANNEL_LOBBYMUSIC) - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Lobby Music", "[usr.client.prefs.toggles & SOUND_LOBBY ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Lobby Music", "[usr.client.prefs.toggles & SOUND_LOBBY]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Sound/toggletitlemusic/Get_checked(client/C) return C.prefs.toggles & SOUND_LOBBY @@ -147,7 +147,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglemidis)() var/client/C = usr.client if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded) C.chatOutput.sendMusic(" ") - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Hearing Midis", "[usr.client.prefs.toggles & SOUND_MIDI ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Hearing Midis", "[usr.client.prefs.toggles & SOUND_MIDI]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Sound/togglemidis/Get_checked(client/C) return C.prefs.toggles & SOUND_MIDI @@ -162,7 +162,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_instruments)() to_chat(usr, "You will now hear people playing musical instruments.") else to_chat(usr, "You will no longer hear musical instruments.") - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Instruments", "[usr.client.prefs.toggles & SOUND_INSTRUMENTS ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Instruments", "[usr.client.prefs.toggles & SOUND_INSTRUMENTS]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Sound/toggle_instruments/Get_checked(client/C) return C.prefs.toggles & SOUND_INSTRUMENTS @@ -179,7 +179,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, Toggle_Soundscape)() to_chat(usr, "You will no longer hear ambient sounds.") usr.stop_sound_channel(CHANNEL_AMBIENCE) usr.stop_sound_channel(CHANNEL_BUZZ) - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ambience", "[usr.client.prefs.toggles & SOUND_AMBIENCE ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ambience", "[usr.client.prefs.toggles & SOUND_AMBIENCE]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Sound/Toggle_Soundscape/Get_checked(client/C) return C.prefs.toggles & SOUND_AMBIENCE @@ -196,7 +196,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_ship_ambience)() to_chat(usr, "You will no longer hear ship ambience.") usr.stop_sound_channel(CHANNEL_BUZZ) usr.client.ambience_playing = 0 - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ship Ambience", "[usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^) + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ship Ambience", "[usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE]")) //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^) /datum/verbs/menu/Settings/Sound/toggle_ship_ambience/Get_checked(client/C) return C.prefs.toggles & SOUND_SHIP_AMBIENCE @@ -208,7 +208,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_announcement_sound)() usr.client.prefs.toggles ^= SOUND_ANNOUNCEMENTS to_chat(usr, "You will now [(usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"].") usr.client.prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Announcement Sound", "[usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Announcement Sound", "[usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Sound/toggle_announcement_sound/Get_checked(client/C) return C.prefs.toggles & SOUND_ANNOUNCEMENTS @@ -223,7 +223,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleprayersounds)() to_chat(usr, "You will now hear prayer sounds.") else to_chat(usr, "You will no longer prayer sounds.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Prayer Sounds", "[usr.client.prefs.toggles & SOUND_PRAYERS ? "Enabled" : "Disabled"]")) + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Prayer Sounds", "[usr.client.prefs.toggles & SOUND_PRAYERS]")) /datum/verbs/menu/Settings/Sound/toggleprayersounds/Get_checked(client/C) return C.prefs.toggles & SOUND_PRAYERS @@ -246,7 +246,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_ooc)() usr.client.prefs.chat_toggles ^= CHAT_OOC usr.client.prefs.save_preferences() to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Seeing OOC", "[usr.client.prefs.chat_toggles & CHAT_OOC ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Seeing OOC", "[usr.client.prefs.chat_toggles & CHAT_OOC]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_OOC @@ -337,7 +337,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= INTENT_STYLE to_chat(src, "[(prefs.toggles & INTENT_STYLE) ? "Clicking directly on intents selects them." : "Clicking on intents rotates selection clockwise."]") prefs.save_preferences() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Intent Selection", "[prefs.toggles & INTENT_STYLE ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Intent Selection", "[prefs.toggles & INTENT_STYLE]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_ghost_hud_pref() set name = "Toggle Ghost HUD" @@ -349,7 +349,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.save_preferences() if(isobserver(mob)) mob.hud_used.show_hud() - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost HUD", "[prefs.ghost_hud ? "Enabled" : "Disabled"]")) + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost HUD", "[prefs.ghost_hud]")) /client/verb/toggle_inquisition() // warning: unexpected inquisition set name = "Toggle Inquisitiveness" @@ -362,7 +362,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS to_chat(src, "You will now examine everything you click on.") else to_chat(src, "You will no longer examine things you click on.") - SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Inquisitiveness", "[prefs.inquisitive_ghost ? "Enabled" : "Disabled"]")) + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Ghost Inquisitiveness", "[prefs.inquisitive_ghost]")) //Admin Preferences /client/proc/toggleadminhelpsound() @@ -374,7 +374,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= SOUND_ADMINHELP prefs.save_preferences() to_chat(usr, "You will [(prefs.toggles & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Adminhelp Sound", "[prefs.toggles & SOUND_ADMINHELP ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Adminhelp Sound", "[prefs.toggles & SOUND_ADMINHELP]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggleannouncelogin() set name = "Do/Don't Announce Login" @@ -385,7 +385,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.toggles ^= ANNOUNCE_LOGIN prefs.save_preferences() to_chat(usr, "You will [(prefs.toggles & ANNOUNCE_LOGIN) ? "now" : "no longer"] have an announcement to other admins when you login.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Login Announcement", "[prefs.toggles & ANNOUNCE_LOGIN ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Login Announcement", "[prefs.toggles & ANNOUNCE_LOGIN]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_hear_radio() set name = "Show/Hide Radio Chatter" @@ -396,7 +396,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.chat_toggles ^= CHAT_RADIO prefs.save_preferences() to_chat(usr, "You will [(prefs.chat_toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from nearby radios or speakers") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Radio Chatter", "[prefs.chat_toggles & CHAT_RADIO ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Radio Chatter", "[prefs.chat_toggles & CHAT_RADIO]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/deadchat() set name = "Show/Hide Deadchat" @@ -405,7 +405,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.chat_toggles ^= CHAT_DEAD prefs.save_preferences() to_chat(src, "You will [(prefs.chat_toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Deadchat Visibility", "[prefs.chat_toggles & CHAT_DEAD ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Deadchat Visibility", "[prefs.chat_toggles & CHAT_DEAD]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggleprayers() set name = "Show/Hide Prayers" @@ -414,4 +414,4 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.chat_toggles ^= CHAT_PRAYER prefs.save_preferences() to_chat(src, "You will [(prefs.chat_toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Prayer Visibility", "[prefs.chat_toggles & CHAT_PRAYER ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Prayer Visibility", "[prefs.chat_toggles & CHAT_PRAYER]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 80195f6e39..dd876f3701 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -170,30 +170,30 @@ var/obj/item/I = target var/mob/living/M = owner - var/flags = I.slot_flags - if(flags & SLOT_OCLOTHING) + var/flags_1 = I.slot_flags + if(flags_1 & SLOT_OCLOTHING) M.update_inv_wear_suit() - if(flags & SLOT_ICLOTHING) + if(flags_1 & SLOT_ICLOTHING) M.update_inv_w_uniform() - if(flags & SLOT_GLOVES) + if(flags_1 & SLOT_GLOVES) M.update_inv_gloves() - if(flags & SLOT_EYES) + if(flags_1 & SLOT_EYES) M.update_inv_glasses() - if(flags & SLOT_EARS) + if(flags_1 & SLOT_EARS) M.update_inv_ears() - if(flags & SLOT_MASK) + if(flags_1 & SLOT_MASK) M.update_inv_wear_mask() - if(flags & SLOT_HEAD) + if(flags_1 & SLOT_HEAD) M.update_inv_head() - if(flags & SLOT_FEET) + if(flags_1 & SLOT_FEET) M.update_inv_shoes() - if(flags & SLOT_ID) + if(flags_1 & SLOT_ID) M.update_inv_wear_id() - if(flags & SLOT_BELT) + if(flags_1 & SLOT_BELT) M.update_inv_belt() - if(flags & SLOT_BACK) + if(flags_1 & SLOT_BACK) M.update_inv_back() - if(flags & SLOT_NECK) + if(flags_1 & SLOT_NECK) M.update_inv_neck() /obj/item/clothing/under/chameleon diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index b8f093dfa5..9d5433663e 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -1,46 +1,45 @@ - -//Ears: currently only used for headsets and earmuffs -/obj/item/clothing/ears - name = "ears" - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - slot_flags = SLOT_EARS - resistance_flags = NONE - -/obj/item/clothing/ears/earmuffs - name = "earmuffs" - desc = "Protects your hearing from loud noises, and quiet ones as well." - icon_state = "earmuffs" - item_state = "earmuffs" - strip_delay = 15 - equip_delay_other = 25 - resistance_flags = FLAMMABLE - flags_2 = BANG_PROTECT_2|HEALS_EARS_2 - -/obj/item/clothing/ears/headphones - name = "headphones" - desc = "Unce unce unce unce. Boop!" - icon = 'icons/obj/clothing/accessories.dmi' - icon_state = "headphones" - item_state = "headphones" - slot_flags = SLOT_EARS | SLOT_HEAD | SLOT_NECK //Fluff item, put it whereever you want! - actions_types = list(/datum/action/item_action/toggle_headphones) - var/headphones_on = FALSE - -/obj/item/clothing/ears/headphones/Initialize() - . = ..() - update_icon() - -/obj/item/clothing/ears/headphones/update_icon() - icon_state = "[initial(icon_state)]_[headphones_on? "on" : "off"]" - item_state = "[initial(item_state)]_[headphones_on? "on" : "off"]" - -/obj/item/clothing/ears/headphones/proc/toggle(owner) - headphones_on = !headphones_on - update_icon() - var/mob/living/carbon/human/H = owner - if(istype(H)) - H.update_inv_ears() - H.update_inv_neck() - H.update_inv_head() - to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") +//Ears: currently only used for headsets and earmuffs +/obj/item/clothing/ears + name = "ears" + w_class = WEIGHT_CLASS_TINY + throwforce = 0 + slot_flags = SLOT_EARS + resistance_flags = NONE + +/obj/item/clothing/ears/earmuffs + name = "earmuffs" + desc = "Protects your hearing from loud noises, and quiet ones as well." + icon_state = "earmuffs" + item_state = "earmuffs" + strip_delay = 15 + equip_delay_other = 25 + resistance_flags = FLAMMABLE + flags_2 = BANG_PROTECT_2|HEALS_EARS_2 + +/obj/item/clothing/ears/headphones + name = "headphones" + desc = "Unce unce unce unce. Boop!" + icon = 'icons/obj/clothing/accessories.dmi' + icon_state = "headphones" + item_state = "headphones" + slot_flags = SLOT_EARS | SLOT_HEAD | SLOT_NECK //Fluff item, put it whereever you want! + actions_types = list(/datum/action/item_action/toggle_headphones) + var/headphones_on = FALSE + +/obj/item/clothing/ears/headphones/Initialize() + . = ..() + update_icon() + +/obj/item/clothing/ears/headphones/update_icon() + icon_state = "[initial(icon_state)]_[headphones_on? "on" : "off"]" + item_state = "[initial(item_state)]_[headphones_on? "on" : "off"]" + +/obj/item/clothing/ears/headphones/proc/toggle(owner) + headphones_on = !headphones_on + update_icon() + var/mob/living/carbon/human/H = owner + if(istype(H)) + H.update_inv_ears() + H.update_inv_neck() + H.update_inv_head() + to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 249cd6a1d9..4f108a505f 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -4,7 +4,7 @@ icon_state = "yellow" item_state = "ygloves" siemens_coefficient = 0 - permeability_coefficient = 0.05 + permeability_coefficient = 0.5 item_color="yellow" resistance_flags = NONE @@ -14,7 +14,7 @@ icon_state = "yellow" item_state = "ygloves" siemens_coefficient = 1 //Set to a default of 1, gets overridden in New() - permeability_coefficient = 0.05 + permeability_coefficient = 0.5 item_color="yellow" resistance_flags = NONE @@ -77,7 +77,7 @@ name = "insulated gloves" desc = "These gloves will protect the wearer from electric shock." siemens_coefficient = 0 - permeability_coefficient = 0.05 + permeability_coefficient = 0.5 resistance_flags = NONE /obj/item/clothing/gloves/color/rainbow @@ -148,7 +148,7 @@ item_state = "egloves" item_color = "captain" siemens_coefficient = 0 - permeability_coefficient = 0.05 + permeability_coefficient = 0.5 cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS @@ -162,7 +162,7 @@ icon_state = "latex" item_state = "lgloves" siemens_coefficient = 0.3 - permeability_coefficient = 0.01 + permeability_coefficient = 0.1 item_color="white" transfer_prints = TRUE resistance_flags = NONE diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 51a1131f1c..9adc86e7f8 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -1,84 +1,84 @@ -/obj/item/clothing/head/hardhat - name = "hard hat" - desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight." - icon_state = "hardhat0_yellow" - item_state = "hardhat0_yellow" - var/brightness_on = 4 //luminosity when on +/obj/item/clothing/head/hardhat + name = "hard hat" + desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight." + icon_state = "hardhat0_yellow" + item_state = "hardhat0_yellow" + var/brightness_on = 4 //luminosity when on var/on = FALSE - item_color = "yellow" //Determines used sprites: hardhat[on]_[item_color] and hardhat[on]_[item_color]2 (lying down sprite) - armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20, fire = 100, acid = 50) - flags_inv = 0 - actions_types = list(/datum/action/item_action/toggle_helmet_light) - resistance_flags = FIRE_PROOF + item_color = "yellow" //Determines used sprites: hardhat[on]_[item_color] and hardhat[on]_[item_color]2 (lying down sprite) + armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20, fire = 100, acid = 50) + flags_inv = 0 + actions_types = list(/datum/action/item_action/toggle_helmet_light) + resistance_flags = FIRE_PROOF dynamic_hair_suffix = "+generic" - - dog_fashion = /datum/dog_fashion/head - -/obj/item/clothing/head/hardhat/attack_self(mob/user) - on = !on - icon_state = "hardhat[on]_[item_color]" - item_state = "hardhat[on]_[item_color]" - user.update_inv_head() //so our mob-overlays update - - if(on) - turn_on(user) - else - turn_off(user) - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() - -/obj/item/clothing/head/hardhat/proc/turn_on(mob/user) - set_light(brightness_on) - -/obj/item/clothing/head/hardhat/proc/turn_off(mob/user) - set_light(0) - -/obj/item/clothing/head/hardhat/orange - icon_state = "hardhat0_orange" - item_state = "hardhat0_orange" - item_color = "orange" - dog_fashion = null - -/obj/item/clothing/head/hardhat/red - icon_state = "hardhat0_red" - item_state = "hardhat0_red" - item_color = "red" - dog_fashion = null - name = "firefighter helmet" + + dog_fashion = /datum/dog_fashion/head + +/obj/item/clothing/head/hardhat/attack_self(mob/user) + on = !on + icon_state = "hardhat[on]_[item_color]" + item_state = "hardhat[on]_[item_color]" + user.update_inv_head() //so our mob-overlays update + + if(on) + turn_on(user) + else + turn_off(user) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/clothing/head/hardhat/proc/turn_on(mob/user) + set_light(brightness_on) + +/obj/item/clothing/head/hardhat/proc/turn_off(mob/user) + set_light(0) + +/obj/item/clothing/head/hardhat/orange + icon_state = "hardhat0_orange" + item_state = "hardhat0_orange" + item_color = "orange" + dog_fashion = null + +/obj/item/clothing/head/hardhat/red + icon_state = "hardhat0_red" + item_state = "hardhat0_red" + item_color = "red" + dog_fashion = null + name = "firefighter helmet" flags_1 = STOPSPRESSUREDMAGE_1 - heat_protection = HEAD - max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - cold_protection = HEAD - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - -/obj/item/clothing/head/hardhat/white - icon_state = "hardhat0_white" - item_state = "hardhat0_white" - item_color = "white" + heat_protection = HEAD + max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT + cold_protection = HEAD + min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + +/obj/item/clothing/head/hardhat/white + icon_state = "hardhat0_white" + item_state = "hardhat0_white" + item_color = "white" flags_1 = STOPSPRESSUREDMAGE_1 - heat_protection = HEAD - max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - cold_protection = HEAD - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - dog_fashion = /datum/dog_fashion/head - -/obj/item/clothing/head/hardhat/dblue - icon_state = "hardhat0_dblue" - item_state = "hardhat0_dblue" - item_color = "dblue" - dog_fashion = null - -/obj/item/clothing/head/hardhat/atmos - icon_state = "hardhat0_atmos" - item_state = "hardhat0_atmos" - item_color = "atmos" - dog_fashion = null - name = "atmospheric technician's firefighting helmet" - desc = "A firefighter's helmet, able to keep the user cool in any situation." + heat_protection = HEAD + max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT + cold_protection = HEAD + min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + dog_fashion = /datum/dog_fashion/head + +/obj/item/clothing/head/hardhat/dblue + icon_state = "hardhat0_dblue" + item_state = "hardhat0_dblue" + item_color = "dblue" + dog_fashion = null + +/obj/item/clothing/head/hardhat/atmos + icon_state = "hardhat0_atmos" + item_state = "hardhat0_atmos" + item_color = "atmos" + dog_fashion = null + name = "atmospheric technician's firefighting helmet" + desc = "A firefighter's helmet, able to keep the user cool in any situation." flags_1 = STOPSPRESSUREDMAGE_1 | THICKMATERIAL_1 - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - heat_protection = HEAD - max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT - cold_protection = HEAD - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + heat_protection = HEAD + max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + cold_protection = HEAD + min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 15d4579d33..5691dbb782 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -283,7 +283,7 @@ for(var/obj/item/device/flashlight/seclite/S in src) to_chat(user, "You unscrew the seclite from [src].") F = null - S.forceMove(user.drop_location()) + S.loc = get_turf(user) update_helmlight(user) S.update_brightness(user) update_icon() diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 544d9e7b12..9f09783df2 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -1,7 +1,5 @@ - - /obj/item/clothing/head/centhat - name = "\improper CentCom hat" + name = "\improper Centcom hat" icon_state = "centcom" desc = "It's good to be emperor." item_state = "that" @@ -293,18 +291,6 @@ desc = "A simple straw hat." icon_state = "scarecrow_hat" -/obj/item/clothing/head/lobsterhat - name = "foam lobster head" - desc = "When everything's going to crab, protecting your head is the best choice." - icon_state = "lobster_hat" - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/drfreezehat - name = "doctor freeze's wig" - desc = "A cool wig for cool people." - icon_state = "drfreeze_hat" - flags_inv = HIDEHAIR - /obj/item/clothing/head/pharoah name = "pharoah hat" desc = "Walk like an Egyptian." diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 403b81211d..58b4d1fffe 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -14,8 +14,8 @@ L.implant(H, null, 1) var/obj/item/device/radio/R = H.ears - R.set_frequency(FREQ_CENTCOM) - R.freqlock = TRUE + R.set_frequency(GLOB.CENTCOM_FREQ) + R.freqlock = 1 var/obj/item/card/id/W = H.wear_id W.registered_name = H.real_name diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 050c2fdc87..e16dd2a782 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -102,8 +102,8 @@ var/obj/item/device/radio/R = H.ears if(R) - R.set_frequency(FREQ_SYNDICATE) - R.freqlock = TRUE + R.set_frequency(GLOB.SYND_FREQ) + R.freqlock = 1 var/obj/item/card/id/W = H.wear_id if(W) @@ -257,8 +257,8 @@ W.update_label() var/obj/item/device/radio/headset/R = H.ears - R.set_frequency(FREQ_CENTCOM) - R.freqlock = TRUE + R.set_frequency(GLOB.CENTCOM_FREQ) + R.freqlock = 1 /datum/outfit/ghost_cultist name = "Cultist Ghost" @@ -396,8 +396,8 @@ return var/obj/item/device/radio/R = H.ears - R.set_frequency(FREQ_CENTCOM) - R.freqlock = TRUE + R.set_frequency(GLOB.CENTCOM_FREQ) + R.freqlock = 1 var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)//Here you go Deuryn L.implant(H, null, 1) diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 2b25188b80..1715636b57 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -98,7 +98,7 @@ I.flags_1 &= ~NODROP_1 if(camera) camera.remove_target_ui() - camera.forceMove(user) + camera.loc = user teleport_now.UpdateButtonIcon() /obj/item/clothing/suit/space/chronos/proc/chronowalk(atom/location) @@ -278,19 +278,19 @@ if(loc == user) forceMove(get_turf(user)) if(user.client && user.client.eye != src) - src.forceMove(user.drop_location()) + src.loc = get_turf(user) user.reset_perspective(src) user.set_machine(src) var/atom/step = get_step(src, direction) if(step) if((step.x <= TRANSITIONEDGE) || (step.x >= (world.maxx - TRANSITIONEDGE - 1)) || (step.y <= TRANSITIONEDGE) || (step.y >= (world.maxy - TRANSITIONEDGE - 1))) if(!src.Move(step)) - src.forceMove(step) + src.loc = step else - src.forceMove(step) + src.loc = step if((x == holder.x) && (y == holder.y) && (z == holder.z)) remove_target_ui() - forceMove(user) + loc = user else if(!target_ui) create_target_ui() phase_time = world.time + phase_time_length diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 8e2251980d..cc1df785b5 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -136,7 +136,7 @@ return jetpack.turn_off() - jetpack.forceMove(drop_location()) + jetpack.loc = get_turf(src) jetpack = null to_chat(user, "You successfully remove the jetpack from [src].") diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 0068c1e102..e934b77f38 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -2,7 +2,7 @@ icon = 'icons/obj/clothing/suits.dmi' name = "suit" var/fire_resist = T0C+100 - allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/tank/internals/emergency_oxygen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) slot_flags = SLOT_OCLOTHING var/blood_overlay_type = "suit" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 3e044108fb..7cbdb46f55 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -354,7 +354,7 @@ item_state = "centcom" w_class = WEIGHT_CLASS_BULKY body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - allowed = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals/emergency_oxygen) flags_1 = THICKMATERIAL_1 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index bfd4415b3a..11b60817ed 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -21,7 +21,7 @@ flags_1 = THICKMATERIAL_1 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 1 - allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/pen, /obj/item/device/flashlight/pen, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray) + allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/pen, /obj/item/device/flashlight/pen, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 80, fire = 30, acid = 100) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT strip_delay = 70 diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index e6331eb8b8..bb379ae6f3 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -20,7 +20,7 @@ item_state = "bio_suit" body_parts_covered = CHEST|GROIN|LEGS|ARMS flags_inv = HIDEJUMPSUIT - allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/device/assembly/flash/handheld, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/device/assembly/flash/handheld, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/internals/emergency_oxygen) //Chaplain /obj/item/clothing/suit/hooded/chaplain_hoodie @@ -29,7 +29,7 @@ icon_state = "chaplain_hoodie" item_state = "chaplain_hoodie" body_parts_covered = CHEST|GROIN|LEGS|ARMS - allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen) hoodtype = /obj/item/clothing/head/hooded/chaplain_hood /obj/item/clothing/head/hooded/chaplain_hood @@ -46,7 +46,7 @@ item_state = "nun" body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS flags_inv = HIDESHOES|HIDEJUMPSUIT - allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen) /obj/item/clothing/suit/studentuni name = "student robe" @@ -54,7 +54,7 @@ icon_state = "studentuni" item_state = "studentuni" body_parts_covered = ARMS|CHEST - allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen) /obj/item/clothing/suit/witchhunter name = "witchunter garb" @@ -62,7 +62,7 @@ icon_state = "witchhunter" item_state = "witchhunter" body_parts_covered = CHEST|GROIN|LEGS|ARMS - allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen) //Chef /obj/item/clothing/suit/toggle/chef diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index abf609376b..f50f6eaf6a 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -1,48 +1,48 @@ -/obj/item/clothing/suit/toggle/labcoat - name = "labcoat" - desc = "A suit that protects against minor chemical spills." - icon_state = "labcoat" - item_state = "labcoat" - blood_overlay_type = "coat" - body_parts_covered = CHEST|ARMS - allowed = list(/obj/item/device/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/device/healthanalyzer, /obj/item/device/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/soap, /obj/item/device/sensor_device, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0, fire = 50, acid = 50) - togglename = "buttons" - -/obj/item/clothing/suit/toggle/labcoat/cmo - name = "chief medical officer's labcoat" - desc = "Bluer than the standard model." - icon_state = "labcoat_cmo" - item_state = "labcoat_cmo" - -/obj/item/clothing/suit/toggle/labcoat/emt - name = "EMT's jacket" - desc = "A dark blue jacket with reflective strips for emergency medical technicians." - icon_state = "labcoat_emt" - item_state = "labcoat_cmo" - -/obj/item/clothing/suit/toggle/labcoat/mad - name = "\improper The Mad's labcoat" - desc = "It makes you look capable of konking someone on the noggin and shooting them into space." - icon_state = "labgreen" - item_state = "labgreen" - -/obj/item/clothing/suit/toggle/labcoat/genetics - name = "geneticist labcoat" - desc = "A suit that protects against minor chemical spills. Has a blue stripe on the shoulder." - icon_state = "labcoat_gen" - -/obj/item/clothing/suit/toggle/labcoat/chemist - name = "chemist labcoat" - desc = "A suit that protects against minor chemical spills. Has an orange stripe on the shoulder." - icon_state = "labcoat_chem" - -/obj/item/clothing/suit/toggle/labcoat/virologist - name = "virologist labcoat" - desc = "A suit that protects against minor chemical spills. Offers slightly more protection against biohazards than the standard model. Has a green stripe on the shoulder." - icon_state = "labcoat_vir" - -/obj/item/clothing/suit/toggle/labcoat/science - name = "scientist labcoat" - desc = "A suit that protects against minor chemical spills. Has a purple stripe on the shoulder." +/obj/item/clothing/suit/toggle/labcoat + name = "labcoat" + desc = "A suit that protects against minor chemical spills." + icon_state = "labcoat" + item_state = "labcoat" + blood_overlay_type = "coat" + body_parts_covered = CHEST|ARMS + allowed = list(/obj/item/device/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/device/healthanalyzer, /obj/item/device/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/soap, /obj/item/device/sensor_device, /obj/item/tank/internals/emergency_oxygen) + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0, fire = 50, acid = 50) + togglename = "buttons" + +/obj/item/clothing/suit/toggle/labcoat/cmo + name = "chief medical officer's labcoat" + desc = "Bluer than the standard model." + icon_state = "labcoat_cmo" + item_state = "labcoat_cmo" + +/obj/item/clothing/suit/toggle/labcoat/emt + name = "EMT's jacket" + desc = "A dark blue jacket with reflective strips for emergency medical technicians." + icon_state = "labcoat_emt" + item_state = "labcoat_cmo" + +/obj/item/clothing/suit/toggle/labcoat/mad + name = "\improper The Mad's labcoat" + desc = "It makes you look capable of konking someone on the noggin and shooting them into space." + icon_state = "labgreen" + item_state = "labgreen" + +/obj/item/clothing/suit/toggle/labcoat/genetics + name = "geneticist labcoat" + desc = "A suit that protects against minor chemical spills. Has a blue stripe on the shoulder." + icon_state = "labcoat_gen" + +/obj/item/clothing/suit/toggle/labcoat/chemist + name = "chemist labcoat" + desc = "A suit that protects against minor chemical spills. Has an orange stripe on the shoulder." + icon_state = "labcoat_chem" + +/obj/item/clothing/suit/toggle/labcoat/virologist + name = "virologist labcoat" + desc = "A suit that protects against minor chemical spills. Offers slightly more protection against biohazards than the standard model. Has a green stripe on the shoulder." + icon_state = "labcoat_vir" + +/obj/item/clothing/suit/toggle/labcoat/science + name = "scientist labcoat" + desc = "A suit that protects against minor chemical spills. Has a purple stripe on the shoulder." icon_state = "labcoat_tox" \ No newline at end of file diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 5a2e5ade3c..a5135222d0 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -93,7 +93,7 @@ item_state = "syndicate-black-red" desc = "A plastic replica of the Syndicate space suit. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!" w_class = WEIGHT_CLASS_NORMAL - allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy) + allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/toy) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT resistance_flags = NONE @@ -160,7 +160,7 @@ item_state = "w_suit" body_parts_covered = CHEST|GROIN|LEGS|ARMS flags_inv = HIDEJUMPSUIT - allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen) /obj/item/clothing/suit/cardborg name = "cardborg suit" @@ -240,7 +240,7 @@ body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too - allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/automatic/speargun) + allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/gun/ballistic/automatic/speargun) hoodtype = /obj/item/clothing/head/hooded/carp_hood /obj/item/clothing/head/hooded/carp_hood @@ -355,7 +355,7 @@ desc = "Aviators not included." icon_state = "bomberjacket" item_state = "brownjsuit" - allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/device/radio) + allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/device/radio) body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT @@ -367,7 +367,7 @@ item_state = "hostrench" resistance_flags = NONE max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT - allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/gun/ballistic/revolver/detective, /obj/item/device/radio) + allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/gun/ballistic/revolver/detective, /obj/item/device/radio) /obj/item/clothing/suit/jacket/leather/overcoat name = "leather overcoat" @@ -397,7 +397,7 @@ desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable." icon_state = "militaryjacket" item_state = "militaryjacket" - allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/gun/ballistic/revolver/detective, /obj/item/device/radio) + allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/gun/ballistic/revolver/detective, /obj/item/device/radio) /obj/item/clothing/suit/jacket/letterman name = "letterman jacket" @@ -470,7 +470,7 @@ cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0, fire = 0, acid = 0) - allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) /obj/item/clothing/head/hooded/winterhood name = "winter hood" @@ -513,7 +513,7 @@ name = "medical winter coat" icon_state = "coatmedical" item_state = "coatmedical" - allowed = list(/obj/item/device/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/device/healthanalyzer, /obj/item/device/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/device/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/device/healthanalyzer, /obj/item/device/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0, fire = 0, acid = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/medical @@ -524,7 +524,7 @@ name = "science winter coat" icon_state = "coatscience" item_state = "coatscience" - allowed = list(/obj/item/device/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/device/healthanalyzer, /obj/item/device/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/device/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/device/healthanalyzer, /obj/item/device/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/science @@ -536,7 +536,7 @@ icon_state = "coatengineer" item_state = "coatengineer" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20, fire = 30, acid = 45) - allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/device/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/device/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering /obj/item/clothing/head/hooded/winterhood/engineering @@ -555,7 +555,7 @@ name = "hydroponics winter coat" icon_state = "coathydro" item_state = "coathydro" - allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/device/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants, /obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/device/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro /obj/item/clothing/head/hooded/winterhood/hydro @@ -574,7 +574,7 @@ name = "mining winter coat" icon_state = "coatminer" item_state = "coatminer" - allowed = list(/obj/item/pickaxe, /obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + allowed = list(/obj/item/pickaxe, /obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/miner diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 22b5ee421b..10c1a47ac1 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -18,7 +18,7 @@ gas_transfer_coefficient = 0.9 permeability_coefficient = 0.5 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/extinguisher, /obj/item/crowbar) + allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/extinguisher, /obj/item/crowbar) slowdown = 1 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT flags_1 = STOPSPRESSUREDMAGE_1 | THICKMATERIAL_1 @@ -141,7 +141,7 @@ permeability_coefficient = 0.5 flags_1 = THICKMATERIAL_1 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/device/geiger_counter) + allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/device/geiger_counter) slowdown = 1.5 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100, fire = 30, acid = 30) strip_delay = 60 @@ -151,6 +151,6 @@ /obj/item/clothing/suit/radiation/ComponentInitialize() . = ..() - AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION, TRUE, FALSE) + AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION, TRUE, FALSE) // Just don't want things to be irradiated inside this // Except things on the mob aren't even inside the suit so ehhhhhh \ No newline at end of file diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 49364e76d9..f983ca2563 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -15,11 +15,11 @@ if(U.pockets) // storage items conflict return FALSE - pockets.forceMove(U) + pockets.loc = U U.pockets = pockets U.attached_accessory = src - forceMove(U) + loc = U layer = FLOAT_LAYER plane = FLOAT_PLANE if(minimize_when_attached) @@ -39,7 +39,7 @@ /obj/item/clothing/accessory/proc/detach(obj/item/clothing/under/U, user) if(pockets && pockets == U.pockets) - pockets.forceMove(src) + pockets.loc = src U.pockets = null for(var/armor_type in armor) @@ -135,7 +135,7 @@ "You pin \the [src] on [M]'s chest.") if(input) SSblackbox.record_feedback("associative", "commendation", 1, list("commender" = "[user.real_name]", "commendee" = "[M.real_name]", "medal" = "[src]", "reason" = input)) - GLOB.commendations += "[user.real_name] awarded [M.real_name] the [name]! \n- [input]" + GLOB.commendations += "[user.real_name] awarded [M.real_name] the [name]! \n- [input]" commended = TRUE log_game("[key_name(M)] was given the following commendation by [key_name(user)]: [input]") message_admins("[key_name(M)] was given the following commendation by [key_name(user)]: [input]") diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 6d522a3706..4e7f0da011 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -40,7 +40,6 @@ item_color = "cargo" body_parts_covered = CHEST|GROIN|ARMS mutantrace_variation = MUTANTRACE_VARIATION - alt_covers_chest = TRUE /obj/item/clothing/under/rank/chaplain diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index cd69aec17e..185712e072 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -31,4 +31,4 @@ icon_state = "robotics" item_state = "robotics" item_color = "robotics" - resistance_flags = NONE \ No newline at end of file + resistance_flags = NONE diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 608005ffbf..899219c227 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -646,7 +646,6 @@ return 0 /obj/item/clothing/under/plasmaman/attackby(obj/item/E, mob/user, params) - ..() if (istype(E, /obj/item/device/extinguisher_refill)) if (extinguishes_left == 5) to_chat(user, "The inbuilt extinguisher is full.") @@ -729,4 +728,4 @@ body_parts_covered = CHEST|GROIN|ARMS|LEGS fitted = NO_FEMALE_UNIFORM can_adjust = FALSE - resistance_flags = NONE \ No newline at end of file + resistance_flags = NONE diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index f8f26b3efb..1a8a174bff 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -16,7 +16,6 @@ // 50% chance of being incremented by one var/spawncount = 1 var/successSpawn = 0 //So we don't make a command report if nothing gets spawned. - fakeable = TRUE /datum/round_event/ghost_role/alien_infestation/setup() diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index e75752adcc..95f72d15b3 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -11,7 +11,6 @@ /datum/round_event/ghost_role/blob announceWhen = -1 role_name = "blob overmind" - fakeable = TRUE /datum/round_event/ghost_role/blob/announce(fake) priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/outbreak5.ogg') diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index c17140a2d2..b75140e3c7 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -23,5 +23,3 @@ new /mob/living/simple_animal/hostile/carp(C.loc) else new /mob/living/simple_animal/hostile/carp/megacarp(C.loc) - - diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 9ce4bf6ac3..eb7625e08c 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -10,8 +10,6 @@ var/virus_type - var/max_severity = 3 - /datum/round_event/disease_outbreak/announce(fake) priority_announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/outbreak7.ogg') @@ -19,14 +17,8 @@ /datum/round_event/disease_outbreak/setup() announceWhen = rand(15, 30) - /datum/round_event/disease_outbreak/start() - var/advanced_virus = FALSE - max_severity = 3 + max(Floor((world.time - control.earliest_start)/6000),0) //3 symptoms at 20 minutes, plus 1 per 10 minutes - if(prob(20 + (10 * max_severity))) - advanced_virus = TRUE - - if(!virus_type && !advanced_virus) + if(!virus_type) virus_type = pick(/datum/disease/dnaspread, /datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis) for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) @@ -49,48 +41,16 @@ continue var/datum/disease/D - if(!advanced_virus) - if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. - if(!H.dna || (H.disabilities & BLIND)) //A blindness disease would be the worst. - continue - D = new virus_type() - var/datum/disease/dnaspread/DS = D - DS.strain_data["name"] = H.real_name - DS.strain_data["UI"] = H.dna.uni_identity - DS.strain_data["SE"] = H.dna.struc_enzymes - else - D = new virus_type() + if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. + if(!H.dna || (H.disabilities & BLIND)) //A blindness disease would be the worst. + continue + D = new virus_type() + var/datum/disease/dnaspread/DS = D + DS.strain_data["name"] = H.real_name + DS.strain_data["UI"] = H.dna.uni_identity + DS.strain_data["SE"] = H.dna.struc_enzymes else - D = make_virus(max_severity, max_severity) + D = new virus_type() D.carrier = TRUE H.AddDisease(D) - - if(advanced_virus) - var/datum/disease/advance/A = D - var/list/name_symptoms = list() //for feedback - for(var/datum/symptom/S in A.symptoms) - name_symptoms += S.name - message_admins("An event has triggered a random advanced virus outbreak on [key_name_admin(H)]! It has these symptoms: [english_list(name_symptoms)]") - log_game("An event has triggered a random advanced virus outbreak on [key_name(H)]! It has these symptoms: [english_list(name_symptoms)]") - break - -/datum/round_event/disease_outbreak/proc/make_virus(max_symptoms, max_level) - if(max_symptoms > SYMPTOM_LIMIT) - max_symptoms = SYMPTOM_LIMIT - var/datum/disease/advance/A = new(FALSE, null) - A.symptoms = list() - var/list/datum/symptom/possible_symptoms = list() - for(var/symptom in subtypesof(/datum/symptom)) - var/datum/symptom/S = symptom - if(initial(S.level) > max_level) - continue - if(initial(S.level) <= 0) //unobtainable symptoms - continue - possible_symptoms += S - for(var/i in 1 to max_symptoms) - var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) - if(chosen_symptom) - var/datum/symptom/S = new chosen_symptom - A.symptoms += S - A.Refresh() //just in case someone already made and named the same disease - return A + break \ No newline at end of file diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 47eb2d4ea8..978f62d85a 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -28,4 +28,4 @@ fakeable = FALSE /datum/round_event/sandstorm/tick() - spawn_meteors(10, GLOB.meteorsC) \ No newline at end of file + spawn_meteors(10, GLOB.meteorsC) diff --git a/code/modules/events/ghost_role.dm b/code/modules/events/ghost_role.dm index e50d89a3a3..f5e9513b2e 100644 --- a/code/modules/events/ghost_role.dm +++ b/code/modules/events/ghost_role.dm @@ -7,7 +7,6 @@ var/minimum_required = 1 var/role_name = "debug rat with cancer" // Q U A L I T Y M E M E S var/list/spawned_mobs = list() - fakeable = FALSE /datum/round_event/ghost_role/start() try_spawning() diff --git a/code/modules/events/holiday/friday13th.dm b/code/modules/events/holiday/friday13th.dm index ba2c9ea78f..b1db15a896 100644 --- a/code/modules/events/holiday/friday13th.dm +++ b/code/modules/events/holiday/friday13th.dm @@ -15,4 +15,4 @@ /datum/round_event/fridaythethirteen/announce(fake) for(var/mob/living/L in player_list) - to_chat(L, "You are feeling unlucky today.") \ No newline at end of file + to_chat(L, "You are feeling unlucky today.") diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index abb5a0639d..41ff90407d 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -45,26 +45,19 @@ to_chat(L, "You didn't get a date! They're all having fun without you! you'll show them though...") var/datum/objective/martyr/normiesgetout = new normiesgetout.owner = L.mind - L.mind.special_role = "heartbreaker" SSticker.mode.traitors |= L.mind L.mind.objectives += normiesgetout - L.mind.add_antag_datum(/datum/antagonist/auto_custom) - /proc/forge_valentines_objective(mob/living/lover,mob/living/date) SSticker.mode.traitors |= lover.mind lover.mind.special_role = "valentine" - var/datum/objective/protect/protect_objective = new /datum/objective/protect protect_objective.owner = lover.mind protect_objective.target = date.mind protect_objective.explanation_text = "Protect [date.real_name], your date." lover.mind.objectives += protect_objective - - lover.mind.add_antag_datum(/datum/antagonist/auto_custom) - to_chat(lover, "You're on a date with [date]! Protect them at all costs. This takes priority over all other loyalties.") diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 5bad888f17..88fe218a22 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -10,4 +10,4 @@ /datum/round_event/mass_hallucination/start() for(var/mob/living/carbon/C in GLOB.alive_mob_list) - C.hallucination += rand(20, 50) \ No newline at end of file + C.hallucination += rand(20, 50) diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm index 76188cb5b7..073ef8aea3 100644 --- a/code/modules/events/nightmare.dm +++ b/code/modules/events/nightmare.dm @@ -35,7 +35,6 @@ player_mind.assigned_role = "Nightmare" player_mind.special_role = "Nightmare" SSticker.mode.traitors += player_mind - player_mind.add_antag_datum(/datum/antagonist/auto_custom) S.set_species(/datum/species/shadow/nightmare) playsound(S, 'sound/magic/ethereal_exit.ogg', 50, 1, -1) message_admins("[key_name_admin(S)] has been made into a Nightmare by an event.") diff --git a/code/modules/events/operative.dm b/code/modules/events/operative.dm index e0e3b98776..47130ff924 100644 --- a/code/modules/events/operative.dm +++ b/code/modules/events/operative.dm @@ -26,12 +26,32 @@ var/datum/preferences/A = new A.copy_to(operative) operative.dna.update_dna_identity() + + operative.equipOutfit(/datum/outfit/syndicate/full) + var/datum/mind/Mind = new /datum/mind(selected.key) Mind.assigned_role = "Lone Operative" Mind.special_role = "Lone Operative" + SSticker.mode.traitors |= Mind Mind.active = 1 + + var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.machines + if(nuke) + var/nuke_code + if(!nuke.r_code || nuke.r_code == "ADMIN") + nuke_code = random_nukecode() + nuke.r_code = nuke_code + else + nuke_code = nuke.r_code + + Mind.store_memory("Station Self-Destruct Device Code: [nuke_code]", 0, 0) + to_chat(Mind.current, "The nuclear authorization code is: [nuke_code]") + + var/datum/objective/nuclear/O = new() + O.owner = Mind + Mind.objectives += O + Mind.transfer_to(operative) - Mind.add_antag_datum(/datum/antagonist/nukeop/lone) message_admins("[key_name_admin(operative)] has been made into lone operative by an event.") log_game("[key_name(operative)] was spawned as a lone operative by an event.") diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index 96f5a3917d..ebcade74a3 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -56,4 +56,4 @@ temp.prison_open() else if(istype(O, /obj/machinery/door_timer)) var/obj/machinery/door_timer/temp = O - temp.timer_end(forced = TRUE) \ No newline at end of file + temp.timer_end(forced = TRUE) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index d186d2cf88..7b66ac553f 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -16,4 +16,5 @@ //sound not longer matches the text, but an audible warning is probably good /datum/round_event/radiation_storm/start() - SSweather.run_weather("radiation storm",ZLEVEL_STATION_PRIMARY) \ No newline at end of file + SSweather.run_weather("radiation storm",ZLEVEL_STATION_PRIMARY) + make_maint_all_access() diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 227bf14984..bd08743aaf 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -9,7 +9,6 @@ role_name = "random animal" var/animals = 1 var/one = "one" - fakeable = TRUE /datum/round_event/ghost_role/sentience/announce(fake) var/sentience_report = "" diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index 55984df033..ca5de88d58 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -135,7 +135,7 @@ new /obj/structure/spider/stickyweb(T) if(ANTIDOTE_NEEDED) - var/obj/effect/mob_spawn/human/corpse/assistant/infected_assistant = pick(/obj/effect/mob_spawn/human/corpse/assistant/beesease_infection, /obj/effect/mob_spawn/human/corpse/assistant/brainrot_infection, /obj/effect/mob_spawn/human/corpse/assistant/spanishflu_infection) + var/obj/item/reagent_containers/glass/bottle/virus_type = pick(/obj/item/reagent_containers/glass/bottle/beesease, /obj/item/reagent_containers/glass/bottle/brainrot, /obj/item/reagent_containers/glass/bottle/fluspanish) var/turf/T for(var/i=0, i<10, i++) if(prob(15)) @@ -145,7 +145,7 @@ else if(prob(25)) shuttle_spawns.Add(/obj/item/shard) T = pick_n_take(empty_shuttle_turfs) - new infected_assistant(T) + new virus_type(T) shuttle_spawns.Add(/obj/structure/closet/crate) shuttle_spawns.Add(/obj/item/reagent_containers/glass/bottle/pierrot_throat) shuttle_spawns.Add(/obj/item/reagent_containers/glass/bottle/magnitis) diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index a9ae27993d..46bb254703 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -26,4 +26,4 @@ var/datum/disease/D = new /datum/disease/appendicitis H.ForceContractDisease(D) - break \ No newline at end of file + break diff --git a/code/modules/events/weightless.dm b/code/modules/events/weightless.dm index bb5b3fd15a..425ed7ef9f 100644 --- a/code/modules/events/weightless.dm +++ b/code/modules/events/weightless.dm @@ -28,5 +28,3 @@ if(announceWhen >= 0) command_alert("Artificial gravity arrays are now functioning within normal parameters. Please report any irregularities to your respective head of staff.") - - diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm index 3227f81d58..618c746a65 100644 --- a/code/modules/events/wizard/departmentrevolt.dm +++ b/code/modules/events/wizard/departmentrevolt.dm @@ -44,7 +44,6 @@ citizens += H SSticker.mode.traitors += M M.special_role = "separatist" - M.add_antag_datum(/datum/antagonist/auto_custom) H.log_message("Was made into a separatist, long live [nation]!", INDIVIDUAL_ATTACK_LOG) to_chat(H, "You are a separatist! [nation] forever! Protect the sovereignty of your newfound land with your comrades in arms!") if(citizens.len) diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 1cf4858ce7..6ee000249b 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -67,7 +67,6 @@ O.completed = 1 //YES! O.owner = new_holder.mind new_holder.mind.objectives += O - new_holder.mind.add_antag_datum(/datum/antagonist/auto_custom) new_holder.log_message("Won with greentext!!!", INDIVIDUAL_ATTACK_LOG) color_altered_mobs -= new_holder resistance_flags |= ON_FIRE diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index bfbad559e1..779fe7fa09 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -1,5 +1,5 @@ -/mob/living/carbon/proc/dream() - set waitfor = 0 +/mob/living/carbon/proc/dream() + set waitfor = 0 var/list/dreams = GLOB.dream_strings.Copy() for(var/obj/item/bedsheet/sheet in loc) dreams += sheet.dream_messages @@ -9,12 +9,12 @@ dreaming++ for(var/i in 1 to dream_images.len) addtimer(CALLBACK(src, .proc/experience_dream, dream_images[i]), ((i - 1) * rand(30,60))) - return 1 - -/mob/living/carbon/proc/handle_dreams() - if(prob(5) && !dreaming) - dream() - + return 1 + +/mob/living/carbon/proc/handle_dreams() + if(prob(5) && !dreaming) + dream() + /mob/living/carbon/proc/experience_dream(dream_image) dreaming-- if(stat != UNCONSCIOUS || InCritical()) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index a4726d4bfd..194edd77b1 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -779,7 +779,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) humans += H person = pick(humans) - var/message = target.compose_message(person,understood_language,pick(radio_messages),"[FREQ_COMMON]",person.get_spans(),face_name = TRUE) + var/message = target.compose_message(person,understood_language,pick(radio_messages),"1459",person.get_spans(),face_name = TRUE) feedback_details += "Type: Radio, Source: [person.real_name], Message: [message]" to_chat(target, message) qdel(src) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 137f04c7b1..7217fe0b28 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -91,10 +91,12 @@ addtimer(CALLBACK(reagents, /datum/reagents.proc/add_reagent, refill, trans), 600) /obj/item/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params) - var/hotness = I.is_hot() - if(hotness && reagents) - reagents.expose_temperature(hotness) - to_chat(user, "You heat [name] with [I]!") + if(I.is_hot()) + var/added_heat = (I.is_hot() / 100) //ishot returns a temperature + if(reagents) + reagents.chem_temp += added_heat + to_chat(user, "You heat [src] with [I].") + reagents.handle_reactions() ..() /obj/item/reagent_containers/food/drinks/throw_impact(atom/target, mob/thrower) @@ -391,7 +393,6 @@ container_type = NONE spillable = FALSE isGlass = FALSE - grind_results = list("aluminum" = 10) /obj/item/reagent_containers/food/drinks/soda_cans/attack(mob/M, mob/user) if(M == user && !src.reagents.total_volume && user.a_intent == INTENT_HARM && user.zone_selected == "head") diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 81ebc3d67c..005dda29ca 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -232,8 +232,8 @@ icon_state = "absinthebottle" list_reagents = list("absinthe" = 100) -/obj/item/reagent_containers/food/drinks/bottle/absinthe/Initialize() - . = ..() +/obj/item/reagent_containers/food/drinks/bottle/absinthe/New() + ..() redact() /obj/item/reagent_containers/food/drinks/bottle/absinthe/proc/redact() diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 57288d8277..e23f6b98a9 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -9,12 +9,13 @@ var/foodtype = NONE var/last_check_time -/obj/item/reagent_containers/food/Initialize(mapload) - . = ..() +/obj/item/weapon/reagent_containers/food/Initialize(mapload) + ..() if(!mapload) - pixel_x = rand(-5, 5) + pixel_x = rand(-5, 5) //Randomizes postion slightly. pixel_y = rand(-5, 5) + /obj/item/reagent_containers/food/proc/checkLiked(var/fraction, mob/M) if(last_check_time + 50 < world.time) if(ishuman(M)) diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index fc49cee9ab..3351a67d39 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -276,8 +276,8 @@ icon = 'icons/obj/food/soupsalad.dmi' icon_state = "wishsoup" -/obj/item/reagent_containers/food/snacks/customizable/soup/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/customizable/soup/New() + ..() eatverb = pick("slurp","sip","suck","inhale","drink") diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 4ccded83f7..49f85a882d 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -6,7 +6,6 @@ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' unique_rename = 1 - grind_results = list() //To let them be ground up to transfer their reagents var/bitesize = 2 var/bitecount = 0 var/trash = null @@ -316,10 +315,10 @@ // name = "Xenoburger" //Name that displays in the UI. // desc = "Smells caustic. Tastes like heresy." //Duh // icon_state = "xburger" //Refers to an icon in food.dmi -///obj/item/reagent_containers/food/snacks/xenoburger/Initialize() //Don't mess with this. | nO I WILL MESS WITH THIS -// . = ..() //Same here. +///obj/item/reagent_containers/food/snacks/xenoburger/New() //Don't mess with this. +// ..() //Same here. // reagents.add_reagent("xenomicrobes", 10) //This is what is in the food item. you may copy/paste -// reagents.add_reagent("nutriment", 2) //this line of code for all the contents. +// reagents.add_reagent("nutriment", 2) // this line of code for all the contents. // bitesize = 3 //This is the amount each bite consumes. //All foods are distributed among various categories. Use common sense. diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm index 10039f7a8b..bfe181b419 100644 --- a/code/modules/food_and_drinks/food/snacks_egg.dm +++ b/code/modules/food_and_drinks/food/snacks_egg.dm @@ -20,7 +20,6 @@ filling_color = "#F0E68C" tastes = list("egg" = 1) foodtype = MEAT - grind_results = list("eggyolk" = 5) /obj/item/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) if(!..()) //was it caught by a mob? diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 9691eee144..c32ebfb765 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -28,7 +28,6 @@ filling_color = "#FF1493" tastes = list("watermelon" = 1) foodtype = FRUIT - juice_results = list("watermelonjuice" = 5) /obj/item/reagent_containers/food/snacks/candy_corn name = "candy corn" @@ -67,8 +66,8 @@ tastes = list("popcorn" = 3, "butter" = 1) foodtype = JUNKFOOD -/obj/item/reagent_containers/food/snacks/popcorn/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/popcorn/New() + ..() eatverb = pick("bite","crunch","nibble","gnaw","gobble","chomp") /obj/item/reagent_containers/food/snacks/loadedbakedpotato @@ -448,8 +447,8 @@ tastes = list("candy" = 1) foodtype = JUNKFOOD | SUGAR -/obj/item/reagent_containers/food/snacks/lollipop/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/lollipop/New() + ..() head = mutable_appearance('icons/obj/lollipop.dmi', "lollipop_head") change_head_color(rgb(rand(0, 255), rand(0, 255), rand(0, 255))) @@ -467,8 +466,8 @@ /obj/item/reagent_containers/food/snacks/lollipop/cyborg var/spamchecking = TRUE -/obj/item/reagent_containers/food/snacks/lollipop/cyborg/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/lollipop/cyborg/New() + ..() addtimer(CALLBACK(src, .proc/spamcheck), 1200) /obj/item/reagent_containers/food/snacks/lollipop/cyborg/equipped(mob/living/user, slot) @@ -488,15 +487,15 @@ tastes = list("candy") foodtype = JUNKFOOD -/obj/item/reagent_containers/food/snacks/gumball/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/gumball/New() + ..() color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) /obj/item/reagent_containers/food/snacks/gumball/cyborg var/spamchecking = TRUE -/obj/item/reagent_containers/food/snacks/gumball/cyborg/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/gumball/cyborg/New() + ..() addtimer(CALLBACK(src, .proc/spamcheck), 1200) /obj/item/reagent_containers/food/snacks/gumball/cyborg/equipped(mob/living/user, slot) diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index b7df203e30..284784484f 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -350,113 +350,3 @@ filling_color = "#F2CE91" tastes = list("pastry" = 1, "sweetness" = 1) foodtype = GRAIN - -#define PANCAKE_MAX_STACK 10 - -/obj/item/reagent_containers/food/snacks/pancakes - name = "pancake" - desc = "A fluffy pancake. The softer, superior relative of the waffle." - icon_state = "pancakes_1" - item_state = "pancakes" - bonus_reagents = list("vitamin" = 1) - list_reagents = list("nutriment" = 4, "vitamin" = 1) - filling_color = "#D2691E" - tastes = list("pancakes" = 1) - foodtype = GRAIN | SUGAR - -/obj/item/reagent_containers/food/snacks/pancakes/blueberry - name = "blueberry pancake" - desc = "A fluffy and delicious blueberry pancake." - icon_state = "bbpancakes_1" - item_state = "bbpancakes" - bonus_reagents = list("vitamin" = 2) - list_reagents = list("nutriment" = 6, "vitamin" = 3) - tastes = list("pancakes" = 1, "blueberries" = 1) - -/obj/item/reagent_containers/food/snacks/pancakes/chocolatechip - name = "chocolate chip pancake" - desc = "A fluffy and delicious chocolate chip pancake." - icon_state = "ccpancakes_1" - item_state = "ccpancakes" - bonus_reagents = list("vitamin" = 2) - list_reagents = list("nutriment" = 6, "vitamin" = 3) - tastes = list("pancakes" = 1, "chocolate" = 1) - -/obj/item/reagent_containers/food/snacks/pancakes/Initialize() - . = ..() - update_icon() - -/obj/item/reagent_containers/food/snacks/pancakes/update_icon() - if(contents.len) - name = "stack of pancakes" - else - name = initial(name) - if(contents.len < our_overlays.len) - cut_overlay(our_overlays[our_overlays.len]) - -/obj/item/reagent_containers/food/snacks/pancakes/examine(mob/user) - var/ingredients_listed = "" - var/pancakeCount = contents.len - switch(pancakeCount) - if(0) - desc = initial(desc) - if(1 to 2) - desc = "A stack of fluffy pancakes." - if(3 to 6) - desc = "A fat stack of fluffy pancakes!" - if(7 to 9) - desc = "A grand tower of fluffy, delicious pancakes!" - if(PANCAKE_MAX_STACK to INFINITY) - desc = "A massive towering spire of fluffy, delicious pancakes. It looks like it could tumble over!" - var/originalBites = bitecount - if (pancakeCount) - var/obj/item/reagent_containers/food/snacks/S = contents[pancakeCount] - bitecount = S.bitecount - ..() - if (pancakeCount) - for(var/obj/item/reagent_containers/food/snacks/pancakes/ING in contents) - ingredients_listed += "[ING.name], " - to_chat(user, "It contains [contents.len?"[ingredients_listed]":"no ingredient, "]on top of a [initial(name)].") - bitecount = originalBites - -/obj/item/reagent_containers/food/snacks/pancakes/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/reagent_containers/food/snacks/pancakes/)) - var/obj/item/reagent_containers/food/snacks/pancakes/P = I - if((contents.len >= PANCAKE_MAX_STACK) || ((P.contents.len + contents.len) > PANCAKE_MAX_STACK) || (reagents.total_volume >= volume)) - to_chat(user, "You can't add that many pancakes to [src]!") - else - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You add the [I] to the [name].") - P.name = initial(P.name) - contents += P - update_overlays(P) - if (P.contents.len) - for(var/V in P.contents) - P = V - P.name = initial(P.name) - contents += P - update_overlays(P) - P = I - clearlist(P.contents) - return - else if(contents.len) - var/obj/O = contents[contents.len] - return O.attackby(I, user, params) - ..() - -/obj/item/reagent_containers/food/snacks/pancakes/update_overlays(obj/item/reagent_containers/food/snacks/P) - var/mutable_appearance/pancake = mutable_appearance(icon, "[P.item_state]_[rand(1,3)]") - pancake.pixel_x = rand(-1,1) - pancake.pixel_y = 3 * contents.len - 1 - add_overlay(pancake) - update_icon() - -/obj/item/reagent_containers/food/snacks/pancakes/attack(mob/M, mob/user, def_zone, stacked = TRUE) - if(user.a_intent == INTENT_HARM || !contents.len || !stacked) - return ..() - var/obj/item/O = contents[contents.len] - . = O.attack(M, user, def_zone, FALSE) - update_icon() - -#undef PANCAKE_MAX_STACK \ No newline at end of file diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 1255b16f1e..977bd60da1 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -112,13 +112,13 @@ foodtype = GRAIN | VEGETABLES -/obj/item/reagent_containers/food/snacks/pie/plump_pie/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/pie/plump_pie/New() var/fey = prob(10) if(fey) name = "exceptional plump pie" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" bonus_reagents = list("nutriment" = 1, "omnizine" = 5, "vitamin" = 4) + ..() if(fey) reagents.add_reagent("omnizine", 5) diff --git a/code/modules/food_and_drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm index 65ff4d2eb9..4cb44093a7 100644 --- a/code/modules/food_and_drinks/food/snacks_salad.dm +++ b/code/modules/food_and_drinks/food/snacks_salad.dm @@ -9,9 +9,9 @@ tastes = list("leaves" = 1) foodtype = VEGETABLES -/obj/item/reagent_containers/food/snacks/salad/Initialize() - . = ..() - eatverb = pick("crunch","devour","nibble","gnaw","gobble","chomp") //who the fuck gnaws and devours on a salad +/obj/item/reagent_containers/food/snacks/salad/New() + ..() + eatverb = pick("crunch","devour","nibble","gnaw","gobble","chomp") /obj/item/reagent_containers/food/snacks/salad/aesirsalad name = "\improper Aesir salad" diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm index 3e3fc9440a..422e35b849 100644 --- a/code/modules/food_and_drinks/food/snacks_soup.dm +++ b/code/modules/food_and_drinks/food/snacks_soup.dm @@ -8,8 +8,8 @@ tastes = list("tasteless soup" = 1) foodtype = VEGETABLES -/obj/item/reagent_containers/food/snacks/soup/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/soup/New() + ..() eatverb = pick("slurp","sip","suck","inhale","drink") /obj/item/reagent_containers/food/snacks/soup/wish @@ -19,12 +19,12 @@ list_reagents = list("water" = 10) tastes = list("wishes" = 1) -/obj/item/reagent_containers/food/snacks/soup/wish/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/soup/wish/New() var/wish_true = prob(25) if(wish_true) desc = "A wish come true!" bonus_reagents = list("nutriment" = 9, "vitamin" = 1) + ..() if(wish_true) reagents.add_reagent("nutriment", 9) reagents.add_reagent("vitamin", 1) @@ -99,10 +99,10 @@ list_reagents = list("nutriment" = 6) tastes = list("chaos" = 1) -/obj/item/reagent_containers/food/snacks/soup/mystery/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/soup/mystery/New() extra_reagent = pick("capsaicin", "frostoil", "omnizine", "banana", "blood", "slimejelly", "toxin", "banana", "carbon", "oculine") bonus_reagents = list("[extra_reagent]" = 5, "nutriment" = 6) + ..() reagents.add_reagent("[extra_reagent]", 5) /obj/item/reagent_containers/food/snacks/soup/hotchili @@ -173,8 +173,8 @@ bonus_reagents = list("nutriment" = 1, "vitamin" = 5) foodtype = VEGETABLES -/obj/item/reagent_containers/food/snacks/soup/beet/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/soup/beet/New() + ..() name = pick("borsch","bortsch","borstch","borsh","borshch","borscht") tastes = list(name = 1) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index abca943075..82ba8ab405 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -28,10 +28,9 @@ var/const/BOMB_TIMER_MIN = 1 var/const/BOMB_TIMER_MAX = 10 -/obj/item/pizzabox/Initialize() - . = ..() +/obj/item/pizzabox/New() update_icon() - + ..() /obj/item/pizzabox/Destroy() unprocess() @@ -258,31 +257,29 @@ wires = null update_icon() -/obj/item/pizzabox/bomb/Initialize() - . = ..() +/obj/item/pizzabox/bomb/New() var/randompizza = pick(subtypesof(/obj/item/reagent_containers/food/snacks/pizza)) pizza = new randompizza(src) bomb = new(src) wires = new /datum/wires/explosive/pizza(src) + ..() -/obj/item/pizzabox/margherita/Initialize() - . = ..() +/obj/item/pizzabox/margherita/New() pizza = new /obj/item/reagent_containers/food/snacks/pizza/margherita(src) boxtag = "Margherita Deluxe" + ..() - -/obj/item/pizzabox/vegetable/Initialize() - . = ..() +/obj/item/pizzabox/vegetable/New() pizza = new /obj/item/reagent_containers/food/snacks/pizza/vegetable(src) boxtag = "Gourmet Vegatable" + ..() - -/obj/item/pizzabox/mushroom/Initialize() - . = ..() +/obj/item/pizzabox/mushroom/New() pizza = new /obj/item/reagent_containers/food/snacks/pizza/mushroom(src) boxtag = "Mushroom Special" + ..() -/obj/item/pizzabox/meat/Initialize() - . = ..() +/obj/item/pizzabox/meat/New() pizza = new /obj/item/reagent_containers/food/snacks/pizza/meat(src) boxtag = "Meatlover's Supreme" + ..() diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index a75510ae9a..041a58c467 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -50,7 +50,7 @@ result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly subcategory = CAT_PASTRY -////////////////////////////////////////////////WAFFLES AND PANCAKES//////////////////////////////////////////////// +////////////////////////////////////////////////WAFFLES//////////////////////////////////////////////// /datum/crafting_recipe/food/waffles time = 15 @@ -90,33 +90,6 @@ result = /obj/item/reagent_containers/food/snacks/rofflewaffles subcategory = CAT_PASTRY -/datum/crafting_recipe/food/pancakes - name = "Pancake" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1 - ) - result = /obj/item/reagent_containers/food/snacks/pancakes - subcategory = CAT_PASTRY - -/datum/crafting_recipe/food/bbpancakes - name = "Blueberry pancake" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/grown/berries = 1 - ) - result = /obj/item/reagent_containers/food/snacks/pancakes/blueberry - subcategory = CAT_PASTRY - -/datum/crafting_recipe/food/ccpancakes - name = "Chocolate chip pancake" - reqs = list( - /obj/item/reagent_containers/food/snacks/pastrybase = 1, - /obj/item/reagent_containers/food/snacks/chocolatebar = 1 - ) - result = /obj/item/reagent_containers/food/snacks/pancakes/chocolatechip - subcategory = CAT_PASTRY - - ////////////////////////////////////////////////DONKPOCCKETS//////////////////////////////////////////////// /datum/crafting_recipe/food/donkpocket diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index e7bf3ea9d7..89f6316297 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -16,7 +16,7 @@ var/list/cards = list() -/obj/item/deck/Initialize() +/obj/item/deck/New() . = ..() var/cardcolor @@ -187,7 +187,7 @@ ASSERT(H) usr.visible_message("\The [usr] plays \the [card.name].") - H.forceMove(get_step(usr,usr.dir)) + H.loc = get_step(usr,usr.dir) src.update_icon() diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 13e7ee334f..5bfcb9963d 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -179,7 +179,6 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]") //Global chat procs - /proc/to_chat(target, message) if(!target) return diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 9c1fd87cac..66d92df569 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -109,8 +109,8 @@ /obj/item/reagent_containers/food/snacks/egg/loaded containsPrize = TRUE -/obj/item/reagent_containers/food/snacks/egg/loaded/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/egg/loaded/New() + ..() var/eggcolor = pick("blue","green","mime","orange","purple","rainbow","red","yellow") icon_state = "egg-[eggcolor]" item_color = "[eggcolor]" diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm index a27db8dd38..f8716870e1 100644 --- a/code/modules/holiday/halloween.dm +++ b/code/modules/holiday/halloween.dm @@ -146,7 +146,7 @@ timer = rand(1,15) /mob/living/simple_animal/shade/howling_ghost/proc/EtherealMove(direction) - forceMove(get_step(src, direction)) + loc = get_step(src, direction) setDir(direction) /mob/living/simple_animal/shade/howling_ghost/proc/roam() @@ -220,7 +220,7 @@ timer = rand(5,15) playsound(M.loc, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 300, 1) spawn(12) - forceMove(M.loc) + loc = M.loc /mob/living/simple_animal/hostile/retaliate/clown/insane/MoveToTarget() stalk(target) diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 1dcab21e16..54384753d7 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -25,13 +25,13 @@ armour_penetration = 50 var/active = 0 -/obj/item/holo/esword/green/Initialize() - . = ..() +/obj/item/holo/esword/green/New() + ..() item_color = "green" -/obj/item/holo/esword/red/Initialize() - . = ..() +/obj/item/holo/esword/red/New() + ..() item_color = "red" /obj/item/holo/esword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) @@ -42,9 +42,9 @@ /obj/item/holo/esword/attack(target as mob, mob/user as mob) ..() -/obj/item/holo/esword/Initialize() - . = ..() +/obj/item/holo/esword/New() item_color = pick("red","blue","green","purple") + ..() /obj/item/holo/esword/attack_self(mob/living/user as mob) active = !active @@ -113,7 +113,7 @@ if(user.grab_state < GRAB_AGGRESSIVE) to_chat(user, "You need a better grip to do that!") return - L.forceMove(loc) + L.loc = src.loc L.Knockdown(100) visible_message("[user] dunks [L] into \the [src]!") user.stop_pulling() diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index cf12ccb3ce..482a48edfd 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -37,8 +37,8 @@ var/bee_resources = 0 -/obj/structure/beebox/Initialize() - . = ..() +/obj/structure/beebox/New() + ..() START_PROCESSING(SSobj, src) @@ -55,8 +55,8 @@ var/random_reagent = FALSE -/obj/structure/beebox/premade/Initialize() - . = ..() +/obj/structure/beebox/premade/New() + ..() icon_state = "beebox" var/datum/reagent/R = null @@ -152,7 +152,6 @@ else to_chat(user, "There's no room for any more frames in the apiary!") return - if(istype(I, /obj/item/wrench)) if(default_unfasten_wrench(user, I, time = 20)) return @@ -179,7 +178,7 @@ bees -= B B.beehome = null if(B.loc == src) - B.forceMove(drop_location()) + B.loc = get_turf(src) relocated++ if(relocated) to_chat(user, "This queen has a different reagent to some of the bees who live here, those bees will not return to this apiary!") @@ -202,7 +201,7 @@ if(B.isqueen) continue if(B.loc == src) - B.forceMove(drop_location()) + B.loc = get_turf(src) B.target = user bees = TRUE if(bees) @@ -222,7 +221,7 @@ var/obj/item/honey_frame/HF = pick_n_take(honey_frames) if(HF) if(!user.put_in_active_hand(HF)) - HF.forceMove(drop_location()) + HF.loc = get_turf(src) visible_message("[user] removes a frame from the apiary.") var/amtH = HF.honeycomb_capacity @@ -230,7 +229,7 @@ while(honeycombs.len && amtH) //let's pretend you always grab the frame with the most honeycomb on it var/obj/item/reagent_containers/honeycomb/HC = pick_n_take(honeycombs) if(HC) - HC.forceMove(drop_location()) + HC.loc = get_turf(user) amtH-- fallen++ if(fallen) @@ -242,12 +241,12 @@ to_chat(user, "There is no queen bee to remove!") return var/obj/item/queen_bee/QB = new() - queen_bee.forceMove(QB) + queen_bee.loc = QB bees -= queen_bee QB.queen = queen_bee QB.name = queen_bee.name if(!user.put_in_active_hand(QB)) - QB.forceMove(drop_location()) + QB.loc = get_turf(src) visible_message("[user] removes the queen from the apiary.") queen_bee = null @@ -255,8 +254,8 @@ new /obj/item/stack/sheet/mineral/wood (loc, 20) for(var/mob/living/simple_animal/hostile/poison/bees/B in bees) if(B.loc == src) - B.forceMove(drop_location()) + B.loc = get_turf(src) for(var/obj/item/honey_frame/HF in honey_frames) if(HF.loc == src) - HF.forceMove(drop_location()) - qdel(src) + HF.loc = get_turf(src) + qdel(src) \ No newline at end of file diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm index e7faff0209..737736efc5 100644 --- a/code/modules/hydroponics/beekeeping/honeycomb.dm +++ b/code/modules/hydroponics/beekeeping/honeycomb.dm @@ -10,11 +10,10 @@ volume = 10 amount_per_transfer_from_this = 0 list_reagents = list("honey" = 5) - grind_results = list() var/honey_color = "" -/obj/item/reagent_containers/honeycomb/Initialize() - . = ..() +/obj/item/reagent_containers/honeycomb/New() + ..() pixel_x = rand(8,-8) pixel_y = rand(8,-8) update_icon() diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 8939b60138..324a94128d 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -78,7 +78,7 @@ if(default_deconstruction_screwdriver(user, "biogen-empty-o", "biogen-empty", O)) if(beaker) var/obj/item/reagent_containers/glass/B = beaker - B.forceMove(drop_location()) + B.loc = loc beaker = null update_icon() return diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index fe8a101053..bd0215138a 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -260,7 +260,7 @@ if(href_list["eject_seed"] && !operation) if (seed) - seed.forceMove(drop_location()) + seed.loc = src.loc seed.verb_pickup() seed = null update_genes() @@ -275,7 +275,7 @@ update_icon() else if(href_list["eject_disk"] && !operation) if (disk) - disk.forceMove(drop_location()) + disk.loc = src.loc disk.verb_pickup() disk = null update_genes() @@ -368,7 +368,7 @@ /obj/machinery/plantgenes/proc/insert_seed(obj/item/seeds/S) if(!istype(S) || seed) return - S.forceMove(src) + S.loc = src seed = S update_genes() update_icon() @@ -422,8 +422,8 @@ var/read_only = 0 //Well, it's still a floppy disk unique_rename = 1 -/obj/item/disk/plantgene/Initialize() - . = ..() +/obj/item/disk/plantgene/New() + ..() add_overlay("datadisk_gene") src.pixel_x = rand(-5, 5) src.pixel_y = rand(-5, 5) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 643ac056e4..d003f40d4a 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -15,7 +15,6 @@ // Saves us from having to define each stupid grown's dried_type as itself. // If you don't want a plant to be driable (watermelons) set this to null in the time definition. resistance_flags = FLAMMABLE - var/dry_grind = FALSE //If TRUE, this object needs to be dry to be ground up /obj/item/reagent_containers/food/snacks/grown/Initialize(mapload, obj/item/seeds/new_seed) . = ..() @@ -138,28 +137,6 @@ return return ..() -/obj/item/reagent_containers/food/snacks/grown/grind_requirements() - if(dry_grind && !dry) - to_chat(usr, "[src] needs to be dry before it can be ground up!") - return - return TRUE - -/obj/item/reagent_containers/food/snacks/grown/on_grind() - var/nutriment = reagents.get_reagent_amount("nutriment") - if(grind_results.len) - for(var/i in 1 to grind_results.len) - grind_results[grind_results[i]] = nutriment - reagents.del_reagent("nutriment") - reagents.del_reagent("vitamin") - -/obj/item/reagent_containers/food/snacks/grown/on_juice() - var/nutriment = reagents.get_reagent_amount("nutriment") - if(juice_results.len) - for(var/i in 1 to juice_results.len) - juice_results[juice_results[i]] = nutriment - reagents.del_reagent("nutriment") - reagents.del_reagent("vitamin") - // For item-containing growns such as eggy or gatfruit /obj/item/reagent_containers/food/snacks/grown/shell/attack_self(mob/user) var/obj/item/T diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm index 8b35fee872..7ec9a730ed 100644 --- a/code/modules/hydroponics/grown/apple.dm +++ b/code/modules/hydroponics/grown/apple.dm @@ -15,7 +15,6 @@ genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/apple/gold) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) - juice_results = list("applejuice" = 0) /obj/item/reagent_containers/food/snacks/grown/apple seed = /obj/item/seeds/apple diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 72517e87bc..bf71856323 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -13,7 +13,6 @@ genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/banana/mime, /obj/item/seeds/banana/bluespace) reagents_add = list("banana" = 0.1, "potassium" = 0.1, "vitamin" = 0.04, "nutriment" = 0.02) - juice_results = list("banana" = 0) /obj/item/reagent_containers/food/snacks/grown/banana seed = /obj/item/seeds/banana diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index 46a7e7979f..8ca2a5961a 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -26,7 +26,6 @@ filling_color = "#F0E68C" bitesize_mod = 2 foodtype = VEGETABLES - grind_results = list("soymilk" = 0) // Koibean /obj/item/seeds/soya/koi diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 541fb1b2a5..0d8c5d5a9a 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -26,7 +26,6 @@ filling_color = "#FF00FF" bitesize_mod = 2 foodtype = FRUIT - juice_results = list("berryjuice" = 0) // Poison Berries /obj/item/seeds/berry/poison @@ -47,7 +46,6 @@ icon_state = "poisonberrypile" filling_color = "#C71585" foodtype = FRUIT | TOXIC - juice_results = list("poisonberryjuice" = 0) // Death Berries /obj/item/seeds/berry/death @@ -123,7 +121,6 @@ filling_color = "#FF0000" bitesize_mod = 2 foodtype = FRUIT - grind_results = list("cherryjelly" = 0) // Blue Cherries /obj/item/seeds/cherry/blue @@ -145,7 +142,6 @@ filling_color = "#6495ED" bitesize_mod = 2 foodtype = FRUIT - grind_results = list("bluecherryjelly" = 0) // Grapes /obj/item/seeds/grape @@ -177,7 +173,6 @@ filling_color = "#FF1493" bitesize_mod = 2 foodtype = FRUIT - juice_results = list("grapejuice" = 0) // Green Grapes /obj/item/seeds/grape/green diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index d9b724d052..7834ed15e8 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -22,7 +22,6 @@ filling_color = "#F0E68C" bitesize_mod = 2 foodtype = GRAIN - grind_results = list("flour" = 0) // Oat /obj/item/seeds/wheat/oat @@ -43,7 +42,6 @@ filling_color = "#556B2F" bitesize_mod = 2 foodtype = GRAIN - grind_results = list("flour" = 0) // Rice /obj/item/seeds/wheat/rice @@ -65,7 +63,6 @@ filling_color = "#FAFAD2" bitesize_mod = 2 foodtype = GRAIN - grind_results = list("rice" = 0) //Meatwheat - grows into synthetic meat /obj/item/seeds/wheat/meat @@ -86,7 +83,6 @@ bitesize_mod = 2 seed = /obj/item/seeds/wheat/meat foodtype = MEAT | GRAIN - grind_results = list("flour" = 0, "blood" = 0) /obj/item/reagent_containers/food/snacks/grown/meatwheat/attack_self(mob/living/user) user.visible_message("[user] crushes [src] into meat.", "You crush [src] into something that resembles meat.") diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 38f8a40ec3..1b0cdc00d2 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -30,7 +30,6 @@ desc = "It's so sour, your face will twist." icon_state = "lime" filling_color = "#00FF00" - juice_results = list("limejuice" = 0) // Orange /obj/item/seeds/orange @@ -57,7 +56,6 @@ desc = "It's a tangy fruit." icon_state = "orange" filling_color = "#FFA500" - juice_results = list("orangejuice" = 0) // Lemon /obj/item/seeds/lemon @@ -83,7 +81,6 @@ desc = "When life gives you lemons, make lemonade." icon_state = "lemon" filling_color = "#FFD700" - juice_results = list("lemonjuice" = 0) // Combustible lemon /obj/item/seeds/firelemon //combustible lemon is too long so firelemon diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 4454c3c52a..827deaea47 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -25,7 +25,6 @@ trash = /obj/item/grown/corncob bitesize_mod = 2 foodtype = VEGETABLES - juice_results = list("corn_starch" = 0) /obj/item/grown/corncob name = "corn cob" diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 18eae2f4fd..e0845ffb2a 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -182,7 +182,6 @@ throw_speed = 1 throw_range = 3 attack_verb = list("roasted", "scorched", "burned") - grind_results = list("capsaicin" = 0, "condensedcapsaicin" = 0) /obj/item/grown/novaflower/add_juice() ..() diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index a64fc4b156..5e64d716ec 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -33,7 +33,6 @@ filling_color = "#008000" bitesize_mod = 3 foodtype = FRUIT - juice_results = list("watermelonjuice" = 0) // Holymelon /obj/item/seeds/watermelon/holy diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index 9ec936c1f2..284f962e45 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -43,7 +43,6 @@ throw_speed = 1 throw_range = 3 attack_verb = list("stung") - grind_results = list("sacid" = 0) /obj/item/grown/nettle/suicide_act(mob/user) user.visible_message("[user] is eating some of [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -92,7 +91,6 @@ icon_state = "deathnettle" force = 30 throwforce = 15 - grind_results = list("facid" = 1, "sacid" = 1) /obj/item/grown/nettle/death/add_juice() ..() diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index e127b166ea..0a3cbc060c 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -17,7 +17,6 @@ genes = list(/datum/plant_gene/trait/battery) mutatelist = list(/obj/item/seeds/potato/sweet) reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) - juice_results = list("potato" = 0) /obj/item/reagent_containers/food/snacks/grown/potato seed = /obj/item/seeds/potato diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 7113a8feab..d5257aeee7 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -24,7 +24,6 @@ filling_color = "#FFA500" bitesize_mod = 2 foodtype = VEGETABLES - juice_results = list("pumpkinjuice" = 0) /obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params) if(W.is_sharp()) @@ -54,5 +53,4 @@ icon_state = "blumpkin" filling_color = "#87CEFA" bitesize_mod = 2 - foodtype = VEGETABLES - juice_results = list("blumpkinjuice" = 0) + foodtype = VEGETABLES \ No newline at end of file diff --git a/code/modules/hydroponics/grown/random.dm b/code/modules/hydroponics/grown/random.dm index 04b3ff29fa..8f25eff215 100644 --- a/code/modules/hydroponics/grown/random.dm +++ b/code/modules/hydroponics/grown/random.dm @@ -12,9 +12,9 @@ icon_harvest = "xpod-harvest" growthstages = 4 -/obj/item/seeds/random/Initialize() - . = ..() +/obj/item/seeds/random/New() randomize_stats() + ..() if(prob(60)) add_random_reagents(1, 3) if(prob(50)) diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index fd78fa6ffa..8666db45a8 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -22,7 +22,6 @@ filling_color = "#FFA500" bitesize_mod = 2 foodtype = VEGETABLES - juice_results = list("carrotjuice" = 0) /obj/item/reagent_containers/food/snacks/grown/carrot/attackby(obj/item/I, mob/user, params) if(I.is_sharp()) diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index fc2ed221c5..bd3b182c13 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -14,6 +14,7 @@ icon_dead = "tea-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/tea/astra) + reagents_add = list("vitamin" = 0.04, "teapowder" = 0.1) /obj/item/reagent_containers/food/snacks/grown/tea seed = /obj/item/seeds/tea @@ -21,8 +22,6 @@ desc = "These aromatic tips of the tea plant can be dried to make tea." icon_state = "tea_aspera_leaves" filling_color = "#008000" - grind_results = list("teapowder" = 0) - dry_grind = TRUE // Tea Astra /obj/item/seeds/tea/astra @@ -40,7 +39,6 @@ name = "Tea Astra tips" icon_state = "tea_astra_leaves" filling_color = "#4582B4" - grind_results = list("teapowder" = 0, "salglu_solution" = 0) // Coffee @@ -69,8 +67,6 @@ icon_state = "coffee_arabica" filling_color = "#DC143C" bitesize_mod = 2 - dry_grind = TRUE - grind_results = list("coffeepowder" = 0) // Coffee Robusta /obj/item/seeds/coffee/robusta @@ -88,5 +84,4 @@ seed = /obj/item/seeds/coffee/robusta name = "coffee robusta beans" desc = "Increases robustness by 37 percent!" - icon_state = "coffee_robusta" - grind_results = list("coffeepowder" = 0, "morphine" = 0) + icon_state = "coffee_robusta" \ No newline at end of file diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 4d066e769e..1bc42b45c0 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -23,8 +23,6 @@ filling_color = "#FF6347" bitesize_mod = 2 foodtype = VEGETABLES - grind_results = list("ketchup" = 0) - juice_results = list("tomatojuice" = 0) // Blood Tomato /obj/item/seeds/tomato/blood @@ -46,7 +44,6 @@ splat_type = /obj/effect/gibspawner/generic filling_color = "#FF0000" foodtype = VEGETABLES | GROSS - grind_results = list("ketchup" = 0, "blood" = 0) // Blue Tomato diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 3b80fae6c0..a77808f006 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -62,7 +62,3 @@ /obj/item/grown/microwave_act(obj/machine/microwave/M) return - -/obj/item/grown/on_grind() - for(var/i in 1 to grind_results.len) - grind_results[grind_results[i]] = round(seed.potency) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 5c1fafc1c4..9eafcec71b 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -108,7 +108,7 @@ var/needs_update = 0 // Checks if the icon needs updating so we don't redraw empty trays every time if(myseed && (myseed.loc != src)) - myseed.forceMove(src) + myseed.loc = src if(self_sustaining) adjustNutri(1) diff --git a/code/modules/hydroponics/sample.dm b/code/modules/hydroponics/sample.dm index fff4c646ac..52c2e1052f 100644 --- a/code/modules/hydroponics/sample.dm +++ b/code/modules/hydroponics/sample.dm @@ -5,8 +5,8 @@ yield = -1 var/sample_color = "#FFFFFF" -/obj/item/seeds/sample/Initialize() - . = ..() +/obj/item/seeds/sample/New() + ..() if(sample_color) var/mutable_appearance/filling = mutable_appearance(icon, "sample-filling") filling.color = sample_color diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index b79d0652aa..0899a21132 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -17,7 +17,7 @@ return while(t_amount < t_max) var/obj/item/seeds/t_prod = F.seed.Copy() - t_prod.forceMove(seedloc) + t_prod.loc = seedloc t_amount++ qdel(O) return 1 @@ -29,7 +29,7 @@ return while(t_amount < t_max) var/obj/item/seeds/t_prod = F.seed.Copy() - t_prod.forceMove(seedloc) + t_prod.loc = seedloc t_amount++ qdel(O) return 1 @@ -168,7 +168,7 @@ for (var/obj/T in contents)//Now we find the seed we need to vend var/obj/item/seeds/O = T if (O.plantname == href_list["name"] && O.lifespan == href_list["li"] && O.endurance == href_list["en"] && O.maturation == href_list["ma"] && O.production == href_list["pr"] && O.yield == href_list["yi"] && O.potency == href_list["pot"]) - O.forceMove(drop_location()) + O.loc = src.loc break src.updateUsrDialog() diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 7294e45a97..aa35b4ae07 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -35,8 +35,8 @@ var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth var/weed_chance = 5 //Percentage chance per tray update to grow weeds -/obj/item/seeds/Initialize(loc, nogenes = 0) - . = ..() +/obj/item/seeds/New(loc, nogenes = 0) + ..() pixel_x = rand(-8, 8) pixel_y = rand(-8, 8) diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 4429fd7128..276d3d9ca0 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -478,8 +478,8 @@ power_draw_idle = 5 power_draw_per_use = 40 - var/frequency = FREQ_SIGNALER - var/code = DEFAULT_SIGNALER_CODE + var/frequency = 1457 + var/code = 30 var/datum/radio_frequency/radio_connection /obj/item/integrated_circuit/input/signaler/Initialize() @@ -509,16 +509,24 @@ if(!radio_connection) return - var/datum/signal/signal = new(list("code" = code)) + var/datum/signal/signal = new + signal.source = src + signal.encryption = code + signal.data["message"] = "ACTIVATE" radio_connection.post_signal(src, signal) + activate_pin(2) /obj/item/integrated_circuit/input/signaler/proc/set_frequency(new_frequency) if(!frequency) return + if(!SSradio) + sleep(20) + if(!SSradio) + return SSradio.remove_object(src, frequency) frequency = new_frequency - radio_connection = SSradio.add_object(src, frequency, RADIO_SIGNALER) + radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_CHAT) /obj/item/integrated_circuit/input/signaler/receive_signal(datum/signal/signal) var/new_code = get_pin_data(IC_INPUT, 2) @@ -528,7 +536,7 @@ code = new_code if(!signal) return 0 - if(signal.data["code"] != code) + if(signal.encryption != code) return 0 if(signal.source == src) // Don't trigger ourselves. return 0 diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index d5a5584f82..564c3a4851 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -288,7 +288,6 @@ activators = list() spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - /obj/item/integrated_circuit/reagent/storage/interact(mob/user) set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) push_data() diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm index 83a2af9b4c..220fa2e9ac 100644 --- a/code/modules/jobs/job_exp.dm +++ b/code/modules/jobs/job_exp.dm @@ -263,4 +263,4 @@ GLOBAL_PROTECT(exp_to_update) prefs.db_flags = text2num(flags_read.item[1]) else if(isnull(prefs.db_flags)) prefs.db_flags = 0 //This PROBABLY won't happen, but better safe than sorry. - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 38418e9916..03498f1e7b 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -1,77 +1,77 @@ -/* -Captain -*/ -/datum/job/captain - title = "Captain" - flag = CAPTAIN +/* +Captain +*/ +/datum/job/captain + title = "Captain" + flag = CAPTAIN department_head = list("CentCom") - department_flag = ENGSEC - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "Nanotrasen officials and Space law" - selection_color = "#ccccff" - req_admin_notify = 1 - minimal_player_age = 14 + department_flag = ENGSEC + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "Nanotrasen officials and Space law" + selection_color = "#ccccff" + req_admin_notify = 1 + minimal_player_age = 14 exp_requirements = 180 exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/captain - - access = list() //See get_access() - minimal_access = list() //See get_access() - -/datum/job/captain/get_access() - return get_all_accesses() - -/datum/job/captain/announce(mob/living/carbon/human/H) - ..() - SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/minor_announce, "Captain [H.real_name] on deck!")) - -/datum/outfit/job/captain - name = "Captain" - jobtype = /datum/job/captain - - id = /obj/item/card/id/gold - belt = /obj/item/device/pda/captain - glasses = /obj/item/clothing/glasses/sunglasses - ears = /obj/item/device/radio/headset/heads/captain/alt - gloves = /obj/item/clothing/gloves/color/captain - uniform = /obj/item/clothing/under/rank/captain - suit = /obj/item/clothing/suit/armor/vest/capcarapace - shoes = /obj/item/clothing/shoes/sneakers/brown - head = /obj/item/clothing/head/caphat - backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/station_charter=1) - - backpack = /obj/item/storage/backpack/captain - satchel = /obj/item/storage/backpack/satchel/cap - duffelbag = /obj/item/storage/backpack/duffelbag/captain - - implants = list(/obj/item/implant/mindshield) - accessory = /obj/item/clothing/accessory/medal/gold/captain - -/* -Head of Personnel -*/ -/datum/job/hop - title = "Head of Personnel" - flag = HOP - department_head = list("Captain") - department_flag = CIVILIAN - head_announce = list("Supply", "Service") - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#ddddff" - req_admin_notify = 1 - minimal_player_age = 10 + + outfit = /datum/outfit/job/captain + + access = list() //See get_access() + minimal_access = list() //See get_access() + +/datum/job/captain/get_access() + return get_all_accesses() + +/datum/job/captain/announce(mob/living/carbon/human/H) + ..() + SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, .proc/minor_announce, "Captain [H.real_name] on deck!")) + +/datum/outfit/job/captain + name = "Captain" + jobtype = /datum/job/captain + + id = /obj/item/card/id/gold + belt = /obj/item/device/pda/captain + glasses = /obj/item/clothing/glasses/sunglasses + ears = /obj/item/device/radio/headset/heads/captain/alt + gloves = /obj/item/clothing/gloves/color/captain + uniform = /obj/item/clothing/under/rank/captain + suit = /obj/item/clothing/suit/armor/vest/capcarapace + shoes = /obj/item/clothing/shoes/sneakers/brown + head = /obj/item/clothing/head/caphat + backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/station_charter=1) + + backpack = /obj/item/storage/backpack/captain + satchel = /obj/item/storage/backpack/satchel/cap + duffelbag = /obj/item/storage/backpack/duffelbag/captain + + implants = list(/obj/item/implant/mindshield) + accessory = /obj/item/clothing/accessory/medal/gold/captain + +/* +Head of Personnel +*/ +/datum/job/hop + title = "Head of Personnel" + flag = HOP + department_head = list("Captain") + department_flag = CIVILIAN + head_announce = list("Supply", "Service") + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the captain" + selection_color = "#ddddff" + req_admin_notify = 1 + minimal_player_age = 10 exp_requirements = 180 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_SUPPLY - - outfit = /datum/outfit/job/hop - + + outfit = /datum/outfit/job/hop + access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, 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, @@ -84,17 +84,17 @@ Head of Personnel ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_HEADS_VAULT, ACCESS_MINING_STATION, ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) - - -/datum/outfit/job/hop - name = "Head of Personnel" - jobtype = /datum/job/hop - - id = /obj/item/card/id/silver - belt = /obj/item/device/pda/heads/hop - ears = /obj/item/device/radio/headset/heads/hop - uniform = /obj/item/clothing/under/rank/head_of_personnel - shoes = /obj/item/clothing/shoes/sneakers/brown - head = /obj/item/clothing/head/hopcap - backpack_contents = list(/obj/item/storage/box/ids=1,\ - /obj/item/melee/classic_baton/telescopic=1, /obj/item/device/modular_computer/tablet/preset/advanced = 1) + + +/datum/outfit/job/hop + name = "Head of Personnel" + jobtype = /datum/job/hop + + id = /obj/item/card/id/silver + belt = /obj/item/device/pda/heads/hop + ears = /obj/item/device/radio/headset/heads/hop + uniform = /obj/item/clothing/under/rank/head_of_personnel + shoes = /obj/item/clothing/shoes/sneakers/brown + head = /obj/item/clothing/head/hopcap + backpack_contents = list(/obj/item/storage/box/ids=1,\ + /obj/item/melee/classic_baton/telescopic=1, /obj/item/device/modular_computer/tablet/preset/advanced = 1) diff --git a/code/modules/jobs/job_types/job.dm b/code/modules/jobs/job_types/job.dm index 6720c28710..2e18807541 100644 --- a/code/modules/jobs/job_types/job.dm +++ b/code/modules/jobs/job_types/job.dm @@ -72,15 +72,14 @@ H.dna.species.after_equip_job(src, H, visualsOnly) - if(CONFIG_GET(flag/enforce_human_authority) && (title in GLOB.command_positions)) - if(H.dna.species.id != "human") - H.set_species(/datum/species/human) - H.rename_self("human", H.client) - purrbation_remove(H, silent=TRUE) - if(!visualsOnly && announce) announce(H) + if(CONFIG_GET(flag/enforce_human_authority) && (title in GLOB.command_positions)) + H.dna.features["tail_human"] = "None" + H.dna.features["ears"] = "None" + H.regenerate_icons() + /datum/job/proc/get_access() if(!config) //Needed for robots. return src.minimal_access.Copy() diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 151ed213f8..9a33e1e759 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -1,191 +1,191 @@ -/* -Chief Medical Officer -*/ -/datum/job/cmo - title = "Chief Medical Officer" - flag = CMO_JF - department_head = list("Captain") - department_flag = MEDSCI - head_announce = list("Medical") - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#ffddf0" - req_admin_notify = 1 - minimal_player_age = 7 +/* +Chief Medical Officer +*/ +/datum/job/cmo + title = "Chief Medical Officer" + flag = CMO_JF + department_head = list("Captain") + department_flag = MEDSCI + head_announce = list("Medical") + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the captain" + selection_color = "#ffddf0" + req_admin_notify = 1 + minimal_player_age = 7 exp_requirements = 180 exp_type = EXP_TYPE_CREW exp_type_department = EXP_TYPE_MEDICAL - - outfit = /datum/outfit/job/cmo - + + outfit = /datum/outfit/job/cmo + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) - -/datum/outfit/job/cmo - name = "Chief Medical Officer" - jobtype = /datum/job/cmo - - id = /obj/item/card/id/silver - belt = /obj/item/device/pda/heads/cmo + +/datum/outfit/job/cmo + name = "Chief Medical Officer" + jobtype = /datum/job/cmo + + id = /obj/item/card/id/silver + belt = /obj/item/device/pda/heads/cmo l_pocket = /obj/item/pinpointer/crew - ears = /obj/item/device/radio/headset/heads/cmo - uniform = /obj/item/clothing/under/rank/chief_medical_officer - shoes = /obj/item/clothing/shoes/sneakers/brown - suit = /obj/item/clothing/suit/toggle/labcoat/cmo - l_hand = /obj/item/storage/firstaid/regular - suit_store = /obj/item/device/flashlight/pen - backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1) - - backpack = /obj/item/storage/backpack/medic - satchel = /obj/item/storage/backpack/satchel/med - duffelbag = /obj/item/storage/backpack/duffelbag/med - -/* -Medical Doctor -*/ -/datum/job/doctor - title = "Medical Doctor" - flag = DOCTOR - department_head = list("Chief Medical Officer") - department_flag = MEDSCI - faction = "Station" - total_positions = 5 - spawn_positions = 3 - supervisors = "the chief medical officer" - selection_color = "#ffeef0" - - outfit = /datum/outfit/job/doctor - + ears = /obj/item/device/radio/headset/heads/cmo + uniform = /obj/item/clothing/under/rank/chief_medical_officer + shoes = /obj/item/clothing/shoes/sneakers/brown + suit = /obj/item/clothing/suit/toggle/labcoat/cmo + l_hand = /obj/item/storage/firstaid/regular + suit_store = /obj/item/device/flashlight/pen + backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1) + + backpack = /obj/item/storage/backpack/medic + satchel = /obj/item/storage/backpack/satchel/med + duffelbag = /obj/item/storage/backpack/duffelbag/med + +/* +Medical Doctor +*/ +/datum/job/doctor + title = "Medical Doctor" + flag = DOCTOR + department_head = list("Chief Medical Officer") + department_flag = MEDSCI + faction = "Station" + total_positions = 5 + spawn_positions = 3 + supervisors = "the chief medical officer" + selection_color = "#ffeef0" + + outfit = /datum/outfit/job/doctor + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING) - -/datum/outfit/job/doctor - name = "Medical Doctor" - jobtype = /datum/job/doctor - - belt = /obj/item/device/pda/medical - ears = /obj/item/device/radio/headset/headset_med - uniform = /obj/item/clothing/under/rank/medical - shoes = /obj/item/clothing/shoes/sneakers/white - suit = /obj/item/clothing/suit/toggle/labcoat - l_hand = /obj/item/storage/firstaid/regular - suit_store = /obj/item/device/flashlight/pen - - backpack = /obj/item/storage/backpack/medic - satchel = /obj/item/storage/backpack/satchel/med - duffelbag = /obj/item/storage/backpack/duffelbag/med - -/* -Chemist -*/ -/datum/job/chemist - title = "Chemist" - flag = CHEMIST - department_head = list("Chief Medical Officer") - department_flag = MEDSCI - faction = "Station" - total_positions = 2 - spawn_positions = 2 - supervisors = "the chief medical officer" - selection_color = "#ffeef0" + +/datum/outfit/job/doctor + name = "Medical Doctor" + jobtype = /datum/job/doctor + + belt = /obj/item/device/pda/medical + ears = /obj/item/device/radio/headset/headset_med + uniform = /obj/item/clothing/under/rank/medical + shoes = /obj/item/clothing/shoes/sneakers/white + suit = /obj/item/clothing/suit/toggle/labcoat + l_hand = /obj/item/storage/firstaid/regular + suit_store = /obj/item/device/flashlight/pen + + backpack = /obj/item/storage/backpack/medic + satchel = /obj/item/storage/backpack/satchel/med + duffelbag = /obj/item/storage/backpack/duffelbag/med + +/* +Chemist +*/ +/datum/job/chemist + title = "Chemist" + flag = CHEMIST + department_head = list("Chief Medical Officer") + department_flag = MEDSCI + faction = "Station" + total_positions = 2 + spawn_positions = 2 + supervisors = "the chief medical officer" + selection_color = "#ffeef0" exp_type = EXP_TYPE_CREW exp_requirements = 60 - - outfit = /datum/outfit/job/chemist - + + outfit = /datum/outfit/job/chemist + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/chemist - name = "Chemist" - jobtype = /datum/job/chemist - - glasses = /obj/item/clothing/glasses/science - belt = /obj/item/device/pda/chemist - ears = /obj/item/device/radio/headset/headset_med - uniform = /obj/item/clothing/under/rank/chemist - shoes = /obj/item/clothing/shoes/sneakers/white - suit = /obj/item/clothing/suit/toggle/labcoat/chemist - accessory = /obj/item/clothing/accessory/pocketprotector/full - backpack = /obj/item/storage/backpack/chemistry - satchel = /obj/item/storage/backpack/satchel/chem - duffelbag = /obj/item/storage/backpack/duffelbag/med - -/* -Geneticist -*/ -/datum/job/geneticist - title = "Geneticist" - flag = GENETICIST - department_head = list("Chief Medical Officer", "Research Director") - department_flag = MEDSCI - faction = "Station" - total_positions = 2 - spawn_positions = 2 - supervisors = "the chief medical officer and research director" - selection_color = "#ffeef0" + +/datum/outfit/job/chemist + name = "Chemist" + jobtype = /datum/job/chemist + + glasses = /obj/item/clothing/glasses/science + belt = /obj/item/device/pda/chemist + ears = /obj/item/device/radio/headset/headset_med + uniform = /obj/item/clothing/under/rank/chemist + shoes = /obj/item/clothing/shoes/sneakers/white + suit = /obj/item/clothing/suit/toggle/labcoat/chemist + accessory = /obj/item/clothing/accessory/pocketprotector/full + backpack = /obj/item/storage/backpack/chemistry + satchel = /obj/item/storage/backpack/satchel/chem + duffelbag = /obj/item/storage/backpack/duffelbag/med + +/* +Geneticist +*/ +/datum/job/geneticist + title = "Geneticist" + flag = GENETICIST + department_head = list("Chief Medical Officer", "Research Director") + department_flag = MEDSCI + faction = "Station" + total_positions = 2 + spawn_positions = 2 + supervisors = "the chief medical officer and research director" + selection_color = "#ffeef0" exp_type = EXP_TYPE_CREW exp_requirements = 60 - - outfit = /datum/outfit/job/geneticist - + + outfit = /datum/outfit/job/geneticist + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH) - -/datum/outfit/job/geneticist - name = "Geneticist" - jobtype = /datum/job/geneticist - - belt = /obj/item/device/pda/geneticist - ears = /obj/item/device/radio/headset/headset_medsci - uniform = /obj/item/clothing/under/rank/geneticist - shoes = /obj/item/clothing/shoes/sneakers/white - suit = /obj/item/clothing/suit/toggle/labcoat/genetics - suit_store = /obj/item/device/flashlight/pen - - backpack = /obj/item/storage/backpack/genetics - satchel = /obj/item/storage/backpack/satchel/gen - duffelbag = /obj/item/storage/backpack/duffelbag/med - -/* -Virologist -*/ -/datum/job/virologist - title = "Virologist" - flag = VIROLOGIST - department_head = list("Chief Medical Officer") - department_flag = MEDSCI - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the chief medical officer" - selection_color = "#ffeef0" + +/datum/outfit/job/geneticist + name = "Geneticist" + jobtype = /datum/job/geneticist + + belt = /obj/item/device/pda/geneticist + ears = /obj/item/device/radio/headset/headset_medsci + uniform = /obj/item/clothing/under/rank/geneticist + shoes = /obj/item/clothing/shoes/sneakers/white + suit = /obj/item/clothing/suit/toggle/labcoat/genetics + suit_store = /obj/item/device/flashlight/pen + + backpack = /obj/item/storage/backpack/genetics + satchel = /obj/item/storage/backpack/satchel/gen + duffelbag = /obj/item/storage/backpack/duffelbag/med + +/* +Virologist +*/ +/datum/job/virologist + title = "Virologist" + flag = VIROLOGIST + department_head = list("Chief Medical Officer") + department_flag = MEDSCI + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the chief medical officer" + selection_color = "#ffeef0" exp_type = EXP_TYPE_CREW exp_requirements = 60 - - outfit = /datum/outfit/job/virologist - + + outfit = /datum/outfit/job/virologist + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/virologist - name = "Virologist" - jobtype = /datum/job/virologist - - belt = /obj/item/device/pda/viro - ears = /obj/item/device/radio/headset/headset_med - uniform = /obj/item/clothing/under/rank/virologist - mask = /obj/item/clothing/mask/surgical - shoes = /obj/item/clothing/shoes/sneakers/white - suit = /obj/item/clothing/suit/toggle/labcoat/virologist - suit_store = /obj/item/device/flashlight/pen - - backpack = /obj/item/storage/backpack/virology - satchel = /obj/item/storage/backpack/satchel/vir - duffelbag = /obj/item/storage/backpack/duffelbag/med + +/datum/outfit/job/virologist + name = "Virologist" + jobtype = /datum/job/virologist + + belt = /obj/item/device/pda/viro + ears = /obj/item/device/radio/headset/headset_med + uniform = /obj/item/clothing/under/rank/virologist + mask = /obj/item/clothing/mask/surgical + shoes = /obj/item/clothing/shoes/sneakers/white + suit = /obj/item/clothing/suit/toggle/labcoat/virologist + suit_store = /obj/item/device/flashlight/pen + + backpack = /obj/item/storage/backpack/virology + satchel = /obj/item/storage/backpack/satchel/vir + duffelbag = /obj/item/storage/backpack/duffelbag/med diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm index 7fc1dada77..4eac15d9f1 100644 --- a/code/modules/jobs/job_types/science.dm +++ b/code/modules/jobs/job_types/science.dm @@ -1,25 +1,25 @@ -/* -Research Director -*/ -/datum/job/rd - title = "Research Director" - flag = RD_JF - department_head = list("Captain") - department_flag = MEDSCI - head_announce = list("Science") - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#ffddff" - req_admin_notify = 1 - minimal_player_age = 7 +/* +Research Director +*/ +/datum/job/rd + title = "Research Director" + flag = RD_JF + department_head = list("Captain") + department_flag = MEDSCI + head_announce = list("Science") + faction = "Station" + total_positions = 1 + spawn_positions = 1 + supervisors = "the captain" + selection_color = "#ffddff" + req_admin_notify = 1 + minimal_player_age = 7 exp_type_department = EXP_TYPE_SCIENCE exp_requirements = 180 exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/rd - + + outfit = /datum/outfit/job/rd + access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, @@ -30,101 +30,101 @@ Research Director ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) - -/datum/outfit/job/rd - name = "Research Director" - jobtype = /datum/job/rd - - id = /obj/item/card/id/silver - belt = /obj/item/device/pda/heads/rd - ears = /obj/item/device/radio/headset/heads/rd - uniform = /obj/item/clothing/under/rank/research_director - shoes = /obj/item/clothing/shoes/sneakers/brown - suit = /obj/item/clothing/suit/toggle/labcoat - l_hand = /obj/item/clipboard - l_pocket = /obj/item/device/laser_pointer - accessory = /obj/item/clothing/accessory/pocketprotector/full + +/datum/outfit/job/rd + name = "Research Director" + jobtype = /datum/job/rd + + id = /obj/item/card/id/silver + belt = /obj/item/device/pda/heads/rd + ears = /obj/item/device/radio/headset/heads/rd + uniform = /obj/item/clothing/under/rank/research_director + shoes = /obj/item/clothing/shoes/sneakers/brown + suit = /obj/item/clothing/suit/toggle/labcoat + l_hand = /obj/item/clipboard + l_pocket = /obj/item/device/laser_pointer + accessory = /obj/item/clothing/accessory/pocketprotector/full backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/device/modular_computer/tablet/preset/advanced=1) - - backpack = /obj/item/storage/backpack/science - satchel = /obj/item/storage/backpack/satchel/tox - -/datum/outfit/job/rd/rig - name = "Research Director (Hardsuit)" - - l_hand = null - mask = /obj/item/clothing/mask/breath - suit = /obj/item/clothing/suit/space/hardsuit/rd - suit_store = /obj/item/tank/internals/oxygen - internals_slot = slot_s_store - -/* -Scientist -*/ -/datum/job/scientist - title = "Scientist" - flag = SCIENTIST - department_head = list("Research Director") - department_flag = MEDSCI - faction = "Station" - total_positions = 5 - spawn_positions = 3 - supervisors = "the research director" - selection_color = "#ffeeff" + + backpack = /obj/item/storage/backpack/science + satchel = /obj/item/storage/backpack/satchel/tox + +/datum/outfit/job/rd/rig + name = "Research Director (Hardsuit)" + + l_hand = null + mask = /obj/item/clothing/mask/breath + suit = /obj/item/clothing/suit/space/hardsuit/rd + suit_store = /obj/item/tank/internals/oxygen + internals_slot = slot_s_store + +/* +Scientist +*/ +/datum/job/scientist + title = "Scientist" + flag = SCIENTIST + department_head = list("Research Director") + department_flag = MEDSCI + faction = "Station" + total_positions = 5 + spawn_positions = 3 + supervisors = "the research director" + selection_color = "#ffeeff" exp_requirements = 60 exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/scientist - + + outfit = /datum/outfit/job/scientist + access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS) minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/scientist - name = "Scientist" - jobtype = /datum/job/scientist - - belt = /obj/item/device/pda/toxins - ears = /obj/item/device/radio/headset/headset_sci - uniform = /obj/item/clothing/under/rank/scientist - shoes = /obj/item/clothing/shoes/sneakers/white - suit = /obj/item/clothing/suit/toggle/labcoat/science - - backpack = /obj/item/storage/backpack/science - satchel = /obj/item/storage/backpack/satchel/tox - accessory = /obj/item/clothing/accessory/pocketprotector/full - -/* -Roboticist -*/ -/datum/job/roboticist - title = "Roboticist" - flag = ROBOTICIST - department_head = list("Research Director") - department_flag = MEDSCI - faction = "Station" - total_positions = 2 - spawn_positions = 2 - supervisors = "research director" - selection_color = "#ffeeff" + +/datum/outfit/job/scientist + name = "Scientist" + jobtype = /datum/job/scientist + + belt = /obj/item/device/pda/toxins + ears = /obj/item/device/radio/headset/headset_sci + uniform = /obj/item/clothing/under/rank/scientist + shoes = /obj/item/clothing/shoes/sneakers/white + suit = /obj/item/clothing/suit/toggle/labcoat/science + + backpack = /obj/item/storage/backpack/science + satchel = /obj/item/storage/backpack/satchel/tox + accessory = /obj/item/clothing/accessory/pocketprotector/full + +/* +Roboticist +*/ +/datum/job/roboticist + title = "Roboticist" + flag = ROBOTICIST + department_head = list("Research Director") + department_flag = MEDSCI + faction = "Station" + total_positions = 2 + spawn_positions = 2 + supervisors = "research director" + selection_color = "#ffeeff" exp_requirements = 60 exp_type = EXP_TYPE_CREW - - outfit = /datum/outfit/job/roboticist - + + outfit = /datum/outfit/job/roboticist + access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS) minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) - -/datum/outfit/job/roboticist - name = "Roboticist" - jobtype = /datum/job/roboticist - - belt = /obj/item/storage/belt/utility/full - l_pocket = /obj/item/device/pda/roboticist - ears = /obj/item/device/radio/headset/headset_sci - uniform = /obj/item/clothing/under/rank/roboticist - suit = /obj/item/clothing/suit/toggle/labcoat - - backpack = /obj/item/storage/backpack/science - satchel = /obj/item/storage/backpack/satchel/tox - - pda_slot = slot_l_store + +/datum/outfit/job/roboticist + name = "Roboticist" + jobtype = /datum/job/roboticist + + belt = /obj/item/storage/belt/utility/full + l_pocket = /obj/item/device/pda/roboticist + ears = /obj/item/device/radio/headset/headset_sci + uniform = /obj/item/clothing/under/rank/roboticist + suit = /obj/item/clothing/suit/toggle/labcoat + + backpack = /obj/item/storage/backpack/science + satchel = /obj/item/storage/backpack/satchel/tox + + pda_slot = slot_l_store diff --git a/code/modules/jobs/job_types/silicon.dm b/code/modules/jobs/job_types/silicon.dm index 4a4893e93d..bc3b31b2bf 100644 --- a/code/modules/jobs/job_types/silicon.dm +++ b/code/modules/jobs/job_types/silicon.dm @@ -52,4 +52,4 @@ Cyborg /datum/job/cyborg/after_spawn(mob/living/silicon/robot/R, mob/M) if(CONFIG_GET(flag/rename_cyborg)) //name can't be set in robot/New without the client - R.rename_self("cyborg", M.client) \ No newline at end of file + R.rename_self("cyborg", M.client) diff --git a/code/modules/keybindings/bindings_admin.dm b/code/modules/keybindings/bindings_admin.dm deleted file mode 100644 index 812bb95784..0000000000 --- a/code/modules/keybindings/bindings_admin.dm +++ /dev/null @@ -1,18 +0,0 @@ -/datum/admins/key_down(_key, client/user) - switch(_key) - if("F5") - user.admin_ghost() - return - if("F6") - player_panel_new() - return - if("F7") - user.togglebuildmodeself() - return - if("F8") - if(user.keys_held["Ctrl"]) - user.stealth() - else - user.invisimin() - return - ..() diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm deleted file mode 100644 index 7bc2ff98fe..0000000000 --- a/code/modules/keybindings/bindings_atom.dm +++ /dev/null @@ -1,18 +0,0 @@ -// You might be wondering why this isn't client level. If focus is null, we don't want you to move. -// Only way to do that is to tie the behavior into the focus's keyLoop(). - -/atom/movable/keyLoop(client/user) - if(!user.keys_held["Ctrl"]) - var/movement_dir = NONE - for(var/_key in user.keys_held) - movement_dir |= GLOB.movement_keys[_key] - if(user.next_move_dir_add) - movement_dir |= user.next_move_dir_add - if(user.next_move_dir_sub) - movement_dir &= ~user.next_move_dir_sub - // Sanity checks in case you hold left and right and up to make sure you only go up - if((movement_dir & NORTH) && (movement_dir & SOUTH)) - movement_dir &= ~(NORTH|SOUTH) - if((movement_dir & EAST) && (movement_dir & WEST)) - movement_dir &= ~(EAST|WEST) - user.Move(get_step(src, movement_dir), movement_dir) \ No newline at end of file diff --git a/code/modules/keybindings/bindings_carbon.dm b/code/modules/keybindings/bindings_carbon.dm deleted file mode 100644 index d17f10e963..0000000000 --- a/code/modules/keybindings/bindings_carbon.dm +++ /dev/null @@ -1,18 +0,0 @@ -/mob/living/carbon/key_down(_key, client/user) - switch(_key) - if("R", "Southwest") // Southwest is End - toggle_throw_mode() - return - if("1") - a_intent_change("help") - return - if("2") - a_intent_change("disarm") - return - if("3") - a_intent_change("grab") - return - if("4") - a_intent_change("harm") - return - return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm deleted file mode 100644 index 6bfaedf39d..0000000000 --- a/code/modules/keybindings/bindings_client.dm +++ /dev/null @@ -1,50 +0,0 @@ -// Clients aren't datums so we have to define these procs indpendently. -// These verbs are called for all key press and release events -/client/verb/keyDown(_key as text) - set instant = TRUE - set hidden = TRUE - - keys_held[_key] = world.time - var/movement = GLOB.movement_keys[_key] - if(!(next_move_dir_sub & movement)) - next_move_dir_add |= movement - - // Client-level keybindings are ones anyone should be able to do at any time - // Things like taking screenshots, hitting tab, and adminhelps. - - switch(_key) - if("F1") - if(keys_held["Ctrl"] && keys_held["Shift"]) // Is this command ever used? - winset(src, null, "command=.options") - else - adminhelp() - if("F2") // Screenshot. Hold shift to choose a name and location to save in - winset(src, null, "command=.screenshot [!keys_held["shift"] ? "auto" : ""]") - if("F12") // Toggles minimal HUD - mob.button_pressed_F12() - - if(holder) - holder.key_down(_key, src) - if(mob.focus) - mob.focus.key_down(_key, src) - -/client/verb/keyUp(_key as text) - set instant = TRUE - set hidden = TRUE - - keys_held -= _key - var/movement = GLOB.movement_keys[_key] - if(!(next_move_dir_add & movement)) - next_move_dir_sub |= movement - - if(holder) - holder.key_up(_key, src) - if(mob.focus) - mob.focus.key_up(_key, src) - -// Called every game tick -/client/keyLoop() - if(holder) - holder.keyLoop(src) - if(mob.focus) - mob.focus.keyLoop(src) \ No newline at end of file diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm deleted file mode 100644 index 10d035305f..0000000000 --- a/code/modules/keybindings/bindings_human.dm +++ /dev/null @@ -1,6 +0,0 @@ -/mob/living/carbon/human/key_down(_key, client/user) - switch(_key) - if("E") - quick_equip() - return - return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_living.dm b/code/modules/keybindings/bindings_living.dm deleted file mode 100644 index 241bc15b60..0000000000 --- a/code/modules/keybindings/bindings_living.dm +++ /dev/null @@ -1,7 +0,0 @@ -/mob/living/key_down(_key, client/user) - switch(_key) - if("B") - resist() - return - - return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm deleted file mode 100644 index 1d35694e5f..0000000000 --- a/code/modules/keybindings/bindings_mob.dm +++ /dev/null @@ -1,79 +0,0 @@ -// Technically the client argument is unncessary here since that SHOULD be src.client but let's not assume things -// All it takes is one badmin setting their focus to someone else's client to mess things up -// Or we can have NPC's send actual keypresses and detect that by seeing no client - -/mob/key_down(_key, client/user) - switch(_key) - if("Delete", "H") - if(!pulling) - to_chat(src, "You are not pulling anything.") - else - stop_pulling() - return - if("Insert", "G") - a_intent_change(INTENT_HOTKEY_RIGHT) - return - if("F") - a_intent_change(INTENT_HOTKEY_LEFT) - return - if("X", "Northeast") // Northeast is Page-up - swap_hand() - return - if("Y", "Z", "Southeast") // Southeast is Page-down - mode() // attack_self(). No idea who came up with "mode()" - return - if("Q", "Northwest") // Northwest is Home - var/obj/item/I = get_active_held_item() - if(!I) - to_chat(src, "You have nothing to drop in your hand!") - else - dropItemToGround(I) - return - if("Alt") - toggle_move_intent() - return - //Bodypart selections - if("Numpad8") - user.body_toggle_head() - return - if("Numpad4") - user.body_r_arm() - return - if("Numpad5") - user.body_chest() - return - if("Numpad6") - user.body_l_arm() - return - if("Numpad1") - user.body_r_leg() - return - if("Numpad2") - user.body_groin() - return - if("Numpad3") - user.body_l_leg() - return - - if(client.keys_held["Ctrl"]) - switch(GLOB.movement_keys[_key]) - if(NORTH) - northface() - return - if(SOUTH) - southface() - return - if(WEST) - westface() - return - if(EAST) - eastface() - return - return ..() - -/mob/key_up(_key, client/user) - switch(_key) - if("Alt") - toggle_move_intent() - return - return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_robot.dm b/code/modules/keybindings/bindings_robot.dm deleted file mode 100644 index 2354f33c9e..0000000000 --- a/code/modules/keybindings/bindings_robot.dm +++ /dev/null @@ -1,12 +0,0 @@ -/mob/living/silicon/robot/key_down(_key, client/user) - switch(_key) - if("1", "2", "3") - toggle_module(text2num(_key)) - return - if("4") - a_intent_change(INTENT_HOTKEY_LEFT) - return - if("Q") - uneq_active() - return - return ..() \ No newline at end of file diff --git a/code/modules/keybindings/focus.dm b/code/modules/keybindings/focus.dm deleted file mode 100644 index 9d3e44f059..0000000000 --- a/code/modules/keybindings/focus.dm +++ /dev/null @@ -1,20 +0,0 @@ -/datum - var/list/focusers //Only initialized when needed. Contains a list of mobs focusing on this. - -/mob - var/datum/focus //What receives our keyboard inputs. src by default - -/mob/proc/set_focus(datum/new_focus) - if(focus == new_focus) - return - - if(new_focus) - if(!new_focus.focusers) //Set up the new focus - new_focus.focusers = list() - new_focus.focusers += src - - if(focus) - focus.focusers -= src //Tell the old focus we're done with it - - focus = new_focus - reset_perspective(focus) //Maybe this should be done manually? You figure it out, reader \ No newline at end of file diff --git a/code/modules/keybindings/readme.md b/code/modules/keybindings/readme.md deleted file mode 100644 index 1170804436..0000000000 --- a/code/modules/keybindings/readme.md +++ /dev/null @@ -1,40 +0,0 @@ -# In-code keypress handling system - -This whole system is heavily based off of forum_account's keyboard library. -Thanks to forum_account for saving the day, the library can be found [here](http://www.byond.com/developer/Forum_account/Keyboard)! - -.dmf macros have some very serious shortcomings. For example, they do not allow reusing parts -of one macro in another, so giving cyborgs their own shortcuts to swap active module couldn't -inherit the movement that all mobs should have anyways. The webclient only supports one macro, -so having more than one was problematic. Additionally each keybind has to call an actual -verb, which meant a lot of hidden verbs that just call one other proc. Also our existing -macro was really bad and tied unrelated behavior into `Northeast()`, `Southeast()`, `Northwest()`, -and `Southwest()`. - -The basic premise of this system is to not screw with .dmf macro setup at all and handle -pressing those keys in the code instead. We have every key call `client.keyDown()` -or `client.keyUp()` with the pressed key as an argument. Certain keys get processed -directly by the client because they should be doable at any time, then we call -`keyDown()` or `keyUp()` on the client's holder and the client's mob's focus. -By default `mob.focus` is the mob itself, but you can set it to any datum to give control of a -client's keypresses to another object. This would be a good way to handle a menu or driving -a mech. You can also set it to null to disregard input from a certain user. - -Movement is handled by having each client call `client.keyLoop()` every game tick. -As above, this calls holder and `focus.keyLoop()`. `atom/movable/keyLoop()` handles movement -Try to keep the calculations in this proc light. It runs every tick for every client after all! - -You can also tell which keys are being held down now. Each client a list of keys pressed called -`keys_held`. Each entry is a key as a text string associated with the world.time when it was -pressed. - -No client-set keybindings at this time, but it shouldn't be too hard if someone wants. - -Notes about certain keys -`Tab` has client-sided behavior but acts normally -`T`, `O`, and `M` move focus to the input when pressed. This fires the keyUp macro right away. -`\` needs to be escaped in the dmf so any usage is `\\` - -You cannot `TICK_CHECK` or check `world.tick_usage` inside of procs called by key down and up -events. They happen outside of a byond tick and have no meaning there. Key looping -works correctly since it's part of a subsystem, not direct input. \ No newline at end of file diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm deleted file mode 100644 index bd7490abaa..0000000000 --- a/code/modules/keybindings/setup.dm +++ /dev/null @@ -1,62 +0,0 @@ -/client - var/list/keys_held = list() // A list of any keys held currently - // These next two vars are to apply movement for keypresses and releases made while move delayed. - // Because discarding that input makes the game less responsive. - var/next_move_dir_add // On next move, add this dir to the move that would otherwise be done - var/next_move_dir_sub // On next move, subtract this dir from the move that would otherwise be done - -// Set a client's focus to an object and override these procs on that object to let it handle keypresses - -/datum/proc/key_down(key, client/user) // Called when a key is pressed down initially - return -/datum/proc/key_up(key, client/user) // Called when a key is released - return -/datum/proc/keyLoop(client/user) // Called once every frame - return - -// Keys used for movement -GLOBAL_LIST_INIT(movement_keys, list( - "W" = NORTH, "A" = WEST, "S" = SOUTH, "D" = EAST, // WASD - "North" = NORTH, "West" = WEST, "South" = SOUTH, "East" = EAST, // Arrow keys & Numpad - )) - -/* -A horrific battle against shitcode was fought here to find out some use details of winset -Aparently you need to wrap the entire proc + args in quotes if you intend on using args -But you don't need the quote wrappings to just call on a proc with no args -ex. winset(src, "default-Any", "command=keyDown \[\[*\]\]") fail: command = keyDown -ex. winset(src, "default-Any", "command=keyDown \"\[\[*\]\]\"") fail: same -ex. winset(src, "default-T", "command=say") works fine -ex. winset(src, "default-Any", "command=\"keyDown \[\[*\]\]\"") works fine -Thanks for the useful errors lummox ~ninjanomnom -*/ -GLOBAL_LIST_INIT(default_macros, list( - "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=#F0F0F0:input.focus=true input.background-color=#D3B5B5\\\"\"", - "O" = "ooc", - "T" = "say", - "M" = "me", - "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs - "Any" = "\"KeyDown \[\[*\]\]\"", - "Any+UP" = "\"KeyUp \[\[*\]\]\"", - )) - -/client/proc/set_macros() - set waitfor = FALSE - - winset(src, null, "reset=true") - winset(src, null, "mainwindow.macro=default") - var/list/default = params2list(winget(src, "default.*", "command")) - for(var/i in 1 to length(default)) - var/id = default[i] - winset(src, id, "parent=none") - - var/list/default_macros = GLOB.default_macros - for(var/i in 1 to length(default_macros)) - var/input = default_macros[i] - var/output = default_macros[input] - winset(src, "default-[input]", "parent=default;name=[input];command=[output]") - - if(prefs.hotkeys) - winset(src, null, "mapwindow.map.focus=true input.background-color=#e0e0e0") - else - winset(src, null, "input.focus=true input.background-color=#d3b5b5") \ No newline at end of file diff --git a/code/modules/language/codespeak.dm b/code/modules/language/codespeak.dm index 2a140f27de..e8398c2b9f 100644 --- a/code/modules/language/codespeak.dm +++ b/code/modules/language/codespeak.dm @@ -3,7 +3,7 @@ desc = "Syndicate operatives can use a series of codewords to convey complex information, while sounding like random concepts and drinks to anyone listening in." key = "t" default_priority = 0 - flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD + flags_1 = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD icon_state = "codespeak" /datum/language/codespeak/scramble(input) diff --git a/code/modules/language/common.dm b/code/modules/language/common.dm index c00ab328ec..162fbf9226 100644 --- a/code/modules/language/common.dm +++ b/code/modules/language/common.dm @@ -5,7 +5,7 @@ speech_verb = "says" whisper_verb = "whispers" key = "0" - flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_UNDERSTOOD + flags_1 = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_UNDERSTOOD default_priority = 100 icon_state = "galcom" diff --git a/code/modules/language/draconic.dm b/code/modules/language/draconic.dm index aaa998c2c0..a85c1c9747 100644 --- a/code/modules/language/draconic.dm +++ b/code/modules/language/draconic.dm @@ -5,7 +5,7 @@ ask_verb = "hisses" exclaim_verb = "roars" key = "o" - flags = TONGUELESS_SPEECH + flags_1 = TONGUELESS_SPEECH space_chance = 40 syllables = list( "za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz", diff --git a/code/modules/language/drone.dm b/code/modules/language/drone.dm index 390e0027cf..32659e263b 100644 --- a/code/modules/language/drone.dm +++ b/code/modules/language/drone.dm @@ -1,12 +1,12 @@ /datum/language/drone name = "Drone" - desc = "A heavily encoded damage control coordination stream, with special flags for hats." + desc = "A heavily encoded damage control coordination stream, with special flags_1 for hats." speech_verb = "chitters" ask_verb = "chitters inquisitively" exclaim_verb = "chitters loudly" spans = list(SPAN_ROBOT) key = "d" - flags = NO_STUTTER + flags_1 = NO_STUTTER syllables = list(".", "|") // ...|..||.||||.|.||.|.|.|||.||| space_chance = 0 diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm index 8b51429bd3..67881f7510 100644 --- a/code/modules/language/language.dm +++ b/code/modules/language/language.dm @@ -11,10 +11,10 @@ var/ask_verb = "asks" // Used when sentence ends in a ? var/exclaim_verb = "exclaims" // Used when sentence ends in a ! var/whisper_verb = "whispers" // Optional. When not specified speech_verb + quietly/softly is used instead. - var/list/signlang_verb = list("signs", "gestures") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags + var/list/signlang_verb = list("signs", "gestures") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags_1 var/key // Character used to speak in language // If key is null, then the language isn't real or learnable. - var/flags // Various language flags. + var/flags_1 // Various language flags_1. var/list/syllables // Used when scrambling text for a non-speaker. var/sentence_chance = 5 // Likelihood of making a new sentence after each syllable. var/space_chance = 55 // Likelihood of getting a space in the random scramble string @@ -28,9 +28,9 @@ /datum/language/proc/display_icon(atom/movable/hearer) var/understands = hearer.has_language(src.type) - if(flags & LANGUAGE_HIDE_ICON_IF_UNDERSTOOD && understands) + if(flags_1 & LANGUAGE_HIDE_ICON_IF_UNDERSTOOD && understands) return FALSE - if(flags & LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD && !understands) + if(flags_1 & LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD && !understands) return FALSE return TRUE diff --git a/code/modules/language/machine.dm b/code/modules/language/machine.dm index 4d88bcb416..e5775040a2 100644 --- a/code/modules/language/machine.dm +++ b/code/modules/language/machine.dm @@ -6,7 +6,7 @@ exclaim_verb = "whistles loudly" spans = list(SPAN_ROBOT) key = "6" - flags = NO_STUTTER + flags_1 = NO_STUTTER syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz") space_chance = 10 default_priority = 90 diff --git a/code/modules/language/swarmer.dm b/code/modules/language/swarmer.dm index e3b7826706..ea58775a08 100644 --- a/code/modules/language/swarmer.dm +++ b/code/modules/language/swarmer.dm @@ -6,7 +6,7 @@ exclaim_verb = "tones loudly" spans = list(SPAN_ROBOT) key = "s" - flags = NO_STUTTER + flags_1 = NO_STUTTER space_chance = 100 sentence_chance = 0 default_priority = 60 diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index b7673a9640..711ac4f33a 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -49,7 +49,7 @@ anchored = TRUE for(var/obj/item/I in loc) if(istype(I, /obj/item/book)) - I.forceMove(src) + I.loc = src update_icon() @@ -123,7 +123,7 @@ if(!user.get_active_held_item()) user.put_in_hands(choice) else - choice.forceMove(drop_location()) + choice.loc = get_turf(src) update_icon() @@ -144,8 +144,8 @@ /obj/structure/bookcase/manuals/medical name = "medical manuals bookcase" -/obj/structure/bookcase/manuals/medical/Initialize() - . = ..() +/obj/structure/bookcase/manuals/medical/New() + ..() new /obj/item/book/manual/medical_cloning(src) update_icon() @@ -153,8 +153,8 @@ /obj/structure/bookcase/manuals/engineering name = "engineering manuals bookcase" -/obj/structure/bookcase/manuals/engineering/Initialize() - . = ..() +/obj/structure/bookcase/manuals/engineering/New() + ..() new /obj/item/book/manual/wiki/engineering_construction(src) new /obj/item/book/manual/engineering_particle_accelerator(src) new /obj/item/book/manual/wiki/engineering_hacking(src) @@ -167,8 +167,8 @@ /obj/structure/bookcase/manuals/research_and_development name = "\improper R&D manuals bookcase" -/obj/structure/bookcase/manuals/research_and_development/Initialize() - . = ..() +/obj/structure/bookcase/manuals/research_and_development/New() + ..() new /obj/item/book/manual/research_and_development(src) update_icon() @@ -289,7 +289,7 @@ user.put_in_hands(B) return else - B.forceMove(drop_location()) + B.loc = src.loc qdel(src) return return diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 54a6caffef..52077d2367 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -541,7 +541,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums cache = null if(href_list["eject"]) for(var/obj/item/book/B in contents) - B.forceMove(drop_location()) + B.loc = src.loc src.add_fingerprint(usr) src.updateUsrDialog() return @@ -589,4 +589,4 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums B.icon_state = "book[rand(1,7)]" qdel(P) else - P.forceMove(drop_location()) + P.loc = loc diff --git a/code/modules/mapping/dmm_suite.dm b/code/modules/mapping/dmm_suite.dm index c4ceec33ee..d272a10673 100644 --- a/code/modules/mapping/dmm_suite.dm +++ b/code/modules/mapping/dmm_suite.dm @@ -27,7 +27,7 @@ dmm_suite{ write_map(), which accepts three arguments: - A turf representing one corner of a three dimensional grid (Required). - Another turf representing the other corner of the same grid (Required). - - Any, or a combination, of several bit flags (Optional, see documentation). + - Any, or a combination, of several bit flags_1 (Optional, see documentation). The order in which the turfs are supplied does not matter, the /dmm_writer will determine the grid containing both, in much the same way as DM's block() function. diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 89d9d07a14..dfc602e725 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -1,5 +1,3 @@ - - /proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) if(!z_levels || !z_levels.len) WARNING("No Z levels provided - Not generating ruins") diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 5e7265f043..6c445c9ceb 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -11,8 +11,8 @@ var/codelen = 4 tamperproof = 90 -/obj/structure/closet/crate/secure/loot/Initialize() - . = ..() +/obj/structure/closet/crate/secure/loot/New() + ..() var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") code = "" for(var/i = 0, i < codelen, i++) diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index a434a41873..6b364e63e7 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -351,4 +351,4 @@ obj/docking_port/stationary/public_mining_dock #undef BAD_ZLEVEL #undef BAD_AREA #undef BAD_COORDS -#undef ZONE_SET \ No newline at end of file +#undef ZONE_SET diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 729665034e..f2cdefa9a4 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -43,8 +43,8 @@ ..() w_class = mask_adjusted ? WEIGHT_CLASS_NORMAL : WEIGHT_CLASS_SMALL -/obj/item/clothing/mask/gas/explorer/folded/Initialize() - . = ..() +/obj/item/clothing/mask/gas/explorer/folded/New() + ..() adjustmask() /obj/item/clothing/suit/space/hostile_environment diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index ec3dda28a0..52160303cc 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -71,7 +71,7 @@ plane = FULLSCREEN_PLANE layer = FLASH_LAYER icon = 'icons/effects/ore_visuals.dmi' - appearance_flags = 0 //to avoid having TILE_BOUND in the flags, so that the 480x480 icon states let you see it no matter where you are + appearance_flags = 0 //to avoid having TILE_BOUND in the flags_1, so that the 480x480 icon states let you see it no matter where you are duration = 35 pixel_x = -224 pixel_y = -224 diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm index 60983aa25a..f2c782c279 100644 --- a/code/modules/mining/laborcamp/laborshuttle.dm +++ b/code/modules/mining/laborcamp/laborshuttle.dm @@ -1,27 +1,27 @@ -/obj/machinery/computer/shuttle/labor - name = "labor shuttle console" - desc = "Used to call and send the labor camp shuttle." - circuit = /obj/item/circuitboard/computer/labor_shuttle - shuttleId = "laborcamp" - possible_destinations = "laborcamp_home;laborcamp_away" +/obj/machinery/computer/shuttle/labor + name = "labor shuttle console" + desc = "Used to call and send the labor camp shuttle." + circuit = /obj/item/circuitboard/computer/labor_shuttle + shuttleId = "laborcamp" + possible_destinations = "laborcamp_home;laborcamp_away" req_access = list(ACCESS_BRIG) - - -/obj/machinery/computer/shuttle/labor/one_way - name = "prisoner shuttle console" - desc = "A one-way shuttle console, used to summon the shuttle to the labor camp." - possible_destinations = "laborcamp_away" - circuit = /obj/item/circuitboard/computer/labor_shuttle/one_way - req_access = list( ) - -/obj/machinery/computer/shuttle/labor/one_way/Topic(href, href_list) - if(href_list["move"]) - var/obj/docking_port/mobile/M = SSshuttle.getShuttle("laborcamp") - if(!M) - to_chat(usr, "Cannot locate shuttle!") - return 0 - var/obj/docking_port/stationary/S = M.get_docked() - if(S && S.name == "laborcamp_away") - to_chat(usr, "Shuttle is already at the outpost!") - return 0 + + +/obj/machinery/computer/shuttle/labor/one_way + name = "prisoner shuttle console" + desc = "A one-way shuttle console, used to summon the shuttle to the labor camp." + possible_destinations = "laborcamp_away" + circuit = /obj/item/circuitboard/computer/labor_shuttle/one_way + req_access = list( ) + +/obj/machinery/computer/shuttle/labor/one_way/Topic(href, href_list) + if(href_list["move"]) + var/obj/docking_port/mobile/M = SSshuttle.getShuttle("laborcamp") + if(!M) + to_chat(usr, "Cannot locate shuttle!") + return 0 + var/obj/docking_port/stationary/S = M.get_docked() + if(S && S.name == "laborcamp_away") + to_chat(usr, "Shuttle is already at the outpost!") + return 0 ..() \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 7b38bc4cb5..12c9bfb30e 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -102,8 +102,8 @@ to_chat(usr, "No permission to dock could be granted.") else if(!emagged) - Radio.set_frequency(FREQ_SECURITY) - Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY, get_spans(), get_default_language()) + Radio.set_frequency(GLOB.SEC_FREQ) + Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", GLOB.SEC_FREQ, get_spans(), get_default_language()) to_chat(usr, "Shuttle received message and will be sent shortly.") /obj/machinery/mineral/labor_claim_console/proc/check_auth() diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 340ba16373..6ecdc91635 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -20,8 +20,8 @@ var/regrowth_time_low = 4800 var/regrowth_time_high = 8400 -/obj/structure/flora/ash/Initialize() - . = ..() +/obj/structure/flora/ash/New() + ..() base_icon = "[icon_state][rand(1, 4)]" icon_state = base_icon if(prob(15)) @@ -153,8 +153,8 @@ max_integrity = 100 seed = /obj/item/seeds/lavaland/polypore -/obj/item/reagent_containers/food/snacks/grown/ash_flora/Initialize() - . = ..() +/obj/item/reagent_containers/food/snacks/grown/ash_flora/New() + ..() pixel_x = rand(-4, 4) pixel_y = rand(-4, 4) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 665654088f..7fdecaaeb6 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -107,7 +107,6 @@ /datum/design/unique_modkit category = list("Mining Designs", "Cyborg Upgrade Modules") //can't be normally obtained build_type = PROTOLATHE | MECHFAB - departmental_flags = DEPARTMENTAL_FLAG_CARGO /datum/design/unique_modkit/offensive_turf_aoe name = "Kinetic Accelerator Offensive Mining Explosion Mod" @@ -173,7 +172,7 @@ to_chat(M, "Your vision returns to normal.") wisp.stop_orbit() - wisp.forceMove(src) + wisp.loc = src icon_state = "lantern-blue" SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Returned") @@ -413,7 +412,7 @@ /obj/item/device/shared_storage/attackby(obj/item/W, mob/user, params) if(bag) - bag.forceMove(user) + bag.loc = user bag.attackby(W, user, params) @@ -422,7 +421,7 @@ return if(loc == user && user.back && user.back == src) if(bag) - bag.forceMove(user) + bag.loc = user bag.attack_hand(user) else ..() diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm index efda0f9c8f..2eb30dc711 100644 --- a/code/modules/mining/lavaland/ruins/gym.dm +++ b/code/modules/mining/lavaland/ruins/gym.dm @@ -29,7 +29,7 @@ icon_state = "fitnesslifter2" user.setDir(SOUTH) user.Stun(80) - user.forceMove(src.loc) + user.loc = src.loc var/bragmessage = pick("pushing it to the limit","going into overdrive","burning with determination","rising up to the challenge", "getting strong now","getting ripped") user.visible_message("[user] is [bragmessage]!") var/lifts = 0 @@ -67,7 +67,7 @@ icon_state = "fitnessweight-c" user.setDir(SOUTH) user.Stun(80) - user.forceMove(src.loc) + user.loc = src.loc var/mutable_appearance/swole_overlay = mutable_appearance(icon, "fitnessweight-w", WALL_OBJ_LAYER) add_overlay(swole_overlay) var/bragmessage = pick("pushing it to the limit","going into overdrive","burning with determination","rising up to the challenge", "getting strong now","getting ripped") @@ -93,4 +93,4 @@ var/finishmessage = pick("You feel stronger!","You feel like you can take on the world!","You feel robust!","You feel indestructible!") icon_state = "fitnessweight" cut_overlay(swole_overlay) - to_chat(user, "[finishmessage]") + to_chat(user, "[finishmessage]") \ No newline at end of file diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 44f13d0a4f..3c7e736105 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -88,7 +88,7 @@ stack_list[inp.type] = s var/obj/item/stack/sheet/storage = stack_list[inp.type] storage.amount += inp.amount //Stack the sheets - qdel(inp) //Let the old sheet garbage collect + inp.loc = null //Let the old sheet garbage collect while(storage.amount > stack_amt) //Get rid of excessive stackage var/obj/item/stack/sheet/out = new inp.type() out.amount = stack_amt diff --git a/code/modules/mining/machine_unloading.dm b/code/modules/mining/machine_unloading.dm index c22ba5d757..6896a1a805 100644 --- a/code/modules/mining/machine_unloading.dm +++ b/code/modules/mining/machine_unloading.dm @@ -29,4 +29,4 @@ limit++ if (limit>=10) return - CHECK_TICK \ No newline at end of file + CHECK_TICK diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index c872756872..1e298604eb 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -276,8 +276,8 @@ name = "mining conscription kit" desc = "A kit containing everything a crewmember needs to support a shaft miner in the field." -/obj/item/storage/backpack/duffelbag/mining_conscript/Initialize() - . = ..() +/obj/item/storage/backpack/duffelbag/mining_conscript/New() + ..() new /obj/item/pickaxe/mini(src) new /obj/item/clothing/glasses/meson(src) new /obj/item/device/t_scanner/adv_mining_scanner/lesser(src) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 8d3f62f18d..8d36922bdf 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -8,8 +8,8 @@ var/set_luminosity = 8 var/set_cap = 0 -/obj/effect/light_emitter/Initialize() - . = ..() +/obj/effect/light_emitter/New() + ..() set_light(set_luminosity, set_cap) /obj/effect/light_emitter/singularity_pull() @@ -73,6 +73,7 @@ possible_destinations = "mining_home;mining_away;landing_zone_dock;mining_public" no_destination_swap = 1 var/global/list/dumb_rev_heads = list() + req_access = list(ACCESS_MINING) // should slow the ashwalkers down. /obj/machinery/computer/shuttle/mining/attack_hand(mob/user) if((user.z in GLOB.station_z_levels) && user.mind && is_head_revolutionary(user) && !(user.mind in dumb_rev_heads)) @@ -86,4 +87,4 @@ /obj/structure/closet/crate/miningcar desc = "A mining car. This one doesn't work on rails, but has to be dragged." name = "Mining car (not for rails)" - icon_state = "miningcar" + icon_state = "miningcar" \ No newline at end of file diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index befaef31a2..f13079861a 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -14,8 +14,8 @@ can_hold = list(/obj/item/coin, /obj/item/stack/spacecash) -/obj/item/storage/bag/money/vault/Initialize() - . = ..() +/obj/item/storage/bag/money/vault/New() + ..() new /obj/item/coin/silver(src) new /obj/item/coin/silver(src) new /obj/item/coin/silver(src) diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index 9a95bc9a4a..e058782be1 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -1,18 +1,15 @@ -// Camera mob, used by AI camera and blob. - -/mob/camera - name = "camera mob" +// Camera mob, used by AI camera and blob. + +/mob/camera + name = "camera mob" density = FALSE anchored = TRUE - status_flags = GODMODE // You can't damage it. + status_flags = GODMODE // You can't damage it. mouse_opacity = MOUSE_OPACITY_TRANSPARENT - see_in_dark = 7 - invisibility = INVISIBILITY_ABSTRACT // No one can see us - sight = SEE_SELF - move_on_shuttle = 0 - -/mob/camera/experience_pressure_difference() - return - -/mob/camera/forceMove(atom/destination) - loc = destination + see_in_dark = 7 + invisibility = INVISIBILITY_ABSTRACT // No one can see us + sight = SEE_SELF + move_on_shuttle = 0 + +/mob/camera/experience_pressure_difference() + return diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 59e8911659..689ef552d9 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -2,9 +2,6 @@ INITIALIZE_IMMEDIATE(/mob/dead) -/mob/dead - sight = SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF - /mob/dead/Initialize() if(initialized) stack_trace("Warning: [src]([type]) initialized multiple times!") @@ -14,9 +11,8 @@ INITIALIZE_IMMEDIATE(/mob/dead) prepare_huds() - if(length(CONFIG_GET(keyed_string_list/cross_server))) + if(CONFIG_GET(string/cross_server_address)) verbs += /mob/dead/proc/server_hop - set_focus(src) return INITIALIZE_HINT_NORMAL /mob/dead/dust() //ghosts can't be vaporised. @@ -28,9 +24,6 @@ INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead/ConveyorMove() //lol return -/mob/dead/forceMove(atom/destination) - loc = destination - /mob/dead/Stat() ..() @@ -49,46 +42,26 @@ INITIALIZE_IMMEDIATE(/mob/dead) else stat(null, "Time To Start: SOON") - stat(null, "Players: [SSticker.totalPlayers]") - if(client.holder) - stat(null, "Players Ready: [SSticker.totalPlayersReady]") - /mob/dead/proc/server_hop() set category = "OOC" set name = "Server Hop!" set desc= "Jump to the other server" if(notransform) return - var/list/csa = CONFIG_GET(keyed_string_list/cross_server) - var/pick - switch(csa.len) - if(0) - verbs -= /mob/dead/proc/server_hop - to_chat(src, "Server Hop has been disabled.") - if(1) - pick = csa[0] - else - pick = input(src, "Pick a server to jump to", "Server Hop") as null|anything in csa - - if(!pick) + var/csa = CONFIG_GET(string/cross_server_address) + if(csa) + verbs -= /mob/dead/proc/server_hop + to_chat(src, "Server Hop has been disabled.") return - - var/addr = csa[pick] - - if(alert(src, "Jump to server [pick] ([addr])?", "Server Hop", "Yes", "No") != "Yes") - return - - var/client/C = client - to_chat(C, "Sending you to [pick].") - new /obj/screen/splash(C) - - notransform = TRUE - sleep(29) //let the animation play - notransform = FALSE - - if(!C) - return - - winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources - - C << link("[addr]?server_hop=[key]") + if (alert(src, "Jump to server running at [csa]?", "Server Hop", "Yes", "No") != "Yes") + return 0 + if (client && csa) + to_chat(src, "Sending you to [csa].") + new /obj/screen/splash(client) + notransform = TRUE + sleep(29) //let the animation play + notransform = FALSE + winset(src, null, "command=.options") //other wise the user never knows if byond is downloading resources + client << link(csa + "?server_hop=[key]") + else + to_chat(src, "There is no other server configured!") diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 072c2bce8a..458a54aa48 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -21,9 +21,9 @@ S.Fade(TRUE) if(length(GLOB.newplayer_start)) - forceMove(pick(GLOB.newplayer_start)) + loc = pick(GLOB.newplayer_start) else - forceMove(locate(1,1,1)) + loc = locate(1,1,1) ComponentInitialize() @@ -73,6 +73,26 @@ popup.open(0) return +/mob/dead/new_player/Stat() + ..() + + if(statpanel("Lobby")) + stat("Game Mode:", (SSticker.hide_mode) ? "Secret" : "[GLOB.master_mode]") + stat("Map:", SSmapping.config.map_name) + + if(SSticker.current_state == GAME_STATE_PREGAME) + var/time_remaining = SSticker.GetTimeLeft() + if(time_remaining > 0) + stat("Time To Start:", "[round(time_remaining/10)]s") + else if(time_remaining == -10) + stat("Time To Start:", "DELAYED") + else + stat("Time To Start:", "SOON") + + stat("Players:", "[SSticker.totalPlayers]") + if(client.holder) + stat("Players Ready:", "[SSticker.totalPlayersReady]") + /mob/dead/new_player/Topic(href, href_list[]) if(src != usr) @@ -262,7 +282,7 @@ var/obj/effect/landmark/observer_start/O = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list to_chat(src, "Now teleporting.") if (O) - observer.forceMove(O.loc) + observer.loc = O.loc else to_chat(src, "Teleporting failed. Ahelp an admin please") stack_trace("There's no freaking observer landmark available on this map or you're making observers before the map is initialised") @@ -297,13 +317,15 @@ return 0 if(job.required_playtime_remaining(client)) return 0 + if(CONFIG_GET(flag/enforce_human_authority) && !client.prefs.pref_species.qualifies_for_rank(rank, client.prefs.features)) + return 0 return 1 /mob/dead/new_player/proc/AttemptLateSpawn(rank) if(!IsJobAvailable(rank)) alert(src, "[rank] is not available. Please try another.") - return FALSE + return 0 if(SSticker.late_join_disabled) alert(src, "An administrator has disabled late join spawning.") diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 22d9fa3d9c..f362f09a65 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -1,5 +1,4 @@ - - //The mob should have a gender you want before running this proc. Will run fine without H +//The mob should have a gender you want before running this proc. Will run fine without H /datum/preferences/proc/random_character(gender_override) if(gender_override) gender = gender_override @@ -20,7 +19,7 @@ features = random_features() age = rand(AGE_MIN,AGE_MAX) -/datum/preferences/proc/update_preview_icon() +/datum/preferences/proc/update_preview_icon(nude = 0) // Silicons only need a very basic preview since there is no customization for them. if(job_engsec_high) switch(job_engsec_high) @@ -57,7 +56,7 @@ previewJob = job break - if(previewJob) + if(previewJob && !nude) mannequin.job = previewJob.title previewJob.equip(mannequin, TRUE) COMPILE_OVERLAYS(mannequin) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 343f82b6f1..d19f3d4bf8 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -13,6 +13,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) density = FALSE canmove = 0 anchored = TRUE // don't get pushed around + sight = SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF see_invisible = SEE_INVISIBLE_OBSERVER see_in_dark = 100 invisibility = INVISIBILITY_OBSERVER @@ -108,7 +109,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) else T = locate(round(world.maxx/2), round(world.maxy/2), ZLEVEL_STATION_PRIMARY) //middle of the station - forceMove(T) + loc = T if(!name) //To prevent nameless ghosts name = random_unique_name(gender) @@ -135,13 +136,13 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) /mob/dead/observer/narsie_act() var/old_color = color color = "#960000" - animate(src, color = old_color, time = 10, flags = ANIMATION_PARALLEL) + animate(src, color = old_color, time = 10, flags_1 = ANIMATION_PARALLEL) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 10) /mob/dead/observer/ratvar_act() var/old_color = color color = "#FAE48C" - animate(src, color = old_color, time = 10, flags = ANIMATION_PARALLEL) + animate(src, color = old_color, time = 10, flags_1 = ANIMATION_PARALLEL) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 10) /mob/dead/observer/Destroy() @@ -287,10 +288,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/oldloc = loc if(NewLoc) - forceMove(NewLoc) + loc = NewLoc update_parallax_contents() else - forceMove(get_turf(src)) //Get out of closets and such as a ghost + loc = get_turf(src) //Get out of closets and such as a ghost if((direct & NORTH) && y < world.maxy) y++ else if((direct & SOUTH) && y > 1) @@ -370,7 +371,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!L || !L.len) to_chat(usr, "No area available.") - usr.forceMove(pick(L)) + usr.loc = pick(L) update_parallax_contents() /mob/dead/observer/verb/follow() @@ -444,7 +445,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/turf/T = get_turf(M) //Turf of the destination mob if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - A.forceMove(T) + A.loc = T A.update_parallax_contents() else to_chat(A, "This mob is not located in the game world.") @@ -766,8 +767,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //Istype so we filter out points of interest that are not mobs if(client && mob_eye && istype(mob_eye)) client.eye = mob_eye + client.screen = list() if(mob_eye.hud_used) - client.screen = list() LAZYINITLIST(mob_eye.observers) mob_eye.observers |= src mob_eye.hud_used.show_hud(mob_eye.hud_used.hud_version, src) diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 435005baf6..ad64c53fc7 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -1,25 +1,25 @@ -/mob/dead/observer/say(message) - message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) - - if (!message) - return - +/mob/dead/observer/say(message) + message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + + if (!message) + return + log_talk(src,"Ghost/[src.key] : [message]", LOGSAY) - - . = src.say_dead(message) - -/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - var/atom/movable/to_follow = speaker - if(radio_freq) - var/atom/movable/virtualspeaker/V = speaker - - if(isAI(V.source)) - var/mob/living/silicon/ai/S = V.source - to_follow = S.eyeobj - else - to_follow = V.source - var/link = FOLLOW_LINK(src, to_follow) - // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) - to_chat(src, "[link] [message]") - + + . = src.say_dead(message) + +/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) + var/atom/movable/to_follow = speaker + if(radio_freq) + var/atom/movable/virtualspeaker/V = speaker + + if(isAI(V.source)) + var/mob/living/silicon/ai/S = V.source + to_follow = S.eyeobj + else + to_follow = V.source + var/link = FOLLOW_LINK(src, to_follow) + // Recompose the message, because it's scrambled by default + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) + to_chat(src, "[link] [message]") + diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index e090592ba3..e4d49d7b70 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -57,7 +57,7 @@ brainmob = newbrain.brainmob newbrain.brainmob = null - brainmob.forceMove(src) + brainmob.loc = src brainmob.container = src if(!newbrain.damaged_brain) // the brain organ hasn't been beaten to death. brainmob.stat = CONSCIOUS //we manually revive the brain mob @@ -90,7 +90,7 @@ /obj/item/device/mmi/proc/eject_brain(mob/user) brainmob.container = null //Reset brainmob mmi var. - brainmob.forceMove(brain) //Throw mob into brain. + brainmob.loc = brain //Throw mob into brain. brainmob.stat = DEAD brainmob.emp_damage = 0 brainmob.reset_perspective() //so the brainmob follows the brain organ instead of the mmi. And to update our vision @@ -120,7 +120,7 @@ if(ishuman(L)) var/mob/living/carbon/human/H = L var/obj/item/organ/brain/newbrain = H.getorgan(/obj/item/organ/brain) - newbrain.forceMove(src) + newbrain.loc = src brain = newbrain else if(!brain) brain = new(src) diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index 33a274c762..ef704ef136 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -157,7 +157,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) new_name = pick(possible_names) brainmob.name = "[new_name]-[rand(100, 999)]" brainmob.real_name = brainmob.name - brainmob.forceMove(src) + brainmob.loc = src brainmob.container = src if(autoping) ping_ghosts("created", TRUE) diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index b55abb11f0..b0f76df80d 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -1,126 +1,126 @@ - -/mob/living/carbon/alien/get_eye_protection() - return ..() + 2 //potential cyber implants + natural eye protection - -/mob/living/carbon/alien/get_ear_protection() - return 2 //no ears - -/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush) + +/mob/living/carbon/alien/get_eye_protection() + return ..() + 2 //potential cyber implants + natural eye protection + +/mob/living/carbon/alien/get_ear_protection() + return 2 //no ears + +/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush) ..(AM, skipcatch = TRUE, hitpush = FALSE) - - -/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other. -As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble. -In all, this is a lot like the monkey code. /N -*/ -/mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M) - if(isturf(loc) && istype(loc.loc, /area/start)) - to_chat(M, "No attacking people at spawn, you jackass.") - return - - switch(M.a_intent) - - if ("help") - resting = 0 - AdjustStun(-60) - AdjustKnockdown(-60) - AdjustUnconscious(-60) - AdjustSleeping(-100) - visible_message("[M.name] nuzzles [src] trying to wake [p_them()] up!") - - if ("grab") - grabbedby(M) - - else - if(health > 0) - M.do_attack_animation(src, ATTACK_EFFECT_BITE) - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - visible_message("[M.name] bites [src]!", \ - "[M.name] bites [src]!", null, COMBAT_MESSAGE_RANGE) - adjustBruteLoss(1) - add_logs(M, src, "attacked") - updatehealth() - else - to_chat(M, "[name] is too injured for that.") - - -/mob/living/carbon/alien/attack_larva(mob/living/carbon/alien/larva/L) - return attack_alien(L) - - -/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M) - if(..()) //to allow surgery to return properly. - return 0 - - switch(M.a_intent) - if("help") - help_shake_act(M) - if("grab") - grabbedby(M) - if ("harm") - M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - return 1 - if("disarm") - M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - return 1 - return 0 - - -/mob/living/carbon/alien/attack_paw(mob/living/carbon/monkey/M) - if(..()) - if (stat != DEAD) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - apply_damage(rand(1, 3), BRUTE, affecting) - - -/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M) - . = ..() - if(.) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - switch(M.melee_damage_type) - if(BRUTE) - adjustBruteLoss(damage) - if(BURN) - adjustFireLoss(damage) - if(TOX) - adjustToxLoss(damage) - if(OXY) - adjustOxyLoss(damage) - if(CLONE) - adjustCloneLoss(damage) - if(STAMINA) - adjustStaminaLoss(damage) - -/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M) - if(..()) //successful slime attack - var/damage = rand(5, 35) - if(M.is_adult) - damage = rand(10, 40) - adjustBruteLoss(damage) - add_logs(M, src, "attacked") - updatehealth() - -/mob/living/carbon/alien/ex_act(severity, target, origin) - if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) - return - ..() - switch (severity) - if (1) - gib() - return - - if (2) - take_overall_damage(60, 60) - adjustEarDamage(30,120) - - if(3) - take_overall_damage(30,0) - if(prob(50)) - Unconscious(20) - adjustEarDamage(15,60) - -/mob/living/carbon/alien/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) - return 0 - -/mob/living/carbon/alien/acid_act(acidpwr, acid_volume) - return 0//aliens are immune to acid. + + +/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other. +As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble. +In all, this is a lot like the monkey code. /N +*/ +/mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M) + if(isturf(loc) && istype(loc.loc, /area/start)) + to_chat(M, "No attacking people at spawn, you jackass.") + return + + switch(M.a_intent) + + if ("help") + resting = 0 + AdjustStun(-60) + AdjustKnockdown(-60) + AdjustUnconscious(-60) + AdjustSleeping(-100) + visible_message("[M.name] nuzzles [src] trying to wake [p_them()] up!") + + if ("grab") + grabbedby(M) + + else + if(health > 0) + M.do_attack_animation(src, ATTACK_EFFECT_BITE) + playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) + visible_message("[M.name] bites [src]!", \ + "[M.name] bites [src]!", null, COMBAT_MESSAGE_RANGE) + adjustBruteLoss(1) + add_logs(M, src, "attacked") + updatehealth() + else + to_chat(M, "[name] is too injured for that.") + + +/mob/living/carbon/alien/attack_larva(mob/living/carbon/alien/larva/L) + return attack_alien(L) + + +/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M) + if(..()) //to allow surgery to return properly. + return 0 + + switch(M.a_intent) + if("help") + help_shake_act(M) + if("grab") + grabbedby(M) + if ("harm") + M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) + return 1 + if("disarm") + M.do_attack_animation(src, ATTACK_EFFECT_DISARM) + return 1 + return 0 + + +/mob/living/carbon/alien/attack_paw(mob/living/carbon/monkey/M) + if(..()) + if (stat != DEAD) + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) + apply_damage(rand(1, 3), BRUTE, affecting) + + +/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M) + . = ..() + if(.) + var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) + switch(M.melee_damage_type) + if(BRUTE) + adjustBruteLoss(damage) + if(BURN) + adjustFireLoss(damage) + if(TOX) + adjustToxLoss(damage) + if(OXY) + adjustOxyLoss(damage) + if(CLONE) + adjustCloneLoss(damage) + if(STAMINA) + adjustStaminaLoss(damage) + +/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + var/damage = rand(5, 35) + if(M.is_adult) + damage = rand(10, 40) + adjustBruteLoss(damage) + add_logs(M, src, "attacked") + updatehealth() + +/mob/living/carbon/alien/ex_act(severity, target, origin) + if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) + return + ..() + switch (severity) + if (1) + gib() + return + + if (2) + take_overall_damage(60, 60) + adjustEarDamage(30,120) + + if(3) + take_overall_damage(30,0) + if(prob(50)) + Unconscious(20) + adjustEarDamage(15,60) + +/mob/living/carbon/alien/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) + return 0 + +/mob/living/carbon/alien/acid_act(acidpwr, acid_volume) + return 0//aliens are immune to acid. diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index cf8a833bd8..eb17ecc40a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -277,7 +277,7 @@ Doesn't work on other aliens/AI.*/ if(user.stomach_contents.len) for(var/atom/movable/A in user.stomach_contents) user.stomach_contents.Remove(A) - A.forceMove(user.drop_location()) + A.loc = user.loc if(isliving(A)) var/mob/M = A M.reset_perspective() diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 2462242e25..e93fed311c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -11,7 +11,7 @@ ..() /mob/living/carbon/alien/humanoid/hunter/movement_delay() - . = -1 //hunters are sanic + . = -1 //hunters are sanic . += ..() //but they still need to slow down on stun diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm index f8cf430d74..404d285b25 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm @@ -48,4 +48,4 @@ return 1 else to_chat(user, "We already have an alive queen.") - return 0 + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index 375ef2318b..c0577c0d61 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -18,4 +18,4 @@ /mob/living/carbon/alien/humanoid/sentinel/movement_delay() - . = ..() + . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm index c6c675ead9..5d85ace4a6 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/death.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/death.dm @@ -20,4 +20,4 @@ if(istype(node)) // just in case someone would ever add a diffirent node to hivenode slot node.queen_death() - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index fc759ec827..fdca497bc3 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -106,7 +106,7 @@ for(var/atom/movable/A in stomach_contents) stomach_contents.Remove(A) new_xeno.stomach_contents.Add(A) - A.forceMove(new_xeno) + A.loc = new_xeno ..() //For alien evolution/promotion/queen finder procs. Checks for an active alien of that type diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 2e2d1f4188..101f1495e2 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -65,4 +65,4 @@ /mob/living/carbon/alien/larva/stripPanelEquip(obj/item/what, mob/who) to_chat(src, "You don't have the dexterity to do this!") - return + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index de543651eb..97d0509dfb 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -2,12 +2,12 @@ icon_state = "xgibmid2" var/list/alien_powers = list() -/obj/item/organ/alien/Initialize() - . = ..() +/obj/item/organ/alien/New() for(var/A in alien_powers) if(ispath(A)) alien_powers -= A alien_powers += new A(src) + ..() /obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0) ..() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 13aa33aaca..e2ae973d43 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -8,7 +8,7 @@ GLOB.carbon_list += src /mob/living/carbon/Destroy() - //This must be done first, so the mob ghosts correctly before DNA etc is nulled +//This must be done first, so the mob ghosts correctly before DNA etc is nulled . = ..() QDEL_LIST(internal_organs) @@ -38,7 +38,7 @@ if(prob(src.getBruteLoss() - 50)) for(var/atom/movable/A in stomach_contents) - A.forceMove(drop_location()) + A.loc = loc stomach_contents.Remove(A) src.gib() @@ -332,7 +332,7 @@ if (client) client.screen -= W if (W) - W.forceMove(drop_location()) + W.loc = loc W.dropped(src) if (W) W.layer = initial(W.layer) @@ -345,7 +345,7 @@ if (client) client.screen -= W if (W) - W.forceMove(drop_location()) + W.loc = loc W.dropped(src) if (W) W.layer = initial(W.layer) @@ -372,7 +372,7 @@ else if(I == handcuffed) - handcuffed.forceMove(drop_location()) + handcuffed.loc = loc handcuffed.dropped(src) handcuffed = null if(buckled && buckled.buckle_requires_restraints) @@ -380,7 +380,7 @@ update_handcuffed() return if(I == legcuffed) - legcuffed.forceMove(drop_location()) + legcuffed.loc = loc legcuffed.dropped() legcuffed = null update_inv_legcuffed() @@ -786,7 +786,7 @@ if(prob(50)) organs_amt++ O.Remove(src) - O.forceMove(drop_location()) + O.loc = get_turf(src) if(organs_amt) to_chat(user, "You retrieve some of [src]\'s internal organs!") diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index d876e2dab1..0bfa287a09 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -78,6 +78,7 @@ send_item_attack_message(I, user, affecting.name) if(I.force) apply_damage(I.force, I.damtype, affecting) + damage_clothes(I.force, I.damtype, "melee", affecting.body_zone) if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) if(prob(33)) I.add_mob_blood(src) diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 37b5539d33..e2555d4a8b 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -19,7 +19,7 @@ if(stat == SOFT_CRIT) . += SOFTCRIT_ADD_SLOWDOWN - + /mob/living/carbon/slip(knockdown_amount, obj/O, lube) if(movement_type & FLYING) return 0 diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 752a9d6471..991fd7a94d 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -151,7 +151,7 @@ var/mob/living/carbon/human/H = user if(H.dna && H.dna.species && (H.dna.features["wings"] != "None")) return TRUE - + /mob/living/carbon/human/proc/OpenWings() if(!dna || !dna.species) return diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index de83812aab..6ed9291b83 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -230,13 +230,14 @@ msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n" else msg += "[t_He] [t_is] quite chubby.\n" + switch(disgust) if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS) - msg += "[t_He] look[p_s()] a bit grossed out.\n" + msg += "[t_He] looks a bit grossed out.\n" if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED) - msg += "[t_He] look[p_s()] really grossed out.\n" + msg += "[t_He] looks really grossed out.\n" if(DISGUST_LEVEL_DISGUSTED to INFINITY) - msg += "[t_He] look[p_s()] extremely disgusted.\n" + msg += "[t_He] looks disgusted.\n" if(blood_volume < BLOOD_VOLUME_SAFE) msg += "[t_He] [t_has] pale skin.\n" @@ -341,7 +342,6 @@ R = find_record("name", perpname, GLOB.data_core.security) if(R) criminal = R.fields["criminal"] - msg += "Criminal status: \[[criminal]\]\n" msg += "Security record: \[View\] " msg += "\[Add crime\] " diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 711af9958b..f0c630421d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -263,7 +263,7 @@ // Display a warning if the user mocks up to_chat(src, "You feel your [pocket_side] pocket being fumbled with!") - ..() + ..() ///////HUDs/////// diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index df7999cba2..e8d4baba63 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -131,7 +131,7 @@ var/obj/item/bodypart/L = pick(bodyparts) L.embedded_objects |= I I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! - I.forceMove(src) + I.loc = src L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier) visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") hitpush = FALSE @@ -140,7 +140,7 @@ return ..() /mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0) - if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (disabilities & FAT) && ismonkey(pulling)) + if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling)) vore_attack(user, pulling) else ..() @@ -180,6 +180,7 @@ visible_message("[message]", \ "[message]") adjustBruteLoss(15) + damage_clothes(15, BRUTE, "melee") return 1 /mob/living/carbon/human/attack_hand(mob/user) @@ -199,8 +200,7 @@ return 0 if(M.a_intent == INTENT_DISARM) //Always drop item in hand, if no item, get stunned instead. - var/obj/item/I = get_active_held_item() - if(I && dropItemToGround(I)) + if(dropItemToGround(get_active_held_item())) playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) visible_message("[M] disarmed [src]!", \ "[M] disarmed [src]!") @@ -221,6 +221,7 @@ return 0 if(stat != DEAD) apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee")) + damage_clothes(damage, BRUTE, "melee", affecting.body_zone) return 1 /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M) @@ -250,10 +251,10 @@ if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful return 1 apply_damage(damage, BRUTE, affecting, armor_block) + damage_clothes(damage, BRUTE, "melee", affecting.body_zone) if(M.a_intent == INTENT_DISARM) //Always drop item in hand, if no item, get stun instead. - var/obj/item/I = get_active_held_item() - if(I && dropItemToGround(I)) + if(dropItemToGround(get_active_held_item())) playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) visible_message("[M] disarmed [src]!", \ "[M] disarmed [src]!") @@ -278,6 +279,7 @@ affecting = get_bodypart("chest") var/armor_block = run_armor_check(affecting, "melee") apply_damage(damage, BRUTE, affecting, armor_block) + damage_clothes(damage, BRUTE, "melee", affecting.body_zone) /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M) @@ -294,6 +296,7 @@ affecting = get_bodypart("chest") var/armor = run_armor_check(affecting, "melee", armour_penetration = M.armour_penetration) apply_damage(damage, M.melee_damage_type, affecting, armor) + damage_clothes(damage, M.melee_damage_type, "melee", affecting.body_zone) /mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M) @@ -314,6 +317,7 @@ affecting = get_bodypart("chest") var/armor_block = run_armor_check(affecting, "melee") apply_damage(damage, BRUTE, affecting, armor_block) + damage_clothes(damage, BRUTE, "melee", affecting.body_zone) /mob/living/carbon/human/mech_melee_attack(obj/mecha/M) @@ -331,9 +335,11 @@ Unconscious(20) update |= temp.receive_damage(dmg, 0) playsound(src, 'sound/weapons/punch4.ogg', 50, 1) + damage_clothes(dmg, BRUTE, "melee", temp.body_zone) if("fire") update |= temp.receive_damage(0, dmg) playsound(src, 'sound/items/welder.ogg', 50, 1) + damage_clothes(dmg, BURN, "melee", temp.body_zone) if("tox") M.mech_toxin_damage(src) else @@ -368,9 +374,6 @@ throw_at(throw_target, 200, 4) damage_clothes(400 - bomb_armor, BRUTE, "bomb") else - for(var/I in contents) - var/atom/A = I - A.ex_act(severity) gib() return diff --git a/code/modules/mob/living/carbon/human/interactive.dm b/code/modules/mob/living/carbon/human/interactive.dm index 1bce4fadb5..9fd2cbf8de 100644 --- a/code/modules/mob/living/carbon/human/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive.dm @@ -219,7 +219,7 @@ if(prob(25)) var/cType = pick(list(SNPC_BRUTE,SNPC_STEALTH,SNPC_MARTYR,SNPC_PSYCHO)) T.makeTraitor(cType) - T.forceMove(pick(get_area_turfs(T.job2area(T.myjob)))) + T.loc = pick(get_area_turfs(T.job2area(T.myjob))) if(choice == "Custom") var/cjob = input("Choose Job") as null|anything in SSjob.occupations if(cjob) @@ -256,7 +256,7 @@ var/doTele = input("Place the SNPC in their department?") as null|anything in list("Yes","No") if(doTele) if(doTele == "Yes") - T.forceMove(pick(get_area_turfs(T.job2area(T.myjob)))) + T.loc = pick(get_area_turfs(T.job2area(T.myjob))) /mob/living/carbon/human/interactive/proc/doSetup() Path_ID = new /obj/item/card/id(src) @@ -506,7 +506,7 @@ var/list/slots = list ("left pocket" = slot_l_store,"right pocket" = slot_r_store,"left hand" = slot_hands,"right hand" = slot_hands) if(hands) slots = list ("left hand" = slot_hands,"right hand" = slot_hands) - G.forceMove(src) + G.loc = src if(G.force && G.force > best_force) best_force = G.force equip_in_one_of_slots(G, slots) @@ -931,7 +931,7 @@ /mob/living/carbon/human/interactive/proc/npcDrop(var/obj/item/A,var/blacklist = 0) if(blacklist) blacklistItems += A - A.forceMove(drop_location()) // drop item works inconsistently + A.loc = get_turf(src) // drop item works inconsistently enforce_hands() update_icons() @@ -956,7 +956,7 @@ retal_target = traitorTarget else var/obj/item/I = traitorTarget - I.forceMove(get_turf(I)) // pull it outta them + I.loc = get_turf(traitorTarget) // pull it outta them else take_to_slot(traitorTarget) if(SNPC_MARTYR) @@ -1315,7 +1315,7 @@ customEmote("[src] [pick("gibbers","drools","slobbers","claps wildly","spits")], grabbing various foodstuffs from [SF] and sticking them in it's mouth!") for(var/obj/item/A in SF.contents) if(prob(smartness/2)) - A.forceMove(src) + A.loc = src if(foundCustom) @@ -1398,7 +1398,7 @@ if(!Adjacent(toGrab)) tryWalk(toGrab) else - toGrab.forceMove(src) + toGrab.loc = src if(finishedList.len > 0) var/obj/structure/table/reinforced/RT @@ -1563,7 +1563,7 @@ var/obj/item/W = main_hand W.attack(TARGET,src) else - G.forceMove(drop_location()) // drop item works inconsistently + G.loc = get_turf(src) // drop item works inconsistently enforce_hands() update_icons() else @@ -1622,4 +1622,4 @@ TRAITS |= TRAIT_ROBUST TRAITS |= TRAIT_SMART faction += "bot_power" - . = ..() + . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 51d0a731dd..cca672d3d8 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -32,7 +32,8 @@ handle_arousal() if(..()) //not dead - handle_active_genes() + for(var/datum/mutation/human/HM in dna.mutations) + HM.on_life(src) if(stat != DEAD) //heart attack stuff @@ -152,7 +153,7 @@ //END FIRE CODE -//This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, CHEST, GROIN, etc. See setup.dm for the full list) +//This proc returns a number made up of the flags_1 for body parts which you are protected on. (such as HEAD, CHEST, GROIN, etc. See setup.dm for the full list) /mob/living/carbon/human/proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. var/thermal_protection_flags = 0 //Handle normal clothing @@ -313,7 +314,7 @@ if(prob(I.embedded_fall_chance)) BP.receive_damage(I.w_class*I.embedded_fall_pain_multiplier) BP.embedded_objects -= I - I.forceMove(drop_location()) + I.loc = get_turf(src) visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!") if(!has_embedded_objects()) clear_alert("embeddedobject") @@ -342,9 +343,6 @@ heart.beating = !status -/mob/living/carbon/human/proc/handle_active_genes() - for(var/datum/mutation/human/HM in dna.mutations) - HM.on_life(src) /mob/living/carbon/human/proc/handle_heart() if(!can_heartattack()) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index d58c9b5c7e..0b02a2c711 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -53,7 +53,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded? var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"] - // species flags. these can be found in flags.dm + // species flags_1. these can be found in flags_1.dm var/list/species_traits = list() var/attack_verb = "punch" // punch-specific attack verb @@ -125,11 +125,12 @@ GLOBAL_LIST_EMPTY(roundstart_races) randname += " [pick(GLOB.last_names)]" return randname - + //Called when cloning, copies some vars that should be kept /datum/species/proc/copy_properties_from(datum/species/old_species) return + //Please override this locally if you want to define when what species qualifies for what rank if human authority is enforced. /datum/species/proc/qualifies_for_rank(rank, list/features) if(rank in GLOB.command_positions) @@ -1092,7 +1093,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/get_spans() return list() -/datum/species/proc/check_weakness(obj/item, mob/living/attacker) +/datum/species/proc/check_weakness(obj/item/weapon, mob/living/attacker) return 0 //////// @@ -1475,6 +1476,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/weakness = H.check_weakness(I, user) apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H) + H.damage_clothes(I.force, I.damtype, "melee", affecting.body_zone) H.send_item_attack_message(I, user, hit_area) diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm index fed10446f1..de0120028c 100644 --- a/code/modules/mob/living/carbon/human/species_types/angel.dm +++ b/code/modules/mob/living/carbon/human/species_types/angel.dm @@ -136,4 +136,4 @@ H.movement_type &= ~FLYING override_float = FALSE H.pass_flags &= ~PASSTABLE - H.CloseWings() \ No newline at end of file + H.CloseWings() diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm index bc1fcc9b1e..d78d2b5262 100644 --- a/code/modules/mob/living/carbon/human/species_types/corporate.dm +++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm @@ -16,4 +16,4 @@ blacklisted = 1 use_skintones = 0 species_traits = list(SPECIES_ORGANIC,RADIMMUNE,VIRUSIMMUNE,NOBLOOD,PIERCEIMMUNE,EYECOLOR,NODISMEMBER,NOHUNGER) - sexes = 0 \ No newline at end of file + sexes = 0 diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 2063238cd3..d2c83fa39f 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -595,7 +595,6 @@ H.adjustFireLoss(-4) H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) - /datum/species/golem/clockwork name = "Clockwork Golem" id = "clockwork golem" @@ -648,7 +647,6 @@ dangerous_existence = TRUE random_eligible = FALSE - /datum/species/golem/cloth name = "Cloth Golem" id = "cloth golem" diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index cec82a62d9..fe0acc4feb 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -12,7 +12,7 @@ /datum/species/human/qualifies_for_rank(rank, list/features) - return TRUE //Pure humans are always allowed in all roles. + return TRUE //Curiosity killed the cat's wagging tail. /datum/species/human/spec_death(gibbed, mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 17f5bafc42..09c9df5f9f 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -182,9 +182,7 @@ var/mob/living/L = AM if(iscyborg(AM)) var/mob/living/silicon/robot/borg = AM - if(!borg.lamp_cooldown) - borg.update_headlamp(TRUE, INFINITY) - to_chat(borg, "Your headlamp is fried! You'll need a human to help replace it.") + borg.update_headlamp(TRUE, 100) else for(var/obj/item/O in AM) if(O.light_range && O.light_power) diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index be56909b7c..0a55ae0134 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -15,4 +15,4 @@ /datum/species/skeleton/check_roundstart_eligible() if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) return TRUE - return ..() + return ..() diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 62e1a53355..4592d76138 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -1,142 +1,142 @@ -/mob/living/carbon/get_item_by_slot(slot_id) - switch(slot_id) - if(slot_back) - return back - if(slot_wear_mask) - return wear_mask - if(slot_neck) - return wear_neck - if(slot_head) - return head - if(slot_handcuffed) - return handcuffed - if(slot_legcuffed) - return legcuffed - return null - -/mob/living/carbon/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = 1) - for(var/slot in slots) - if(equip_to_slot_if_possible(I, slots[slot], qdel_on_fail = 0, disable_warning = TRUE)) - return slot - if(qdel_on_fail) - qdel(I) - return null - -//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() -/mob/living/carbon/equip_to_slot(obj/item/I, slot) - if(!slot) - return - if(!istype(I)) - return - - var/index = get_held_index_of_item(I) - if(index) - held_items[index] = null - - if(I.pulledby) - I.pulledby.stop_pulling() - - I.screen_loc = null - if(client) - client.screen -= I - if(observers && observers.len) - for(var/M in observers) - var/mob/dead/observe = M - if(observe.client) - observe.client.screen -= I +/mob/living/carbon/get_item_by_slot(slot_id) + switch(slot_id) + if(slot_back) + return back + if(slot_wear_mask) + return wear_mask + if(slot_neck) + return wear_neck + if(slot_head) + return head + if(slot_handcuffed) + return handcuffed + if(slot_legcuffed) + return legcuffed + return null + +/mob/living/carbon/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = 1) + for(var/slot in slots) + if(equip_to_slot_if_possible(I, slots[slot], qdel_on_fail = 0, disable_warning = TRUE)) + return slot + if(qdel_on_fail) + qdel(I) + return null + +//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() +/mob/living/carbon/equip_to_slot(obj/item/I, slot) + if(!slot) + return + if(!istype(I)) + return + + var/index = get_held_index_of_item(I) + if(index) + held_items[index] = null + + if(I.pulledby) + I.pulledby.stop_pulling() + + I.screen_loc = null + if(client) + client.screen -= I + if(observers && observers.len) + for(var/M in observers) + var/mob/dead/observe = M + if(observe.client) + observe.client.screen -= I I.forceMove(src) - I.layer = ABOVE_HUD_LAYER - I.plane = ABOVE_HUD_PLANE - I.appearance_flags |= NO_CLIENT_COLOR - var/not_handled = FALSE - switch(slot) - if(slot_back) - back = I - update_inv_back() - if(slot_wear_mask) - wear_mask = I - wear_mask_update(I, toggle_off = 0) - if(slot_head) - head = I - head_update(I) - if(slot_neck) - wear_neck = I - update_inv_neck(I) - if(slot_handcuffed) - handcuffed = I - update_handcuffed() - if(slot_legcuffed) - legcuffed = I - update_inv_legcuffed() - if(slot_hands) - put_in_hands(I) - update_inv_hands() - if(slot_in_backpack) - var/obj/item/storage/B = back - var/prev_jimmies = B.rustle_jimmies - B.rustle_jimmies = FALSE //don't conspicously rustle - B.handle_item_insertion(I, 1, src) - B.rustle_jimmies = prev_jimmies - else - not_handled = TRUE - - //Item has been handled at this point and equipped callback can be safely called - //We cannot call it for items that have not been handled as they are not yet correctly - //in a slot (handled further down inheritance chain, probably living/carbon/human/equip_to_slot - if(!not_handled) - I.equipped(src, slot) - - return not_handled - -/mob/living/carbon/doUnEquip(obj/item/I) - . = ..() //Sets the default return value to what the parent returns. - if(!. || !I) //We don't want to set anything to null if the parent returned 0. - return - - if(I == head) - head = null + I.layer = ABOVE_HUD_LAYER + I.plane = ABOVE_HUD_PLANE + I.appearance_flags |= NO_CLIENT_COLOR + var/not_handled = FALSE + switch(slot) + if(slot_back) + back = I + update_inv_back() + if(slot_wear_mask) + wear_mask = I + wear_mask_update(I, toggle_off = 0) + if(slot_head) + head = I + head_update(I) + if(slot_neck) + wear_neck = I + update_inv_neck(I) + if(slot_handcuffed) + handcuffed = I + update_handcuffed() + if(slot_legcuffed) + legcuffed = I + update_inv_legcuffed() + if(slot_hands) + put_in_hands(I) + update_inv_hands() + if(slot_in_backpack) + var/obj/item/storage/B = back + var/prev_jimmies = B.rustle_jimmies + B.rustle_jimmies = FALSE //don't conspicously rustle + B.handle_item_insertion(I, 1, src) + B.rustle_jimmies = prev_jimmies + else + not_handled = TRUE + + //Item has been handled at this point and equipped callback can be safely called + //We cannot call it for items that have not been handled as they are not yet correctly + //in a slot (handled further down inheritance chain, probably living/carbon/human/equip_to_slot + if(!not_handled) + I.equipped(src, slot) + + return not_handled + +/mob/living/carbon/doUnEquip(obj/item/I) + . = ..() //Sets the default return value to what the parent returns. + if(!. || !I) //We don't want to set anything to null if the parent returned 0. + return + + if(I == head) + head = null if(!QDELETED(src)) head_update(I) - else if(I == back) - back = null + else if(I == back) + back = null if(!QDELETED(src)) update_inv_back() - else if(I == wear_mask) - wear_mask = null + else if(I == wear_mask) + wear_mask = null if(!QDELETED(src)) wear_mask_update(I, toggle_off = 1) - if(I == wear_neck) - wear_neck = null + if(I == wear_neck) + wear_neck = null if(!QDELETED(src)) update_inv_neck(I) - else if(I == handcuffed) - handcuffed = null - if(buckled && buckled.buckle_requires_restraints) - buckled.unbuckle_mob(src) + else if(I == handcuffed) + handcuffed = null + if(buckled && buckled.buckle_requires_restraints) + buckled.unbuckle_mob(src) if(!QDELETED(src)) update_handcuffed() - else if(I == legcuffed) - legcuffed = null + else if(I == legcuffed) + legcuffed = null if(!QDELETED(src)) update_inv_legcuffed() - -//handle stuff to update when a mob equips/unequips a mask. -/mob/living/proc/wear_mask_update(obj/item/clothing/C, toggle_off = 1) - update_inv_wear_mask() - -/mob/living/carbon/wear_mask_update(obj/item/clothing/C, toggle_off = 1) - if(C.tint || initial(C.tint)) - update_tint() - update_inv_wear_mask() - -//handle stuff to update when a mob equips/unequips a headgear. -/mob/living/carbon/proc/head_update(obj/item/I, forced) - if(istype(I, /obj/item/clothing)) - var/obj/item/clothing/C = I - if(C.tint || initial(C.tint)) - update_tint() - update_sight() - if(I.flags_inv & HIDEMASK || forced) - update_inv_wear_mask() - update_inv_head() - + +//handle stuff to update when a mob equips/unequips a mask. +/mob/living/proc/wear_mask_update(obj/item/clothing/C, toggle_off = 1) + update_inv_wear_mask() + +/mob/living/carbon/wear_mask_update(obj/item/clothing/C, toggle_off = 1) + if(C.tint || initial(C.tint)) + update_tint() + update_inv_wear_mask() + +//handle stuff to update when a mob equips/unequips a headgear. +/mob/living/carbon/proc/head_update(obj/item/I, forced) + if(istype(I, /obj/item/clothing)) + var/obj/item/clothing/C = I + if(C.tint || initial(C.tint)) + update_tint() + update_sight() + if(I.flags_inv & HIDEMASK || forced) + update_inv_wear_mask() + update_inv_head() + diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index b61bd21a64..d6afdbdbc2 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -77,7 +77,7 @@ return FALSE // WEAPONS - if(istype(I, /obj/item)) + if(istype(I, /obj/item/weapon)) var/obj/item/W = I if(W.force >= best_force) put_in_hands(W) @@ -150,7 +150,7 @@ return TRUE // have we been disarmed - if(!locate(/obj/item) in held_items) + if(!locate(/obj/item/weapon) in held_items) best_force = 0 if(restrained() || blacklistItems[pickupTarget] || (pickupTarget && (pickupTarget.flags_1 & NODROP_1))) @@ -388,7 +388,7 @@ // attack using a held weapon otherwise bite the enemy, then if we are angry there is a chance we might calm down a little /mob/living/carbon/monkey/proc/monkey_attack(mob/living/L) - var/obj/item/Weapon = locate(/obj/item) in held_items + var/obj/item/Weapon = locate(/obj/item/weapon) in held_items // attack with weapon if we have one if(Weapon) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 7ddb9190a2..613a04bd17 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -133,6 +133,7 @@ /mob/living/carbon/monkey/has_smoke_protection() if(wear_mask) + if(wear_mask.flags_1 & BLOCK_GAS_SMOKE_EFFECT_1) return 1 diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index e51017d899..96cafa4501 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -16,6 +16,9 @@ if(stat != DEAD) var/dmg = rand(1, 5) apply_damage(dmg, BRUTE, affecting) + damage_clothes(dmg, BRUTE, "melee", affecting.body_zone) + + /mob/living/carbon/monkey/attack_larva(mob/living/carbon/alien/larva/L) if(..()) //successful larva bite. @@ -26,6 +29,7 @@ if(!affecting) affecting = get_bodypart("chest") apply_damage(damage, BRUTE, affecting) + damage_clothes(damage, BRUTE, "melee", affecting.body_zone) /mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M) if(..()) //To allow surgery to return properly. @@ -54,6 +58,7 @@ if(!affecting) affecting = get_bodypart("chest") apply_damage(damage, BRUTE, affecting) + damage_clothes(damage, BRUTE, "melee", affecting.body_zone) add_logs(M, src, "attacked") else @@ -96,6 +101,7 @@ if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful return 1 apply_damage(damage, BRUTE, affecting) + damage_clothes(damage, BRUTE, "melee", affecting.body_zone) else playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) @@ -130,6 +136,9 @@ if(!affecting) affecting = get_bodypart("chest") apply_damage(damage, M.melee_damage_type, affecting) + damage_clothes(damage, M.melee_damage_type, "melee", affecting.body_zone) + + /mob/living/carbon/monkey/attack_slime(mob/living/simple_animal/slime/M) if(..()) //successful slime attack @@ -143,6 +152,8 @@ if(!affecting) affecting = get_bodypart("chest") apply_damage(damage, BRUTE, affecting) + damage_clothes(damage, BRUTE, "melee", affecting.body_zone) + /mob/living/carbon/monkey/acid_act(acidpwr, acid_volume, bodyzone_hit) . = 1 diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index fc0d97e3cb..767268f8dc 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -74,4 +74,4 @@ file_data["relic_hat"] = head ? head.type : null file_data["relic_mask"] = wear_mask ? wear_mask.type : null fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) + WRITE_FILE(json_file, json_encode(file_data)) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index 83d943ccbf..c1a6af9688 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -36,7 +36,7 @@ if(T) . = T.could_speak_in_language(dt) else - . = initial(dt.flags) & TONGUELESS_SPEECH + . = initial(dt.flags_1) & TONGUELESS_SPEECH /mob/living/carbon/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) if(!client) @@ -44,4 +44,4 @@ for(var/T in get_traumas()) var/datum/brain_trauma/trauma = T message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 8c712b33fb..f589ecbb20 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -979,6 +979,7 @@ stop_pulling() else if(has_legs || ignore_legs) lying = 0 + if(buckled) lying = 90*buckle_lying else if(!lying) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 385f48c8d9..b1d0484086 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -72,7 +72,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( /mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE) var/static/list/crit_allowed_modes = list(MODE_WHISPER = TRUE, MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE) var/static/list/unconscious_allowed_modes = list(MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE) - var/talk_key = get_key(message) + var/key = get_key(message) var/static/list/one_character_prefix = list(MODE_HEADSET = TRUE, MODE_ROBOT = TRUE, MODE_WHISPER = TRUE) @@ -134,10 +134,12 @@ GLOBAL_LIST_INIT(department_radio_keys, list( // Detection of language needs to be before inherent channels, because // AIs use inherent channels for the holopad. Most inherent channels // ignore the language argument however. - - var/datum/saymode/SM = SSradio.saymodes[talk_key] - if(SM && !SM.handle_message(src, message, language)) - return + + var/datum/saymode/SM = SSradio.saymodes[key] + if(key && SM) + if(!SM.handle_message(src, message, language) && !message_mode) + return + if(!can_speak_vocal(message)) to_chat(src, "You find yourself unable to speak!") diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 86314e33d7..47d5a0ffd8 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -117,7 +117,7 @@ job = "AI" eyeobj.ai = src - eyeobj.forceMove(src.loc) + eyeobj.loc = src.loc rename_self("ai") holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"default")) diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index 025d3d8e6d..3af95cec4c 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -1,26 +1,26 @@ -/mob/living/silicon/ai/examine(mob/user) +/mob/living/silicon/ai/examine(mob/user) var/msg = "*---------*\nThis is [icon2html(src, user)] [src]!\n" - if (stat == DEAD) - msg += "It appears to be powered-down.\n" - else - msg += "" - if (getBruteLoss()) - if (getBruteLoss() < 30) - msg += "It looks slightly dented.\n" - else - msg += "It looks severely dented!\n" - if (getFireLoss()) - if (getFireLoss() < 30) - msg += "It looks slightly charred.\n" - else - msg += "Its casing is melted and heat-warped!\n" - msg += "" - if(deployed_shell) - msg += "The wireless networking light is blinking.\n" - else if (!shunted && !client) - msg += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem...\n" - msg += "*---------*" - - to_chat(user, msg) - + if (stat == DEAD) + msg += "It appears to be powered-down.\n" + else + msg += "" + if (getBruteLoss()) + if (getBruteLoss() < 30) + msg += "It looks slightly dented.\n" + else + msg += "It looks severely dented!\n" + if (getFireLoss()) + if (getFireLoss() < 30) + msg += "It looks slightly charred.\n" + else + msg += "Its casing is melted and heat-warped!\n" + msg += "" + if(deployed_shell) + msg += "The wireless networking light is blinking.\n" + else if (!shunted && !client) + msg += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem...\n" + msg += "*---------*" + + to_chat(user, msg) + ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index a76c02f3b5..2a009d4d00 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -173,4 +173,4 @@ obscured += t.obscured #undef UPDATE_BUFFER -#undef CHUNK_SIZE \ No newline at end of file +#undef CHUNK_SIZE diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 2e1adb1959..7537697d71 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -1,13 +1,13 @@ -/mob/living/silicon/spawn_gibs() +/mob/living/silicon/spawn_gibs() new /obj/effect/gibspawner/robot(get_turf(src)) - -/mob/living/silicon/spawn_dust() - new /obj/effect/decal/remains/robot(loc) - -/mob/living/silicon/death(gibbed) - if(!gibbed) - emote("deathgasp") - diag_hud_set_status() - diag_hud_set_health() - update_health_hud() + +/mob/living/silicon/spawn_dust() + new /obj/effect/decal/remains/robot(loc) + +/mob/living/silicon/death(gibbed) + if(!gibbed) + emote("deathgasp") + diag_hud_set_status() + diag_hud_set_health() + update_health_hud() . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 3042ddc5df..b12430d26d 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -51,7 +51,7 @@ var/obj/machinery/door/hackdoor // The airlock being hacked var/hackprogress = 0 // Possible values: 0 - 100, >= 100 means the hack is complete and will be reset upon next check - var/obj/item/integrated_signaler/signaler // AI's signaller + var/obj/item/radio/integrated/signal/sradio // AI's signaller var/holoform = FALSE var/canholo = TRUE @@ -101,7 +101,7 @@ P.setPersonality(src) forceMove(P) card = P - signaler = new(src) + sradio = new(src) if(!radio) radio = new /obj/item/device/radio(src) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index bb057f7774..e73792e705 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -169,20 +169,23 @@ if("signaller") if(href_list["send"]) - signaler.send_activation() + + sradio.send_signal("ACTIVATE") audible_message("[icon2html(src, world)] *beep* *beep*") if(href_list["freq"]) - var/new_frequency = (signaler.frequency + text2num(href_list["freq"])) - if(new_frequency < MIN_FREE_FREQ || new_frequency > MAX_FREE_FREQ) + + var/new_frequency = (sradio.frequency + text2num(href_list["freq"])) + if(new_frequency < 1200 || new_frequency > 1600) new_frequency = sanitize_frequency(new_frequency) - signaler.set_frequency(new_frequency) + sradio.set_frequency(new_frequency) if(href_list["code"]) - signaler.code += text2num(href_list["code"]) - signaler.code = round(signaler.code) - signaler.code = min(100, signaler.code) - signaler.code = max(1, signaler.code) + + sradio.code += text2num(href_list["code"]) + sradio.code = round(sradio.code) + sradio.code = min(100, sradio.code) + sradio.code = max(1, sradio.code) @@ -394,14 +397,14 @@ Frequency: - - - [format_frequency(signaler.frequency)] + [format_frequency(sradio.frequency)] + +
    Code: - - - [signaler.code] + [sradio.code] + +
    diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index d09f8cd4a2..aab1f204f6 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -50,7 +50,6 @@ if(!mind.special_role) mind.special_role = "traitor" SSticker.mode.traitors += mind - mind.add_antag_datum(/datum/antagonist/auto_custom) // ???? /mob/living/silicon/robot/update_health_hud() diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 8fb58b9472..cf55cdd5f9 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -1,4 +1,3 @@ - /mob/living/silicon/robot/Login() ..() regenerate_icons() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 71b58fddd0..db10f4a81c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -5,6 +5,8 @@ icon_state = "robot" maxHealth = 100 health = 100 + macro_default = "robot-default" + macro_hotkeys = "robot-hotkeys" bubble_icon = "robot" designation = "Default" //used for displaying the prefix & getting the current module of cyborg has_limbs = 1 @@ -246,6 +248,17 @@ return //won't work if dead robot_alerts() +//for borg hotkeys, here module refers to borg inv slot, not core module +/mob/living/silicon/robot/verb/cmd_toggle_module(module as num) + set name = "Toggle Module" + set hidden = 1 + toggle_module(module) + +/mob/living/silicon/robot/verb/cmd_unequip_module() + set name = "Unequip Module" + set hidden = 1 + uneq_active() + /mob/living/silicon/robot/proc/robot_alerts() var/dat = "" for (var/cat in alarms) @@ -524,19 +537,6 @@ toner = tonermax qdel(W) to_chat(user, "You fill the toner level of [src] to its max capacity.") - - else if(istype(W, /obj/item/device/flashlight)) - if(!opened) - to_chat(user, "You need to open the panel to repair the headlamp!") - if(lamp_cooldown <= world.time) - to_chat(user, "The headlamp is already functional!") - else - if(!user.temporarilyRemoveItemFromInventory(W)) - to_chat(user, "[W] seems to be stuck to your hand. You'll have to find a different light.") - return - lamp_cooldown = 0 - qdel(W) - to_chat(user, "You replace the headlamp bulbs.") else return ..() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 253cb14a89..b1be1c3076 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -33,8 +33,8 @@ var/ride_allow_incapacitated = FALSE var/allow_riding = TRUE -/obj/item/robot_module/Initialize() - . = ..() +/obj/item/robot_module/New() + ..() for(var/i in basic_modules) var/obj/item/I = new i(src) basic_modules += I diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 383cdd268d..b19bc401e3 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -72,7 +72,7 @@ var/nearest_beacon // the nearest beacon's tag var/turf/nearest_beacon_loc // the nearest beacon's location - var/beacon_freq = FREQ_NAV_BEACON + var/beacon_freq = 1445 // navigation beacon frequency var/model = "" //The type of bot it is. var/bot_type = 0 //The type of bot it is, for radio control. var/data_hud_type = DATA_HUD_DIAGNOSTIC_BASIC //The type of data HUD the bot uses. Diagnostic by default. @@ -108,7 +108,6 @@ if(stat) return FALSE on = TRUE - canmove = TRUE set_light(initial(light_range)) update_icon() diag_hud_set_botstat() @@ -116,7 +115,6 @@ /mob/living/simple_animal/bot/proc/turn_off() on = FALSE - canmove = FALSE set_light(0) bot_reset() //Resets an AI's call, should it exist. update_icon() @@ -131,7 +129,7 @@ Radio = new/obj/item/device/radio(src) if(radio_key) Radio.keyslot = new radio_key - Radio.subspace_transmission = TRUE + Radio.subspace_transmission = 1 Radio.canhear_range = 0 // anything greater will have the bot broadcast the channel as if it were saying it out loud. Radio.recalculateChannels() diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index a4e8d09121..0ef926f942 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -282,8 +282,8 @@ var/skin = null //Same as medbot, set to tox or ointment for the respective kits. w_class = WEIGHT_CLASS_NORMAL -/obj/item/firstaid_arm_assembly/Initialize() - . = ..() +/obj/item/firstaid_arm_assembly/New() + ..() spawn(5) if(skin) add_overlay("kit_skin_[skin]") diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 8046daf55d..0e6ecf1672 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -360,14 +360,8 @@ ..() /datum/action/innate/seek_master/Activate() - var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult) - if(!C) - return - var/datum/objective/eldergod/summon_objective = locate() in C.cult_team.objectives - - if(summon_objective.check_completion()) - the_construct.master = C.cult_team.blood_target - + if(!SSticker.mode.eldergod) + the_construct.master = GLOB.blood_target if(!the_construct.master) to_chat(the_construct, "You have no master to seek!") the_construct.seeking = FALSE diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index d2f408e687..35d7d12174 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -75,4 +75,4 @@ real_name = "Evil Kreb" icon_state = "evilkreb" icon_living = "evilkreb" - icon_dead = "evilkreb_dead" + icon_dead = "evilkreb_dead" diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index adc88c5633..6ea4d2ef94 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -135,7 +135,7 @@ switch(remove_from) if("head") if(inventory_head) - inventory_head.forceMove(drop_location()) + inventory_head.loc = src.loc inventory_head = null update_corgi_fluff() regenerate_icons() @@ -144,7 +144,7 @@ return if("back") if(inventory_back) - inventory_back.forceMove(drop_location()) + inventory_back.loc = src.loc inventory_back = null update_corgi_fluff() regenerate_icons() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index 3b23e4adc0..7a2c9e6b39 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -15,8 +15,8 @@ icon_state = "drone_maint_hat"//yes reuse the _hat state. var/drone_type = /mob/living/simple_animal/drone //Type of drone that will be spawned -/obj/item/drone_shell/Initialize() - . = ..() +/obj/item/drone_shell/New() + ..() var/area/A = get_area(src) if(A) notify_ghosts("A drone shell has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE) @@ -67,7 +67,7 @@ L.dropItemToGround(src) contents -= drone - drone.forceMove(drop_location()) + drone.loc = get_turf(src) drone.reset_perspective() drone.setDir(SOUTH )//Looks better drone.visible_message("[drone] uncurls!") diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 65ef28baee..3aa1153133 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -153,7 +153,7 @@ /mob/living/simple_animal/drone/cogscarab/Login() ..() - add_servant_of_ratvar(src, TRUE, GLOB.servants_active) + add_servant_of_ratvar(src, TRUE) to_chat(src,"You yourself are one of these servants, and will be able to utilize almost anything they can[GLOB.ratvar_awakens ? "":", excluding a clockwork slab"].") // this can't go with flavortext because i'm assuming it requires them to be ratvar'd /mob/living/simple_animal/drone/cogscarab/binarycheck() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/verbs.dm b/code/modules/mob/living/simple_animal/friendly/drone/verbs.dm index 70116d53b6..49faea14b3 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/verbs.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/verbs.dm @@ -15,6 +15,7 @@ /mob/living/simple_animal/drone/verb/toggle_light() set category = "Drone" set name = "Toggle drone light" + if(stat == DEAD) to_chat(src, "There's no light in your life... by that I mean you're dead.") return @@ -39,6 +40,7 @@ var/msg = "DRONE PING: [name]: [alert_s] priority alert in [A.name]!" alert_drones(msg) + /mob/living/simple_animal/drone/verb/toggle_statics() set name = "Change Vision Filter" set desc = "Change the filter on the system used to remove non drone beings from your viewscreen." diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 34ed273c5b..cbd14bb376 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -66,7 +66,7 @@ src.visible_message("[src] gets an evil-looking gleam in [p_their()] eye.") /mob/living/simple_animal/hostile/retaliate/goat/Move() - . = ..() + ..() if(!stat) eat_plants() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 809681ed6b..85ec19bfb9 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -110,7 +110,3 @@ eatverb = "devours" list_reagents = list("nutriment" = 3, "vitamin" = 2) foodtype = GROSS | MEAT | RAW - grind_results = list("blood" = 20, "liquidgibs" = 5) - -/obj/item/reagent_containers/food/snacks/deadmouse/on_grind() - reagents.clear_reagents() diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index 7dc2b0f8ca..3200c8b7d7 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -9,20 +9,17 @@ /mob/living/simple_animal/pet/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/clothing/neck/petcollar) && !pcollar) - var/pet_icon_states = icon_states("[icon]") - if("[icon_state]collar" in pet_icon_states) - var/obj/item/clothing/neck/petcollar/P = O - pcollar = P - collar = "[icon_state]collar" - pettag = "[icon_state]tag" - regenerate_icons() - to_chat(user, "You put the [P] around [src]'s neck.") - if(P.tagname) - real_name = "\proper [P.tagname]" - name = real_name - qdel(P) - return - + var/obj/item/clothing/neck/petcollar/P = O + pcollar = P + collar = "[icon_state]collar" + pettag = "[icon_state]tag" + regenerate_icons() + to_chat(user, "You put the [P] around [src]'s neck.") + if(P.tagname) + real_name = "\proper [P.tagname]" + name = real_name + qdel(P) + return if(istype(O, /obj/item/newspaper)) if(!stat) user.visible_message("[user] baps [name] on the nose with the rolled up [O].") @@ -54,4 +51,3 @@ add_overlay(collar) if(pettag) add_overlay(pettag) - diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index efb418a817..577eba1858 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -57,7 +57,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians . = ..() /mob/living/simple_animal/hostile/guardian/med_hud_set_health() - if(summoner) + if(!QDELETED(summoner)) var/image/holder = hud_list[HEALTH_HUD] holder.icon_state = "hud[RoundHealth(summoner)]" diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 0650f90fc6..2929e146f1 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -39,4 +39,4 @@ var/mob/living/carbon/C = target C.Knockdown(60) C.visible_message("\The [src] knocks down \the [C]!", \ - "\The [src] knocks you down!") \ No newline at end of file + "\The [src] knocks you down!") diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index 09d97c946d..84bb54f242 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -105,4 +105,3 @@ if(oogas >= rand(2,6)) playsound(src, "sound/creatures/gorilla.ogg", 200) oogas = 0 - diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 0b75dc5be8..10d9fd93d7 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -28,6 +28,9 @@ var/ranged_message = "fires" //Fluff text for ranged mobs var/ranged_cooldown = 0 //What the current cooldown on ranged attacks is, generally world.time + ranged_cooldown_time var/ranged_cooldown_time = 30 //How long, in deciseconds, the cooldown of ranged attacks is + var/ranged_telegraph = "prepares to fire at *TARGET*!" //A message shown when the mob prepares to fire; use *TARGET* if you want to show the target's name + var/ranged_telegraph_sound //A sound played when the mob prepares to fire + var/ranged_telegraph_time = 0 //In deciseconds, how long between the telegraph and ranged shot var/ranged_ignores_vision = FALSE //if it'll fire ranged attacks even if it lacks vision on its target, only works with environment smash var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat. @@ -228,6 +231,9 @@ if(!target || !CanAttack(target)) LoseTarget() return 0 + if(ismob(target.loc)) + LoseTarget() + return 0 if(target in possible_targets) if(target.z != z) LoseTarget() @@ -235,7 +241,14 @@ var/target_distance = get_dist(targets_from,target) if(ranged) //We ranged? Shoot at em if(!target.Adjacent(targets_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown - OpenFire(target) + if(!ranged_telegraph_time || client) + OpenFire(target) + else + if(ranged_telegraph) + visible_message("[src] [replacetext(ranged_telegraph, "*TARGET*", "[target]")]") + if(ranged_telegraph_sound) + playsound(src, ranged_telegraph_sound, 75, FALSE) + addtimer(CALLBACK(src, .proc/OpenFire, target), ranged_telegraph_time) if(!Process_Spacemove()) //Drifting walk(src,0) return 1 @@ -399,6 +412,7 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega DestroyObjectsInDirection(dir) + /mob/living/simple_animal/hostile/proc/EscapeConfinement() if(buckled) buckled.attack_animal(src) diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index a1cb61c115..f9868771ac 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -283,8 +283,9 @@ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/Move(NewLoc,Dir=0,step_x=0,step_y=0) if(mecha && loc == mecha) - return mecha.relaymove(src, Dir) - return ..() + mecha.relaymove(src, Dir) + return + ..() /mob/living/simple_animal/hostile/syndicate/mecha_pilot/Goto(target, delay, minimum_distance) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 1db7855e10..03f466ddfd 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -114,7 +114,7 @@ Difficulty: Medium if(L.stat == DEAD) visible_message("[src] butchers [L]!", "You butcher [L], restoring your health!") - if(!(z in GLOB.station_z_levels) || client) //NPC monsters won't heal while on station + if(!(z in GLOB.station_z_levels && !client)) //NPC monsters won't heal while on station if(guidance) adjustHealth(-L.maxHealth) else @@ -251,9 +251,9 @@ Difficulty: Medium animate(src, transform = M, pixel_y = -6, dir = final_dir, time = 2, easing = EASE_IN|EASE_OUT) sleep(5) - animate(src, color = list("#A7A19E", "#A7A19E", "#A7A19E", list(0, 0, 0)), time = 10, easing = EASE_IN, flags = ANIMATION_PARALLEL) + animate(src, color = list("#A7A19E", "#A7A19E", "#A7A19E", list(0, 0, 0)), time = 10, easing = EASE_IN, flags_1 = ANIMATION_PARALLEL) sleep(4) - animate(src, alpha = 0, time = 6, easing = EASE_OUT, flags = ANIMATION_PARALLEL) + animate(src, alpha = 0, time = 6, easing = EASE_OUT, flags_1 = ANIMATION_PARALLEL) /obj/item/device/gps/internal/miner icon_state = null diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index fe6e7f7974..58e3e0837b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -783,4 +783,4 @@ Difficulty: Very Hard #undef ACTIVATE_WEAPON #undef ACTIVATE_MAGIC -#undef MEDAL_PREFIX +#undef MEDAL_PREFIX \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 8ec955892f..7f12e684e8 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -192,7 +192,7 @@ Difficulty: Medium qdel(F) if(stat == DEAD) swooping &= ~SWOOP_DAMAGEABLE - animate(src, alpha = 255, transform = oldtransform, time = 0, flags = ANIMATION_END_NOW) //reset immediately + animate(src, alpha = 255, transform = oldtransform, time = 0, flags_1 = ANIMATION_END_NOW) //reset immediately return animate(src, alpha = 100, transform = matrix()*0.7, time = 7) swooping |= SWOOP_INVULNERABLE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 385ab2c668..5c95c2ec26 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -89,11 +89,15 @@ . = ..() if(. && isliving(target)) var/mob/living/L = target - if(L.stat != DEAD) - if(!client && ranged && ranged_cooldown <= world.time) - OpenFire() + if(L.stat >= SOFT_CRIT) + if(vore_active == TRUE && L.devourable == TRUE) + dragon_feeding(src,L) + else if(L.stat == DEAD) + devour(L) else - devour(L) + if(L.stat != DEAD) + if(!client && ranged && ranged_cooldown <= world.time) + OpenFire() /mob/living/simple_animal/hostile/megafauna/proc/devour(mob/living/L) if(!L) @@ -101,7 +105,7 @@ visible_message( "[src] devours [L]!", "You feast on [L], restoring your health!") - if(!(z in GLOB.station_z_levels) || client) //NPC monsters won't heal while on station + if(!(z in GLOB.station_z_levels && !client)) //NPC monsters won't heal while on station adjustBruteLoss(-L.maxHealth/2) L.gib() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index bc4686fd42..7a3a85c35b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -14,6 +14,9 @@ ranged = 1 ranged_message = "stares" ranged_cooldown_time = 30 + ranged_telegraph = "gathers energy and stares at *TARGET*!" + ranged_telegraph_sound = 'sound/magic/magic_missile.ogg' + ranged_telegraph_time = 7 throw_message = "does nothing against the hard shell of" vision_range = 2 speed = 3 @@ -71,9 +74,11 @@ melee_damage_lower = 15 melee_damage_upper = 15 attacktext = "impales" + ranged_telegraph = "fixates on *TARGET* as its eye shines blue!" + ranged_telegraph_sound = 'sound/magic/tail_swing.ogg' + ranged_telegraph_time = 5 a_intent = INTENT_HARM speak_emote = list("telepathically cries") - attack_sound = 'sound/weapons/bladeslice.ogg' stat_attack = UNCONSCIOUS movement_type = FLYING robust_searching = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm index 3c40bacde8..ad7edb1716 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm @@ -123,8 +123,7 @@ /obj/item/udder/gutlunch name = "nutrient sac" -/obj/item/udder/gutlunch/Initialize() - . = ..() +/obj/item/udder/gutlunch/New() reagents = new(50) reagents.my_atom = src diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index 7479b1aaa2..8ad8babb36 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -64,4 +64,3 @@ projectiletype = /obj/item/projectile/beam/laser loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged, /obj/item/gun/energy/laser) - diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 29bc2cbff0..8355bd2e27 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -12,8 +12,8 @@ var/growth_time = 1200 -/obj/structure/alien/resin/flower_bud_enemy/Initialize() - . = ..() +/obj/structure/alien/resin/flower_bud_enemy/New() + ..() var/list/anchors = list() anchors += locate(x-2,y+2,z) anchors += locate(x+2,y+2,z) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index d6c8403d8f..681f36e6d9 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -127,7 +127,7 @@ /mob/living/simple_animal/parrot/death(gibbed) if(held_item) - held_item.forceMove(drop_location()) + held_item.loc = src.loc held_item = null walk(src,0) @@ -702,7 +702,7 @@ continue held_item = I - I.forceMove(src) + I.loc = src visible_message("[src] grabs [held_item]!", "You grab [held_item]!", "You hear the sounds of wings flapping furiously.") return held_item @@ -777,7 +777,7 @@ if(!drop_gently) if(istype(held_item, /obj/item/grenade)) var/obj/item/grenade/G = held_item - G.forceMove(drop_location()) + G.loc = src.loc G.prime() to_chat(src, "You let go of [held_item]!") held_item = null @@ -785,7 +785,7 @@ to_chat(src, "You drop [held_item].") - held_item.forceMove(drop_location()) + held_item.loc = src.loc held_item = null return 1 @@ -801,7 +801,7 @@ for(var/atom/movable/AM in view(src,1)) for(var/perch_path in desired_perches) if(istype(AM, perch_path)) - src.forceMove(AM.loc) + src.loc = AM.loc icon_state = icon_sit return to_chat(src, "There is no perch nearby to sit on!") @@ -838,7 +838,7 @@ /mob/living/simple_animal/parrot/proc/perch_on_human(mob/living/carbon/human/H) if(!H) return - forceMove(get_turf(H)) + loc = get_turf(H) H.buckle_mob(src, force=1) pixel_y = 9 pixel_x = pick(-8,8) //pick left or right shoulder @@ -996,12 +996,11 @@ return var/datum/disease/parrot_possession/P = new P.parrot = src - forceMove(H) + loc = H H.ForceContractDisease(P) parrot_interest = null H.visible_message("[src] dive bombs into [H]'s chest and vanishes!", "[src] dive bombs into your chest, vanishing! This can't be good!") - /mob/living/simple_animal/parrot/clock_hawk name = "clock hawk" desc = "Cbyl jnaan penpxre! Fdhnnnjx!" diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 7e7a86a9e4..9ffbff5619 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -30,6 +30,8 @@ sync_mind() + client.sethotkeys() //set mob specific hotkeys + //Reload alternate appearances for(var/v in GLOB.active_alternate_appearances) if(!v) @@ -43,10 +45,6 @@ client.change_view(CONFIG_GET(string/default_view)) // Resets the client.view in case it was changed. - if(client.player_details.player_actions.len) - for(var/datum/action/A in client.player_details.player_actions) - A.Grant(src) - if(!GLOB.individual_log_list[ckey]) GLOB.individual_log_list[ckey] = logging else diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4b08876daa..b19af6342c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -30,7 +30,6 @@ GLOB.dead_mob_list += src else GLOB.alive_mob_list += src - set_focus(src) prepare_huds() for(var/v in GLOB.active_alternate_appearances) if(!v) @@ -126,7 +125,7 @@ if(self_message) msg = self_message else - if(M.see_invisibleThis mob type cannot throw items.") + return + + +/client/Northwest() + var/obj/item/I = usr.get_active_held_item() + if(!I) + to_chat(usr, "You have nothing to drop in your hand!") + return + usr.dropItemToGround(I) + +//This gets called when you press the delete button. +/client/verb/delete_key_pressed() + set hidden = 1 + + if(!isliving(usr)) + return + if(!usr.pulling) + to_chat(usr, "You are not pulling anything.") + return + usr.stop_pulling() + +/client/verb/swap_hand() + set category = "IC" + set name = "Swap hands" + + if(mob) + mob.swap_hand() + +/client/verb/attack_self() + set hidden = 1 + if(mob) + mob.mode() + return + + /client/verb/drop_item() set hidden = 1 if(!iscyborg(mob) && mob.stat == CONSCIOUS) mob.dropItemToGround(mob.get_active_held_item()) return + +/client/Center() + if(isobj(mob.loc)) + var/obj/O = mob.loc + if(mob.canmove) + return O.relaymove(mob, 0) + return + + /client/proc/Move_object(direct) if(mob && mob.control_object) if(mob.control_object.density) @@ -25,30 +107,26 @@ return mob.control_object.setDir(direct) else - mob.control_object.forceMove(get_step(mob.control_object,direct)) + mob.control_object.loc = get_step(mob.control_object,direct) return #define MOVEMENT_DELAY_BUFFER 0.75 #define MOVEMENT_DELAY_BUFFER_DELTA 1.25 /client/Move(n, direct) - if(world.time < move_delay) //do not move anything ahead of this check please + if(world.time < move_delay) return FALSE - else - next_move_dir_add = 0 - next_move_dir_sub = 0 var/old_move_delay = move_delay move_delay = world.time+world.tick_lag //this is here because Move() can now be called mutiple times per tick if(!mob || !mob.loc) return FALSE - if(!n || !direct) - return FALSE + var/oldloc = mob.loc if(mob.notransform) return FALSE //This is sota the goto stop mobs from moving var if(mob.control_object) return Move_object(direct) if(!isliving(mob)) - return mob.Move(n, direct) + return mob.Move(n,direct) if(mob.stat == DEAD) mob.ghostize() return FALSE @@ -81,32 +159,26 @@ if(!mob.Process_Spacemove(direct)) return FALSE + //We are now going to move - var/add_delay = mob.movement_delay() - if(old_move_delay + (add_delay*MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time) - move_delay = old_move_delay + var/delay = mob.movement_delay() + if(old_move_delay + (delay*MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time) + move_delay = old_move_delay + delay else - move_delay = world.time - var/oldloc = mob.loc + move_delay = delay + world.time if(mob.confused) - var/newdir = 0 if(mob.confused > 40) - newdir = pick(GLOB.alldirs) + step(mob, pick(GLOB.cardinals)) else if(prob(mob.confused * 1.5)) - newdir = angle2dir(dir2angle(direct) + pick(90, -90)) + step(mob, angle2dir(dir2angle(direct) + pick(90, -90))) else if(prob(mob.confused * 3)) - newdir = angle2dir(dir2angle(direct) + pick(45, -45)) - if(newdir) - direct = newdir - n = get_step(mob, direct) + step(mob, angle2dir(dir2angle(direct) + pick(45, -45))) + else + step(mob, direct) + else + . = ..() - . = ..() - - if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully - add_delay *= 2 - if(mob.loc != oldloc) - move_delay += add_delay if(.) // If mob is null here, we deserve the runtime if(mob.throwing) mob.throwing.finalize(FALSE) @@ -114,7 +186,7 @@ if(LAZYLEN(mob.user_movement_hooks)) for(var/obj/O in mob.user_movement_hooks) O.intercept_user_move(direct, mob, n, oldloc) - + var/atom/movable/P = mob.pulling if(P && !ismob(P) && P.density) mob.dir = turn(mob.dir, 180) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index ef1523bf43..1ee7f27452 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -5,8 +5,7 @@ if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return - if(message) - say(message) + usr.say(message) /mob/verb/whisper_verb(message as text) diff --git a/code/modules/mob/say_readme.dm b/code/modules/mob/say_readme.dm index 00e0f66246..a4f85c1422 100644 --- a/code/modules/mob/say_readme.dm +++ b/code/modules/mob/say_readme.dm @@ -11,7 +11,7 @@ This rewrite was needed, but is far from perfect. Report any bugs you come acros Radio code, while very much related to saycode, is not something I wanted to touch, so the code related to that may be messy. If you came here to see how to use saycode, all you will ever really need to call is say(message). -To have things react when other things speak around them, add the HEAR_1 flag to their flags variable and +To have things react when other things speak around them, add the HEAR_1 flag to their flags_1 variable and override their Hear() proc. =======================PROCS & VARIABLES======================= @@ -43,7 +43,7 @@ global procs Attaches span classes around input. /atom/movable - flags + flags_1 The HEAR_1 flag determines whether something is a hearer or not. Hear() is only called on procs with this flag. diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index c501984de8..534307f727 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -58,6 +58,7 @@ O.suiciding = suiciding if(hellbound) O.hellbound = hellbound + O.loc = loc O.a_intent = INTENT_HARM //keep viruses? @@ -112,7 +113,7 @@ var/obj/item/bodypart/chest/torso = O.get_bodypart("chest") if(cavity_object) torso.cavity_item = cavity_object //cavity item is given to the new chest - cavity_object.forceMove(O) + cavity_object.loc = O for(var/missing_zone in missing_bodyparts_zones) var/obj/item/bodypart/BP = O.get_bodypart(missing_zone) @@ -219,6 +220,8 @@ if(hellbound) O.hellbound = hellbound + O.loc = loc + //keep viruses? if (tr_flags & TR_KEEPVIRUS) O.viruses = viruses @@ -273,7 +276,7 @@ var/obj/item/bodypart/chest/torso = get_bodypart("chest") if(cavity_object) torso.cavity_item = cavity_object //cavity item is given to the new chest - cavity_object.forceMove(O) + cavity_object.loc = O for(var/missing_zone in missing_bodyparts_zones) var/obj/item/bodypart/BP = O.get_bodypart(missing_zone) @@ -398,6 +401,7 @@ R.mmi.brainmob.real_name = real_name //the name of the brain inside the cyborg is the robotized human's name. R.mmi.brainmob.name = real_name + R.loc = loc R.job = "Cyborg" R.notify_ai(NEW_BORG) @@ -468,7 +472,11 @@ qdel(src) /mob/proc/become_overmind(starting_points = 60) - var/mob/camera/blob/B = new /mob/camera/blob(get_turf(src), starting_points) + var/turf/T = get_turf(loc) //just to avoid messing up in lockers + var/area/A = get_area(T) + if(((A && !A.blob_allowed) || !(T.z in GLOB.station_z_levels)) && LAZYLEN(GLOB.blobstart)) + T = get_turf(pick(GLOB.blobstart)) + var/mob/camera/blob/B = new /mob/camera/blob(T, starting_points) B.key = key . = B qdel(src) diff --git a/code/modules/modular_computers/computers/item/laptop_presets.dm b/code/modules/modular_computers/computers/item/laptop_presets.dm index a1f5f7e37f..78270fb0d9 100644 --- a/code/modules/modular_computers/computers/item/laptop_presets.dm +++ b/code/modules/modular_computers/computers/item/laptop_presets.dm @@ -1,4 +1,4 @@ -/obj/item/device/modular_computer/laptop/preset/Initialize() +/obj/item/device/modular_computer/laptop/preset/New() . = ..() install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index 21080e593f..c8f9282380 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -3,7 +3,7 @@ /obj/item/device/modular_computer/tablet/preset/cheap desc = "A low-end tablet often seen among low ranked station personnel." -/obj/item/device/modular_computer/tablet/preset/cheap/Initialize() +/obj/item/device/modular_computer/tablet/preset/cheap/New() . = ..() install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer/micro)) @@ -11,7 +11,7 @@ install_component(new /obj/item/computer_hardware/network_card) // Alternative version, an average one, for higher ranked positions mostly -/obj/item/device/modular_computer/tablet/preset/advanced/Initialize() +/obj/item/device/modular_computer/tablet/preset/advanced/New() . = ..() install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) @@ -20,7 +20,7 @@ install_component(new /obj/item/computer_hardware/card_slot) install_component(new /obj/item/computer_hardware/printer/mini) -/obj/item/device/modular_computer/tablet/preset/cargo/Initialize() +/obj/item/device/modular_computer/tablet/preset/cargo/New() . = ..() install_component(new /obj/item/computer_hardware/processor_unit/small) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 54e26d2e63..62d8ff5d86 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -120,9 +120,9 @@ stored_files = null return ..() -/obj/item/computer_hardware/hard_drive/Initialize() - . = ..() +/obj/item/computer_hardware/hard_drive/New() install_default_programs() + ..() /obj/item/computer_hardware/hard_drive/advanced diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index b26d01d880..1656a43505 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -95,7 +95,7 @@ Contents: var/datum/mind/Mind = new /datum/mind(key) Mind.assigned_role = "Space Ninja" Mind.special_role = "Space Ninja" - SSticker.mode.traitors |= Mind //Adds them to current traitor list. TODO : Remove this in admin tools refeactor. + SSticker.mode.traitors |= Mind //Adds them to current traitor list. Which is really the extra antagonist list. return Mind diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index 4e7ad477e2..82c7dfa0bf 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -58,8 +58,8 @@ Contents: /obj/item/clothing/suit/space/space_ninja/get_cell() return cell -/obj/item/clothing/suit/space/space_ninja/Initialize() - . = ..() +/obj/item/clothing/suit/space/space_ninja/New() + ..() //Spark Init spark_system = new @@ -97,7 +97,7 @@ Contents: if(!istype(H)) return FALSE if(!is_ninja(H)) - to_chat(H, "fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAU†HORIZED USÈ DETÈC†††eD\nCoMMÈNCING SUB-R0U†IN3 13...\nTÈRMInATING U-U-USÈR...") + to_chat(H, "fTaL RRoR: 382200-*#00CDE RED\nUNAU?HORIZED US DETC???eD\nCoMMNCING SUB-R0U?IN3 13...\nTRMInATING U-U-USR...") H.gib() return FALSE if(!istype(H.head, /obj/item/clothing/head/helmet/space/space_ninja)) diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm index 4b159557bc..e19e67404d 100644 --- a/code/modules/ninja/suit/suit_initialisation.dm +++ b/code/modules/ninja/suit/suit_initialisation.dm @@ -28,7 +28,7 @@ /obj/item/clothing/suit/space/space_ninja/proc/ninitialize_four(delay, mob/living/carbon/human/U) if(U.stat == DEAD|| U.health <= 0) - to_chat(U, "FĆAL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG...") + to_chat(U, "F?AL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG...") unlock_suit() s_busy = FALSE return diff --git a/code/modules/orbit/orbit.dm b/code/modules/orbit/orbit.dm index 0293886fd4..89d1d89e58 100644 --- a/code/modules/orbit/orbit.dm +++ b/code/modules/orbit/orbit.dm @@ -43,10 +43,6 @@ if (!orbiter.orbiting) //admin wants to stop the orbit. orbiter.orbiting = src //set it back to us first orbiter.stop_orbit() - var/atom/movable/AM = orbiting - if(istype(AM) && AM.orbiting && AM.orbiting.orbiting == orbiter) - orbiter.stop_orbit() - return lastprocess = world.time if (!targetloc) targetloc = get_turf(orbiting) @@ -58,7 +54,7 @@ lastloc = orbiter.loc for(var/other_orbit in orbiter.orbiters) var/datum/orbit/OO = other_orbit - if(OO == src || OO.orbiter == orbiting) + if(OO == src) continue OO.Check(targetloc) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index e8487b3344..d9d220b0ef 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -73,7 +73,7 @@ if(href_list["pen"]) if(haspen) - haspen.forceMove(usr.loc) + haspen.loc = usr.loc usr.put_in_hands(haspen) haspen = null @@ -96,7 +96,7 @@ if(href_list["remove"]) var/obj/item/P = locate(href_list["remove"]) if(istype(P) && P.loc == src) - P.forceMove(usr.loc) + P.loc = usr.loc usr.put_in_hands(P) if(P == toppaper) toppaper = null diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index fed93fabd3..0d963d4be8 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -187,6 +187,7 @@ GLOBAL_LIST_EMPTY(employmentCabinets) /obj/structure/filingcabinet/employment/Initialize() . = ..() GLOB.employmentCabinets += src + return ..() /obj/structure/filingcabinet/employment/Destroy() GLOB.employmentCabinets -= src @@ -198,9 +199,8 @@ GLOBAL_LIST_EMPTY(employmentCabinets) var/datum/data/record/G = record if(!G) continue - var/datum/mind/M = G.fields["mindref"] - if(M && ishuman(M.current)) - addFile(M.current) + if(G.fields["reference"]) + addFile(G.fields["reference"]) /obj/structure/filingcabinet/employment/proc/addFile(mob/living/carbon/human/employee) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index c81ab37591..3221a2c8db 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -62,7 +62,7 @@ if(href_list["remove"]) var/obj/item/I = locate(href_list["remove"]) if(istype(I) && I.loc == src) - I.forceMove(usr.loc) + I.loc = usr.loc usr.put_in_hands(I) if(href_list["read"]) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 3dd47a0dab..1fb1846f4c 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -374,3 +374,4 @@ /obj/item/paper/crumpled/bloody icon_state = "scrap_bloodied" + diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index df69e9548a..fbf6e7b6e4 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -12,8 +12,8 @@ pass_flags = PASSTABLE -/obj/item/papercutter/Initialize() - . = ..() +/obj/item/papercutter/New() + ..() storedcutter = new /obj/item/hatchet/cutterblade(src) update_icon() @@ -111,8 +111,8 @@ resistance_flags = FLAMMABLE max_integrity = 50 -/obj/item/paperslip/Initialize() - . = ..() +/obj/item/paperslip/New() + ..() pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm index dbf13367ed..7d0d2d8cef 100644 --- a/code/modules/paperwork/paper_premade.dm +++ b/code/modules/paperwork/paper_premade.dm @@ -14,7 +14,8 @@ /obj/item/paper/guides/jobs/hydroponics name = "paper- 'Greetings from Billy Bob'" - info = "Hey fellow botanist!
    \n
    \nI didn't trust the station folk so I left
    \na couple of weeks ago. But here's some
    \ninstructions on how to operate things here.
    \nYou can grow plants and each iteration they become
    \nstronger, more potent and have better yield, if you
    \nknow which ones to pick. Use your botanist's analyzer
    \nfor that. You can turn harvested plants into seeds
    \nat the seed extractor, and replant them for better stuff!
    \nSometimes if the weed level gets high in the tray
    \nmutations into different mushroom or weed species have
    \nbeen witnessed. On the rare occasion even weeds mutate!
    \n
    \nEither way, have fun!
    \n
    \nBest regards,
    \nBilly Bob Johnson.
    \n
    \nPS.
    \nHere's a few tips:
    \nIn nettles, potency = damage
    \nIn amanitas, potency = deadliness + side effect
    \nIn Liberty caps, potency = drug power + effect
    \nIn chilies, potency = heat
    \nNutrients keep mushrooms alive!
    \nWater keeps weeds such as nettles alive!
    \nAll other plants need both." + info = "Hey fellow botanist!
    \n
    \nI didn't trust the station folk so I left
    \na couple of weeks ago. But here's some
    \ninstructions on how to operate things here.
    \nYou can grow plants and each iteration they become
    \nstronger, more potent and have better yield, if you
    \nknow which ones to pick. Use your botanist's analyzer
    \nfor that. You can turn harvested plants into seeds
    \nat the seed extractor, and replant them for better stuff!
    \nSometimes if the weed level gets high in the tray
    \nmutations into different mushroom or weed species have
    \nbeen witnessed. On the rare occassion even weeds mutate!
    \n
    \nEither way, have fun!
    \n
    \nBest regards,
    \nBilly Bob Johnson.
    \n
    \nPS.
    \nHere's a few tips:
    \nIn nettles, potency = damage
    \nIn amanitas, potency = deadliness + side effect
    \nIn Liberty caps, potency = drug power + effect
    \nIn chilis, potency = heat
    \nNutrients keep mushrooms alive!
    \nWater keeps weeds such as nettles alive!
    \nAll other plants need both." + /obj/item/paper/fluff/jobs/security/beepsky_mom name = "Note from Beepsky's Mom" @@ -26,7 +27,7 @@ /obj/item/paper/guides/jobs/security/labor_camp name = "Labor Camp Operating Guide" - info = "Labor Camp Facility Operation Guide

    Hello there, proud operator of an NT-Sec Prisoner Rehabilitation Center. A solution to rising crime rates and falling productivity, these facilities are specifically designed for the safe, productive imprisonment of your most dangerous criminals.

    To press a long-term prisoner into the service of the station, replace his equipment with prisoners' garb at one of the prison lockers, as per normal operating procedure. Before assigning a prisoner his ID, insert the ID into a prisoner management console and assign the prisoner a quota, based on the severity of his crime.
    A single sheet of most materials produces five points for the prisoner, and points can be expected to be produced at a rate of about 100 per minute, though punishments as severe as forced labor should be reserved for serious crimes of sentences not less than five minutes long.
    Once you have prepared the prisoner, place him in the secure northern half of the labor shuttle, and send him to the station. Once he meets his quota by feeding sheets to the stacker, he will be allowed to return to the station, and will be able to open the secure door to the prisoner release area.

    In the case of dangerous prisoners, surveillance may be needed. To that end, there is a prisoner monitoring room on the mining station, equipped with a remote flasher and a lockdown button. The mine itself is patrolled by a securibot, so the nearby security records console can also be used to secure hostile prisoners on the mine." + info = "Labor Camp Facility Operation Guide

    Hello there, proud operator of an NT-Sec Prisoner Rehabilitation Center. A solution to rising crime rates and falling productivity, these facilities are specifically designed for the safe, productive imprisonment of your most dangerous criminals.

    To press a long-term prisoner into the service of the station, replace his equipment with prisoners' garb at one of the prison lockers, as per normal operating procedure. Before assigning a prisoner his ID, insert the ID into a prisoner management console and assign the prisoner a quota, based on the severity of his crime.
    A single sheet of most materials produces five points for the prisoner, and points can be expected to be produced at a rate of about 100 per minute, though punishments as severe as forced labor should be reserved for serious crimes of sentences not less than five minutes long.
    Once you have prepared the prisoner, place him in the secure northern half of the labor shuttle, and send him to the station. Once he meets his quota by feeding sheets to the stacker, he will be allowed to return to the station, and will be able to open the secure door to the prisoner release area.

    In the case of dangerous prisoners, surveilance may be needed. To that end, there is a prisoner monitoring room on the mining station, equipped with a remote flasher and a lockdown button. The mine itself is patrolled by a securibot, so the nearby security records console can also be used to secure hostile prisoners on the mine." /obj/item/paper/guides/jobs/security/range name = "paper- Firing Range Instructions" @@ -34,7 +35,7 @@ /obj/item/paper/fluff/jobs/jobs name = "paper- 'Job Information'" - info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
    \nThe data will be in the following form.
    \nGenerally lower ranking positions come first in this list.
    \n
    \nJob Name general access>lab access-engine access-systems access (atmosphere control)
    \n\tJob Description
    \nJob Duties (in no particular order)
    \nTips (where applicable)
    \n
    \nResearch Assistant 1>1-0-0
    \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
    \n1. Assist the researchers.
    \n2. Clean up the labs.
    \n3. Prepare materials.
    \n
    \nStaff Assistant 2>0-0-0
    \n\tThis position assists the security officer in his duties. The staff assistants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
    \n1. Patrol ship/Guard key areas
    \n2. Assist security officer
    \n3. Perform other security duties.
    \n
    \nTechnical Assistant 1>0-0-1
    \n\tThis is yet another low level position. The technical assistant helps the engineer and the station\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
    \n1. Assist Station technician and Engineers.
    \n2. Perform general maintenance of station.
    \n3. Prepare materials.
    \n
    \nMedical Assistant 1>1-0-0
    \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
    \n1. Assist the medical personnel.
    \n2. Update medical files.
    \n3. Prepare materials for medical operations.
    \n
    \nResearch Technician 2>3-0-0
    \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
    \n1. Inform superiors of research.
    \n2. Perform research alongside of official researchers.
    \n
    \nDetective 3>2-0-0
    \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crime scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should store the evidence ly.
    \n1. Perform crime-scene investigations/draw conclusions.
    \n2. Store and catalogue evidence properly.
    \n3. Testify to superiors/inquiries on findings.
    \n
    \nStation Technician 2>0-2-3
    \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
    \n1. Maintain SS13 systems.
    \n2. Repair equipment.
    \n
    \nAtmospheric Technician 3>0-0-4
    \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
    \n1. Maintain atmosphere on SS13
    \n2. Research atmospheres on the space station. (safely please!)
    \n
    \nEngineer 2>1-3-0
    \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
    \n1. Upkeep the engine.
    \n2. Prevent fires in the engine.
    \n3. Maintain a safe orbit.
    \n
    \nMedical Researcher 2>5-0-0
    \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
    \n1. Make sure the station is kept safe.
    \n2. Research medical properties of materials studied of Space Station 13.
    \n
    \nScientist 2>5-0-0
    \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Plasma Technicians as plasma is the material they routinely handle.
    \n1. Research plasma
    \n2. Make sure all plasma is properly handled.
    \n
    \nMedical Doctor (Officer) 2>0-0-0
    \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
    \n1. Heal wounded people.
    \n2. Perform examinations of all personnel.
    \n3. Monitor usage of medical equipment.
    \n
    \nSecurity Officer 3>0-0-0
    \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
    \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
    \n1. Maintain order.
    \n2. Assist others.
    \n3. Repair structural problems.
    \n
    \nHead of Security 4>5-2-2
    \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
    \n1. Oversee security.
    \n2. Assign patrol duties.
    \n3. Protect the station and staff.
    \n
    \nHead of Personnel 4>4-2-2
    \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
    \n1. Assign duties.
    \n2. Moderate personnel.
    \n3. Moderate research.
    \n
    \nCaptain 5>5-5-5 (unrestricted station wide access)
    \n\tThis is the highest position you can acquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
    \n1. Assign all positions on SS13
    \n2. Inspect the station for any problems.
    \n3. Perform administrative duties.
    \n" + info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
    \nThe data will be in the following form.
    \nGenerally lower ranking positions come first in this list.
    \n
    \nJob Name general access>lab access-engine access-systems access (atmosphere control)
    \n\tJob Description
    \nJob Duties (in no particular order)
    \nTips (where applicable)
    \n
    \nResearch Assistant 1>1-0-0
    \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
    \n1. Assist the researchers.
    \n2. Clean up the labs.
    \n3. Prepare materials.
    \n
    \nStaff Assistant 2>0-0-0
    \n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
    \n1. Patrol ship/Guard key areas
    \n2. Assist security officer
    \n3. Perform other security duties.
    \n
    \nTechnical Assistant 1>0-0-1
    \n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
    \n1. Assist Station technician and Engineers.
    \n2. Perform general maintenance of station.
    \n3. Prepare materials.
    \n
    \nMedical Assistant 1>1-0-0
    \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
    \n1. Assist the medical personnel.
    \n2. Update medical files.
    \n3. Prepare materials for medical operations.
    \n
    \nResearch Technician 2>3-0-0
    \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
    \n1. Inform superiors of research.
    \n2. Perform research alongside of official researchers.
    \n
    \nDetective 3>2-0-0
    \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
    \n1. Perform crime-scene investigations/draw conclusions.
    \n2. Store and catalogue evidence properly.
    \n3. Testify to superiors/inquieries on findings.
    \n
    \nStation Technician 2>0-2-3
    \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
    \n1. Maintain SS13 systems.
    \n2. Repair equipment.
    \n
    \nAtmospheric Technician 3>0-0-4
    \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
    \n1. Maintain atmosphere on SS13
    \n2. Research atmospheres on the space station. (safely please!)
    \n
    \nEngineer 2>1-3-0
    \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
    \n1. Upkeep the engine.
    \n2. Prevent fires in the engine.
    \n3. Maintain a safe orbit.
    \n
    \nMedical Researcher 2>5-0-0
    \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
    \n1. Make sure the station is kept safe.
    \n2. Research medical properties of materials studied of Space Station 13.
    \n
    \nScientist 2>5-0-0
    \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Plasma Technicians as plasma is the material they routinly handle.
    \n1. Research plasma
    \n2. Make sure all plasma is properly handled.
    \n
    \nMedical Doctor (Officer) 2>0-0-0
    \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
    \n1. Heal wounded people.
    \n2. Perform examinations of all personnel.
    \n3. Monitor usage of medical equipment.
    \n
    \nSecurity Officer 3>0-0-0
    \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
    \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
    \n1. Maintain order.
    \n2. Assist others.
    \n3. Repair structural problems.
    \n
    \nHead of Security 4>5-2-2
    \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
    \n1. Oversee security.
    \n2. Assign patrol duties.
    \n3. Protect the station and staff.
    \n
    \nHead of Personnel 4>4-2-2
    \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
    \n1. Assign duties.
    \n2. Moderate personnel.
    \n3. Moderate research.
    \n
    \nCaptain 5>5-5-5 (unrestricted station wide access)
    \n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
    \n1. Assign all positions on SS13
    \n2. Inspect the station for any problems.
    \n3. Perform administrative duties.
    \n" /obj/item/paper/fluff/jobs/mining/smelter_notice name = "paper- Smelting Operations Closed" @@ -48,24 +49,60 @@ name = "paper- 'Chemical Information'" info = "Known Onboard Toxins:
    \n\tGrade A Semi-Liquid Plasma:
    \n\t\tHighly poisonous. You cannot sustain concentrations above 15 units.
    \n\t\tA gas mask fails to filter plasma after 50 units.
    \n\t\tWill attempt to diffuse like a gas.
    \n\t\tFiltered by scrubbers.
    \n\t\tThere is a bottled version which is very different
    \n\t\t\tfrom the version found in canisters!
    \n
    \n\t\tWARNING: Highly Flammable. Keep away from heat sources
    \n\t\texcept in an enclosed fire area!
    \n\t\tWARNING: It is a crime to use this without authorization.
    \nKnown Onboard Anti-Toxin:
    \n\tAnti-Toxin Type 01P: Works against Grade A Plasma.
    \n\t\tBest if injected directly into bloodstream.
    \n\t\tA full injection is in every regular Med-Kit.
    \n\t\tSpecial toxin Kits hold around 7.
    \n
    \nKnown Onboard Chemicals (other):
    \n\tRejuvenation T#001:
    \n\t\tEven 1 unit injected directly into the bloodstream
    \n\t\t\twill cure unconscious and sleep toxins.
    \n\t\tIf administered to a dying patient it will prevent
    \n\t\t\tfurther damage for about units*3 seconds.
    \n\t\t\tit will not cure them or allow them to be cured.
    \n\t\tIt can be administered to a non-dying patient
    \n\t\t\tbut the chemicals disappear just as fast.
    \n\tMorphine T#054:
    \n\t\t5 units will induce precisely 1 minute of sleep.
    \n\t\t\tThe effect are cumulative.
    \n\t\tWARNING: It is a crime to use this without authorization" - /* * Stations */ +////////// Cere fluff -/////////// CentCom +/obj/item/paper/fluff/stations/cere/abandoned_dock + name = "Disclaimer Notice" + info = "This station needs clearing out within the next few weeks as construction is almost complete and NT expects most of the equipment off-site before then. Throw most of the shit in here for now and we'll come back later with a pod to haul the heavier stuff. Shouldn't be too big of an issue." + +/obj/item/paper/fluff/stations/cere/janitor + name = "Janitor Notice" + info = "You got a big job ahead of you, pal. This is a big station, lots of floors and assholes to dirty said floors without any thought for you. It might not be a bad idea to check on the external waste belts every now and again to make sure some foriegn object hasn't clogged the disposal loop, either." + +/obj/item/paper/fluff/stations/cere/gateway + name = "NOTICE - GATEWAY STATUS" + info = "
    Nanotrasen Exploration and Colonization Program


    Due to recent shutdowns of the Exploration and Colonization department shortly after this gateway was delivered on-site during station construction, this room has been condemmed and an engineering team will be on-site within the next few months to recollect the gate. Thank you for your cooperation." + +/obj/item/paper/fluff/stations/cere/journal/journal + name = "Journal Log" + info = "
    2XXX - 2nd Trimestor


    I hide in here, away from the masses, not like it matters much considering how fucking huge this place is. " + +/obj/item/paper/fluff/stations/cere/journal/journal_2 + name = "Journal Log 2" + info = "
    2XXX - 3rd Trimestor


    I hear strange whispers from the halls, longing for blood. Something isn't right here. Why did they transfer us here to work in the first place? " + +/obj/item/paper/crumpled/stations/cere/empty_station + info = "I can't be here for much longer, this station is too empty for its own good. Something is wrong..." + +/obj/item/paper/crumpled/bloody/hop + info = "...THE HOPLINE CALLS...IT THIRSTS FOR BLOOD...I MUST GO..." + +/obj/item/paper/crumpled/stations/cere/rocks1 + info = "...SOMETHING IN THE ROCKS, IT WATCHES US ALL..." + +/obj/item/paper/crumpled/stations/cere/rocks2 + info = "...THEY SENT US HERE FOR A REASON...TERRIBLE..." + +/obj/item/paper/crumpled/stations/cere/rocks3 + info = "...EMPTY HALLS...USELESS SPACE..." + + +/////////// Centcom /obj/item/paper/fluff/stations/centcom/disk_memo name = "memo" info = "GET DAT FUKKEN DISK" /obj/item/paper/fluff/stations/centcom/broken_evac - info = "Due to circumstances beyond our control, your Emergency Evacuation Shuttle is out of service.

    We apologize for the inconvenience this may cause you.

    Please enjoy the use of this complementary book.

    Sincerely,
    CentCom Operations Demolitions Examination Retribution Bugfixing Underlining Services" + info = "Due to circumstances beyond our control, your Emergency Evacuation Shuttle is out of service.

    We apologise for the inconvinience this may cause you.

    Please enjoy the use of this complementary book.

    Sincerely,
    Centcom Operations Demolitions Examination Retribution Bugfixing Underlining Services" /obj/item/paper/fluff/stations/centcom/bulletin name = "paper- 'Official Bulletin'" - info = "
    CentCom Security
    Port Division
    Official Bulletin

    Inspector,
    There is an emergency shuttle arriving today.

    Approval is restricted to Nanotrasen employees only. Deny all other entrants.

    CentCom Port Commissioner" + info = "
    Centcom Security
    Port Division
    Official Bulletin

    Inspector,
    There is an emergency shuttle arriving today.

    Approval is restricted to Nanotrasen employees only. Deny all other entrants.

    Centcom Port Commissioner" /////////// Lavaland diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 68be3e1462..0826a49c7c 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -23,7 +23,6 @@ throw_range = 7 materials = list(MAT_METAL=10) pressure_resistance = 2 - grind_results = list("iron" = 2, "iodine" = 1) var/colour = "black" //what colour the ink is! var/traitor_unlock_degrees = 0 var/degrees = 0 @@ -175,12 +174,12 @@ reagents.trans_to(M, reagents.total_volume) -/obj/item/pen/sleepy/Initialize() - . = ..() +/obj/item/pen/sleepy/New() create_reagents(45) reagents.add_reagent("chloralhydrate2", 20) reagents.add_reagent("mutetoxin", 15) reagents.add_reagent("tirizene", 10) + ..() /* * (Alan) Edaggers diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index e065fd8c03..20038f5745 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -247,10 +247,10 @@ /obj/machinery/photocopier/proc/remove_photocopy(obj/item/O, mob/user) if(!issilicon(user)) //surprised this check didn't exist before, putting stuff in AI's hand is bad - O.forceMove(user.loc) + O.loc = user.loc user.put_in_hands(O) else - O.forceMove(drop_location()) + O.loc = src.loc to_chat(user, "You take [O] out of [src].") /obj/machinery/photocopier/attackby(obj/item/O, mob/user, params) @@ -338,16 +338,16 @@ else user.visible_message("[user] puts [target] onto the photocopier!", "You put [target] onto the photocopier.") - target.forceMove(drop_location()) + target.loc = get_turf(src) ass = target if(photocopy) - photocopy.forceMove(drop_location()) + photocopy.loc = src.loc visible_message("[photocopy] is shoved out of the way by [ass]!") photocopy = null else if(copy) - copy.forceMove(drop_location()) + copy.loc = src.loc visible_message("[copy] is shoved out of the way by [ass]!") copy = null updateUsrDialog() @@ -391,6 +391,5 @@ /obj/item/device/toner name = "toner cartridge" icon_state = "tonercartridge" - grind_results = list("iodine" = 40, "iron" = 10) var/charges = 5 var/max_charges = 5 diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 6e908c0f6a..48b045f680 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -33,7 +33,6 @@ w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE max_integrity = 50 - grind_results = list("iodine" = 4) var/icon/img //Big photo image var/scribble //Scribble on the back. var/blueprints = 0 //Does it include the blueprints? diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index f8b8cae22a..a37344d635 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -339,7 +339,7 @@ if(href_list["ejectjar"]) if(fueljar) - fueljar.forceMove(drop_location()) + fueljar.loc = src.loc fueljar = null //fueljar.control_unit = null currently it does not care where it is //update_icon() when we have the icon for it diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index cbe8f335de..7f3b428978 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -972,7 +972,7 @@ else to_chat(occupier, "Primary core damaged, unable to return core processes.") if(forced) - occupier.forceMove(drop_location()) + occupier.loc = src.loc occupier.death() occupier.gib() for(var/obj/item/pinpointer/nuke/P in GLOB.pinpointer_list) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index ca424cb80d..9e4e29ceb5 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -427,7 +427,7 @@ By design, d1 is the smallest direction and d2 is the highest var/obj/O = P_list[1] // remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist if(remove) - moveToNullspace() + loc = null powernet.remove_cable(src) //remove the cut cable from its powernet addtimer(CALLBACK(O, .proc/auto_propogate_cut_cable, O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables @@ -472,7 +472,6 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai attack_verb = list("whipped", "lashed", "disciplined", "flogged") singular_name = "cable piece" full_w_class = WEIGHT_CLASS_SMALL - grind_results = list("copper" = 2) //2 copper per cable in the coil /obj/item/stack/cable_coil/cyborg is_cyborg = 1 diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index d6781f63c3..1e1407e852 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -14,7 +14,6 @@ var/charge = 0 // note %age conveted to actual charge in New var/maxcharge = 1000 materials = list(MAT_METAL=700, MAT_GLASS=50) - grind_results = list("lithium" = 15, "iron" = 5, "silicon" = 5) var/rigged = 0 // true if rigged to explode var/chargerate = 100 //how much power is given every tick in a recharger var/self_recharge = 0 //does it self recharge, over time, or not? @@ -76,7 +75,7 @@ return 0 charge = (charge - amount) if(!istype(loc, /obj/machinery/power/apc)) - SSblackbox.record_feedback("tally", "cell_used", 1, type) + SSblackbox.record_feedback("tally", "cell_used", 1, "[src.type]") return 1 // recharge the cell @@ -108,7 +107,6 @@ to_chat(user, "You inject the solution into the power cell.") if(S.reagents.has_reagent("plasma", 5)) rigged = 1 - grind_results["plasma"] = 5 S.reagents.clear_reagents() diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 1c4ce4a5c1..65e6d4c0e4 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -53,7 +53,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // You aren't allowed to move. /obj/machinery/gravity_generator/Move() - . = ..() + ..() qdel(src) /obj/machinery/gravity_generator/proc/set_broken() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index f83a4f41d8..3acac6cee5 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -246,15 +246,15 @@ . = ..() status = LIGHT_EMPTY update(0) + ..() /obj/machinery/light/small/built icon_state = "bulb-empty" -/obj/machinery/light/small/built/Initialize() - . = ..() +/obj/machinery/light/small/built/New() status = LIGHT_EMPTY update(0) - + ..() // create a new lighting fixture @@ -680,7 +680,6 @@ var/base_state var/switchcount = 0 // number of times switched materials = list(MAT_GLASS=100) - grind_results = list("silicon" = 5, "nitrogen" = 10) //Nitrogen is used as a cheaper alternative to argon in incandescent lighbulbs var/rigged = 0 // true if rigged to explode var/brightness = 2 //how much light it gives off @@ -727,8 +726,8 @@ desc = "A broken [name]." -/obj/item/light/Initialize() - . = ..() +/obj/item/light/New() + ..() update() diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 36dd615e86..0ede336ef6 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -132,7 +132,7 @@ var/obj/item/tank/internals/plasma/Z = src.loaded_tank if (!Z) return - Z.forceMove(drop_location()) + Z.loc = get_turf(src) Z.layer = initial(Z.layer) Z.plane = initial(Z.plane) src.loaded_tank = null diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 70772f74f9..c2610ebc44 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -76,7 +76,6 @@ /obj/machinery/field/containment/Move() qdel(src) - return FALSE // Abstract Field Class diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index cdfbb35b34..74aa140721 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -285,8 +285,9 @@ field_generator power level display var/field_dir = get_dir(T,get_step(G.loc, NSEW)) T = get_step(T, NSEW) if(!locate(/obj/machinery/field/containment) in T) - var/obj/machinery/field/containment/CF = new(T) + var/obj/machinery/field/containment/CF = new/obj/machinery/field/containment() CF.set_master(src,G) + CF.loc = T CF.setDir(field_dir) fields += CF G.fields += CF diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 9801e98614..22712e970d 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -47,15 +47,8 @@ /obj/singularity/narsie/large/cult/Initialize() . = ..() GLOB.cult_narsie = src - var/list/all_cults = list() - for(var/datum/antagonist/cult/C in GLOB.antagonists) - all_cults |= C.cult_team - for(var/datum/objective_team/cult/T in all_cults) - deltimer(T.blood_target_reset_timer) - T.blood_target = src - var/datum/objective/eldergod/summon_objective = locate() in T.objectives - if(summon_objective) - summon_objective.summoned = TRUE + deltimer(GLOB.blood_target_reset_timer) + GLOB.blood_target = src for(var/datum/mind/cult_mind in SSticker.mode.cult) if(isliving(cult_mind.current)) var/mob/living/L = cult_mind.current diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 33c8a19982..eebe4ef8c0 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -152,7 +152,7 @@ qdel(src) /obj/structure/particle_accelerator/Move() - . = ..() + ..() if(master && master.active) master.toggle_power() investigate_log("was moved whilst active; it powered down.", INVESTIGATE_SINGULO) diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index c1ba907ada..266e5b22f5 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -17,7 +17,7 @@ var/active = 0 var/strength = 0 var/powered = 0 - mouse_opacity = MOUSE_OPACITY_OPAQUE + mouse_opacity = 2 /obj/machinery/particle_accelerator/control_box/Initialize() . = ..() diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index f4b749c0e0..681bb88c6b 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -164,7 +164,7 @@ dissipate_track = 0 dissipate_strength = 1 if(STAGE_TWO) - if(check_cardinals_range(1, TRUE)) + if((check_turfs_in(1,1))&&(check_turfs_in(2,1))&&(check_turfs_in(4,1))&&(check_turfs_in(8,1))) current_size = STAGE_TWO icon = 'icons/effects/96x96.dmi' icon_state = "singularity_s3" @@ -176,7 +176,7 @@ dissipate_track = 0 dissipate_strength = 5 if(STAGE_THREE) - if(check_cardinals_range(2, TRUE)) + if((check_turfs_in(1,2))&&(check_turfs_in(2,2))&&(check_turfs_in(4,2))&&(check_turfs_in(8,2))) current_size = STAGE_THREE icon = 'icons/effects/160x160.dmi' icon_state = "singularity_s5" @@ -188,7 +188,7 @@ dissipate_track = 0 dissipate_strength = 20 if(STAGE_FOUR) - if(check_cardinals_range(3, TRUE)) + if((check_turfs_in(1,3))&&(check_turfs_in(2,3))&&(check_turfs_in(4,3))&&(check_turfs_in(8,3))) current_size = STAGE_FOUR icon = 'icons/effects/224x224.dmi' icon_state = "singularity_s7" @@ -296,16 +296,6 @@ step(src, movement_dir) -/obj/singularity/proc/check_cardinals_range(steps, retry_with_move = FALSE) - . = length(GLOB.cardinals) //Should be 4. - for(var/i in GLOB.cardinals) - . -= check_turfs_in(i, steps) //-1 for each working direction - if(. && retry_with_move) //If there's still a positive value it means it didn't pass. Retry with move if applicable - for(var/i in GLOB.cardinals) - if(step(src, i)) //Move in each direction. - if(check_cardinals_range(steps, FALSE)) //New location passes, return true. - return TRUE - . = !. /obj/singularity/proc/check_turfs_in(direction = 0, step = 0) if(!direction) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 435cfe4156..fb530f128f 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -419,7 +419,7 @@ new /obj/item/shard( src.loc ) var/obj/item/circuitboard/computer/solar_control/M = new /obj/item/circuitboard/computer/solar_control( A ) for (var/obj/C in src) - C.forceMove(drop_location()) + C.loc = src.loc A.circuit = M A.state = 3 A.icon_state = "3" @@ -430,7 +430,7 @@ var/obj/structure/frame/computer/A = new /obj/structure/frame/computer( src.loc ) var/obj/item/circuitboard/computer/solar_control/M = new /obj/item/circuitboard/computer/solar_control( A ) for (var/obj/C in src) - C.forceMove(drop_location()) + C.loc = src.loc A.circuit = M A.state = 4 A.icon_state = "4" diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index a46627b7ca..5e129acf8f 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -47,7 +47,7 @@ S.glass_type = /obj/item/stack/sheet/glass S.tracker = 1 S.anchored = TRUE - S.forceMove(src) + S.loc = src update_icon() //updates the tracker icon and the facing angle for the control computer @@ -94,4 +94,4 @@ // Tracker Electronic /obj/item/electronics/tracker - name = "tracker electronics" + name = "tracker electronics" \ No newline at end of file diff --git a/code/modules/procedural_mapping/mapGeneratorReadme.dm b/code/modules/procedural_mapping/mapGeneratorReadme.dm index c4ced7674b..85f937b41b 100644 --- a/code/modules/procedural_mapping/mapGeneratorReadme.dm +++ b/code/modules/procedural_mapping/mapGeneratorReadme.dm @@ -127,7 +127,7 @@ Variable Breakdown (For Mappers): clusterCheckFlags - A Bitfield that controls how the cluster checks work, All based on clusterMin and clusterMax guides allowAtomsOnSpace - A Boolean for if we allow atoms to spawn on space tiles - clusterCheckFlags flags: + clusterCheckFlags flags_1: CLUSTER_CHECK_NONE 0 //No checks are done, cluster as much as possible CLUSTER_CHECK_DIFFERENT_TURFS 2 //Don't let turfs of DIFFERENT types cluster CLUSTER_CHECK_DIFFERENT_ATOMS 4 //Don't let atoms of DIFFERENT types cluster diff --git a/code/modules/procedural_mapping/mapGenerators/lava_river.dm b/code/modules/procedural_mapping/mapGenerators/lava_river.dm index 8bdedb4b76..4aadd48a58 100644 --- a/code/modules/procedural_mapping/mapGenerators/lava_river.dm +++ b/code/modules/procedural_mapping/mapGenerators/lava_river.dm @@ -1,4 +1,3 @@ - /datum/mapGenerator/lavaland var/start_z = 5 var/min_x = 0 diff --git a/code/modules/procedural_mapping/mapGenerators/syndicate.dm b/code/modules/procedural_mapping/mapGenerators/syndicate.dm index 758df6e0a0..d3653d7ff3 100644 --- a/code/modules/procedural_mapping/mapGenerators/syndicate.dm +++ b/code/modules/procedural_mapping/mapGenerators/syndicate.dm @@ -1,57 +1,56 @@ - -// Modules - -/turf/open/floor/plasteel/shuttle/red/syndicate - name = "floor" //Not Brig Floor - -/datum/mapGeneratorModule/bottomLayer/syndieFloor - spawnableTurfs = list(/turf/open/floor/plasteel/shuttle/red/syndicate = 100) - -/datum/mapGeneratorModule/border/syndieWalls - spawnableAtoms = list() - spawnableTurfs = list(/turf/closed/wall/r_wall = 100) - - -/datum/mapGeneratorModule/syndieFurniture - clusterCheckFlags = CLUSTER_CHECK_ALL - spawnableTurfs = list() - spawnableAtoms = list(/obj/structure/table = 20,/obj/structure/chair = 15,/obj/structure/chair/stool = 10, \ - /obj/structure/frame/computer = 15, /obj/item/storage/toolbox/syndicate = 15 ,\ - /obj/structure/closet/syndicate = 25, /obj/machinery/suit_storage_unit/syndicate = 15) - -/datum/mapGeneratorModule/splatterLayer/syndieMobs - spawnableAtoms = list(/mob/living/simple_animal/hostile/syndicate = 30, \ - /mob/living/simple_animal/hostile/syndicate/melee = 20, \ - /mob/living/simple_animal/hostile/syndicate/ranged = 20, \ - /mob/living/simple_animal/hostile/viscerator = 30) - spawnableTurfs = list() - -// Generators - -/datum/mapGenerator/syndicate/empty //walls and floor only - modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \ - /datum/mapGeneratorModule/border/syndieWalls,\ - /datum/mapGeneratorModule/bottomLayer/repressurize) - buildmode_name = "Pattern: Shuttle Room: Syndicate" - -/datum/mapGenerator/syndicate/mobsonly - modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \ - /datum/mapGeneratorModule/border/syndieWalls,\ - /datum/mapGeneratorModule/splatterLayer/syndieMobs, \ - /datum/mapGeneratorModule/bottomLayer/repressurize) - buildmode_name = "Pattern: Shuttle Room: Syndicate: Mobs" - -/datum/mapGenerator/syndicate/furniture - modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \ - /datum/mapGeneratorModule/border/syndieWalls,\ - /datum/mapGeneratorModule/syndieFurniture, \ - /datum/mapGeneratorModule/bottomLayer/repressurize) - buildmode_name = "Pattern: Shuttle Room: Syndicate: Furniture" - -/datum/mapGenerator/syndicate/full - modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \ - /datum/mapGeneratorModule/border/syndieWalls,\ - /datum/mapGeneratorModule/syndieFurniture, \ - /datum/mapGeneratorModule/splatterLayer/syndieMobs, \ - /datum/mapGeneratorModule/bottomLayer/repressurize) - buildmode_name = "Pattern: Shuttle Room: Syndicate: All" +// Modules + +/turf/open/floor/plasteel/shuttle/red/syndicate + name = "floor" //Not Brig Floor + +/datum/mapGeneratorModule/bottomLayer/syndieFloor + spawnableTurfs = list(/turf/open/floor/plasteel/shuttle/red/syndicate = 100) + +/datum/mapGeneratorModule/border/syndieWalls + spawnableAtoms = list() + spawnableTurfs = list(/turf/closed/wall/r_wall = 100) + + +/datum/mapGeneratorModule/syndieFurniture + clusterCheckFlags = CLUSTER_CHECK_ALL + spawnableTurfs = list() + spawnableAtoms = list(/obj/structure/table = 20,/obj/structure/chair = 15,/obj/structure/chair/stool = 10, \ + /obj/structure/frame/computer = 15, /obj/item/storage/toolbox/syndicate = 15 ,\ + /obj/structure/closet/syndicate = 25, /obj/machinery/suit_storage_unit/syndicate = 15) + +/datum/mapGeneratorModule/splatterLayer/syndieMobs + spawnableAtoms = list(/mob/living/simple_animal/hostile/syndicate = 30, \ + /mob/living/simple_animal/hostile/syndicate/melee = 20, \ + /mob/living/simple_animal/hostile/syndicate/ranged = 20, \ + /mob/living/simple_animal/hostile/viscerator = 30) + spawnableTurfs = list() + +// Generators + +/datum/mapGenerator/syndicate/empty //walls and floor only + modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \ + /datum/mapGeneratorModule/border/syndieWalls,\ + /datum/mapGeneratorModule/bottomLayer/repressurize) + buildmode_name = "Pattern: Shuttle Room: Syndicate" + +/datum/mapGenerator/syndicate/mobsonly + modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \ + /datum/mapGeneratorModule/border/syndieWalls,\ + /datum/mapGeneratorModule/splatterLayer/syndieMobs, \ + /datum/mapGeneratorModule/bottomLayer/repressurize) + buildmode_name = "Pattern: Shuttle Room: Syndicate: Mobs" + +/datum/mapGenerator/syndicate/furniture + modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \ + /datum/mapGeneratorModule/border/syndieWalls,\ + /datum/mapGeneratorModule/syndieFurniture, \ + /datum/mapGeneratorModule/bottomLayer/repressurize) + buildmode_name = "Pattern: Shuttle Room: Syndicate: Furniture" + +/datum/mapGenerator/syndicate/full + modules = list(/datum/mapGeneratorModule/bottomLayer/syndieFloor, \ + /datum/mapGeneratorModule/border/syndieWalls,\ + /datum/mapGeneratorModule/syndieFurniture, \ + /datum/mapGeneratorModule/splatterLayer/syndieMobs, \ + /datum/mapGeneratorModule/bottomLayer/repressurize) + buildmode_name = "Pattern: Shuttle Room: Syndicate: All" \ No newline at end of file diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index c73dbb1b3b..71befb50f1 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -19,8 +19,8 @@ var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the ammo is fired. -/obj/item/ammo_casing/Initialize() - . = ..() +/obj/item/ammo_casing/New() + ..() if(projectile_type) BB = new projectile_type(src) pixel_x = rand(-10, 10) diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 9e7d21d510..d51ea36e15 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -284,8 +284,8 @@ icon_state = "cshell" projectile_type = /obj/item/projectile/bullet/dart -/obj/item/ammo_casing/shotgun/dart/Initialize() - . = ..() +/obj/item/ammo_casing/shotgun/dart/New() + ..() container_type |= OPENCONTAINER_1 create_reagents(30) reagents.set_reacting(TRUE) @@ -296,10 +296,10 @@ /obj/item/ammo_casing/shotgun/dart/bioterror desc = "A shotgun dart filled with deadly toxins." -/obj/item/ammo_casing/shotgun/dart/bioterror/Initialize() - . = ..() +/obj/item/ammo_casing/shotgun/dart/bioterror/New() + ..() reagents.add_reagent("neurotoxin", 6) reagents.add_reagent("spore", 6) reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT reagents.add_reagent("coniine", 6) - reagents.add_reagent("sodium_thiopental", 6) + reagents.add_reagent("sodium_thiopental", 6) \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/caseless.dm b/code/modules/projectiles/ammunition/caseless.dm index 7432f9f8e7..e5b905019d 100644 --- a/code/modules/projectiles/ammunition/caseless.dm +++ b/code/modules/projectiles/ammunition/caseless.dm @@ -7,7 +7,7 @@ /obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread) if (..()) //successfully firing - moveToNullspace() + loc = null return 1 else return 0 diff --git a/code/modules/projectiles/box_magazine.dm b/code/modules/projectiles/box_magazine.dm index 87a02012ce..324470ede4 100644 --- a/code/modules/projectiles/box_magazine.dm +++ b/code/modules/projectiles/box_magazine.dm @@ -22,8 +22,8 @@ var/multiload = 1 var/start_empty = 0 -/obj/item/ammo_box/Initialize() - . = ..() +/obj/item/ammo_box/New() + ..() if(!start_empty) for(var/i = 1, i <= max_ammo, i++) stored_ammo += new ammo_type(src) diff --git a/code/modules/projectiles/boxes_magazines/internal_mag.dm b/code/modules/projectiles/boxes_magazines/internal_mag.dm index d7bfaf9ee7..3a8b4e6f2f 100644 --- a/code/modules/projectiles/boxes_magazines/internal_mag.dm +++ b/code/modules/projectiles/boxes_magazines/internal_mag.dm @@ -51,10 +51,10 @@ var/obj/item/ammo_casing/bullet = stored_ammo[i] if(!bullet || !bullet.BB) // found a spent ammo stored_ammo[i] = R - R.forceMove(src) + R.loc = src if(bullet) - bullet.forceMove(drop_location()) + bullet.loc = get_turf(src.loc) return 1 return 0 @@ -156,9 +156,9 @@ max_ammo = 6 multiload = 0 -/obj/item/ammo_box/magazine/internal/rus357/Initialize() +/obj/item/ammo_box/magazine/internal/rus357/New() stored_ammo += new ammo_type(src) - . = ..() + ..() /obj/item/ammo_box/magazine/internal/boltaction name = "bolt action rifle internal magazine" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 0307d17df0..37e868462e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -24,7 +24,7 @@ var/can_suppress = FALSE var/can_unsuppress = TRUE var/recoil = 0 //boom boom shake the room - var/clumsy_check = TRUE + var/clumsy_check = 1 var/obj/item/ammo_casing/chambered = null trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers var/sawn_desc = null //description change if weapon is sawn-off @@ -77,8 +77,9 @@ ..() var/obj/item/gun/G = locate(/obj/item/gun) in contents if(G) - G.forceMove(loc) - QDEL_NULL(G.pin) + G.loc = loc + qdel(G.pin) + G.pin = null visible_message("[G] can now fit a new pin, but the old one was destroyed in the process.", null, null, 3) qdel(src) @@ -91,17 +92,19 @@ /obj/item/gun/equipped(mob/living/user, slot) . = ..() - if(zoomed && user.get_active_held_item() != src) - zoom(user, FALSE) //we can only stay zoomed in if it's in our hands //yeah and we only unzoom if we're actually zoomed using the gun!! + if(zoomable && user.get_active_held_item() != src) + zoom(user, FALSE) //we can only stay zoomed in if it's in our hands //called after the gun has successfully fired its chambered ammo. /obj/item/gun/proc/process_chamber() - return FALSE + return 0 + //check if there's enough ammo/energy/whatever to shoot one time //i.e if clicking would make it shoot /obj/item/gun/proc/can_shoot() - return TRUE + return 1 + /obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) to_chat(user, "*click*") @@ -192,13 +195,13 @@ /obj/item/gun/proc/handle_pins(mob/living/user) if(pin) if(pin.pin_auth(user) || pin.emagged) - return TRUE + return 1 else pin.auth_fail(user) - return FALSE + return 0 else to_chat(user, "[src]'s trigger is locked. This weapon doesn't have a firing pin installed!") - return FALSE + return 0 /obj/item/gun/proc/recharge_newshot() return @@ -418,7 +421,7 @@ target.visible_message("[user] points [src] at [target]'s head, ready to pull the trigger...", \ "[user] points [src] at your head, ready to pull the trigger...") - semicd = TRUE + semicd = 1 if(!do_mob(user, target, 120) || user.zone_selected != "mouth") if(user) @@ -426,10 +429,10 @@ user.visible_message("[user] decided not to shoot.") else if(target && target.Adjacent(user)) target.visible_message("[user] has decided to spare [target]", "[user] has decided to spare your life!") - semicd = FALSE + semicd = 0 return - semicd = FALSE + semicd = 0 target.visible_message("[user] pulls the trigger!", "[user] pulls the trigger!") diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index ee7d74081c..bfc9ceac64 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -107,13 +107,13 @@ /obj/item/gun/ballistic/attack_self(mob/living/user) var/obj/item/ammo_casing/AC = chambered //Find chambered round if(magazine) - magazine.forceMove(drop_location()) + magazine.loc = get_turf(src.loc) user.put_in_hands(magazine) magazine.update_icon() magazine = null to_chat(user, "You pull the magazine out of \the [src].") else if(chambered) - AC.forceMove(drop_location()) + AC.loc = get_turf(src) AC.SpinAnimation(10, 1) chambered = null to_chat(user, "You unload the round from \the [src]'s chamber.") @@ -167,8 +167,6 @@ #undef BRAINS_BLOWN_THROW_SPEED #undef BRAINS_BLOWN_THROW_RANGE - - /obj/item/gun/ballistic/proc/sawoff(mob/user) if(sawn_state == SAWN_OFF) to_chat(user, "\The [src] is already shortened!") @@ -218,3 +216,4 @@ desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits all weapons." icon = 'icons/obj/guns/projectile.dmi' icon_state = "suppressor" + diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index daf223aba9..eb36608e77 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -8,7 +8,7 @@ actions_types = list(/datum/action/item_action/toggle_firemode) /obj/item/gun/ballistic/automatic/proto - name = "\improper Nanotrasen Saber SMG" + name = "\improper NanoTrasen Saber SMG" desc = "A prototype three-round burst 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors." icon_state = "saber" mag_type = /obj/item/ammo_box/magazine/smgm9mm @@ -19,6 +19,7 @@ /obj/item/gun/ballistic/automatic/update_icon() ..() + cut_overlays() if(!select) add_overlay("[initial(icon_state)]semi") if(select == 1) @@ -92,9 +93,6 @@ fire_delay = 2 burst_size = 2 pin = /obj/item/device/firing_pin/implant/pindicate - can_bayonet = TRUE - knife_x_offset = 26 - knife_y_offset = 12 /obj/item/gun/ballistic/automatic/c20r/unrestricted pin = /obj/item/device/firing_pin @@ -122,9 +120,6 @@ can_suppress = FALSE burst_size = 0 actions_types = list() - can_bayonet = TRUE - knife_x_offset = 25 - knife_y_offset = 12 /obj/item/gun/ballistic/automatic/wt550/update_icon() ..() @@ -330,7 +325,7 @@ else if(cover_open && magazine) //drop the mag magazine.update_icon() - magazine.forceMove(drop_location()) + magazine.loc = get_turf(src.loc) user.put_in_hands(magazine) magazine = null update_icon() @@ -362,8 +357,7 @@ can_suppress = TRUE w_class = WEIGHT_CLASS_NORMAL zoomable = TRUE - zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you. - zoom_out_amt = 13 + zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. slot_flags = SLOT_BACK actions_types = list() diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 4dafbc3f3c..42f4fb8a05 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -39,7 +39,7 @@ var/obj/item/ammo_casing/CB CB = magazine.get_round(0) if(CB) - CB.forceMove(drop_location()) + CB.loc = get_turf(src.loc) CB.SpinAnimation(10, 1) CB.update_icon() num_unloaded++ @@ -289,7 +289,7 @@ var/obj/item/ammo_casing/CB CB = magazine.get_round(0) chambered = null - CB.forceMove(drop_location()) + CB.loc = get_turf(src.loc) CB.update_icon() num_unloaded++ if (num_unloaded) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index c68917fbfd..650e5ec81f 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -56,7 +56,7 @@ /obj/item/gun/ballistic/shotgun/proc/pump_unload(mob/M) if(chambered)//We have a shell in the chamber - chambered.forceMove(drop_location())//Eject casing + chambered.loc = get_turf(src)//Eject casing chambered.SpinAnimation(5, 1) chambered = null @@ -105,9 +105,6 @@ slot_flags = 0 //no SLOT_BACK sprite, alas mag_type = /obj/item/ammo_box/magazine/internal/boltaction var/bolt_open = FALSE - can_bayonet = TRUE - knife_x_offset = 27 - knife_y_offset = 13 /obj/item/gun/ballistic/shotgun/boltaction/pump(mob/M) playsound(M, 'sound/weapons/shotgunpump.ogg', 60, 1) @@ -144,7 +141,6 @@ pin = /obj/item/device/firing_pin/magic icon_state = "arcane_barrage" item_state = "arcane_barrage" - can_bayonet = FALSE flags_1 = DROPDEL_1 diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/beam_rifle.dm index 4b51951cfd..e1069a6bce 100644 --- a/code/modules/projectiles/guns/beam_rifle.dm +++ b/code/modules/projectiles/guns/beam_rifle.dm @@ -63,6 +63,8 @@ var/projectile_setting_pierce = TRUE var/delay = 65 var/lastfire = 0 + + var/lastprocess = 0 //ZOOMING var/zoom_current_view_increase = 0 @@ -500,11 +502,11 @@ if(!do_pierce) return FALSE if(pierced[target]) //we already pierced them go away - forceMove(get_turf(target)) + loc = get_turf(target) return TRUE if(isclosedturf(target)) if(wall_pierce++ < wall_pierce_amount) - forceMove(target) + loc = target if(prob(wall_devastate)) if(iswallturf(target)) var/turf/closed/wall/W = target @@ -520,7 +522,7 @@ var/obj/O = AM O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(AM), BURN, "energy", FALSE) pierced[AM] = TRUE - forceMove(AM.drop_location()) + loc = get_turf(AM) structure_pierce++ return TRUE return FALSE diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index c65e518383..3b93a960ca 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -16,8 +16,8 @@ var/unique_frequency = FALSE // modified by KA modkits var/overheat = FALSE can_bayonet = TRUE - knife_x_offset = 20 - knife_y_offset = 12 + knife_x_offset = 15 + knife_y_offset = 13 var/max_mod_capacity = 100 var/list/modkits = list() diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index f1e8848d27..dfbcc61f37 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -13,10 +13,10 @@ var/obj/item/device/transfer_valve/bomb -/obj/item/gun/blastcannon/Initialize() - . = ..() +/obj/item/gun/blastcannon/New() if(!pin) pin = new + return ..() /obj/item/gun/blastcannon/Destroy() if(bomb) diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index ac9f7daedf..b8e3c97e81 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -42,7 +42,7 @@ if(!S) return 0 - S.forceMove(user.loc) + S.loc = user.loc syringes.Remove(S) to_chat(user, "You unload [S] from \the [src].") @@ -101,4 +101,4 @@ return TRUE else to_chat(user, "[src] cannot hold more syringes!") - return FALSE + return FALSE \ No newline at end of file diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 66698a8939..0e3bd98c68 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -73,9 +73,9 @@ var/impact_effect_type //what type of impact effect to show when hitting something var/log_override = FALSE //is this type spammed enough to not log? (KAs) -/obj/item/projectile/Initialize() - . = ..() +/obj/item/projectile/New() permutated = list() + return ..() /obj/item/projectile/proc/Range() range-- diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 235f27e9e5..323960c7f3 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -341,8 +341,8 @@ icon_state = "banana" range = 200 -/obj/item/projectile/bullet/honker/Initialize() - . = ..() +/obj/item/projectile/bullet/honker/New() + ..() SpinAnimation() // Mime @@ -364,8 +364,8 @@ damage = 6 var/piercing = FALSE -/obj/item/projectile/bullet/dart/Initialize() - . = ..() +/obj/item/projectile/bullet/dart/New() + ..() create_reagents(50) reagents.set_reacting(FALSE) @@ -388,8 +388,8 @@ reagents.handle_reactions() return TRUE -/obj/item/projectile/bullet/dart/metalfoam/Initialize() - . = ..() +/obj/item/projectile/bullet/dart/metalfoam/New() + ..() reagents.add_reagent("aluminium", 15) reagents.add_reagent("foaming_agent", 5) reagents.add_reagent("facid", 5) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 152cff6c74..5a650ff2c3 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -100,7 +100,7 @@ /obj/item/projectile/meteor/Collide(atom/A) if(A == firer) - forceMove(A.loc) + loc = A.loc return A.ex_act(EXPLODE_HEAVY) playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) @@ -612,3 +612,4 @@ knockdown = 0 nodamage = TRUE return ..() + diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 2d3200c506..9c4bff72cb 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -15,7 +15,6 @@ /datum/reagents/New(maximum=100) maximum_volume = maximum - //I dislike having these here but map-objects are initialised before world/New() is called. >_> if(!GLOB.chemical_reagents_list) //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -229,7 +228,8 @@ var/list/cached_reagents = reagent_list var/list/cached_addictions = addiction_list if(C) - expose_temperature(C.bodytemperature, 0.25) + chem_temp = C.bodytemperature + handle_reactions() var/need_mob_update = 0 for(var/reagent in cached_reagents) var/datum/reagent/R = reagent @@ -283,7 +283,6 @@ C.update_stamina() update_total() - /datum/reagents/proc/set_reacting(react = TRUE) if(react) flags &= ~(REAGENT_NOREACT) @@ -733,15 +732,6 @@ return english_list(out, "something indescribable") -/datum/reagents/proc/expose_temperature(var/temperature, var/coeff=0.02) - var/temp_delta = (temperature - chem_temp) * coeff - if(temp_delta > 0) - chem_temp = min(chem_temp + max(temp_delta, 1), temperature) - else - chem_temp = max(chem_temp + min(temp_delta, -1), temperature) - chem_temp = round(chem_temp) - handle_reactions() - /////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 223259f6f3..77fcd50306 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -2,7 +2,7 @@ #define MILK_TO_BUTTER_COEFF 15 /obj/machinery/reagentgrinder - name = "\improper All-In-One Grinder" + name = "All-In-One Grinder" desc = "From BlenderTech. Will It Blend? Let's test it out!" icon = 'icons/obj/kitchen.dmi' icon_state = "juicer1" @@ -16,6 +16,97 @@ var/operating = FALSE var/obj/item/reagent_containers/beaker = null var/limit = 10 + + var/static/list/blend_items = list( + //Sheets + /obj/item/stack/sheet/mineral/plasma = list("plasma" = 20), + /obj/item/stack/sheet/metal = list("iron" = 20), + /obj/item/stack/sheet/plasteel = list("iron" = 20, "plasma" = 20), + /obj/item/stack/sheet/mineral/wood = list("carbon" = 20), + /obj/item/stack/sheet/glass = list("silicon" = 20), + /obj/item/stack/sheet/rglass = list("silicon" = 20, "iron" = 20), + /obj/item/stack/sheet/mineral/uranium = list("uranium" = 20), + /obj/item/stack/sheet/mineral/bananium = list("banana" = 20), + /obj/item/stack/sheet/mineral/silver = list("silver" = 20), + /obj/item/stack/sheet/mineral/gold = list("gold" = 20), + /obj/item/stack/sheet/bluespace_crystal = list("bluespace" = 20), + /obj/item/stack/cable_coil = list ("copper" = 5), + /obj/item/ore/bluespace_crystal = list("bluespace" = 20), + /obj/item/grown/nettle/basic = list("sacid" = 0), + /obj/item/grown/nettle/death = list("facid" = 0, "sacid" = 0), + /obj/item/grown/novaflower = list("capsaicin" = 0, "condensedcapsaicin" = 0), + //Blender Stuff + /obj/item/reagent_containers/food/snacks/donkpocket/warm = list("omnizine" = 3), + /obj/item/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0), + /obj/item/reagent_containers/food/snacks/grown/tomato = list("ketchup" = 0), + /obj/item/reagent_containers/food/snacks/grown/wheat = list("flour" = -5), + /obj/item/reagent_containers/food/snacks/grown/oat = list("flour" = -5), + /obj/item/reagent_containers/food/snacks/grown/rice = list("rice" = -5), + /obj/item/reagent_containers/food/snacks/donut = list("sprinkles" = -2, "sugar" = 1), + /obj/item/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0), + /obj/item/reagent_containers/food/snacks/grown/bluecherries = list("bluecherryjelly" = 0), + /obj/item/reagent_containers/food/snacks/egg = list("eggyolk" = -5), + /obj/item/reagent_containers/food/snacks/deadmouse = list ("blood" = 20, "gibs" = 5), // You monster + //Grinder stuff, but only if dry + /obj/item/reagent_containers/food/snacks/grown/coffee/robusta = list("coffeepowder" = 0, "morphine" = 0), + /obj/item/reagent_containers/food/snacks/grown/coffee = list("coffeepowder" = 0), + /obj/item/reagent_containers/food/snacks/grown/tea/astra = list("teapowder" = 0, "salglu_solution" = 0), + /obj/item/reagent_containers/food/snacks/grown/tea = list("teapowder" = 0), + //Stuff that doesn't quite fit in the other categories + /obj/item/electronics = list ("iron" = 10, "silicon" = 10), + /obj/item/circuitboard = list ("silicon" = 20, "sacid" = 0.5), // Retrieving acid this way is extremely inefficient + /obj/item/match = list ("phosphorus" = 2), + /obj/item/device/toner = list ("iodine" = 40, "iron" = 10), + /obj/item/photo = list ("iodine" = 4), + /obj/item/pen = list ("iodine" = 2, "iron" = 1), + /obj/item/reagent_containers/food/drinks/soda_cans = list ("aluminium" = 10), + /obj/item/trash/can = list ("aluminium" = 10), + /obj/item/device/flashlight/flare = list ("sulfur" = 15), + /obj/item/device/flashlight/glowstick = list ("phenol" = 15, "hydrodgen" = 10, "oxygen" = 5), + /obj/item/stock_parts/cell = list ("lithium" = 15, "iron" = 5, "silicon" = 5), + /obj/item/soap = list ("lye" = 10), + /obj/item/device/analyzer = list ("mercury" = 5, "iron" = 5, "silicon" = 5), + /obj/item/lighter = list ("iron" = 1, "weldingfuel" = 5, "oil" = 5), + /obj/item/light = list ("silicon" = 5, "nitrogen" = 10), //Nitrogen is used as a cheaper alternative to argon in incandescent lighbulbs + /obj/item/cigbutt/ = list ("carbon" = 2), + /obj/item/trash/coal = list ("carbon" = 20), + /obj/item/stack/medical/bruise_pack = list ("styptic_powder" = 5), + /obj/item/stack/medical/ointment = list ("silver_sulfadiazine" = 5), + //All types that you can put into the grinder to transfer the reagents to the beaker. !Put all recipes above this.! + /obj/item/slime_extract = list(), + /obj/item/reagent_containers/pill = list(), + /obj/item/reagent_containers/food = list(), + /obj/item/reagent_containers/honeycomb = list(), + /obj/item/toy/crayon = list(), + /obj/item/clothing/mask/cigarette = list()) + + var/static/list/juice_items = list( + //Juicer Stuff + /obj/item/reagent_containers/food/snacks/grown/corn = list("corn_starch" = 0), + /obj/item/reagent_containers/food/snacks/grown/tomato = list("tomatojuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/carrot = list("carrotjuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/berries = list("berryjuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/banana = list("banana" = 0), + /obj/item/reagent_containers/food/snacks/grown/potato = list("potato" = 0), + /obj/item/reagent_containers/food/snacks/grown/citrus/lemon = list("lemonjuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/citrus/orange = list("orangejuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/citrus/lime = list("limejuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/watermelon = list("watermelonjuice" = 0), + /obj/item/reagent_containers/food/snacks/watermelonslice = list("watermelonjuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/berries/poison = list("poisonberryjuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/pumpkin = list("pumpkinjuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/blumpkin = list("blumpkinjuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/apple = list("applejuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/grapes = list("grapejuice" = 0), + /obj/item/reagent_containers/food/snacks/grown/grapes/green = list("grapejuice" = 0)) + + var/static/list/dried_items = list( + //Grinder stuff, but only if dry, + /obj/item/reagent_containers/food/snacks/grown/coffee/robusta = list("coffeepowder" = 0, "morphine" = 0), + /obj/item/reagent_containers/food/snacks/grown/coffee = list("coffeepowder" = 0), + /obj/item/reagent_containers/food/snacks/grown/tea/astra = list("teapowder" = 0, "salglu_solution" = 0), + /obj/item/reagent_containers/food/snacks/grown/tea = list("teapowder" = 0)) + var/list/holdingitems /obj/machinery/reagentgrinder/Initialize() @@ -67,7 +158,6 @@ if(!user.transferItemToLoc(I, src)) to_chat(user, "[I] is stuck to your hand!") return TRUE - to_chat(user, "You slide [I] into [src].") beaker = I update_icon() updateUsrDialog() @@ -75,8 +165,15 @@ to_chat(user, "There's already a container inside [src].") return TRUE //no afterattack - if(holdingitems.len >= limit) - to_chat(user, "[src] is filled to capacity!") + if(is_type_in_list(I, dried_items)) + if(istype(I, /obj/item/reagent_containers/food/snacks/grown)) + var/obj/item/reagent_containers/food/snacks/grown/G = I + if(!G.dry) + to_chat(user, "You must dry [G] first!") + return TRUE + + if(length(holdingitems) >= limit) + to_chat(user, "The machine cannot hold anymore items.") return TRUE //Fill machine with a bag! @@ -95,18 +192,14 @@ updateUsrDialog() return TRUE - if(!I.grind_results && !I.juice_results) + if (!is_type_in_list(I, blend_items) && !is_type_in_list(I, juice_items)) if(user.a_intent == INTENT_HARM) return ..() else - to_chat(user, "You cannot grind [I] into reagents!") + to_chat(user, "Cannot refine into a reagent!") return TRUE - if(!I.grind_requirements(src)) //Error messages should be in the objects' definitions - return - if(user.transferItemToLoc(I, src)) - to_chat(user, "You add [I] to [src].") holdingitems[I] = TRUE updateUsrDialog() return FALSE @@ -121,7 +214,7 @@ user.set_machine(src) interact(user) -/obj/machinery/reagentgrinder/interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave +/obj/machinery/reagentgrinder/interact(mob/user) // The microwave Menu var/is_chamber_empty = FALSE var/is_beaker_ready = FALSE var/processing_chamber = "" @@ -214,10 +307,60 @@ holdingitems -= O updateUsrDialog() +/obj/machinery/reagentgrinder/proc/get_allowed_by_obj(obj/item/O) + for (var/i in blend_items) + if (istype(O, i)) + return blend_items[i] + +/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_obj(obj/item/reagent_containers/food/snacks/O) + for(var/i in juice_items) + if(istype(O, i)) + return juice_items[i] + +/obj/machinery/reagentgrinder/proc/get_grownweapon_amount(obj/item/grown/O) + if (!istype(O) || !O.seed) + return 5 + else if (O.seed.potency == -1) + return 5 + else + return round(O.seed.potency) + +/obj/machinery/reagentgrinder/proc/get_juice_amount(obj/item/reagent_containers/food/snacks/grown/O) + if (!istype(O) || !O.seed) + return 5 + else if (O.seed.potency == -1) + return 5 + else + return round(5*sqrt(O.seed.potency)) + /obj/machinery/reagentgrinder/proc/remove_object(obj/item/O) holdingitems -= O qdel(O) +/obj/machinery/reagentgrinder/proc/juice() + power_change() + if(!beaker || (beaker && (beaker.reagents.total_volume >= beaker.reagents.maximum_volume))) + return + operate_for(50, juicing = TRUE) + + //Snacks + for(var/obj/item/i in holdingitems) + var/obj/item/I = i + if(istype(I, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/O = I + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + var/list/allowed = get_allowed_juice_by_obj(O) + if(isnull(allowed)) + break + for(var/r_id in allowed) + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + var/amount = get_juice_amount(O) + beaker.reagents.add_reagent(r_id, min(amount, space)) + if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + remove_object(O) + /obj/machinery/reagentgrinder/proc/shake_for(duration) var/offset = prob(50) ? -2 : 2 var/old_pixel_x = pixel_x @@ -243,26 +386,8 @@ operating = FALSE updateUsrDialog() -/obj/machinery/reagentgrinder/proc/juice() - power_change() - if(!beaker || (beaker && (beaker.reagents.total_volume >= beaker.reagents.maximum_volume))) - return - operate_for(50, juicing = TRUE) - for(var/obj/item/i in holdingitems) - if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break - var/obj/item/I = i - if(I.juice_results) - juice_item(I) - -/obj/machinery/reagentgrinder/proc/juice_item(obj/item/I) //Juicing results can be found in respective object definitions - if(I.on_juice(src) == -1) - to_chat(usr, "[src] shorts out as it tries to juice up [I], and transfers it back to storage.") - return - beaker.reagents.add_reagent_list(I.juice_results) - remove_object(I) - /obj/machinery/reagentgrinder/proc/grind() + power_change() if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume)) return @@ -271,17 +396,82 @@ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume) break var/obj/item/I = i - if(I.grind_results) - grind_item(i) - -/obj/machinery/reagentgrinder/proc/grind_item(obj/item/I) //Grind results can be found in respective object definitions - if(I.on_grind(src) == -1) //Call on_grind() to change amount as needed, and stop grinding the item if it returns -1 - to_chat(usr, "[src] shorts out as it tries to grind up [I], and transfers it back to storage.") - return - beaker.reagents.add_reagent_list(I.grind_results) - if(I.reagents) - I.reagents.trans_to(beaker, I.reagents.total_volume) - remove_object(I) + //Snacks + if(istype(I, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/O = I + var/list/allowed = get_allowed_by_obj(O) + if(isnull(allowed)) + continue + for(var/r_id in allowed) + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + var/amount = allowed[r_id] + if(amount <= 0) + if(amount == 0) + if (O.reagents != null && O.reagents.has_reagent("nutriment")) + beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment"), space)) + O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space)) + else + if (O.reagents != null && O.reagents.has_reagent("nutriment")) + beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)), space)) + O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space)) + else + O.reagents.trans_id_to(beaker, r_id, min(amount, space)) + if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + if(O.reagents.reagent_list.len == 0) + remove_object(O) + //Sheets + else if(istype(I, /obj/item/stack/sheet)) + var/obj/item/stack/sheet/O = I + var/list/allowed = get_allowed_by_obj(O) + for(var/t in 1 to round(O.amount, 1)) + for(var/r_id in allowed) + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + var/amount = allowed[r_id] + beaker.reagents.add_reagent(r_id,min(amount, space)) + if (space < amount) + break + if(t == round(O.amount, 1)) + remove_object(O) + break + //Plants + else if(istype(I, /obj/item/grown)) + var/obj/item/grown/O = I + var/list/allowed = get_allowed_by_obj(O) + for (var/r_id in allowed) + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + var/amount = allowed[r_id] + if (amount == 0) + if (O.reagents != null && O.reagents.has_reagent(r_id)) + beaker.reagents.add_reagent(r_id,min(O.reagents.get_reagent_amount(r_id), space)) + else + beaker.reagents.add_reagent(r_id,min(amount, space)) + if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) + break + remove_object(O) + else if(istype(I, /obj/item/slime_extract)) + var/obj/item/slime_extract/O = I + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + if (O.reagents != null) + var/amount = O.reagents.total_volume + O.reagents.trans_to(beaker, min(amount, space)) + if (O.Uses > 0) + beaker.reagents.add_reagent("slimejelly",min(20, space)) + remove_object(O) + if(istype(I, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/O = I + var/amount = O.reagents.total_volume + O.reagents.trans_to(beaker, amount) + if(!O.reagents.total_volume) + remove_object(O) + else if(istype(I, /obj/item/toy/crayon)) + var/obj/item/toy/crayon/O = I + for (var/r_id in O.reagent_contents) + var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume + if(!space) + break + beaker.reagents.add_reagent(r_id, min(O.reagent_contents[r_id], space)) + remove_object(O) /obj/machinery/reagentgrinder/proc/mix(mob/user) //For butter and other things that would change upon shaking or mixing diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 99ce4afe83..ddb08db032 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -129,16 +129,31 @@ taste_description = "sludge" /datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/M) - var/power = -0.00003 * (M.bodytemperature ** 2) + 3 - if(M.bodytemperature < T0C) - M.adjustOxyLoss(-3 * power, 0) - M.adjustBruteLoss(-power, 0) - M.adjustFireLoss(-power, 0) - M.adjustToxLoss(-power, 0) - M.adjustCloneLoss(-power, 0) - M.status_flags &= ~DISFIGURED - . = 1 - metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (M.bodytemperature ** 2) + 0.5) + switch(M.bodytemperature) // Low temperatures are required to take effect. + if(0 to 100) // At extreme temperatures (upgraded cryo) the effect is greatly increased. + M.status_flags &= ~DISFIGURED + M.adjustCloneLoss(-1, 0) + M.adjustOxyLoss(-9, 0) + M.adjustBruteLoss(-5, 0) + M.adjustFireLoss(-5, 0) + M.adjustToxLoss(-5, 0) + . = 1 + if(100 to 225) // At lower temperatures (cryo) the full effect is boosted + M.status_flags &= ~DISFIGURED + M.adjustCloneLoss(-1, 0) + M.adjustOxyLoss(-7, 0) + M.adjustBruteLoss(-3, 0) + M.adjustFireLoss(-3, 0) + M.adjustToxLoss(-3, 0) + . = 1 + if(225 to T0C) + M.status_flags &= ~DISFIGURED + M.adjustCloneLoss(-1, 0) + M.adjustOxyLoss(-5, 0) + M.adjustBruteLoss(-1, 0) + M.adjustFireLoss(-1, 0) + M.adjustToxLoss(-1, 0) + . = 1 ..() /datum/reagent/medicine/clonexadone diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 3182080ba3..8698c10b05 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -80,7 +80,8 @@ ..() /obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume) - reagents.expose_temperature(exposed_temperature) + reagents.chem_temp += 30 + reagents.handle_reactions() ..() /obj/item/reagent_containers/throw_impact(atom/target) @@ -127,8 +128,6 @@ /obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M) if(is_open_container()) - reagents.expose_temperature(1000) + reagents.chem_temp = max(reagents.chem_temp, 1000) + reagents.handle_reactions() ..() - -/obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - reagents.expose_temperature(exposed_temperature) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 749031b367..6fad290676 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -311,4 +311,4 @@ /obj/item/reagent_containers/glass/bottle/tuberculosiscure name = "BVAK bottle" desc = "A small bottle containing Bio Virus Antidote Kit." - list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10) + list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 15f22feeb4..df2df7c171 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -91,9 +91,15 @@ /obj/item/reagent_containers/glass/attackby(obj/item/I, mob/user, params) var/hotness = I.is_hot() - if(hotness && reagents) - reagents.expose_temperature(hotness) - to_chat(user, "You heat [name] with [I]!") + if(hotness) + var/added_heat = (hotness / 100) //ishot returns a temperature + if(reagents) + if(reagents.chem_temp < hotness) //can't be heated to be hotter than the source + reagents.chem_temp += added_heat + to_chat(user, "You heat [src] with [I].") + reagents.handle_reactions() + else + to_chat(user, "[src] is already hotter than [I]!") if(istype(I, /obj/item/reagent_containers/food/snacks/egg)) //breaking eggs var/obj/item/reagent_containers/food/snacks/egg/E = I diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 5836186ee1..324623edbd 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -8,7 +8,6 @@ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' possible_transfer_amounts = list() volume = 50 - grind_results = list() var/apply_type = INGEST var/apply_method = "swallow" var/roundstart = 0 @@ -152,4 +151,4 @@ desc = "I wouldn't eat this if I were you." icon_state = "pill9" color = "#454545" - list_reagents = list("shadowmutationtoxin" = 1) \ No newline at end of file + list_reagents = list("shadowmutationtoxin" = 1) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 6edcc44a3a..789345ca77 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -123,13 +123,6 @@ current_range = spray_range to_chat(user, "You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""]. You'll now use [amount_per_transfer_from_this] units per use.") -/obj/item/reagent_containers/spray/attackby(obj/item/I, mob/user, params) - var/hotness = I.is_hot() - if(hotness && reagents) - reagents.expose_temperature(hotness) - to_chat(user, "You heat [name] with [I]!") - return ..() - /obj/item/reagent_containers/spray/verb/empty() set name = "Empty Spray Bottle" set category = "Object" diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index aa41763cfa..ed14ae63c1 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -29,7 +29,7 @@ if(make_from) setDir(make_from.dir) - make_from.moveToNullspace() + make_from.loc = null stored = make_from pressure_charging = FALSE // newly built disposal bins start with pump off else @@ -471,7 +471,7 @@ if(isobj(AM)) var/obj/O = AM - O.forceMove(src) + O.loc = src else if(ismob(AM)) var/mob/M = AM if(prob(2)) // to prevent mobs being stuck in infinite loops diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index 355d5d6b96..28eefde453 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -190,7 +190,6 @@ deconstruct() -// Straight/bent pipe segment /obj/structure/disposalpipe/segment icon_state = "pipe" initialize_dirs = DISP_DIR_FLIP diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 38259b56d6..a66fdf7e03 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -12,6 +12,8 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). circuit = /obj/item/circuitboard/machine/circuit_imprinter var/efficiency_coeff + var/console_link = TRUE //can this link to a console? + var/requires_console = TRUE var/datum/component/material_container/materials //Store for hyper speed! @@ -30,11 +32,11 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). ) /obj/machinery/rnd/circuit_imprinter/Initialize() + var/datum/component/material_container/materials materials = AddComponent(/datum/component/material_container, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE), 0, FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) materials.precise_insertion = TRUE create_reagents(0) - RefreshParts() return ..() /obj/machinery/rnd/circuit_imprinter/RefreshParts() @@ -117,9 +119,11 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). return TRUE /obj/machinery/rnd/circuit_imprinter/proc/do_print(path, list/matlist, notify_admins) - if(notify_admins && usr) - investigate_log("[key_name(usr)] built [path] at a circuit imprinter.", INVESTIGATE_RESEARCH) - message_admins("[ADMIN_LOOKUPFLW(usr)] has built [path] at a circuit imprinter.") + if(notify_admins) + if(usr) + usr.investigate_log("built [path] at a circuit imprinter.", INVESTIGATE_RESEARCH) + var/turf/T = get_turf(usr) + message_admins("[key_name(usr)][ADMIN_JMP(T)] has built [path] at a circuit imprinter at [COORD(usr)]") var/obj/item/I = new path(get_turf(src)) I.materials = matlist.Copy() - SSblackbox.record_feedback("nested tally", "circuit_printed", 1, list("[type]", "[path]")) + SSblackbox.record_feedback("nested_tally", "circuit_printed", 1, list("[type]", "[path]")) diff --git a/code/modules/research/departmental_circuit_imprinter.dm b/code/modules/research/departmental_circuit_imprinter.dm index 7c67bd44b7..bd3414884f 100644 --- a/code/modules/research/departmental_circuit_imprinter.dm +++ b/code/modules/research/departmental_circuit_imprinter.dm @@ -4,8 +4,10 @@ icon_state = "circuit_imprinter" container_type = OPENCONTAINER_1 circuit = /obj/item/circuitboard/machine/circuit_imprinter/department + console_link = FALSE requires_console = FALSE + var/list/allowed_department_flags = DEPARTMENTAL_FLAG_ALL var/list/datum/design/cached_designs var/list/datum/design/matching_designs var/department_tag = "Unidentified" //used for material distribution among other things. @@ -143,7 +145,8 @@ /obj/machinery/rnd/circuit_imprinter/department/proc/ui_header() var/list/l = list() - l += "
    [host_research.organization] [department_tag] Department Circuit Imprinter" + l += "

    Nanotrasen Department Circuit Imprinter: [department_tag]

    [RDSCREEN_NOBREAK]" + l += "
    Connected Technology database: [host_research == SSresearch.science_tech? "Nanotrasen" : "Third Party"]" l += "Security protocols: [emagged? "Disabled" : "Enabled"]" l += "Material Amount: [materials.total_amount] / [materials.max_amount]" l += "Chemical volume: [reagents.total_volume] / [reagents.maximum_volume]" diff --git a/code/modules/research/departmental_lathe.dm b/code/modules/research/departmental_lathe.dm index 699248a0a1..2e534195d9 100644 --- a/code/modules/research/departmental_lathe.dm +++ b/code/modules/research/departmental_lathe.dm @@ -4,8 +4,10 @@ icon_state = "protolathe" container_type = OPENCONTAINER_1 circuit = /obj/item/circuitboard/machine/protolathe/department + console_link = FALSE requires_console = FALSE + var/list/allowed_department_flags = DEPARTMENTAL_FLAG_ALL var/list/datum/design/cached_designs var/list/datum/design/matching_designs var/department_tag = "Unidentified" //used for material distribution among other things. @@ -186,7 +188,8 @@ /obj/machinery/rnd/protolathe/department/proc/ui_header() var/list/l = list() - l += "
    [host_research.organization] [department_tag] Department Lathe" + l += "

    Nanotrasen Department Lathe: [department_tag]

    [RDSCREEN_NOBREAK]" + l += "
    Connected Technology database: [host_research == SSresearch.science_tech? "Nanotrasen" : "Third Party"]" l += "Security protocols: [emagged? "Disabled" : "Enabled"]" l += "Material Amount: [materials.total_amount] / [materials.max_amount]" l += "Chemical volume: [reagents.total_volume] / [reagents.maximum_volume]" diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 0af1650d42..e16aadb7cd 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -43,49 +43,11 @@ other types of metals and chemistry for reagents). var/lathe_time_factor = 1 //How many times faster than normal is this to build on the protolathe var/dangerous_construction = FALSE //notify and log for admin investigations if this is printed. var/departmental_flags = ALL //bitflags for deplathes. - var/list/datum/techweb_node/unlocked_by = list() - var/icon_cache /datum/design/Destroy() CRASH("DESIGN DATUMS SHOULD NOT EVER BE DESTROYED AS THEY ARE ONLY MEANT TO BE IN A GLOBAL LIST AND REFERENCED FOR US.") return ..() -/datum/design/proc/icon_html(client/user) - if (!icon_cache) - // construct the icon and slap it into the resource cache - var/atom/item = build_path - if (!ispath(item, /atom)) - // biogenerator outputs to beakers by default - if (build_type & BIOGENERATOR) - item = /obj/item/reagent_containers/glass/beaker/large - else - return // shouldn't happen, but just in case - - // circuit boards become their resulting machines or computers - if (ispath(item, /obj/item/circuitboard)) - var/obj/item/circuitboard/C = item - var/machine = initial(C.build_path) - if (machine) - item = machine - var/icon_file = initial(item.icon) - var/icon/I = icon(icon_file, initial(item.icon_state), SOUTH) - - // computers (and snowflakes) get their screen and keyboard sprites - if (ispath(item, /obj/machinery/computer) || ispath(item, /obj/machinery/power/solar_control)) - var/obj/machinery/computer/C = item - var/screen = initial(C.icon_screen) - var/keyboard = initial(C.icon_keyboard) - if (screen) - I.Blend(icon(icon_file, screen, SOUTH), ICON_OVERLAY) - if (keyboard) - I.Blend(icon(icon_file, keyboard, SOUTH), ICON_OVERLAY) - - // based on icon2html - icon_cache = "[generate_asset_name(I)].png" - register_asset(icon_cache, I) - send_asset(user, icon_cache, FALSE) - return "" - //////////////////////////////////////// //Disks for transporting design datums// //////////////////////////////////////// diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 05acb20f0e..e3caef247c 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -44,8 +44,6 @@ Note: Must be placed within 3 tiles of the R&D Console to_chat(user, "You add the [O.name] to the [src.name]!") flick("d_analyzer_la", src) addtimer(CALLBACK(src, .proc/finish_loading), 10) - if (linked_console) - linked_console.updateUsrDialog() /obj/machinery/rnd/destructive_analyzer/proc/finish_loading() update_icon() @@ -95,35 +93,30 @@ Note: Must be placed within 3 tiles of the R&D Console /obj/machinery/rnd/destructive_analyzer/proc/user_try_decon_id(id, mob/user) if(!istype(loaded_item) || !istype(linked_console)) return FALSE - - if (id && id != RESEARCH_MATERIAL_RECLAMATION_ID) + if(id && !(id == RESEARCH_MATERIAL_RECLAMATION_ID)) var/datum/techweb_node/TN = get_techweb_node_by_id(id) if(!istype(TN)) return FALSE - var/list/can_boost = techweb_item_boost_check(loaded_item) - if(isnull(can_boost[id])) + var/list/pos1 = techweb_item_boost_check(loaded_item) + if(isnull(pos1[id])) return FALSE var/dpath = loaded_item.type - var/worth = TN.boost_item_paths[dpath] - if(isnull(worth)) + if(isnull(TN.boost_item_paths[dpath])) return FALSE - var/difference = min(worth, TN.research_cost) - linked_console.stored_research.boosted_nodes[TN.id] - if(worth && difference <= 0) - return FALSE - var/choice = input("Are you sure you want to destroy [loaded_item] to [!worth ? "reveal [TN.display_name]" : "boost [TN.display_name] by [difference] point\s"]?") in list("Proceed", "Cancel") + var/dboost = TN.boost_item_paths[dpath] + var/choice = input("Are you sure you want to destroy [loaded_item.name] for a boost of [dboost? 0 : dboost] in node [TN.display_name]") in list("Proceed", "Cancel") if(choice == "Cancel") return FALSE if(QDELETED(loaded_item) || QDELETED(linked_console) || !user.Adjacent(linked_console) || QDELETED(src)) return FALSE - SSblackbox.record_feedback("nested tally", "item_deconstructed", 1, list("[TN.id]", "[loaded_item.type]")) + SSblackbox.record_feedback("nested_tally", "item_deconstructed", 1, list("[TN.id]", "[loaded_item.type]")) if(destroy_item(loaded_item)) linked_console.stored_research.boost_with_path(SSresearch.techweb_nodes[TN.id], dpath) - else var/point_value = techweb_item_point_check(loaded_item) if(linked_console.stored_research.deconstructed_items[loaded_item.type]) point_value = 0 - var/choice = input("Are you sure you want to destroy [loaded_item] for [point_value ? "[point_value] research points" : "material reclamation"]?") in list("Proceed", "Cancel") + var/choice = input("Are you sure you want to destroy [loaded_item.name] for [point_value? "[point_value] points" : "material reclaimation"]?") in list("Proceed", "Cancel") if(choice == "Cancel") return FALSE if(QDELETED(loaded_item) || QDELETED(linked_console) || !user.Adjacent(linked_console) || QDELETED(src)) @@ -140,5 +133,4 @@ Note: Must be placed within 3 tiles of the R&D Console return FALSE loaded_item.forceMove(get_turf(src)) loaded_item = null - update_icon() return TRUE diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index bad8f1e5aa..56848c6394 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -219,8 +219,8 @@ return var/turf/dropturf = get_turf(pick(view(1,src))) if(!dropturf) //Failsafe to prevent the object being lost in the void forever. - dropturf = drop_location() - loaded_item.forceMove(dropturf) + dropturf = get_turf(src) + loaded_item.loc = dropturf if(delete) qdel(loaded_item) loaded_item = null @@ -510,7 +510,7 @@ throwSmoke(loc) if(trackedRuntime) throwSmoke(trackedRuntime.loc) - trackedRuntime.forceMove(drop_location()) + trackedRuntime.loc = loc investigate_log("Experimentor has stolen Runtime!", INVESTIGATE_EXPERIMENTOR) else new /mob/living/simple_animal/pet/cat(loc) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index d6bfea7f15..6c52fd4678 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -15,6 +15,8 @@ Note: Must be placed west/left of and R&D console to function. circuit = /obj/item/circuitboard/machine/protolathe var/efficiency_coeff + var/console_link = TRUE //allow console link. + var/requires_console = TRUE var/list/categories = list( "Power Designs", "Medical Designs", @@ -29,7 +31,7 @@ Note: Must be placed west/left of and R&D console to function. "Computer Parts" ) - var/datum/component/material_container/materials //Store for hyper speed! + var/datum/component/material_container/materials /obj/machinery/rnd/protolathe/Initialize() create_reagents(0) @@ -37,7 +39,6 @@ Note: Must be placed west/left of and R&D console to function. list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0, FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) materials.precise_insertion = TRUE - RefreshParts() return ..() /obj/machinery/rnd/protolathe/RefreshParts() @@ -74,7 +75,6 @@ Note: Must be placed west/left of and R&D console to function. materials.retrieve_all() ..() - /obj/machinery/rnd/protolathe/disconnect_console() linked_console.linked_lathe = null ..() @@ -124,11 +124,13 @@ Note: Must be placed west/left of and R&D console to function. return TRUE /obj/machinery/rnd/protolathe/proc/do_print(path, amount, list/matlist, notify_admins) - if(notify_admins && usr) - investigate_log("[key_name(usr)] built [amount] of [path] at a protolathe.", INVESTIGATE_RESEARCH) - message_admins("[ADMIN_LOOKUPFLW(usr)] has built [amount] of [path] at a protolathe") + if(notify_admins) + if(usr) + usr.investigate_log("built [amount] of [path] at a protolathe.", INVESTIGATE_RESEARCH) + var/turf/T = get_turf(usr) + message_admins("[key_name(usr)][ADMIN_JMP(T)] has built [amount] of [path] at a protolathe at [COORD(usr)]") for(var/i in 1 to amount) var/obj/item/I = new path(get_turf(src)) if(!istype(I, /obj/item/stack/sheet) && !istype(I, /obj/item/ore/bluespace_crystal)) I.materials = matlist.Copy() - SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]")) + SSblackbox.record_feedback("nested_tally", "item_printed", amount, list("[type]", "[path]")) \ No newline at end of file diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 0b9453a62d..116d41d7f8 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -45,7 +45,6 @@ doesn't have toxins access. var/disk_slot_selected var/searchstring = "" var/searchtype = "" - var/ui_mode = RDCONSOLE_UI_MODE_NORMAL var/research_control = TRUE @@ -151,9 +150,11 @@ doesn't have toxins access. return FALSE var/price = TN.get_price(stored_research) if(stored_research.research_points >= price) - investigate_log("[key_name(user)] researched [id]([price]) on techweb id [stored_research.id].", INVESTIGATE_RESEARCH) + investigate_log("[key_name_admin(user)] researched [id]([price]) on techweb id [stored_research.id].") if(stored_research == SSresearch.science_tech) - SSblackbox.record_feedback("associative", "science_techweb_unlock", 1, list("id" = "[id]", "price" = "[price]", "time" = "[SQLtime()]")) + if(stored_research.researched_nodes.len < 30) + SSblackbox.record_feedback("tally", "science_techweb_unlock_first_thirty", 1, "[id]") + SSblackbox.record_feedback("tally", "science_techweb_unlock", 1, "[id]") if(stored_research.research_node(SSresearch.techweb_nodes[id])) say("Sucessfully researched [TN.display_name].") var/logname = "Unknown" @@ -217,27 +218,24 @@ doesn't have toxins access. /obj/machinery/computer/rdconsole/proc/ui_header() var/list/l = list() - l += "
    [stored_research.organization] Research and Development Network" - l += "Available points: [round(stored_research.research_points)] (+[round(stored_research.last_bitcoins * 60)] / minute)" + l += "

    Nanotrasen Research and Development

    [RDSCREEN_NOBREAK]" + l += "
    Connected Technology database: [stored_research == SSresearch.science_tech? "Nanotrasen" : "Third Party"]" + l += "Available Points: [stored_research.research_points]" l += "Security protocols: [emagged? "Disabled" : "Enabled"]" + l += "Design Disk: [d_disk? "Loaded" : "Not Loaded"] | \ + Technology Disk: [t_disk? "Loaded" : "Not Loaded"]" l += "Main Menu | Back
    [RDSCREEN_NOBREAK]" - l += "[ui_mode == 1? "Normal View" : "Normal View"] | [ui_mode == 2? "Expert View" : "Expert View"] | [ui_mode == 3? "List View" : "List View"]" return l /obj/machinery/computer/rdconsole/proc/ui_main_menu() var/list/l = list() if(research_control) l += "

    Technology" - if(d_disk) - l += "
    Design Disk" - if(t_disk) - l += "
    Tech Disk" - if(linked_destroy) - l += "
    Destructive Analyzer" - if(linked_lathe) - l += "
    Protolathe" - if(linked_imprinter) - l += "
    Circuit Imprinter" + l += "
    Design Disk" + l += "
    Tech Disk" + l += "
    Deconstructive Analyzer" + l += "
    Protolathe" + l += "
    Circuit Imprinter" l += "
    Settings

    " return l @@ -280,8 +278,6 @@ doesn't have toxins access. var/datum/design/D = stored_research.researched_designs[v] if(!(selected_category in D.category)|| !(D.build_type & PROTOLATHE)) continue - if(!(D.departmental_flags & linked_lathe.allowed_department_flags)) - continue var/temp_material var/c = 50 var/t @@ -332,8 +328,6 @@ doesn't have toxins access. l += ui_protolathe_header() var/coeff = linked_lathe.efficiency_coeff for(var/datum/design/D in matching_designs) - if(!(D.departmental_flags & linked_lathe.allowed_department_flags)) - continue var/temp_material var/c = 50 var/t @@ -422,8 +416,6 @@ doesn't have toxins access. var/datum/design/D = stored_research.researched_designs[v] if(!(selected_category in D.category) || !(D.build_type & IMPRINTER)) continue - if(!(D.departmental_flags & linked_imprinter.allowed_department_flags)) - continue var/temp_materials var/check_materials = TRUE @@ -451,8 +443,6 @@ doesn't have toxins access. var/coeff = linked_imprinter.efficiency_coeff for(var/datum/design/D in matching_designs) - if(!(D.departmental_flags & linked_imprinter.allowed_department_flags)) - continue var/temp_materials var/check_materials = TRUE var/all_materials = D.materials + D.reagents_list @@ -539,214 +529,122 @@ doesn't have toxins access. RDSCREEN_UI_DECONSTRUCT_CHECK var/list/l = list() if(!linked_destroy.loaded_item) - l += "
    No item loaded. Standing-by...
    " + l += "
    No Item Loaded. Standing-by...
    " else - l += "
    [RDSCREEN_NOBREAK]" - l += "
    [icon2html(linked_destroy.loaded_item, usr)][linked_destroy.loaded_item.name] Eject
    [RDSCREEN_NOBREAK]" - l += "Select a node to boost by deconstructing this item. This item can boost:" - - var/anything = FALSE - var/list/boostable_nodes = techweb_item_boost_check(linked_destroy.loaded_item) - for(var/id in boostable_nodes) - anything = TRUE - var/worth = boostable_nodes[id] - var/datum/techweb_node/N = get_techweb_node_by_id(id) - - l += "
    [RDSCREEN_NOBREAK]" - if (stored_research.researched_nodes[N.id]) // already researched - l += "[N.display_name]" - l += "This node has already been researched." - else if (worth == 0) // reveal only - if (stored_research.hidden_nodes[N.id]) - l += "[N.display_name]" - l += "This node will be revealed." - else - l += "[N.display_name]" - l += "This node has already been revealed." - else // boost by the difference - var/difference = min(worth, N.research_cost) - stored_research.boosted_nodes[N.id] - if (difference > 0) - l += "[N.display_name]" - l += "This node will be boosted by [difference] points." - else - l += "[N.display_name]" - l += "This node has already been boosted." - l += "
    [RDSCREEN_NOBREAK]" - - // point deconstruction and material reclamation use the same ID to prevent accidentally missing the points - var/point_value = techweb_item_point_check(linked_destroy.loaded_item) - if(point_value) - anything = TRUE - l += "
    [RDSCREEN_NOBREAK]" - if (stored_research.deconstructed_items[linked_destroy.loaded_item.type]) - l += "Point Deconstruction" - l += "This item's [point_value] point\s have already been claimed." + l += "

    Deconstruction Menu

    " + l += "Eject Item" + l += "Name: [linked_destroy.loaded_item.name]" + l += "Select a node to boost by deconstructing this item." + l += "This item is able to boost:" + var/list/listin = techweb_item_boost_check(linked_destroy.loaded_item) + for(var/node_id in listin) + var/datum/techweb_node/N = get_techweb_node_by_id(node_id) + var/worth = listin[N.id] + if(!stored_research.researched_nodes[N.id] && !stored_research.boosted_nodes[N.id]) + l += "[N.display_name]: [worth] points" else - l += "Point Deconstruction" - l += "This item is worth [point_value] point\s!" - l += "
    [RDSCREEN_NOBREAK]" - - var/list/materials = linked_destroy.loaded_item.materials - if (materials.len) - l += "
    Material Reclamation" - for (var/M in materials) - l += "* [CallMaterialName(M)] x [materials[M]]" - l += "
    [RDSCREEN_NOBREAK]" - anything = TRUE - - if (!anything) - l += "Nothing!" - + l += "Generic Point Deconstruction - [point_value] points" + l += "Material Reclaimation Deconstruction" l += "
    " return l -/obj/machinery/computer/rdconsole/proc/ui_techweb() +/obj/machinery/computer/rdconsole/proc/ui_techweb() //Legacy code. var/list/l = list() - if(ui_mode != RDCONSOLE_UI_MODE_LIST) - var/list/columns = list() - var/max_tier = 0 - for (var/node_ in stored_research.tiers) - var/datum/techweb_node/node = node_ - var/tier = stored_research.tiers[node] - LAZYINITLIST(columns["[tier]"]) // String hackery to make the numbers associative - columns["[tier]"] += ui_techweb_single_node(node, minimal=(tier != 1)) - max_tier = max(max_tier, tier) - - l += "[RDSCREEN_NOBREAK]" - for(var/tier in 0 to max_tier) - l += "[RDSCREEN_NOBREAK]" - l += "
    ResearchedAvailableFuture
    [RDSCREEN_NOBREAK]" - l += columns["[tier]"] - l += "
    [RDSCREEN_NOBREAK]" - else - var/list/avail = list() //This could probably be optimized a bit later. - var/list/unavail = list() - var/list/res = list() - for(var/v in stored_research.researched_nodes) - res += stored_research.researched_nodes[v] - for(var/v in stored_research.available_nodes) - if(stored_research.researched_nodes[v]) - continue - avail += stored_research.available_nodes[v] - for(var/v in stored_research.visible_nodes) - if(stored_research.available_nodes[v]) - continue - unavail += stored_research.visible_nodes[v] - l += "

    Technology Nodes:

    [RDSCREEN_NOBREAK]" - l += "

    Available for Research:

    " - for(var/datum/techweb_node/N in avail) - var/not_unlocked = (stored_research.available_nodes[N.id] && !stored_research.researched_nodes[N.id]) - var/has_points = (stored_research.research_points >= N.get_price(stored_research)) - var/research_href = not_unlocked? (has_points? "Research" : "Not Enough Points") : null - l += "[N.display_name][research_href]" - l += "

    Locked Nodes:

    " - for(var/datum/techweb_node/N in unavail) - l += "[N.display_name]" - l += "

    Researched Nodes:

    " - for(var/datum/techweb_node/N in res) - l += "[N.display_name]" - l += "
    [RDSCREEN_NOBREAK]" - return l - -/obj/machinery/computer/rdconsole/proc/machine_icon(atom/item) - return icon2html(initial(item.icon), usr, initial(item.icon_state), SOUTH) - -/obj/machinery/computer/rdconsole/proc/ui_techweb_single_node(datum/techweb_node/node, selflink=TRUE, minimal=FALSE) - var/list/l = list() - if (stored_research.hidden_nodes[node.id]) - return l - var/price = node.get_price(stored_research) - var/display_name = node.display_name - if (selflink) - display_name = "[display_name]" - l += "
    [display_name] [RDSCREEN_NOBREAK]" - if(minimal) - l += "
    [node.description]" - else - if(stored_research.researched_nodes[node.id]) - l += "Researched" - else if(stored_research.available_nodes[node.id]) - if(stored_research.research_points >= price) - l += "[price]" - else - l += "[price]" // gray - too expensive - else - l += "[price]" // red - missing prereqs - if(ui_mode == RDCONSOLE_UI_MODE_NORMAL) - l += "[node.description]" - for(var/i in node.designs) - var/datum/design/D = node.designs[i] - l += "[D.icon_html(usr)][RDSCREEN_NOBREAK]" + var/list/avail = list() //This could probably be optimized a bit later. + var/list/unavail = list() + var/list/res = list() + for(var/v in stored_research.researched_nodes) + res += stored_research.researched_nodes[v] + for(var/v in stored_research.available_nodes) + if(stored_research.researched_nodes[v]) + continue + avail += stored_research.available_nodes[v] + for(var/v in stored_research.visible_nodes) + if(stored_research.available_nodes[v]) + continue + unavail += stored_research.visible_nodes[v] + l += "

    Technology Nodes:

    [RDSCREEN_NOBREAK]" + l += "

    Available for Research:

    " + for(var/datum/techweb_node/N in avail) + var/not_unlocked = (stored_research.available_nodes[N.id] && !stored_research.researched_nodes[N.id]) + var/has_points = (stored_research.research_points >= N.get_price(stored_research)) + var/research_href = not_unlocked? (has_points? "Research" : "Not Enough Points") : null + l += "[N.display_name][research_href]" + l += "

    Locked Nodes:

    " + for(var/datum/techweb_node/N in unavail) + l += "[N.display_name]" + l += "

    Researched Nodes:

    " + for(var/datum/techweb_node/N in res) + l += "[N.display_name]" l += "
    [RDSCREEN_NOBREAK]" return l -/obj/machinery/computer/rdconsole/proc/ui_techweb_nodeview() +/obj/machinery/computer/rdconsole/proc/ui_techweb_nodeview() //Legacy code RDSCREEN_UI_SNODE_CHECK var/list/l = list() if(stored_research.hidden_nodes[selected_node.id]) l += "

    ERROR: RESEARCH NODE UNKNOWN.

    " - return + l += "

    [selected_node.display_name]

    " + l += "Description: [selected_node.description]" + l += "Status: [stored_research.researched_nodes[selected_node.id]? "Researched" : "Locked"]" + l += "Point Cost: [selected_node.get_price(stored_research)].
    [RDSCREEN_NOBREAK]" + if(stored_research.researched_nodes[selected_node.id]) + l += "

    Already Researched

    [RDSCREEN_NOBREAK]" + else if(stored_research.available_nodes[selected_node.id]) + if(stored_research.research_points >= selected_node.get_price(stored_research)) + l += "

    Research

    [RDSCREEN_NOBREAK]" + else + l += "

    Not Enough Points

    [RDSCREEN_NOBREAK]" + else if(stored_research.visible_nodes[selected_node.id]) + l += "

    Prerequisites not met!

    [RDSCREEN_NOBREAK]" + else + l += "

    ERROR

    [RDSCREEN_NOBREAK]" + l += "

    Designs:

    [RDSCREEN_NOBREAK]" + for(var/i in selected_node.designs) + var/datum/design/D = selected_node.designs[i] + l += "[D.name]" + l += "

    Prerequisites:

    [RDSCREEN_NOBREAK]" + for(var/i in selected_node.prerequisites) + var/datum/techweb_node/prereq = selected_node.prerequisites[i] + var/sc = stored_research.researched_nodes[prereq.id] + var/begin + var/end + if(sc) + begin = "" + end = "" + else + begin = "" + end = "" + l += "[begin][prereq.display_name][end]" + l += "

    Unlocks:

    [RDSCREEN_NOBREAK]" + for(var/i in selected_node.unlocks) + var/datum/techweb_node/unlock = selected_node.unlocks[i] + l += "[unlock.display_name]" - l += "[RDSCREEN_NOBREAK]" - if (length(selected_node.prerequisites)) - l += "[RDSCREEN_NOBREAK]" - l += "[RDSCREEN_NOBREAK]" - if (length(selected_node.unlocks)) - l += "[RDSCREEN_NOBREAK]" - - l += "[RDSCREEN_NOBREAK]" - if (length(selected_node.prerequisites)) - l += "[RDSCREEN_NOBREAK]" - l += "[RDSCREEN_NOBREAK]" - if (length(selected_node.unlocks)) - l += "[RDSCREEN_NOBREAK]" - - l += "
    RequiresCurrent NodeUnlocks
    [RDSCREEN_NOBREAK]" - for (var/i in selected_node.prerequisites) - l += ui_techweb_single_node(selected_node.prerequisites[i]) - l += "[RDSCREEN_NOBREAK]" - l += ui_techweb_single_node(selected_node, selflink=FALSE) - l += "[RDSCREEN_NOBREAK]" - for (var/i in selected_node.unlocks) - l += ui_techweb_single_node(selected_node.unlocks[i]) - l += "
    [RDSCREEN_NOBREAK]" + l += "
    [RDSCREEN_NOBREAK]" return l /obj/machinery/computer/rdconsole/proc/ui_techweb_designview() //Legacy code RDSCREEN_UI_SDESIGN_CHECK var/list/l = list() var/datum/design/D = selected_design - l += "
    [D.icon_html(usr)][D.name]
    [RDSCREEN_NOBREAK]" + l += "
    Name: [D.name]" if(D.build_type) - var/lathes = list() - if(D.build_type & IMPRINTER) - lathes += "[machine_icon(/obj/machinery/rnd/circuit_imprinter)][RDSCREEN_NOBREAK]" - if (linked_imprinter && D.id in stored_research.researched_designs) - l += "Imprint" - if(D.build_type & PROTOLATHE) - lathes += "[machine_icon(/obj/machinery/rnd/protolathe)][RDSCREEN_NOBREAK]" - if (linked_lathe && D.id in stored_research.researched_designs) - l += "Construct" - if(D.build_type & AUTOLATHE) - lathes += "[machine_icon(/obj/machinery/autolathe)][RDSCREEN_NOBREAK]" - if(D.build_type & MECHFAB) - lathes += "[machine_icon(/obj/machinery/mecha_part_fabricator)][RDSCREEN_NOBREAK]" - if(D.build_type & BIOGENERATOR) - lathes += "[machine_icon(/obj/machinery/biogenerator)][RDSCREEN_NOBREAK]" - if(D.build_type & LIMBGROWER) - lathes += "[machine_icon(/obj/machinery/limbgrower)][RDSCREEN_NOBREAK]" - if(D.build_type & SMELTER) - lathes += "[machine_icon(/obj/machinery/mineral/processing_unit)][RDSCREEN_NOBREAK]" - l += "Construction types:" - l += lathes - l += "" - l += "Required materials:" + l += "Lathe Types:" + if(D.build_type & IMPRINTER) l += "Circuit Imprinter" + if(D.build_type & PROTOLATHE) l += "Protolathe" + if(D.build_type & AUTOLATHE) l += "Autolathe" + if(D.build_type & MECHFAB) l += "Exosuit Fabricator" + if(D.build_type & BIOGENERATOR) l += "Biogenerator" + if(D.build_type & LIMBGROWER) l += "Limbgrower" + if(D.build_type & SMELTER) l += "Smelter" + l += "Required Materials:" var/all_mats = D.materials + D.reagents_list for(var/M in all_mats) l += "* [CallMaterialName(M)] x [all_mats[M]]" - l += "Unlocked by:" - for (var/node in D.unlocked_by) - l += ui_techweb_single_node(node) l += "[RDSCREEN_NOBREAK]
    " return l @@ -812,8 +710,6 @@ doesn't have toxins access. if(ls["switch_screen"]) back = screen screen = text2num(ls["switch_screen"]) - if(ls["ui_mode"]) - ui_mode = text2num(ls["ui_mode"]) if(ls["lock_console"]) if(allowed(usr)) lock_console(usr) @@ -966,8 +862,7 @@ doesn't have toxins access. /obj/machinery/computer/rdconsole/interact(mob/user) user.set_machine(src) - var/datum/browser/popup = new(user, "rndconsole", name, 900, 600) - popup.add_stylesheet("techwebs", 'html/browser/techwebs.css') + var/datum/browser/popup = new(user, "rndconsole", name, 460, 550) popup.set_content(generate_ui()) popup.open() diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index ce98b911d3..ad75ddf07b 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -1,4 +1,5 @@ + //All devices that link into the R&D console fall into thise type for easy identification and some shared procs. @@ -10,13 +11,10 @@ use_power = IDLE_POWER_USE var/busy = FALSE var/hacked = FALSE - var/console_link = TRUE //allow console link. - var/requires_console = TRUE var/disabled = FALSE var/shocked = FALSE var/obj/machinery/computer/rdconsole/linked_console var/obj/item/loaded_item = null //the item loaded inside the machine (currently only used by experimentor and destructive analyzer) - var/allowed_department_flags = ALL /obj/machinery/rnd/proc/reset_busy() busy = FALSE @@ -80,26 +78,28 @@ /obj/machinery/rnd/proc/is_insertion_ready(mob/user) if(panel_open) to_chat(user, "You can't load [src] while it's opened!") - return FALSE - if(disabled) - return FALSE - if(requires_console && !linked_console) - to_chat(user, "[src] must be linked to an R&D console first!") - return FALSE - if(busy) + return + if (disabled) + return + if (!linked_console) // Try to auto-connect to new RnD consoles nearby. + if(!linked_console) + to_chat(user, "[src] must be linked to an R&D console first!") + return + if (busy) to_chat(user, "[src] is busy right now.") - return FALSE + return if(stat & BROKEN) to_chat(user, "[src] is broken.") - return FALSE + return if(stat & NOPOWER) to_chat(user, "[src] has no power.") - return FALSE + return if(loaded_item) to_chat(user, "[src] is already loaded.") - return FALSE + return return TRUE + //we eject the loaded item when deconstructing the machine /obj/machinery/rnd/on_deconstruction() if(loaded_item) diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 0e2e788b8f..af1dc853d8 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -82,6 +82,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi //Rating 1 + /obj/item/stock_parts/capacitor name = "capacitor" desc = "A basic capacitor used in the construction of a variety of devices." diff --git a/code/modules/research/techweb/__techweb_helpers.dm b/code/modules/research/techweb/__techweb_helpers.dm index af4fe7480b..adfa5c78d0 100644 --- a/code/modules/research/techweb/__techweb_helpers.dm +++ b/code/modules/research/techweb/__techweb_helpers.dm @@ -130,9 +130,6 @@ CHECK_TICK /proc/calculate_techweb_nodes() - for(var/design_id in SSresearch.techweb_designs) - var/datum/design/D = SSresearch.techweb_designs[design_id] - D.unlocked_by.Cut() for(var/node_id in SSresearch.techweb_nodes) var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id] node.prerequisites = list() @@ -141,9 +138,7 @@ for(var/i in node.prereq_ids) node.prerequisites[i] = SSresearch.techweb_nodes[i] for(var/i in node.design_ids) - var/datum/design/D = SSresearch.techweb_designs[i] - node.designs[i] = D - D.unlocked_by += node + node.designs[i] = SSresearch.techweb_designs[i] if(node.hidden) SSresearch.techweb_nodes_hidden[node.id] = node CHECK_TICK diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index d59dea55d3..74ace7e4c2 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -17,9 +17,6 @@ var/id = "generic" var/list/research_logs = list() //IC logs. var/max_bomb_value = 0 - var/organization = "Third-Party" //Organization name, used for display. - var/last_bitcoins = 0 //Current per-second production, used for display only. - var/list/tiers = list() //Assoc list, datum = number, 1 is available, 2 is all reqs are 1, so on /datum/techweb/New() for(var/i in SSresearch.techweb_nodes_starting) @@ -31,7 +28,6 @@ /datum/techweb/admin research_points = INFINITY //KEKKLES. id = "ADMIN" - organization = "CentCom" /datum/techweb/admin/New() //All unlocked. . = ..() @@ -42,7 +38,6 @@ /datum/techweb/science //Global science techweb for RND consoles. id = "SCIENCE" - organization = "Nanotrasen" /datum/techweb/Destroy() researched_nodes = null @@ -153,31 +148,15 @@ recalculate_nodes(TRUE) //Fully rebuild the tree. /datum/techweb/proc/boost_with_path(datum/techweb_node/N, itempath) - if(!istype(N) || !ispath(itempath)) + if(!istype(N)||!ispath(itempath)) return FALSE - boosted_nodes[N] = max(boosted_nodes[N], N.boost_item_paths[itempath]) - if(N.autounlock_by_boost) - hidden_nodes -= N.id + var/boost = N.boost_item_paths[itempath] + if(!boosted_nodes[N]) + boosted_nodes[N] = boost + if(N.autounlock_by_boost) + hidden_nodes -= N.id return TRUE -/datum/techweb/proc/update_tiers(datum/techweb_node/base) - var/list/current = list(base) - while (current.len) - var/list/next = list() - for (var/node_ in current) - var/datum/techweb_node/node = node_ - var/tier = 0 - if (!researched_nodes[node.id]) // researched is tier 0 - for (var/id in node.prereq_ids) - var/prereq_tier = tiers[node.prerequisites[id]] - tier = max(tier, prereq_tier + 1) - - if (tier != tiers[node]) - tiers[node] = tier - for (var/id in node.unlocks) - next += node.unlocks[id] - current = next - /datum/techweb/proc/update_node_status(datum/techweb_node/node, autoupdate_consoles = TRUE) var/researched = FALSE var/available = FALSE @@ -206,7 +185,6 @@ else if(visible) visible_nodes[node.id] = node - update_tiers(node) if(autoupdate_consoles) for(var/v in consoles_accessing) var/obj/machinery/computer/rdconsole/V = v diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index 3ec6c4cf9d..75faf07bf1 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -23,6 +23,8 @@ actual_cost = research_cost /datum/techweb_node/proc/get_price(datum/techweb/host) - if(host) - actual_cost = research_cost - host.boosted_nodes[src] + if(!host) + return actual_cost + var/discount = boost_item_paths[host.boosted_nodes[src]] + actual_cost = research_cost - discount return actual_cost diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index ba43a1c24b..96b252854b 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1,6 +1,6 @@ //Current rate: 132500 research points in 90 minutes -//Current cargo price: 280000 points for fullmaxed R&D. +//Current cargo price: 250000 points for fullmaxed R&D. //Base Node /datum/techweb_node/base @@ -9,7 +9,7 @@ display_name = "Basic Research Technology" description = "NT default research technologies." design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", - "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", + "destructive_analyzer", "protolathe", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "space_heater") //Default research tech, prevents bricking /////////////////////////Biotech///////////////////////// @@ -18,7 +18,7 @@ display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") - design_ids = list("chem_heater", "chem_master", "chem_dispenser", "sleeper", "pandemic") + design_ids = list("mass_spectrometer", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "pandemic") research_cost = 2500 export_price = 10000 @@ -27,16 +27,7 @@ display_name = "Advanced Biotechnology" description = "Advanced Biotechnology" prereq_ids = list("biotech") - design_ids = list("piercesyringe", "plasmarefiller", "limbgrower") - research_cost = 2500 - export_price = 10000 - -/datum/techweb_node/bio_process - id = "bio_process" - display_name = "Biological Processing" - description = "From slimes to kitchens." - prereq_ids = list("biotech") - design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave") + design_ids = list("piercesyringe", "adv_mass_spectrometer", "plasmarefiller", "limbgrower") research_cost = 2500 export_price = 10000 @@ -61,8 +52,8 @@ /////////////////////////engineering tech///////////////////////// /datum/techweb_node/engineering id = "engineering" + description = "Modern Engineering Technology." display_name = "Industrial Engineering" - description = "A refresher course on modern engineering technology." prereq_ids = list("base") design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", "atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "weldingmask", "mesons", "thermomachine", "tesla_coil", "grounding_rod", "apc_control") @@ -71,31 +62,13 @@ /datum/techweb_node/adv_engi id = "adv_engi" + description = "Advanced Engineering research" display_name = "Advanced Engineering" - description = "Pushing the boundaries of physics, one chainsaw-fist at a time." prereq_ids = list("engineering", "emp_basic") design_ids = list("engine_goggles", "diagnostic_hud", "magboots") research_cost = 2500 export_price = 10000 -/datum/techweb_node/high_efficiency - id = "high_efficiency" - display_name = "High Efficiency Parts" - description = "Finely-tooled manufacturing techniques allowing for picometer-perfect precision levels." - prereq_ids = list("engineering", "datatheory") - design_ids = list("pico_mani", "super_matter_bin") - research_cost = 2500 - export_price = 10000 - -/datum/techweb_node/adv_power - id = "adv_power" - display_name = "Advanced Power Manipulation" - description = "How to get more zap." - prereq_ids = list("engineering") - design_ids = list("smes", "super_cell", "hyper_cell", "super_capacitor", "superpacman", "mrspacman", "power_turbine", "power_turbine_console", "power_compressor") - research_cost = 2500 - export_price = 10000 - /////////////////////////Bluespace tech///////////////////////// /datum/techweb_node/bluespace_basic //Bluespace-memery id = "bluespace_basic" @@ -116,26 +89,6 @@ research_cost = 2500 export_price = 10000 -/datum/techweb_node/practical_bluespace - id = "practical_bluespace" - display_name = "Applied Bluespace Research" - description = "Using bluespace to make things faster and better." - prereq_ids = list("bluespace_basic", "engineering") - design_ids = list("bs_rped","minerbag_holding", "telesci_gps", "bluespacebeaker", "bluespacesyringe", "bluespacebodybag", "phasic_scanning") - research_cost = 2500 - export_price = 10000 - - -/datum/techweb_node/bluespace_power - id = "bluespace_power" - display_name = "Bluespace Power Technology" - description = "Even more powerful.. power!" - prereq_ids = list("adv_power", "adv_bluespace") - design_ids = list("bluespace_cell", "quadratic_capacitor") - research_cost = 2500 - export_price = 10000 - - /////////////////////////plasma tech///////////////////////// /datum/techweb_node/basic_plasma id = "basic_plasma" @@ -174,6 +127,112 @@ research_cost = 2500 export_price = 10000 +/////////////////////////EMP tech///////////////////////// +/datum/techweb_node/emp_basic //EMP tech for some reason + id = "emp_basic" + display_name = "Electromagnetic Theory" + description = "Study into usage of frequencies in the electromagnetic spectrum." + prereq_ids = list("base") + design_ids = list("holosign", "inducer", "tray_goggles", "holopad") + research_cost = 2500 + export_price = 10000 + +/datum/techweb_node/emp_adv + id = "emp_adv" + display_name = "Advanced Electromagnetic Theory" + prereq_ids = list("emp_basic") + design_ids = list("ultra_micro_laser") + research_cost = 2500 + export_price = 10000 + +/datum/techweb_node/emp_super + id = "emp_super" + display_name = "Quantum Electromagnetic Technology" //bs + description = "Even better electromagnetic technology" + prereq_ids = list("emp_adv") + design_ids = list("quadultra_micro_laser") + research_cost = 2500 + export_price = 10000 + +/////////////////////////Clown tech///////////////////////// +/datum/techweb_node/clown + id = "clown" + display_name = "Clown Technology" + description = "Honk?!" + prereq_ids = list("base") + design_ids = list("air_horn", "honker_main", "honker_peri", "honker_targ", "honk_chassis", "honk_head", "honk_torso", "honk_left_arm", "honk_right_arm", + "honk_left_leg", "honk_right_leg", "mech_banana_mortar", "mech_mousetrap_mortar", "mech_honker", "mech_punching_face", "implant_trombone") + research_cost = 2500 + export_price = 10000 + +////////////////////////Computer tech//////////////////////// +/datum/techweb_node/comptech + id = "comptech" + display_name = "Computer Consoles" + description = "Computers and how they work." + prereq_ids = list("datatheory") + design_ids = list("cargo", "cargorequest", "stockexchange", "libraryconsole", "aifixer", "mining", "crewconsole", "comconsole", "idcardconsole", "operating", "seccamera") + research_cost = 2500 + export_price = 10000 + +/datum/techweb_node/computer_hardware_basic //Modular computers are shitty and nearly useless so until someone makes them actually useful this can be easy to get. + id = "computer_hardware_basic" + display_name = "Computer Hardware" + description = "How computer hardware are made." + prereq_ids = list("comptech") + research_cost = 2500 + export_price = 10000 + design_ids = list("hdd_basic", "hdd_advanced", "hdd_super", "hdd_cluster", "ssd_small", "ssd_micro", "netcard_basic", "netcard_advanced", "netcard_wired", + "portadrive_basic", "portadrive_advanced", "portadrive_super", "cardslot", "aislot", "miniprinter", "APClink", "bat_control", "bat_normal", "bat_advanced", + "bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small") + +/datum/techweb_node/computer_board_gaming + id = "computer_board_gaming" + display_name = "Arcade Games" + description = "For the slackers on the station." + prereq_ids = list("comptech") + design_ids = list("arcade_battle", "arcade_orion", "slotmachine") + research_cost = 2500 + export_price = 10000 + +/datum/techweb_node/comp_recordkeeping + id = "comp_recordkeeping" + display_name = "Computerized Recordkeeping" + description = "Organized record databases and how they're used." + prereq_ids = list("comptech") + design_ids = list("secdata", "med_data", "prisonmanage", "vendor", "automated_announcement") + research_cost = 2500 + export_price = 10000 + +/datum/techweb_node/telecomms + id = "telecomms" + display_name = "Telecommunications Technology" + description = "Subspace transmission technology for near-instant communications devices." + prereq_ids = list("comptech", "bluespace_basic") + research_cost = 2500 + export_price = 10000 + design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server", + "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter") + +/datum/techweb_node/integrated_HUDs + id = "integrated_HUDs" + display_name = "Integrated HUDs" + description = "The usefulness of computerized records, projected straight onto your eyepiece!" + prereq_ids = list("comp_recordkeeping", "emp_basic") + design_ids = list("health_hud", "security_hud", "diagnostic_hud", "scigoggles") + research_cost = 2500 + export_price = 10000 + +/datum/techweb_node/NVGtech + id = "NVGtech" + display_name = "Night Vision Technology" + description = "Allows seeing in the dark without actual light!" + prereq_ids = list("integrated_HUDs", "adv_engi", "emp_adv") + design_ids = list("health_hud_night", "security_hud_night", "diagnostic_hud_night", "night_visision_goggles", "nvgmesons") + research_cost = 2500 + export_price = 10000 + +////////////////////////AI & Cyborg tech//////////////////////// /datum/techweb_node/neural_programming id = "neural_programming" display_name = "Neural Programming" @@ -222,7 +281,7 @@ /datum/techweb_node/cyborg_upg_med id = "cyborg_upg_med" display_name = "Cyborg Upgrades: Medical" - description = "Medical upgrades for cyborgs." + description = "Medical upgrades for cyborgs" prereq_ids = list("adv_biotech", "cyborg") design_ids = list("borg_upgrade_defibrillator", "borg_upgrade_piercinghypospray", "borg_upgrade_highstrengthsynthesiser", "borg_upgrade_expandedsynthesiser") research_cost = 2500 @@ -232,7 +291,7 @@ id = "cyborg_upg_combat" display_name = "Cyborg Upgrades: Combat" description = "Military grade upgrades for cyborgs." - prereq_ids = list("adv_robotics", "adv_engi" , "weaponry") + prereq_ids = list("adv_robotics", "adv_engi") design_ids = list("borg_upgrade_vtec", "borg_upgrade_disablercooler") research_cost = 2500 export_price = 10000 @@ -248,112 +307,6 @@ research_cost = 2500 export_price = 10000 -/////////////////////////EMP tech///////////////////////// -/datum/techweb_node/emp_basic //EMP tech for some reason - id = "emp_basic" - display_name = "Electromagnetic Theory" - description = "Study into usage of frequencies in the electromagnetic spectrum." - prereq_ids = list("base") - design_ids = list("holosign", "inducer", "tray_goggles", "holopad") - research_cost = 2500 - export_price = 10000 - -/datum/techweb_node/emp_adv - id = "emp_adv" - display_name = "Advanced Electromagnetic Theory" - description = "Determining whether reversing the polarity will actually help in a given situation." - prereq_ids = list("emp_basic") - design_ids = list("ultra_micro_laser") - research_cost = 2500 - export_price = 10000 - -/datum/techweb_node/emp_super - id = "emp_super" - display_name = "Quantum Electromagnetic Technology" //bs - description = "Even better electromagnetic technology." - prereq_ids = list("emp_adv") - design_ids = list("quadultra_micro_laser") - research_cost = 2500 - export_price = 10000 - -/////////////////////////Clown tech///////////////////////// -/datum/techweb_node/clown - id = "clown" - display_name = "Clown Technology" - description = "Honk?!" - prereq_ids = list("base") - design_ids = list("air_horn", "honker_main", "honker_peri", "honker_targ", "honk_chassis", "honk_head", "honk_torso", "honk_left_arm", "honk_right_arm", - "honk_left_leg", "honk_right_leg", "mech_banana_mortar", "mech_mousetrap_mortar", "mech_honker", "mech_punching_face", "implant_trombone") - research_cost = 2500 - export_price = 10000 - -////////////////////////Computer tech//////////////////////// -/datum/techweb_node/comptech - id = "comptech" - display_name = "Computer Consoles" - description = "Computers and how they work." - prereq_ids = list("datatheory") - design_ids = list("cargo", "cargorequest", "stockexchange", "libraryconsole", "aifixer", "mining", "crewconsole", "comconsole", "idcardconsole", "operating", "seccamera") - research_cost = 2500 - export_price = 10000 - -/datum/techweb_node/computer_hardware_basic //Modular computers are shitty and nearly useless so until someone makes them actually useful this can be easy to get. - id = "computer_hardware_basic" - display_name = "Computer Hardware" - description = "How computer hardware are made." - prereq_ids = list("comptech") - research_cost = 2500 - export_price = 10000 - design_ids = list("hdd_basic", "hdd_advanced", "hdd_super", "hdd_cluster", "ssd_small", "ssd_micro", "netcard_basic", "netcard_advanced", "netcard_wired", - "portadrive_basic", "portadrive_advanced", "portadrive_super", "cardslot", "aislot", "miniprinter", "APClink", "bat_control", "bat_normal", "bat_advanced", - "bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small") - -/datum/techweb_node/computer_board_gaming - id = "computer_board_gaming" - display_name = "Arcade Games" - description = "For the slackers on the station." - prereq_ids = list("comptech") - design_ids = list("arcade_battle", "arcade_orion", "slotmachine") - research_cost = 1000 - export_price = 10000 - -/datum/techweb_node/comp_recordkeeping - id = "comp_recordkeeping" - display_name = "Computerized Recordkeeping" - description = "Organized record databases and how they're used." - prereq_ids = list("comptech") - design_ids = list("secdata", "med_data", "prisonmanage", "vendor", "automated_announcement") - research_cost = 2500 - export_price = 10000 - -/datum/techweb_node/telecomms - id = "telecomms" - display_name = "Telecommunications Technology" - description = "Subspace transmission technology for near-instant communications devices." - prereq_ids = list("comptech", "bluespace_basic") - research_cost = 2500 - export_price = 10000 - design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server", - "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter") - -/datum/techweb_node/integrated_HUDs - id = "integrated_HUDs" - display_name = "Integrated HUDs" - description = "The usefulness of computerized records, projected straight onto your eyepiece!" - prereq_ids = list("comp_recordkeeping", "emp_basic") - design_ids = list("health_hud", "security_hud", "diagnostic_hud", "scigoggles") - research_cost = 2500 - export_price = 10000 - -/datum/techweb_node/NVGtech - id = "NVGtech" - display_name = "Night Vision Technology" - description = "Allows seeing in the dark without actual light!" - prereq_ids = list("integrated_HUDs", "adv_engi", "emp_adv") - design_ids = list("health_hud_night", "security_hud_night", "diagnostic_hud_night", "night_visision_goggles", "nvgmesons") - research_cost = 2500 - export_price = 10000 - ////////////////////////Medical//////////////////////// /datum/techweb_node/cloning id = "cloning" @@ -370,7 +323,7 @@ description = "Smart freezing of objects to preserve them!" prereq_ids = list("adv_engi", "emp_basic", "biotech") design_ids = list("splitbeaker", "noreactsyringe", "cryotube", "cryo_Grenade") - research_cost = 2000 + research_cost = 2500 export_price = 10000 /datum/techweb_node/subdermal_implants @@ -404,7 +357,7 @@ id = "adv_cyber_implants" display_name = "Advanced Cybernetic Implants" description = "Upgraded and more powerful cybernetic implants." - prereq_ids = list("neural_programming", "cyber_implants","integrated_HUDs") + prereq_ids = list("neural_programming", "cyber_implants") design_ids = list("ci-toolset", "ci-surgery", "ci-reviver") research_cost = 2500 export_price = 10000 @@ -413,11 +366,40 @@ id = "combat_cyber_implants" display_name = "Combat Cybernetic Implants" description = "Military grade combat implants to improve performance." - prereq_ids = list("adv_cyber_implants","weaponry","NVGtech","high_efficiency") + prereq_ids = list("adv_cyber_implants") //Needs way more reqs. design_ids = list("ci-xray", "ci-thermals", "ci-antidrop", "ci-antistun", "ci-thrusters") research_cost = 2500 export_price = 10000 +////////////////////////generic biotech//////////////////////// +/datum/techweb_node/bio_process + id = "bio_process" + display_name = "Biological Processing" + description = "From slimes to kitchens." + prereq_ids = list("biotech") + design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave") + research_cost = 2500 + export_price = 10000 + +////////////////////////generic engineering//////////////////////// +/datum/techweb_node/high_efficiency + id = "high_efficiency" + display_name = "High Efficiency Parts" + description = "High Efficiency Parts" + prereq_ids = list("engineering", "datatheory") + design_ids = list("pico_mani", "super_matter_bin") + research_cost = 2500 + export_price = 10000 + +/datum/techweb_node/adv_power + id = "adv_power" + display_name = "Advanced Power Manipulation" + description = "How to get more zap." + prereq_ids = list("engineering") + design_ids = list("smes", "super_cell", "hyper_cell", "super_capacitor", "superpacman", "mrspacman", "power_turbine", "power_turbine_console", "power_compressor") + research_cost = 2500 + export_price = 10000 + ////////////////////////Tools//////////////////////// /datum/techweb_node/basic_mining id = "basic_mining" @@ -437,6 +419,15 @@ research_cost = 2500 export_price = 10000 +/datum/techweb_node/practical_bluespace + id = "practical_bluespace" + display_name = "Applied Bluespace Research" + description = "Using bluespace to make things faster and better." + prereq_ids = list("bluespace_basic", "engineering") + design_ids = list("bs_rped","minerbag_holding", "telesci_gps", "bluespacebeaker", "bluespacesyringe", "bluespacebodybag", "phasic_scanning") + research_cost = 2500 + export_price = 10000 + /datum/techweb_node/janitor id = "janitor" display_name = "Advanced Sanitation Technology" @@ -464,13 +455,22 @@ research_cost = 2500 export_price = 10000 -/datum/techweb_node/exp_flight - id = "exp_flight" +/datum/techweb_node/exp_equipment + id = "exp_equipment" display_name = "Experimental Flight Equipment" description = "Highly advanced construction tools." design_ids = list("flightshoes", "flightpack", "flightsuit") - prereq_ids = list("adv_engi","integrated_HUDs", "adv_power" , "high_efficiency") - research_cost = 5000 + prereq_ids = list("adv_engi") + research_cost = 2500 + export_price = 10000 + +/datum/techweb_node/bluespace_power + id = "bluespace_power" + display_name = "Bluespace Power Technology" + description = "Even more powerful.. power!" + prereq_ids = list("adv_power", "adv_bluespace") + design_ids = list("bluespace_cell", "quadratic_capacitor") + research_cost = 2500 export_price = 10000 /////////////////////////weaponry tech///////////////////////// @@ -496,7 +496,7 @@ id = "electronic_weapons" display_name = "Electric Weapons" description = "Weapons using electric technology" - prereq_ids = list("weaponry", "adv_power" , "emp_basic") + prereq_ids = list("weaponry", "adv_power") design_ids = list("stunrevolver", "stunshell", "tele_shield") research_cost = 2500 export_price = 10000 @@ -506,7 +506,7 @@ display_name = "Radioactive Weaponry" description = "Weapons using radioactive technology." prereq_ids = list("adv_engi", "adv_weaponry") - design_ids = list("nuclear_gun") + design_ids = list("nuclear_gun", "decloner") research_cost = 2500 export_price = 10000 @@ -586,8 +586,8 @@ /datum/techweb_node/adv_mecha id = "adv_mecha" - display_name = "Advanced Exosuits" - description = "For when you just aren't Gundam enough." + display_name = "Mechanical Exosuits" + description = "Mechanized exosuits that are several magnitudes stronger and more powerful than the average human." prereq_ids = list("adv_robotics", "mecha") design_ids = list("mech_repair_droid") research_cost = 2500 @@ -627,7 +627,7 @@ id = "mecha_phazon" display_name = "EXOSUIT: Phazon" description = "Phazon exosuit designs" - prereq_ids = list("adv_mecha", "weaponry" , "adv_bluespace") + prereq_ids = list("adv_mecha", "weaponry") design_ids = list("phazon_chassis", "phazon_torso", "phazon_head", "phazon_left_arm", "phazon_right_arm", "phazon_left_leg", "phazon_right_leg", "phazon_main", "phazon_peri", "phazon_targ", "phazon_armor") research_cost = 2500 @@ -637,7 +637,7 @@ id = "mech_tools" display_name = "Basic Exosuit Equipment" description = "Various tools fit for basic mech units" - prereq_ids = list("mecha") + prereq_ids = list("mecha", "engineering") design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer") research_cost = 2500 export_price = 10000 @@ -646,7 +646,7 @@ id = "adv_mecha_tools" display_name = "Advanced Exosuit Equipment" description = "Tools for high level mech suits" - prereq_ids = list("adv_mecha", "mech_tools") + prereq_ids = list("adv_mecha", "mech_tools", "adv_engi") design_ids = list("mech_rcd") research_cost = 2500 export_price = 10000 @@ -662,9 +662,9 @@ /datum/techweb_node/mech_modules id = "adv_mecha_modules" - display_name = "Simple Exosuit Modules" + display_name = "Basic Exosuit Modules" description = "An advanced piece of mech weaponry" - prereq_ids = list("adv_mecha", "bluespace_power") + prereq_ids = list("adv_mecha", "adv_power") design_ids = list("mech_energy_relay", "mech_ccw_armor", "mech_proj_armor", "mech_generator_nuclear") research_cost = 2500 export_price = 10000 @@ -779,7 +779,7 @@ /datum/techweb_node/mech_lmg id = "mech_lmg" - display_name = "Exosuit Weapon (\"Ultra AC 2\" LMG)" + display_name = "Exosuit Weapon (PBT \"Pacifier\" Mounted Taser)" description = "An advanced piece of mech weaponry" prereq_ids = list("adv_mecha", "adv_weaponry", "ballistic_weapons") design_ids = list("mech_lmg") @@ -800,12 +800,12 @@ id = "alientech" display_name = "Alien Technology" description = "Things used by the greys." - prereq_ids = list("biotech","engineering") + prereq_ids = list("base") boost_item_paths = list(/obj/item/gun/energy/alien = 0, /obj/item/scalpel/alien = 0, /obj/item/hemostat/alien = 0, /obj/item/retractor/alien = 0, /obj/item/circular_saw/alien = 0, /obj/item/cautery/alien = 0, /obj/item/surgicaldrill/alien = 0, /obj/item/screwdriver/abductor = 0, /obj/item/wrench/abductor = 0, /obj/item/crowbar/abductor = 0, /obj/item/device/multitool/abductor = 0, /obj/item/weldingtool/abductor = 0, /obj/item/wirecutters/abductor = 0, /obj/item/circuitboard/machine/abductor = 0, /obj/item/abductor_baton = 0, /obj/item/device/abductor = 0) - research_cost = 5000 - export_price = 20000 + research_cost = 2500 + export_price = 10000 hidden = TRUE design_ids = list("alienalloy") @@ -813,13 +813,13 @@ id = "alien_bio" display_name = "Alien Biological Tools" description = "Advanced biological tools." - prereq_ids = list("alientech", "adv_biotech") + prereq_ids = list("alientech", "biotech") design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery") boost_item_paths = list(/obj/item/gun/energy/alien = 0, /obj/item/scalpel/alien = 0, /obj/item/hemostat/alien = 0, /obj/item/retractor/alien = 0, /obj/item/circular_saw/alien = 0, /obj/item/cautery/alien = 0, /obj/item/surgicaldrill/alien = 0, /obj/item/screwdriver/abductor = 0, /obj/item/wrench/abductor = 0, /obj/item/crowbar/abductor = 0, /obj/item/device/multitool/abductor = 0, /obj/item/weldingtool/abductor = 0, /obj/item/wirecutters/abductor = 0, /obj/item/circuitboard/machine/abductor = 0, /obj/item/abductor_baton = 0, /obj/item/device/abductor = 0) research_cost = 2500 - export_price = 20000 + export_price = 10000 hidden = TRUE /datum/techweb_node/alien_engi @@ -831,38 +831,9 @@ /obj/item/weldingtool/abductor = 0, /obj/item/wirecutters/abductor = 0, /obj/item/circuitboard/machine/abductor = 0, /obj/item/abductor_baton = 0, /obj/item/device/abductor = 0) design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool") research_cost = 2500 - export_price = 20000 - hidden = TRUE - -/datum/techweb_node/syndicate_basic - id = "syndicate_basic" - display_name = "Illegal Technology" - description = "Dangerous research used to create dangerous objects." - prereq_ids = list("adv_engi", "adv_weaponry", "explosive_weapons") - design_ids = list("decloner", "borg_syndicate_module", "suppressor", "largecrossbow") - research_cost = 10000 export_price = 10000 hidden = TRUE -/datum/techweb_node/syndicate_basic/New() //Crappy way of making syndicate gear decon supported until there's another way. - . = ..() - boost_item_paths = list() - for(var/cat in GLOB.uplink_items) - var/list/l = cat - for(var/i in l) - var/datum/uplink_item/UI = i - boost_item_paths[UI.item] = 0 //allows deconning to unlock. - -//HELPERS -/proc/total_techweb_exports() - var/list/datum/techweb_node/processing = list() - for(var/i in subtypesof(/datum/techweb_node)) - processing += new i - . = 0 - for(var/i in processing) - var/datum/techweb_node/TN = i - . += TN.export_price - /proc/total_techweb_points() var/list/datum/techweb_node/processing = list() for(var/i in subtypesof(/datum/techweb_node)) @@ -871,3 +842,19 @@ for(var/i in processing) var/datum/techweb_node/TN = i . += TN.research_cost + +/* +/datum/design/borg_syndicate_module + name = "Cyborg Upgrade (Illegal Modules)" + id = "borg_syndicate_module" + construction_time = 120 + +/datum/design/suppressor + name = "Universal Suppressor" + id = "suppressor" + +/datum/design/largecrossbow + name = "Energy Crossbow" + id = "largecrossbow" + build_path = /obj/item/gun/energy/kinetic_accelerator/crossbow/large +*/ \ No newline at end of file diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 09f241609e..cf250f50f1 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -12,7 +12,6 @@ throw_speed = 3 throw_range = 6 container_type = INJECTABLE_1 - grind_results = list() var/Uses = 1 // uses before it goes inert var/qdel_timer = null // deletion timer, for delayed reactions @@ -30,10 +29,6 @@ . = ..() create_reagents(100) -/obj/item/slime_extract/on_grind() - if(Uses) - grind_results["slimejelly"] = 20 - /obj/item/slime_extract/grey name = "grey slime extract" icon_state = "grey slime extract" @@ -472,7 +467,7 @@ desc = "A golem's head." resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF flags_1 = ABSTRACT_1 | NODROP_1 - + /obj/item/stack/tile/bluespace name = "bluespace floor tile" singular_name = "floor tile" diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index e5c36d09c4..ce467a1181 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -399,7 +399,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) name = "burnt stone surrounding tile" icon_state = "burnt_surrounding_tile1" tile_key = "burnt_surrounding_tile" - + #undef STABLE #undef COLLAPSE_ON_CROSS #undef DESTROY_ON_CROSS diff --git a/code/modules/ruins/spaceruin_code/listeningstation.dm b/code/modules/ruins/spaceruin_code/listeningstation.dm index 5afdc602b8..0c2ec7817d 100644 --- a/code/modules/ruins/spaceruin_code/listeningstation.dm +++ b/code/modules/ruins/spaceruin_code/listeningstation.dm @@ -24,7 +24,7 @@ /obj/item/paper/fluff/ruins/listeningstation/reports/june name = "june report" - info = "Nanotrasen communications have been noticeably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it." + info = "Nanotrasen communications have been noticably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it." /obj/item/paper/fluff/ruins/listeningstation/reports/may name = "may report" diff --git a/code/modules/ruins/spaceruin_code/oldstation.dm b/code/modules/ruins/spaceruin_code/oldstation.dm index d023760061..edea4fe0c1 100644 --- a/code/modules/ruins/spaceruin_code/oldstation.dm +++ b/code/modules/ruins/spaceruin_code/oldstation.dm @@ -44,6 +44,6 @@ /obj/item/paper/fluff/ruins/oldstation/report name = "Crew Reawakening Report" info = "Artifical Program's report to surviving crewmembers.

    Crew were placed into cryostasis on March 10th, 2445.

    Crew were awoken from cryostasis around June, 2557.

    \ - SIGNIFICANT EVENTS OF NOTE
    1: The primary radiation detectors were taken offline after 112 years due to power failure, secondary radiation detectors showed no residual \ - radiation on station. Deduction, primarily detector was malfunctioning and was producing a radiation signal when there was none.

    2: A data burst from a nearby Nanotrasen Space \ + SIGNIFICANT EVENTS OF NOTE
    1: The primary radiation detectors were taken offline after 112 years due to power failure, secondary radioation detectors showed no residual \ + radioation on station. Deduction, primariy detector was malfunctioning and was producing a radioation signal when there was none.

    2: A data burst from a nearby Nanotrasen Space \ Station was recieved, this data burst contained research data that has been uploaded to our RnD labs.

    3: Unknown invasion force has occupied Delta station." diff --git a/code/modules/ruins/spaceruin_code/spacehotel.dm b/code/modules/ruins/spaceruin_code/spacehotel.dm index 69eebd8535..5f20bafb68 100644 --- a/code/modules/ruins/spaceruin_code/spacehotel.dm +++ b/code/modules/ruins/spaceruin_code/spacehotel.dm @@ -7,6 +7,6 @@ /obj/item/paper/pamphlet/ruin/spacehotel name = "hotel pamphlet" - info = "
    The Twin Nexus Hotel

    A place of Sanctuary


    Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff stride to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more information.
    " + info = "
    The Twin Nexus Hotel

    A place of Sanctuary


    Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff stride to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more infomation.
    " diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index 5f2cc3d9ea..2c0ffd3a34 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -76,7 +76,7 @@ GLOBAL_VAR_INIT(security_level, 0) FA.update_icon() for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines) pod.admin_controlled = 0 - SSblackbox.record_feedback("tally", "security_level_changes", 1, get_security_level()) + SSblackbox.record_feedback("tally", "security_level_changes", 1, level) else return diff --git a/code/modules/server_tools/st_commands.dm b/code/modules/server_tools/st_commands.dm index 1e071550e0..9ec87a595c 100644 --- a/code/modules/server_tools/st_commands.dm +++ b/code/modules/server_tools/st_commands.dm @@ -51,7 +51,7 @@ /* The MIT License -Copyright (c) 2017 Jordan Brown +Copyright (c) 2011 Dominic Tarr Permission is hereby granted, free of charge, to any person obtaining a copy of this software and diff --git a/code/modules/server_tools/st_interface.dm b/code/modules/server_tools/st_interface.dm index b0b1b0a43c..39bebbbb3d 100644 --- a/code/modules/server_tools/st_interface.dm +++ b/code/modules/server_tools/st_interface.dm @@ -30,10 +30,7 @@ SERVER_TOOLS_DEFINE_AND_SET_GLOBAL(server_tools_api_compatible, FALSE) return if(skip_compat_check && !fexists(SERVICE_INTERFACE_DLL)) CRASH("Service parameter present but no interface DLL detected. This is symptomatic of running a service less than version 3.1! Please upgrade.") - var/instance = params[SERVICE_INSTANCE_PARAM] - if(!instance) - instance = "TG Station Server" //maybe just upgraded - call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance, command) //trust no retval + call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(command) //trust no retval return TRUE /world/proc/ChatBroadcast(message) @@ -75,7 +72,7 @@ SERVER_TOOLS_DEFINE_AND_SET_GLOBAL(server_tools_api_compatible, FALSE) switch(command) if(SERVICE_CMD_API_COMPATIBLE) SERVER_TOOLS_WRITE_GLOBAL(server_tools_api_compatible, TRUE) - return SERVICE_RETURN_SUCCESS + return "SUCCESS" if(SERVICE_CMD_HARD_REBOOT) if(SERVER_TOOLS_READ_GLOBAL(reboot_mode) != REBOOT_MODE_HARD) SERVER_TOOLS_WRITE_GLOBAL(reboot_mode, REBOOT_MODE_HARD) @@ -91,7 +88,7 @@ SERVER_TOOLS_DEFINE_AND_SET_GLOBAL(server_tools_api_compatible, FALSE) if(!istext(msg) || !msg) return "No message set!" SERVER_TOOLS_WORLD_ANNOUNCE(msg) - return SERVICE_RETURN_SUCCESS + return "SUCCESS" if(SERVICE_CMD_PLAYER_COUNT) return "[SERVER_TOOLS_CLIENT_COUNT]" if(SERVICE_CMD_LIST_CUSTOM) @@ -99,13 +96,13 @@ SERVER_TOOLS_DEFINE_AND_SET_GLOBAL(server_tools_api_compatible, FALSE) else var/custom_command_result = HandleServiceCustomCommand(lowertext(command), params[SERVICE_CMD_PARAM_SENDER], params[SERVICE_CMD_PARAM_CUSTOM]) if(custom_command_result) - return istext(custom_command_result) ? custom_command_result : SERVICE_RETURN_SUCCESS + return istext(custom_command_result) ? custom_command_result : "SUCCESS" return "Unknown command: [command]" /* The MIT License -Copyright (c) 2017 Jordan Brown +Copyright (c) 2011 Dominic Tarr Permission is hereby granted, free of charge, to any person obtaining a copy of this software and diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index b48d38691c..dd5a60ace7 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -200,5 +200,5 @@ /obj/docking_port/mobile/arrivals/vv_edit_var(var_name, var_value) switch(var_name) if("perma_docked") - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("arrivals shuttle", "[var_value ? "stopped" : "started"]")) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "ShA[var_value ? "s" : "g"]") return ..() diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index c3efc5fc55..c4eb16305a 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -301,7 +301,6 @@ var/datum/DBQuery/query_round_shuttle_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET shuttle_name = '[name]' WHERE id = [GLOB.round_id]") query_round_shuttle_name.Execute() - if(SHUTTLE_DOCKED) if(time_left <= ENGINES_START_TIME) mode = SHUTTLE_IGNITING diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index de1b0022f6..65636aa528 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -119,7 +119,7 @@ return if(!my_port) - my_port = new(locate(eyeobj.x - x_offset, eyeobj.y - y_offset, eyeobj.z)) + my_port = new /obj/docking_port/stationary() my_port.name = shuttlePortName my_port.id = shuttlePortId my_port.height = shuttle_port.height @@ -128,6 +128,7 @@ my_port.dwidth = shuttle_port.dwidth my_port.hidden = shuttle_port.hidden my_port.dir = the_eye.dir + my_port.loc = locate(eyeobj.x - x_offset, eyeobj.y - y_offset, eyeobj.z) if(current_user.client) current_user.client.images -= the_eye.placed_images diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index de2b569687..c7a77f9457 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -15,10 +15,6 @@ All ShuttleMove procs go here // Only gets called if fromShuttleMove returns true first // returns the new move_mode (based on the old) /turf/proc/toShuttleMove(turf/oldT, move_mode, obj/docking_port/mobile/shuttle) - . = move_mode - if(!(. & MOVE_TURF)) - return - var/shuttle_dir = shuttle.dir for(var/i in contents) var/atom/movable/thing = i @@ -42,6 +38,8 @@ All ShuttleMove procs go here else qdel(thing) + return move_mode + // Called on the old turf to move the turf data /turf/proc/onShuttleMove(turf/newT, list/movement_force, move_dir) if(newT == src) // In case of in place shuttle rotation shenanigans. diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 02bee0856e..a4303078a5 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -568,7 +568,7 @@ continue move_mode = moving_atom.beforeShuttleMove(newT, rotation, move_mode) //atoms - move_mode = oldT.fromShuttleMove(newT, underlying_turf_type, baseturf_cache, move_mode) //turfs + move_mode = oldT.fromShuttleMove(newT, underlying_turf_type, baseturf_cache, move_mode) //turfs move_mode = newT.toShuttleMove(oldT, move_mode , src) //turfs if(move_mode & MOVE_AREA) diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm index b6d9bda8b2..46aa4b6576 100644 --- a/code/modules/shuttle/white_ship.dm +++ b/code/modules/shuttle/white_ship.dm @@ -17,4 +17,3 @@ x_offset = -6 y_offset = -10 designate_time = 100 - diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 316dde05df..85956b0c6d 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -189,7 +189,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th var/mob/living/carbon/human/H = user - if((invocation_type == "whisper" || invocation_type == "shout") && !H.can_speak_vocal()) + if((invocation_type == "whisper" || invocation_type == "shout") && H.is_muzzled()) to_chat(user, "You can't get the words out!") return 0 diff --git a/code/modules/spells/spell_types/dumbfire.dm b/code/modules/spells/spell_types/dumbfire.dm index f86c29fdc2..bb6e4480f5 100644 --- a/code/modules/spells/spell_types/dumbfire.dm +++ b/code/modules/spells/spell_types/dumbfire.dm @@ -1,41 +1,41 @@ //NEEDS MAJOR CODE CLEANUP -/obj/effect/proc_holder/spell/dumbfire - - var/projectile_type = "" - var/activate_on_collision = 1 - - var/proj_icon = 'icons/obj/projectiles.dmi' - var/proj_icon_state = "spell" - var/proj_name = "a spell projectile" - - var/proj_trail = 0 //if it leaves a trail - var/proj_trail_lifespan = 0 //deciseconds - var/proj_trail_icon = 'icons/obj/wizard.dmi' - var/proj_trail_icon_state = "trail" - - var/proj_type = "/obj/effect/proc_holder/spell" //IMPORTANT use only subtypes of this - - var/proj_insubstantial = 0 //if it can pass through dense objects or not - var/proj_trigger_range = 1 //the range from target at which the projectile triggers cast(target) - - var/proj_lifespan = 100 //in deciseconds * proj_step_delay - var/proj_step_delay = 1 //lower = faster - -/obj/effect/proc_holder/spell/dumbfire/choose_targets(mob/user = usr) - - var/turf/T = get_turf(user) - for(var/i = 1; i < range; i++) - var/turf/new_turf = get_step(T, user.dir) - if(new_turf.density) - break - T = new_turf - perform(list(T),user = user) - -/obj/effect/proc_holder/spell/dumbfire/cast(list/targets, mob/user = usr) - playMagSound() - for(var/turf/target in targets) +/obj/effect/proc_holder/spell/dumbfire + + var/projectile_type = "" + var/activate_on_collision = 1 + + var/proj_icon = 'icons/obj/projectiles.dmi' + var/proj_icon_state = "spell" + var/proj_name = "a spell projectile" + + var/proj_trail = 0 //if it leaves a trail + var/proj_trail_lifespan = 0 //deciseconds + var/proj_trail_icon = 'icons/obj/wizard.dmi' + var/proj_trail_icon_state = "trail" + + var/proj_type = "/obj/effect/proc_holder/spell" //IMPORTANT use only subtypes of this + + var/proj_insubstantial = 0 //if it can pass through dense objects or not + var/proj_trigger_range = 1 //the range from target at which the projectile triggers cast(target) + + var/proj_lifespan = 100 //in deciseconds * proj_step_delay + var/proj_step_delay = 1 //lower = faster + +/obj/effect/proc_holder/spell/dumbfire/choose_targets(mob/user = usr) + + var/turf/T = get_turf(user) + for(var/i = 1; i < range; i++) + var/turf/new_turf = get_step(T, user.dir) + if(new_turf.density) + break + T = new_turf + perform(list(T),user = user) + +/obj/effect/proc_holder/spell/dumbfire/cast(list/targets, mob/user = usr) + playMagSound() + for(var/turf/target in targets) launch_at(target, user) /obj/effect/proc_holder/spell/dumbfire/proc/launch_at(turf/target, mob/user) diff --git a/code/modules/spells/spell_types/genetic.dm b/code/modules/spells/spell_types/genetic.dm index 48d0d7cfbe..c6945dab50 100644 --- a/code/modules/spells/spell_types/genetic.dm +++ b/code/modules/spells/spell_types/genetic.dm @@ -1,28 +1,28 @@ -/obj/effect/proc_holder/spell/targeted/genetic - name = "Genetic" - desc = "This spell inflicts a set of mutations and disabilities upon the target." - - var/disabilities = 0 //bits - var/list/mutations = list() //mutation strings - var/duration = 100 //deciseconds - /* - Disabilities - 1st bit - ? - 2nd bit - ? - 3rd bit - ? - 4th bit - ? - 5th bit - ? - 6th bit - ? - */ - -/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets,mob/user = usr) - playMagSound() - for(var/mob/living/carbon/target in targets) - if(!target.dna) - continue - for(var/A in mutations) - target.dna.add_mutation(A) - target.disabilities |= disabilities +/obj/effect/proc_holder/spell/targeted/genetic + name = "Genetic" + desc = "This spell inflicts a set of mutations and disabilities upon the target." + + var/disabilities = 0 //bits + var/list/mutations = list() //mutation strings + var/duration = 100 //deciseconds + /* + Disabilities + 1st bit - ? + 2nd bit - ? + 3rd bit - ? + 4th bit - ? + 5th bit - ? + 6th bit - ? + */ + +/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets,mob/user = usr) + playMagSound() + for(var/mob/living/carbon/target in targets) + if(!target.dna) + continue + for(var/A in mutations) + target.dna.add_mutation(A) + target.disabilities |= disabilities addtimer(CALLBACK(src, .proc/remove, target), duration) /obj/effect/proc_holder/spell/targeted/genetic/proc/remove(mob/living/carbon/target) diff --git a/code/modules/spells/spell_types/knock.dm b/code/modules/spells/spell_types/knock.dm index 7179bed031..bbb2b3877f 100644 --- a/code/modules/spells/spell_types/knock.dm +++ b/code/modules/spells/spell_types/knock.dm @@ -1,31 +1,31 @@ -/obj/effect/proc_holder/spell/aoe_turf/knock - name = "Knock" - desc = "This spell opens nearby doors and does not require wizard garb." - - school = "transmutation" - charge_max = 100 - clothes_req = 0 - invocation = "AULIE OXIN FIERA" - invocation_type = "whisper" - range = 3 - cooldown_min = 20 //20 deciseconds reduction per rank - - action_icon_state = "knock" - -/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets,mob/user = usr) +/obj/effect/proc_holder/spell/aoe_turf/knock + name = "Knock" + desc = "This spell opens nearby doors and does not require wizard garb." + + school = "transmutation" + charge_max = 100 + clothes_req = 0 + invocation = "AULIE OXIN FIERA" + invocation_type = "whisper" + range = 3 + cooldown_min = 20 //20 deciseconds reduction per rank + + action_icon_state = "knock" + +/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets,mob/user = usr) SEND_SOUND(user, sound('sound/magic/knock.ogg')) - for(var/turf/T in targets) - for(var/obj/machinery/door/door in T.contents) - INVOKE_ASYNC(src, .proc/open_door, door) - for(var/obj/structure/closet/C in T.contents) - INVOKE_ASYNC(src, .proc/open_closet, C) - -/obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_door(var/obj/machinery/door/door) - if(istype(door, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/A = door - A.locked = FALSE - door.open() - -/obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_closet(var/obj/structure/closet/C) - C.locked = FALSE - C.open() + for(var/turf/T in targets) + for(var/obj/machinery/door/door in T.contents) + INVOKE_ASYNC(src, .proc/open_door, door) + for(var/obj/structure/closet/C in T.contents) + INVOKE_ASYNC(src, .proc/open_closet, C) + +/obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_door(var/obj/machinery/door/door) + if(istype(door, /obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/A = door + A.locked = FALSE + door.open() + +/obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_closet(var/obj/structure/closet/C) + C.locked = FALSE + C.open() diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm index 28960fce31..4e5c0605e2 100644 --- a/code/modules/spells/spell_types/mime.dm +++ b/code/modules/spells/spell_types/mime.dm @@ -125,6 +125,146 @@ ..() +/obj/item/spellbook/oneuse/mimery_blockade + spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime + spellname = "" + name = "Guide to Advanced Mimery Vol 1" + desc = "The pages don't make any sound when turned." + icon_state ="bookmime" + +/obj/item/spellbook/oneuse/mimery_guns + spell = /obj/effect/proc_holder/spell/aimed/finger_guns + spellname = "" + name = "Guide to Advanced Mimery Vol 2" + desc = "There aren't any words written..." + icon_state ="bookmime" +/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall + name = "Invisible Wall" + desc = "The mime's performance transmutates into physical reality." + school = "mime" + panel = "Mime" + summon_type = list(/obj/effect/forcefield/mime) + invocation_type = "emote" + invocation_emote_self = "You form a wall in front of yourself." + summon_lifespan = 300 + charge_max = 300 + clothes_req = 0 + range = 0 + cast_sound = null + human_req = 1 + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + +/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click() + if(usr && usr.mind) + if(!usr.mind.miming) + to_chat(usr, "You must dedicate yourself to silence first.") + return + invocation = "[usr.real_name] looks as if a wall is in front of [usr.p_them()]." + else + invocation_type ="none" + ..() + + +/obj/effect/proc_holder/spell/targeted/mime/speak + name = "Speech" + desc = "Make or break a vow of silence." + school = "mime" + panel = "Mime" + clothes_req = 0 + human_req = 1 + charge_max = 3000 + range = -1 + include_user = 1 + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + +/obj/effect/proc_holder/spell/targeted/mime/speak/Click() + if(!usr) + return + if(!ishuman(usr)) + return + var/mob/living/carbon/human/H = usr + if(H.mind.miming) + still_recharging_msg = "You can't break your vow of silence that fast!" + else + still_recharging_msg = "You'll have to wait before you can give your vow of silence again!" + ..() + +/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr) + for(var/mob/living/carbon/human/H in targets) + H.mind.miming=!H.mind.miming + if(H.mind.miming) + to_chat(H, "You make a vow of silence.") + else + to_chat(H, "You break your vow of silence.") + +// These spells can only be gotten from the "Guide for Advanced Mimery series" for Mime Traitors. + +/obj/effect/proc_holder/spell/targeted/forcewall/mime + name = "Invisible Blockade" + desc = "Form an invisible three tile wide blockade." + wall_type = /obj/effect/forcefield/mime/advanced + invocation_type = "emote" + invocation_emote_self = "You form a blockade in front of yourself." + charge_max = 600 + sound = null + clothes_req = 0 + range = -1 + include_user = 1 + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + +/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click() + if(usr && usr.mind) + if(!usr.mind.miming) + to_chat(usr, "You must dedicate yourself to silence first.") + return + invocation = "[usr.real_name] looks as if a blockade is in front of [usr.p_them()]." + else + invocation_type ="none" + ..() + +/obj/effect/proc_holder/spell/aimed/finger_guns + name = "Finger Guns" + desc = "Shoot a mimed bullet from your fingers that stuns and does some damage." + school = "mime" + panel = "Mime" + charge_max = 300 + clothes_req = 0 + invocation_type = "emote" + invocation_emote_self = "You fire your finger gun!" + range = 20 + projectile_type = /obj/item/projectile/bullet/mime + projectile_amount = 3 + sound = null + active_msg = "You draw your fingers!" + deactive_msg = "You put your fingers at ease. Another time." + active = FALSE + + action_icon_state = "mime" + action_background_icon_state = "bg_mime" + base_icon_state = "mime" + + +/obj/effect/proc_holder/spell/aimed/finger_guns/Click() + var/mob/living/carbon/human/owner = usr + if(owner.incapacitated()) + to_chat(owner, "You can't properly point your fingers while incapacitated.") + return + if(usr && usr.mind) + if(!usr.mind.miming) + to_chat(usr, "You must dedicate yourself to silence first.") + return + invocation = "[usr.real_name] fires [usr.p_their()] finger gun!" + else + invocation_type ="none" + ..() + + /obj/item/spellbook/oneuse/mimery_blockade spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime spellname = "" diff --git a/code/modules/spells/spell_types/mind_transfer.dm b/code/modules/spells/spell_types/mind_transfer.dm index 8a646d792f..023af548d0 100644 --- a/code/modules/spells/spell_types/mind_transfer.dm +++ b/code/modules/spells/spell_types/mind_transfer.dm @@ -1,79 +1,79 @@ -/obj/effect/proc_holder/spell/targeted/mind_transfer - name = "Mind Transfer" - desc = "This spell allows the user to switch bodies with a target." - - school = "transmutation" - charge_max = 600 - clothes_req = 0 - invocation = "GIN'YU CAPAN" - invocation_type = "whisper" - range = 1 - cooldown_min = 200 //100 deciseconds reduction per rank - var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell - var/unconscious_amount_caster = 400 //how much the caster is stunned for after the spell - var/unconscious_amount_victim = 400 //how much the victim is stunned for after the spell - - action_icon_state = "mindswap" - -/* -Urist: I don't feel like figuring out how you store object spells so I'm leaving this for you to do. +/obj/effect/proc_holder/spell/targeted/mind_transfer + name = "Mind Transfer" + desc = "This spell allows the user to switch bodies with a target." + + school = "transmutation" + charge_max = 600 + clothes_req = 0 + invocation = "GIN'YU CAPAN" + invocation_type = "whisper" + range = 1 + cooldown_min = 200 //100 deciseconds reduction per rank + var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell + var/unconscious_amount_caster = 400 //how much the caster is stunned for after the spell + var/unconscious_amount_victim = 400 //how much the victim is stunned for after the spell + + action_icon_state = "mindswap" + +/* +Urist: I don't feel like figuring out how you store object spells so I'm leaving this for you to do. Make sure spells that are removed from spell_list are actually removed and deleted when mind transferring. -Also, you never added distance checking after target is selected. I've went ahead and did that. -*/ -/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets, mob/living/user = usr, distanceoverride) - if(!targets.len) - to_chat(user, "No mind found!") - return - - if(targets.len > 1) - to_chat(user, "Too many minds! You're not a hive damnit!") - return - - var/mob/living/target = targets[1] - - var/t_He = target.p_they(TRUE) - var/t_is = target.p_are() - - if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it. - to_chat(user, "[t_He] [t_is] too far away!") - return - - if(ismegafauna(target)) - to_chat(user, "This creature is too powerful to control!") - return - - if(target.stat == DEAD) - to_chat(user, "You don't particularly want to be dead!") - return - - if(!target.key || !target.mind) - to_chat(user, "[t_He] appear[target.p_s()] to be catatonic! Not even magic can affect [target.p_their()] vacant mind.") - return - - if(user.suiciding) - to_chat(user, "You're killing yourself! You can't concentrate enough to do this!") - return - - if((target.mind.special_role in protected_roles) || cmptext(copytext(target.key,1,2),"@")) - to_chat(user, "[target.p_their(TRUE)] mind is resisting your spell!") - return - - var/mob/living/victim = target//The target of the spell whos body will be transferred to. - var/mob/living/caster = user//The wizard/whomever doing the body transferring. - - //MIND TRANSFER BEGIN - var/mob/dead/observer/ghost = victim.ghostize(0) - caster.mind.transfer_to(victim) - - ghost.mind.transfer_to(caster) - if(ghost.key) - caster.key = ghost.key //have to transfer the key since the mind was not active - qdel(ghost) - - //MIND TRANSFER END - - //Here we knock both mobs out for a time. - caster.Unconscious(unconscious_amount_caster) - victim.Unconscious(unconscious_amount_victim) +Also, you never added distance checking after target is selected. I've went ahead and did that. +*/ +/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets, mob/living/user = usr, distanceoverride) + if(!targets.len) + to_chat(user, "No mind found!") + return + + if(targets.len > 1) + to_chat(user, "Too many minds! You're not a hive damnit!") + return + + var/mob/living/target = targets[1] + + var/t_He = target.p_they(TRUE) + var/t_is = target.p_are() + + if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it. + to_chat(user, "[t_He] [t_is] too far away!") + return + + if(ismegafauna(target)) + to_chat(user, "This creature is too powerful to control!") + return + + if(target.stat == DEAD) + to_chat(user, "You don't particularly want to be dead!") + return + + if(!target.key || !target.mind) + to_chat(user, "[t_He] appear[target.p_s()] to be catatonic! Not even magic can affect [target.p_their()] vacant mind.") + return + + if(user.suiciding) + to_chat(user, "You're killing yourself! You can't concentrate enough to do this!") + return + + if((target.mind.special_role in protected_roles) || cmptext(copytext(target.key,1,2),"@")) + to_chat(user, "[target.p_their(TRUE)] mind is resisting your spell!") + return + + var/mob/living/victim = target//The target of the spell whos body will be transferred to. + var/mob/living/caster = user//The wizard/whomever doing the body transferring. + + //MIND TRANSFER BEGIN + var/mob/dead/observer/ghost = victim.ghostize(0) + caster.mind.transfer_to(victim) + + ghost.mind.transfer_to(caster) + if(ghost.key) + caster.key = ghost.key //have to transfer the key since the mind was not active + qdel(ghost) + + //MIND TRANSFER END + + //Here we knock both mobs out for a time. + caster.Unconscious(unconscious_amount_caster) + victim.Unconscious(unconscious_amount_victim) SEND_SOUND(caster, sound('sound/magic/mandswap.ogg')) SEND_SOUND(victim, sound('sound/magic/mandswap.ogg'))// only the caster and victim hear the sounds, that way no one knows for sure if the swap happened diff --git a/code/modules/spells/spell_types/projectile.dm b/code/modules/spells/spell_types/projectile.dm index 4bbd9ac4a6..19e44ffa83 100644 --- a/code/modules/spells/spell_types/projectile.dm +++ b/code/modules/spells/spell_types/projectile.dm @@ -1,33 +1,33 @@ //NEEDS MAJOR CODE CLEANUP. -/obj/effect/proc_holder/spell/targeted/projectile - name = "Projectile" - desc = "This spell summons projectiles which try to hit the targets." - - var/proj_icon = 'icons/obj/projectiles.dmi' - var/proj_icon_state = "spell" - var/proj_name = "a spell projectile" - - var/proj_trail = 0 //if it leaves a trail - var/proj_trail_lifespan = 0 //deciseconds - var/proj_trail_icon = 'icons/obj/wizard.dmi' - var/proj_trail_icon_state = "trail" - - - var/proj_type = "/obj/effect/proc_holder/spell/targeted" //IMPORTANT use only subtypes of this - - var/proj_lingering = 0 //if it lingers or disappears upon hitting an obstacle - var/proj_homing = 1 //if it follows the target - var/proj_insubstantial = 0 //if it can pass through dense objects or not - var/proj_trigger_range = 0 //the range from target at which the projectile triggers cast(target) - - var/proj_lifespan = 15 //in deciseconds * proj_step_delay - var/proj_step_delay = 1 //lower = faster - -/obj/effect/proc_holder/spell/targeted/projectile/cast(list/targets, mob/user = usr) - playMagSound() - for(var/mob/living/target in targets) +/obj/effect/proc_holder/spell/targeted/projectile + name = "Projectile" + desc = "This spell summons projectiles which try to hit the targets." + + var/proj_icon = 'icons/obj/projectiles.dmi' + var/proj_icon_state = "spell" + var/proj_name = "a spell projectile" + + var/proj_trail = 0 //if it leaves a trail + var/proj_trail_lifespan = 0 //deciseconds + var/proj_trail_icon = 'icons/obj/wizard.dmi' + var/proj_trail_icon_state = "trail" + + + var/proj_type = "/obj/effect/proc_holder/spell/targeted" //IMPORTANT use only subtypes of this + + var/proj_lingering = 0 //if it lingers or disappears upon hitting an obstacle + var/proj_homing = 1 //if it follows the target + var/proj_insubstantial = 0 //if it can pass through dense objects or not + var/proj_trigger_range = 0 //the range from target at which the projectile triggers cast(target) + + var/proj_lifespan = 15 //in deciseconds * proj_step_delay + var/proj_step_delay = 1 //lower = faster + +/obj/effect/proc_holder/spell/targeted/projectile/cast(list/targets, mob/user = usr) + playMagSound() + for(var/mob/living/target in targets) launch(target, user) /obj/effect/proc_holder/spell/targeted/projectile/proc/launch(mob/living/target, mob/user) diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index bb454a3b19..b992871004 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -13,7 +13,7 @@ if(H.stat == DEAD || !(H.client)) continue if(H.mind) - if(iswizard(H) || H.mind.special_role == "survivalist") + if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice" || H.mind.special_role == "survivalist") continue if(prob(survivor_probability) && !(H.mind in SSticker.mode.traitors)) SSticker.mode.traitors += H.mind @@ -22,14 +22,12 @@ guns.owner = H.mind H.mind.objectives += guns H.mind.special_role = "survivalist" - H.mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(H, "You are the survivalist! Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, by any means necessary. Kill anyone who gets in your way.") else var/datum/objective/steal_five_of_type/summon_magic/magic = new magic.owner = H.mind H.mind.objectives += magic H.mind.special_role = "amateur magician" - H.mind.add_antag_datum(/datum/antagonist/auto_custom) to_chat(H, "You are the amateur magician! Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way.") var/datum/objective/survive/survive = new survive.owner = H.mind @@ -220,4 +218,4 @@ SSevents.reschedule() message_admins("Summon Events intensifies, events will now occur every [SSevents.frequency_lower / 600] to [SSevents.frequency_upper / 600] minutes.") - log_game("Summon Events was increased!") + log_game("Summon Events was increased!") \ No newline at end of file diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index 8a377c6c3a..4ee1b678f0 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -57,15 +57,13 @@ var/mob/living/shape = new shapeshift_type(caster.loc) H = new(shape,src,caster) - clothes_req = 0 human_req = 0 /obj/effect/proc_holder/spell/targeted/shapeshift/proc/Restore(mob/living/shape) var/obj/shapeshift_holder/H = locate() in shape if(!H) - return - + return H.restore() clothes_req = initial(clothes_req) @@ -158,4 +156,4 @@ /datum/soullink/shapeshift/sharerDies(gibbed, mob/living/sharer) if(source) - source.shapeDeath(gibbed) \ No newline at end of file + source.shapeDeath(gibbed) diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm index 88377455c6..98ec01f641 100644 --- a/code/modules/station_goals/station_goal.dm +++ b/code/modules/station_goals/station_goal.dm @@ -26,11 +26,11 @@ /datum/station_goal/proc/check_completion() return completed -/datum/station_goal/proc/get_result() +/datum/station_goal/proc/print_result() if(check_completion()) - return "
  • [name] : Completed!
  • " + to_chat(world, "Station Goal : [name] : Completed!") else - return "
  • [name] : Failed!
  • " + to_chat(world, "Station Goal : [name] : Failed!") /datum/station_goal/Destroy() SSticker.mode.station_goals -= src diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index 0f8003b9b4..f6a2c057d0 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -22,4 +22,4 @@ var/obj/item/bodypart/target_limb = surgery.operated_bodypart target_limb.drop_limb() - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 0078c0594f..e99455c833 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -142,11 +142,11 @@ //when a limb is dropped, the internal organs are removed from the mob and put into the limb /obj/item/organ/proc/transfer_to_limb(obj/item/bodypart/LB, mob/living/carbon/C) Remove(C) - forceMove(LB) + loc = LB /obj/item/organ/brain/transfer_to_limb(obj/item/bodypart/head/LB, mob/living/carbon/human/C) Remove(C) //Changeling brain concerns are now handled in Remove - forceMove(LB) + loc = LB LB.brain = src if(brainmob) LB.brainmob = brainmob @@ -270,7 +270,7 @@ attach_limb(C, special) /obj/item/bodypart/proc/attach_limb(mob/living/carbon/C, special) - moveToNullspace() + loc = null owner = C C.bodyparts += src if(held_index) diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index c3322126e4..d37b17ae35 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -169,4 +169,3 @@ return 0 return 1 - diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index cfec06c7ea..b9881d0e37 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -34,7 +34,7 @@ case = locate(/obj/item/implantcase) in get_turf(target) if(case && !case.imp) case.imp = I - I.forceMove(case) + I.loc = case case.update_icon() user.visible_message("[user] places [I] into [case]!", "You place [I] into [case].") else @@ -53,4 +53,4 @@ /datum/surgery_step/mechanic_unwrench, /datum/surgery_step/extract_implant, /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close) \ No newline at end of file + /datum/surgery_step/mechanic_close) diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index e2316c0e4d..25d914b0fb 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -1,4 +1,3 @@ - /////AUGMENTATION SURGERIES////// diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index b54ffdfbbd..488f2e81b1 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -50,4 +50,4 @@ newmeat.subjectjob = H.job newmeat.reagents.add_reagent ("nutriment", (removednutriment / 15)) //To balance with nutriment_factor of nutriment newmeat.forceMove(target.loc) - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm index 0bdef2aac9..657564f112 100644 --- a/code/modules/surgery/mechanic_steps.dm +++ b/code/modules/surgery/mechanic_steps.dm @@ -82,4 +82,4 @@ /datum/surgery_step/open_hatch/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].", - "You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]...") \ No newline at end of file + "You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]...") diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 97e24b4cd5..dc8b3543fa 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -126,7 +126,7 @@ return TRUE if(!organs.len) - to_chat(user, "There are no removable organs in [target]'s [parse_zone(target_zone)]!") + to_chat(user, "There are no removeable organs in [target]'s [parse_zone(target_zone)]!") return -1 else for(var/obj/item/organ/O in organs) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index ec1fc2bcc9..a6635ed78d 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -116,7 +116,7 @@ /obj/item/organ/cyberimp/chest/thrusters name = "implantable thrusters set" desc = "An implantable set of thruster ports. They use the gas from environment or subject's internals for propulsion in zero-gravity areas. \ - Unlike regular jetpacks, this device has no stabilization system." + Unlike regular jetpack, this device has no stabilization system." slot = ORGAN_SLOT_THRUSTERS icon_state = "imp_jetpack" implant_overlay = null diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index bb5301d79e..b3f3953c49 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -85,4 +85,3 @@ var/obj/item/melee/arm_blade/new_arm = new(target,TRUE,TRUE) target_zone == "r_arm" ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) return 1 - diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index e293d7c401..b10f6acdd0 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -6,7 +6,7 @@ var/can_cancel = 1 //Can cancel this surgery after step 1 with cautery var/list/species = list(/mob/living/carbon/human) //Acceptable Species var/location = "chest" //Surgery location - var/requires_bodypart_type = BODYPART_ORGANIC //Prevents you from performing an operation on incorrect limbs. 0 for any limb type + var/requires_bodypart_type = BODYPART_ORGANIC //Prevents you from performing an operation on robotic limbs var/list/possible_locs = list() //Multiple locations var/ignore_clothes = 0 //This surgery ignores clothes var/mob/living/carbon/target //Operation target mob diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 445628566e..577dc6547b 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -5,7 +5,7 @@ var/accept_hand = 0 //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item. var/accept_any_item = 0 //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand. var/time = 10 //how long does the step take? - var/repeatable = 0 //does this step may be repeated? Make shure it isn't last step, or it used in surgery with `can_cancel = 1`. Or surgion will be stuck in the loop + var/repeatable = 0 /datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/uplink/uplink.dm b/code/modules/uplink/uplink.dm index 34946a6286..175ac9469c 100644 --- a/code/modules/uplink/uplink.dm +++ b/code/modules/uplink/uplink.dm @@ -17,6 +17,7 @@ GLOBAL_LIST_EMPTY(uplinks) var/selected_cat var/owner = null var/datum/game_mode/gamemode + var/spent_telecrystals = 0 var/datum/uplink_purchase_log/purchase_log var/list/uplink_items var/hidden_crystals = 0 @@ -88,7 +89,7 @@ GLOBAL_LIST_EMPTY(uplinks) var/refundable = initial(UI.refundable) if(I.type == path && refundable && I.check_uplink_validity()) telecrystals += cost - purchase_log.total_spent -= cost + spent_telecrystals -= cost to_chat(user, "[I] refunded.") qdel(I) return diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 753ae2c5eb..d28adebe4b 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -91,6 +91,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/proc/spawn_item(turf/loc, datum/component/uplink/U, mob/user) if(item) + SSblackbox.record_feedback("nested tally", "traitor_uplink_items_bought", 1, list("[initial(name)]", "[cost]")) return new item(loc) /datum/uplink_item/Destroy() @@ -610,7 +611,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. name = "Sleepy Pen" desc = "A syringe disguised as a functional pen, filled with a potent mix of drugs, including a \ strong anesthetic and a chemical that prevents the target from speaking. \ - The pen holds one dose of the mixture, and can be refilled. Note that before the target \ + The pen holds one dose of the mixture, and cannot be refilled. Note that before the target \ falls asleep, they will be able to move and act." item = /obj/item/pen/sleepy cost = 4 @@ -699,6 +700,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/stealthy_tools/chameleon/nuke cost = 6 + exclude_modes = list() include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/syndigaloshes @@ -1390,7 +1392,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. if(possible_items.len) var/datum/uplink_item/I = pick(possible_items) U.telecrystals -= I.cost - U.purchase_log.total_spent += I.cost + U.spent_telecrystals += I.cost SSblackbox.record_feedback("nested tally", "traitor_uplink_items_bought", 1, list("[initial(I.name)]", "[cost]")) SSblackbox.record_feedback("tally", "traitor_random_uplink_items_gotten", 1, initial(I.name)) return new I.item(loc) diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index cc42b7a67e..f203af610a 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -11,7 +11,7 @@ var/icon_left = "bloodhand_left" var/icon_right = "bloodhand_right" hitsound = 'sound/hallucinations/growl1.ogg' - force = 21 // Just enough to break airlocks with melee attacks + force = 20 damtype = "brute" var/removing_airlock = FALSE diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 119ed27926..07e3648417 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -58,8 +58,8 @@ life has not abandoned your broken form. You can only feel a deep and immutable hunger that \ not even death can stop, you will rise again!") var/revive_time = rand(revive_time_min, revive_time_max) - var/flags = TIMER_STOPPABLE - timer_id = addtimer(CALLBACK(src, .proc/zombify), revive_time, flags) + var/flags_1 = TIMER_STOPPABLE + timer_id = addtimer(CALLBACK(src, .proc/zombify), revive_time, flags_1) /obj/item/organ/zombie_infection/proc/zombify() timer_id = null diff --git a/code/world.dm b/code/world.dm index 660d2f272d..955d19c6c4 100644 --- a/code/world.dm +++ b/code/world.dm @@ -1,3 +1,4 @@ + //This file is just for the necessary /world definition //Try looking in game/world.dm diff --git a/config/admin_nicknames.txt b/config/admin_nicknames.txt deleted file mode 100644 index 76198b6c05..0000000000 --- a/config/admin_nicknames.txt +++ /dev/null @@ -1,2 +0,0 @@ -Badmin -Spanmin \ No newline at end of file diff --git a/config/admin_ranks.txt b/config/admin_ranks.txt index 2c87bda64b..3cf5cbfb72 100644 --- a/config/admin_ranks.txt +++ b/config/admin_ranks.txt @@ -19,7 +19,7 @@ # +BAN = the ability to ban, jobban and fullban # +STEALTH = the ability to stealthmin (make yourself appear with a fake name to everyone but other admins # +POSSESS = the ability to possess objects -# +POLL (or +POLL) = the ability to create in game server polls (requires DB) +# +REJUV (or +REJUVINATE) = the ability to heal, respawn, modify damage and use godmode # +BUILD (or +BUILDMODE) = the ability to use buildmode # +SERVER = higher-risk admin verbs and abilities, such as those which affect the server configuration. # +DEBUG = debug tools used for diagnosing and fixing problems. It's useful to give this to coders so they can investigate problems on a live server. @@ -34,12 +34,12 @@ Admin Observer = -AUTOLOGIN Moderator = +ADMIN Admin Candidate = +@ -Trial Admin = +@ +SPAWN +VAREDIT +BAN -Badmin = +@ +POSSESS +POLL +BUILDMODE +SERVER +FUN +Trial Admin = +@ +SPAWN +REJUV +VAREDIT +BAN +Badmin = +@ +POSSESS +BUILDMODE +SERVER +FUN Game Admin = +@ +STEALTH +SOUNDS +DEBUG Game Master = +EVERYTHING Lazy Master = +EVERYTHING -AUTOLOGIN Host = +EVERYTHING -Coder = +DEBUG +VAREDIT +SERVER +SPAWN +POLL -AUTOLOGIN +Coder = +DEBUG +VAREDIT +SERVER +SPAWN -AUTOLOGIN diff --git a/config/admins.txt b/config/admins.txt index 8582144c45..0f5684b465 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -7,7 +7,10 @@ # NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # # NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # ############################################################################################### +<<<<<<< HEAD + Jayehh = Host +======= Optimumtact = Host NewSta = Game Master Expletives = Game Master @@ -132,4 +135,5 @@ JStheguy = Game Master excessiveuseofcobby = Game Master Plizzard = Game Master octareenroon91 = Game Master -Serpentarium = Game Master \ No newline at end of file +Serpentarium = Game Master +>>>>>>> bdfbafd... [READY]integrated circuitry port+upgrade. (#32481) diff --git a/config/comms.txt b/config/comms.txt index 865011032e..4408819f2e 100644 --- a/config/comms.txt +++ b/config/comms.txt @@ -2,9 +2,7 @@ #COMMS_KEY default_pwd ## World address and port for server recieving cross server messages -## Use '+' to denote spaces in ServerName -## Repeat this entry to add more servers -#CROSS_SERVER ServerName byond:\\address:port +#CROSS_SERVER_ADDRESS byond:\\address:port ## Name that the server calls itself in communications #CROSS_COMMS_NAME diff --git a/config/config.txt b/config/config.txt index a94d900fa5..fb648a5fa9 100644 --- a/config/config.txt +++ b/config/config.txt @@ -1,9 +1,3 @@ -# You can use the "$include" directive to split your configs however you want - -$include game_options.txt -$include dbconfig.txt -$include comms.txt - # You can use the @ character at the beginning of a config option to lock it from being edited in-game # Example usage: # @SERVERNAME tgstation @@ -59,7 +53,6 @@ BAN_LEGACY_SYSTEM ## Allows admins to bypass job playtime requirements. #USE_EXP_RESTRICTIONS_ADMIN_BYPASS - ## log OOC channel LOG_OOC @@ -121,9 +114,6 @@ LOG_MANIFEST ## Comment this out to stop admins being able to choose their personal ooccolor ALLOW_ADMIN_OOCCOLOR -## Job slot open/close by identification consoles delay in seconds -ID_CONSOLE_JOBSLOT_DELAY 30 - ## If metadata is supported ALLOW_METADATA @@ -254,12 +244,6 @@ TICKLAG 0.5 ## Uncomment this to let players see their own notes (they can still be set by admins only) #SEE_OWN_NOTES -### Comment these two out to prevent notes fading out over time for admins. -## Notes older then this will start fading out. -NOTE_FRESH_DAYS 91.31055 -## Notes older then this will be completely faded out. -NOTE_STALE_DAYS 365.2422 - ##Note: all population caps can be used with each other if desired. ## Uncomment for 'soft' population caps, players will be warned while joining if the living crew exceeds the listed number. diff --git a/config/game_options.txt b/config/game_options.txt index 4080ae7065..5e36e25808 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -114,6 +114,7 @@ CONTINUOUS CHANGELING CONTINUOUS WIZARD CONTINUOUS BLOB CONTINUOUS ABDUCTION +#CONTINUOUS RAGINMAGES #CONTINUOUS MONKEY ##Note: do not toggle continuous off for these modes, as they have no antagonists and would thus end immediately! @@ -138,6 +139,7 @@ MIDROUND_ANTAG CHANGELING MIDROUND_ANTAG WIZARD MIDROUND_ANTAG BLOB MIDROUND_ANTAG ABDUCTION +#MIDROUND_ANTAG RAGINMAGES #MIDROUND_ANTAG MONKEY ## Uncomment these for overrides of the minimum / maximum number of players in a round type. diff --git a/config/maps.txt b/config/maps.txt index 99a4543853..4717a566cf 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -10,10 +10,9 @@ Format: maxplayers [number] (0 or less disables this requirement) default (The last map with this defined will get all votes of players who have not explicitly voted for a map) voteweight [number] (How much to count each player vote as, defaults to 1, setting to 0.5 counts each vote as half a vote, 2 as double, etc, Setting to 0 disables the map but allows players to still pick it) - disabled (disables the map) endmap -map boxstation +map tgstation2 default #voteweight 1.5 endmap @@ -33,6 +32,3 @@ endmap map deltastation minplayers 50 endmap - -map runtimestation -endmap \ No newline at end of file diff --git a/config/spaceRuinBlacklist.txt b/config/spaceRuinBlacklist.txt index 8d74ee5dea..8a1069408e 100644 --- a/config/spaceRuinBlacklist.txt +++ b/config/spaceRuinBlacklist.txt @@ -18,7 +18,6 @@ #_maps/RandomRuins/SpaceRuins/derelict6.dmm #_maps/RandomRuins/SpaceRuins/spacebar.dmm #_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm -#_maps/RandomRuins/SpaceRuins/deepstorage.dmm #_maps/RandomRuins/SpaceRuins/emptyshell.dmm #_maps/RandomRuins/SpaceRuins/gasthelizards.dmm #_maps/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -41,4 +40,5 @@ #_maps/RandomRuins/SpaceRuins/vaporwave.dmm #_maps/RandomRuins/SpaceRuins/bus.dmm #_maps/RandomRuins/SpaceRuins/miracle.dmm +#_maps/RandomRuins/SpaceRuins/dragoontomb.dmm #_maps/RandomRuins/SpaceRuins/oldstation.dmm diff --git a/html/browser/roundend.css b/html/browser/roundend.css deleted file mode 100644 index 82235f1273..0000000000 --- a/html/browser/roundend.css +++ /dev/null @@ -1,67 +0,0 @@ -.greentext { - color: #90ee90; - font-weight: bold; -} - -.greentext_alt { - color: green; -} -.redtext { - color: #ef2f3c; - font-weight: bold; -} -.neutraltext { - font-weight: bold; /* If you feel these should have some color feel free to change */ -} - -.marooned { - color: rgb(109, 109, 255); font-weight: bold; -} - -.header { - font-size: 24px; font-weight: bold; -} - -.big { - font-size: 24px; -} - -.medaltext { - color: #add8e6; -} - -.codephrase { - color : #ef2f3c; -} - -.redborder { - border-bottom: 2px solid #ef2f3c; -} - -.greenborder { - border-bottom: 2px solid #90ee90; -} - -.clockborder { - border-bottom: 2px solid #B18B25; -} - -.stationborder { - border-bottom: 2px solid #add8e6; -} - -li { - margin-bottom: 0.2rem; -} - -.panel { - background-color: #313131; - padding: 10px; - border-radius: 10px; - margin-bottom: 5px; -} - -body { - background-color: #272727; - color: #efefef; -} \ No newline at end of file diff --git a/html/browser/techwebs.css b/html/browser/techwebs.css deleted file mode 100644 index 889196cc28..0000000000 --- a/html/browser/techwebs.css +++ /dev/null @@ -1,20 +0,0 @@ -[data-tooltip] { - position: relative; -} - -[data-tooltip]:hover::before { - position: absolute; - z-index: 1; - top: 100%; - padding: 0 4px; - margin-top: 1px; - border: 1px solid #40628a; - background: black; - color: white; - content: attr(data-tooltip); - min-width: 160px; -} - -.technode { - width: 256px; -} diff --git a/html/changelog.html b/html/changelog.html index 9bfefbc58b..45dfe57b20 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1,7 +1,7 @@ - /tg/ Station 13 Changelog + Citadel Station 13 Changelog