Files
Bubberstation/code/game/gamemodes/game_mode.dm
ExcessiveUseOfCobblestone 6813956bd5 modified: _maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
modified:   _maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm
 	modified:   _maps/RandomRuins/SpaceRuins/bigderelict1.dmm
 	modified:   _maps/RandomRuins/SpaceRuins/spacebar.dmm
 	modified:   _maps/RandomZLevels/Academy.dmm
 	modified:   _maps/RandomZLevels/caves.dmm
 	modified:   _maps/RandomZLevels/moonoutpost19.dmm
 	modified:   _maps/RandomZLevels/snowdin.dmm
 	modified:   _maps/RandomZLevels/undergroundoutpost45.dmm
 	modified:   _maps/map_files/BirdStation/BirdStation.dmm
 	modified:   _maps/map_files/DreamStation/dreamstation04.dmm
 	modified:   _maps/map_files/EfficiencyStation/EfficiencyStation.dmm
 	modified:   _maps/map_files/MetaStation/MetaStation.dmm
 	deleted:    _maps/map_files/MiniStation/uplink_item.dm
 	modified:   _maps/map_files/TgStation/tgstation.2.1.3.dmm
 	modified:   _maps/map_files/generic/z2.dmm
 	modified:   _maps/ministation.dm
 	modified:   code/__DEFINES/misc.dm
 	modified:   code/__HELPERS/game.dm
 	modified:   code/__HELPERS/lists.dm
 	new file:   code/__HELPERS/pronouns.dm
 	modified:   code/__HELPERS/unsorted.dm
 	modified:   code/_globalvars/lists/objects.dm
 	modified:   code/_onclick/hud/screen_objects.dm
 	modified:   code/controllers/subsystem/persistence.dm
 	modified:   code/controllers/subsystem/processing/objects.dm
 	new file:   code/datums/antagonists/antag_datum.dm
 	new file:   code/datums/antagonists/datum_clockcult.dm
 	new file:   code/datums/antagonists/datum_cult.dm
 	modified:   code/datums/diseases/_MobProcs.dm
 	modified:   code/datums/diseases/advance/symptoms/beard.dm
 	modified:   code/datums/diseases/advance/symptoms/damage_converter.dm
 	modified:   code/datums/diseases/advance/symptoms/shedding.dm
 	modified:   code/datums/diseases/advance/symptoms/skin.dm
 	modified:   code/datums/diseases/advance/symptoms/youth.dm
 	modified:   code/datums/diseases/wizarditis.dm
 	modified:   code/datums/helper_datums/getrev.dm
 	modified:   code/datums/helper_datums/teleport.dm
 	modified:   code/datums/martial/krav_maga.dm
 	modified:   code/datums/mind.dm
 	modified:   code/datums/status_effects/buffs.dm
 	modified:   code/game/area/areas.dm
 	modified:   code/game/asteroid.dm
 	modified:   code/game/atoms.dm
 	modified:   code/game/atoms_movable.dm
 	modified:   code/game/gamemodes/antag_spawner.dm
 	modified:   code/game/gamemodes/blob/blobs/blob_mobs.dm
 	modified:   code/game/gamemodes/blob/blobs/core.dm
 	modified:   code/game/gamemodes/blob/blobs/factory.dm
 	modified:   code/game/gamemodes/blob/blobs/node.dm
 	modified:   code/game/gamemodes/blob/blobs/resource.dm
 	modified:   code/game/gamemodes/blob/blobs/shield.dm
 	modified:   code/game/gamemodes/blob/overmind.dm
 	modified:   code/game/gamemodes/blob/powers.dm
 	modified:   code/game/gamemodes/blob/theblob.dm
 	modified:   code/game/gamemodes/changeling/powers/mutations.dm
 	modified:   code/game/gamemodes/changeling/powers/spiders.dm
 	modified:   code/game/gamemodes/clock_cult/clock_cult.dm
 	modified:   code/game/gamemodes/clock_cult/clock_items.dm
 	modified:   code/game/gamemodes/clock_cult/clock_mobs.dm
 	modified:   code/game/gamemodes/clock_cult/clock_ratvar.dm
 	modified:   code/game/gamemodes/clock_cult/clock_scripture.dm
 	modified:   code/game/gamemodes/clock_cult/clock_structures.dm
 	modified:   code/game/gamemodes/cult/cult.dm
 	modified:   code/game/gamemodes/cult/cult_items.dm
 	modified:   code/game/gamemodes/cult/cult_structures.dm
 	modified:   code/game/gamemodes/cult/runes.dm
 	modified:   code/game/gamemodes/devil/devil.dm
 	modified:   code/game/gamemodes/devil/devilinfo.dm
 	modified:   code/game/gamemodes/devil/game_mode.dm
 	modified:   code/game/gamemodes/game_mode.dm
 	modified:   code/game/gamemodes/gang/dominator.dm
 	modified:   code/game/gamemodes/gang/gang.dm
 	modified:   code/game/gamemodes/gang/gang_datum.dm
 	modified:   code/game/gamemodes/meteor/meteors.dm
 	modified:   code/game/gamemodes/miniantags/abduction/abduction_gear.dm
 	modified:   code/game/gamemodes/miniantags/abduction/gland.dm
 	modified:   code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
 	modified:   code/game/gamemodes/miniantags/revenant/revenant.dm
 	modified:   code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
 	modified:   code/game/gamemodes/nuclear/nuclear.dm
 	modified:   code/game/gamemodes/nuclear/nuclearbomb.dm
 	modified:   code/game/gamemodes/objective.dm
 	modified:   code/game/gamemodes/revolution/revolution.dm
 	modified:   code/game/gamemodes/wizard/artefact.dm
 	modified:   code/game/gamemodes/wizard/soulstone.dm
 	modified:   code/game/gamemodes/wizard/spellbook.dm
 	modified:   code/game/machinery/autolathe.dm
 	modified:   code/game/machinery/camera/camera.dm
 	modified:   code/game/machinery/camera/tracking.dm
 	modified:   code/game/machinery/computer/computer.dm
 	modified:   code/game/machinery/computer/medical.dm
 	modified:   code/game/machinery/computer/prisoner.dm
 	modified:   code/game/machinery/computer/security.dm
 	modified:   code/game/machinery/constructable_frame.dm
 	modified:   code/game/machinery/deployable.dm
 	modified:   code/game/machinery/doors/door.dm
 	modified:   code/game/machinery/doors/windowdoor.dm
 	modified:   code/game/machinery/firealarm.dm
 	modified:   code/game/machinery/flasher.dm
 	modified:   code/game/machinery/iv_drip.dm
 	modified:   code/game/machinery/limbgrower.dm
 	modified:   code/game/machinery/machinery.dm
 	modified:   code/game/machinery/newscaster.dm
 	modified:   code/game/machinery/overview.dm
 	modified:   code/game/machinery/pipe/construction.dm
 	modified:   code/game/machinery/porta_turret/portable_turret.dm
 	modified:   code/game/machinery/shieldgen.dm
 	modified:   code/game/machinery/spaceheater.dm
 	modified:   code/game/machinery/syndicatebeacon.dm
 	modified:   code/game/machinery/syndicatebomb.dm
 	modified:   code/game/machinery/vending.dm
 	modified:   code/game/mecha/combat/combat.dm
 	modified:   code/game/mecha/combat/durand.dm
 	modified:   code/game/mecha/combat/gygax.dm
 	modified:   code/game/mecha/combat/marauder.dm
 	modified:   code/game/mecha/combat/phazon.dm
 	modified:   code/game/mecha/combat/reticence.dm
 	modified:   code/game/mecha/equipment/tools/mining_tools.dm
 	modified:   code/game/mecha/equipment/tools/other_tools.dm
 	modified:   code/game/mecha/equipment/tools/work_tools.dm
 	modified:   code/game/mecha/equipment/weapons/weapons.dm
 	modified:   code/game/mecha/mech_fabricator.dm
 	modified:   code/game/mecha/mecha.dm
 	modified:   code/game/mecha/mecha_defense.dm
 	modified:   code/game/mecha/working/ripley.dm
 	modified:   code/game/objects/buckling.dm
 	modified:   code/game/objects/effects/alien_acid.dm
 	modified:   code/game/objects/effects/anomalies.dm
 	modified:   code/game/objects/effects/contraband.dm
 	modified:   code/game/objects/effects/decals/Cleanable/aliens.dm
 	modified:   code/game/objects/effects/decals/Cleanable/humans.dm
 	modified:   code/game/objects/effects/decals/Cleanable/misc.dm
 	modified:   code/game/objects/effects/decals/Cleanable/robots.dm
 	modified:   code/game/objects/effects/decals/cleanable.dm
 	modified:   code/game/objects/effects/effect_system/effect_system.dm
 	modified:   code/game/objects/effects/effect_system/effects_foam.dm
 	modified:   code/game/objects/effects/effect_system/effects_smoke.dm
 	new file:   code/game/objects/effects/effects.dm
 	modified:   code/game/objects/effects/forcefields.dm
 	modified:   code/game/objects/effects/glowshroom.dm
 	modified:   code/game/objects/effects/landmarks.dm
 	modified:   code/game/objects/effects/manifest.dm
 	modified:   code/game/objects/effects/misc.dm
 	modified:   code/game/objects/effects/overlays.dm
 	modified:   code/game/objects/effects/portals.dm
 	modified:   code/game/objects/effects/spiders.dm
 	modified:   code/game/objects/explosion.dm
 	modified:   code/game/objects/items.dm
 	modified:   code/game/objects/items/cardboard_cutouts.dm
 	modified:   code/game/objects/items/dehy_carp.dm
 	modified:   code/game/objects/items/devices/PDA/PDA.dm
 	modified:   code/game/objects/items/devices/camera_bug.dm
 	modified:   code/game/objects/items/devices/flashlight.dm
 	modified:   code/game/objects/items/devices/instruments.dm
 	modified:   code/game/objects/items/devices/radio/electropack.dm
 	modified:   code/game/objects/items/latexballoon.dm
 	modified:   code/game/objects/items/robot/robot_parts.dm
 	modified:   code/game/objects/items/robot/robot_upgrades.dm
 	modified:   code/game/objects/items/stacks/cash.dm
 	modified:   code/game/objects/items/stacks/medical.dm
 	modified:   code/game/objects/items/stacks/sheets/mineral.dm
 	modified:   code/game/objects/items/stacks/sheets/sheet_types.dm
 	modified:   code/game/objects/items/stacks/tiles/tile_types.dm
 	modified:   code/game/objects/items/stacks/wrap.dm
 	modified:   code/game/objects/items/toys.dm
 	modified:   code/game/objects/items/trash.dm
 	modified:   code/game/objects/items/weapons/cards_ids.dm
 	modified:   code/game/objects/items/weapons/chrono_eraser.dm
 	modified:   code/game/objects/items/weapons/cigs_lighters.dm
 	modified:   code/game/objects/items/weapons/clown_items.dm
 	modified:   code/game/objects/items/weapons/courtroom.dm
 	modified:   code/game/objects/items/weapons/gift.dm
 	modified:   code/game/objects/items/weapons/grenades/flashbang.dm
 	modified:   code/game/objects/items/weapons/grenades/grenade.dm
 	modified:   code/game/objects/items/weapons/grenades/smokebomb.dm
 	modified:   code/game/objects/items/weapons/holosign_creator.dm
 	modified:   code/game/objects/items/weapons/implants/implant.dm
 	modified:   code/game/objects/items/weapons/implants/implant_chem.dm
 	modified:   code/game/objects/items/weapons/mop.dm
 	modified:   code/game/objects/items/weapons/paint.dm
 	modified:   code/game/objects/items/weapons/scrolls.dm
 	modified:   code/game/objects/items/weapons/shields.dm
 	modified:   code/game/objects/items/weapons/signs.dm
 	modified:   code/game/objects/items/weapons/singularityhammer.dm
 	modified:   code/game/objects/items/weapons/storage/backpack.dm
 	modified:   code/game/objects/items/weapons/storage/bags.dm
 	modified:   code/game/objects/items/weapons/storage/belt.dm
 	modified:   code/game/objects/items/weapons/storage/book.dm
 	modified:   code/game/objects/items/weapons/storage/boxes.dm
 	modified:   code/game/objects/items/weapons/storage/briefcase.dm
 	modified:   code/game/objects/items/weapons/storage/fancy.dm
 	modified:   code/game/objects/items/weapons/storage/secure.dm
 	modified:   code/game/objects/items/weapons/storage/storage.dm
 	modified:   code/game/objects/items/weapons/storage/wallets.dm
 	modified:   code/game/objects/items/weapons/tanks/tanks.dm
 	modified:   code/game/objects/items/weapons/tanks/watertank.dm
 	modified:   code/game/objects/items/weapons/twohanded.dm
 	modified:   code/game/objects/items/weapons/weaponry.dm
 	modified:   code/game/objects/objs.dm
 	modified:   code/game/objects/structures.dm
 	modified:   code/game/objects/structures/ai_core.dm
 	modified:   code/game/objects/structures/aliens.dm
 	modified:   code/game/objects/structures/artstuff.dm
 	modified:   code/game/objects/structures/beds_chairs/bed.dm
 	modified:   code/game/objects/structures/beds_chairs/chair.dm
 	modified:   code/game/objects/structures/bedsheet_bin.dm
 	modified:   code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
 	modified:   code/game/objects/structures/crates_lockers/closets/gimmick.dm
 	modified:   code/game/objects/structures/crates_lockers/closets/job_closets.dm
 	modified:   code/game/objects/structures/crates_lockers/closets/secure/bar.dm
 	modified:   code/game/objects/structures/crates_lockers/closets/secure/personal.dm
 	modified:   code/game/objects/structures/crates_lockers/closets/secure/security.dm
 	modified:   code/game/objects/structures/crates_lockers/closets/statue.dm
 	modified:   code/game/objects/structures/displaycase.dm
 	modified:   code/game/objects/structures/fireaxe.dm
 	modified:   code/game/objects/structures/fireplace.dm
 	modified:   code/game/objects/structures/flora.dm
 	modified:   code/game/objects/structures/girders.dm
 	modified:   code/game/objects/structures/grille.dm
 	modified:   code/game/objects/structures/guncase.dm
 	modified:   code/game/objects/structures/lattice.dm
 	modified:   code/game/objects/structures/mineral_doors.dm
 	modified:   code/game/objects/structures/noticeboard.dm
 	modified:   code/game/objects/structures/plasticflaps.dm
 	modified:   code/game/objects/structures/safe.dm
 	modified:   code/game/objects/structures/signs.dm
 	modified:   code/game/objects/structures/table_frames.dm
 	modified:   code/game/objects/structures/tables_racks.dm
 	modified:   code/game/objects/structures/watercloset.dm
 	modified:   code/game/objects/structures/window.dm
 	modified:   code/game/turfs/simulated/floor.dm
 	modified:   code/game/turfs/simulated/floor/plating.dm
 	modified:   code/game/turfs/simulated/floor/warning.dm
 	modified:   code/game/turfs/simulated/walls.dm
 	modified:   code/modules/admin/topic.dm
 	modified:   code/modules/admin/verbs/debug.dm
 	modified:   code/modules/admin/verbs/randomverbs.dm
 	modified:   code/modules/assembly/flash.dm
 	modified:   code/modules/assembly/proximity.dm
 	modified:   code/modules/atmospherics/environmental/LINDA_fire.dm
 	modified:   code/modules/atmospherics/machinery/atmosmachinery.dm
 	modified:   code/modules/atmospherics/machinery/components/components_base.dm
 	modified:   code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
 	modified:   code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
 	modified:   code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
 	modified:   code/modules/atmospherics/machinery/portable/canister.dm
 	modified:   code/modules/awaymissions/gateway.dm
 	modified:   code/modules/awaymissions/mission_code/snowdin.dm
 	modified:   code/modules/awaymissions/mission_code/stationCollision.dm
 	modified:   code/modules/awaymissions/mission_code/wildwest.dm
 	modified:   code/modules/client/preferences.dm
 	modified:   code/modules/clothing/chameleon.dm
 	modified:   code/modules/clothing/clothing.dm
 	modified:   code/modules/clothing/glasses/engine_goggles.dm
 	modified:   code/modules/clothing/glasses/glasses.dm
 	modified:   code/modules/clothing/gloves/color.dm
 	modified:   code/modules/clothing/gloves/miscellaneous.dm
 	modified:   code/modules/clothing/head/collectable.dm
 	modified:   code/modules/clothing/head/hardhat.dm
 	modified:   code/modules/clothing/head/helmet.dm
 	modified:   code/modules/clothing/head/jobs.dm
 	modified:   code/modules/clothing/head/misc.dm
 	modified:   code/modules/clothing/head/misc_special.dm
 	modified:   code/modules/clothing/head/soft_caps.dm
 	modified:   code/modules/clothing/masks/breath.dm
 	modified:   code/modules/clothing/masks/gasmask.dm
 	modified:   code/modules/clothing/masks/hailer.dm
 	modified:   code/modules/clothing/shoes/magboots.dm
 	modified:   code/modules/clothing/shoes/miscellaneous.dm
 	modified:   code/modules/clothing/spacesuits/chronosuit.dm
 	modified:   code/modules/clothing/spacesuits/hardsuit.dm
 	modified:   code/modules/clothing/spacesuits/miscellaneous.dm
 	modified:   code/modules/clothing/spacesuits/plasmamen.dm
 	modified:   code/modules/clothing/spacesuits/syndi.dm
 	modified:   code/modules/clothing/suits/armor.dm
 	modified:   code/modules/clothing/suits/bio.dm
 	modified:   code/modules/clothing/suits/cloaks.dm
 	modified:   code/modules/clothing/suits/jobs.dm
 	modified:   code/modules/clothing/suits/labcoat.dm
 	modified:   code/modules/clothing/suits/miscellaneous.dm
 	modified:   code/modules/clothing/suits/utility.dm
 	modified:   code/modules/clothing/suits/wiz_robe.dm
 	modified:   code/modules/clothing/under/color.dm
 	modified:   code/modules/clothing/under/jobs/civilian.dm
 	modified:   code/modules/clothing/under/jobs/engineering.dm
 	modified:   code/modules/clothing/under/jobs/medsci.dm
 	modified:   code/modules/clothing/under/jobs/security.dm
 	modified:   code/modules/clothing/under/miscellaneous.dm
 	modified:   code/modules/clothing/under/syndicate.dm
 	modified:   code/modules/clothing/under/ties.dm
 	modified:   code/modules/clothing/under/trek.dm
 	modified:   code/modules/events/blob.dm
 	modified:   code/modules/events/holiday/vday.dm
 	modified:   code/modules/events/holiday/xmas.dm
 	modified:   code/modules/events/immovable_rod.dm
 	modified:   code/modules/events/shuttle_loan.dm
 	modified:   code/modules/events/spacevine.dm
 	modified:   code/modules/events/spider_infestation.dm
 	modified:   code/modules/events/wizard/greentext.dm
 	modified:   code/modules/events/wizard/rpgloot.dm
 	modified:   code/modules/flufftext/Hallucination.dm
 	modified:   code/modules/food_and_drinks/drinks/drinks.dm
 	modified:   code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
 	modified:   code/modules/food_and_drinks/food.dm
 	modified:   code/modules/food_and_drinks/food/snacks/meat.dm
 	modified:   code/modules/food_and_drinks/food/snacks_other.dm
 	modified:   code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
 	modified:   code/modules/games/cards.dm
 	modified:   code/modules/holodeck/area_copy.dm
 	modified:   code/modules/holodeck/computer.dm
 	modified:   code/modules/hydroponics/grown.dm
 	modified:   code/modules/hydroponics/grown/flowers.dm
 	modified:   code/modules/hydroponics/grown/kudzu.dm
 	modified:   code/modules/hydroponics/grown/mushrooms.dm
 	modified:   code/modules/hydroponics/grown/nettle.dm
 	modified:   code/modules/hydroponics/grown/replicapod.dm
 	modified:   code/modules/hydroponics/grown/towercap.dm
 	modified:   code/modules/hydroponics/growninedible.dm
 	modified:   code/modules/hydroponics/hydroponics.dm
 	modified:   code/modules/hydroponics/seeds.dm
 	modified:   code/modules/jobs/access.dm
 	modified:   code/modules/jobs/job_types/civilian.dm
 	modified:   code/modules/library/lib_codex_gigas.dm
 	modified:   code/modules/library/lib_items.dm
 	modified:   code/modules/library/lib_machines.dm
 	modified:   code/modules/mining/equipment.dm
 	modified:   code/modules/mining/fulton.dm
 	modified:   code/modules/mining/lavaland/ash_flora.dm
 	modified:   code/modules/mining/lavaland/necropolis_chests.dm
 	modified:   code/modules/mining/machine_redemption.dm
 	modified:   code/modules/mining/mine_items.dm
 	modified:   code/modules/mining/mine_turfs.dm
 	modified:   code/modules/mining/money_bag.dm
 	modified:   code/modules/mob/interactive.dm
 	modified:   code/modules/mob/inventory.dm
 	modified:   code/modules/mob/living/bloodcrawl.dm
 	modified:   code/modules/mob/living/brain/brain.dm
 	modified:   code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
 	modified:   code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
 	modified:   code/modules/mob/living/carbon/carbon_defense.dm
 	modified:   code/modules/mob/living/carbon/examine.dm
 	modified:   code/modules/mob/living/carbon/human/examine.dm
 	modified:   code/modules/mob/living/carbon/human/human.dm
 	modified:   code/modules/mob/living/carbon/human/human_defense.dm
 	modified:   code/modules/mob/living/carbon/human/inventory.dm
 	modified:   code/modules/mob/living/carbon/human/species_types.dm
 	modified:   code/modules/mob/living/carbon/human/whisper.dm
 	modified:   code/modules/mob/living/carbon/monkey/monkey_defense.dm
 	modified:   code/modules/mob/living/carbon/update_icons.dm
 	modified:   code/modules/mob/living/living.dm
 	modified:   code/modules/mob/living/say.dm
 	modified:   code/modules/mob/living/silicon/ai/ai.dm
 	modified:   code/modules/mob/living/silicon/ai/ai_defense.dm
 	modified:   code/modules/mob/living/silicon/pai/pai_defense.dm
 	modified:   code/modules/mob/living/silicon/pai/software.dm
 	modified:   code/modules/mob/living/silicon/robot/robot.dm
 	modified:   code/modules/mob/living/silicon/robot/robot_defense.dm
 	modified:   code/modules/mob/living/simple_animal/animal_defense.dm
 	modified:   code/modules/mob/living/simple_animal/bot/ed209bot.dm
 	modified:   code/modules/mob/living/simple_animal/bot/secbot.dm
 	modified:   code/modules/mob/living/simple_animal/constructs.dm
 	modified:   code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm
 	modified:   code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
 	modified:   code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
 	modified:   code/modules/mob/living/simple_animal/friendly/farm_animals.dm
 	modified:   code/modules/mob/living/simple_animal/hostile/bear.dm
 	modified:   code/modules/mob/living/simple_animal/hostile/giant_spider.dm
 	modified:   code/modules/mob/living/simple_animal/hostile/illusion.dm
 	modified:   code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
 	modified:   code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
 	modified:   code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
 	modified:   code/modules/mob/living/simple_animal/hostile/statue.dm
 	modified:   code/modules/mob/living/simple_animal/shade.dm
 	modified:   code/modules/mob/living/simple_animal/simple_animal.dm
 	modified:   code/modules/mob/living/simple_animal/slime/life.dm
 	modified:   code/modules/mob/mob.dm
 	modified:   code/modules/mob/mob_transformation_simple.dm
 	modified:   code/modules/modular_computers/computers/item/computer.dm
 	modified:   code/modules/ninja/energy_katana.dm
 	modified:   code/modules/ninja/ninja_event.dm
 	modified:   code/modules/ninja/suit/gloves.dm
 	modified:   code/modules/ninja/suit/head.dm
 	modified:   code/modules/ninja/suit/mask.dm
 	modified:   code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
 	modified:   code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
 	modified:   code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm
 	modified:   code/modules/ninja/suit/ninjaDrainAct.dm
 	modified:   code/modules/ninja/suit/shoes.dm
 	modified:   code/modules/ninja/suit/suit.dm
 	modified:   code/modules/paperwork/clipboard.dm
 	modified:   code/modules/paperwork/contract.dm
 	modified:   code/modules/paperwork/folders.dm
 	modified:   code/modules/paperwork/paper.dm
 	modified:   code/modules/paperwork/paper_cutter.dm
 	modified:   code/modules/paperwork/paperbin.dm
 	modified:   code/modules/paperwork/paperplane.dm
 	modified:   code/modules/paperwork/photocopier.dm
 	modified:   code/modules/paperwork/photography.dm
 	modified:   code/modules/power/apc.dm
 	modified:   code/modules/power/cable.dm
 	modified:   code/modules/power/cell.dm
 	modified:   code/modules/power/gravitygenerator.dm
 	modified:   code/modules/power/lighting.dm
 	modified:   code/modules/power/power.dm
 	modified:   code/modules/power/rtg.dm
 	modified:   code/modules/power/singularity/containment_field.dm
 	modified:   code/modules/power/singularity/field_generator.dm
 	modified:   code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
 	modified:   code/modules/power/singularity/particle_accelerator/particle_control.dm
 	modified:   code/modules/power/singularity/singularity.dm
 	modified:   code/modules/power/smes.dm
 	modified:   code/modules/power/solar.dm
 	modified:   code/modules/power/supermatter/supermatter.dm
 	modified:   code/modules/power/tesla/energy_ball.dm
 	modified:   code/modules/projectiles/gun.dm
 	modified:   code/modules/projectiles/guns/energy/nuclear.dm
 	modified:   code/modules/projectiles/projectile.dm
 	modified:   code/modules/projectiles/projectile/bullets.dm
 	modified:   code/modules/projectiles/projectile/energy.dm
 	modified:   code/modules/reagents/chemistry/holder.dm
 	modified:   code/modules/reagents/chemistry/machinery/chem_dispenser.dm
 	modified:   code/modules/reagents/chemistry/machinery/chem_heater.dm
 	modified:   code/modules/reagents/chemistry/machinery/chem_master.dm
 	modified:   code/modules/reagents/chemistry/machinery/pandemic.dm
 	modified:   code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
 	modified:   code/modules/reagents/chemistry/reagents/blob_reagents.dm
 	modified:   code/modules/reagents/chemistry/reagents/drink_reagents.dm
 	modified:   code/modules/reagents/chemistry/reagents/food_reagents.dm
 	modified:   code/modules/reagents/chemistry/reagents/medicine_reagents.dm
 	modified:   code/modules/reagents/chemistry/reagents/other_reagents.dm
 	modified:   code/modules/reagents/chemistry/reagents/toxin_reagents.dm
 	modified:   code/modules/reagents/chemistry/recipes/slime_extracts.dm
 	modified:   code/modules/reagents/reagent_containers.dm
 	modified:   code/modules/reagents/reagent_containers/hypospray.dm
 	modified:   code/modules/reagents/reagent_dispenser.dm
 	modified:   code/modules/research/circuitprinter.dm
 	modified:   code/modules/research/designs.dm
 	modified:   code/modules/research/designs/stock_parts_designs.dm
 	modified:   code/modules/research/protolathe.dm
 	modified:   code/modules/research/rdconsole.dm
 	modified:   code/modules/research/rdmachines.dm
 	modified:   code/modules/research/server.dm
 	modified:   code/modules/research/xenobiology/xenobiology.dm
 	modified:   code/modules/ruins/objects_and_mobs/necropolis_gate.dm
 	modified:   code/modules/ruins/objects_and_mobs/sin_ruins.dm
 	modified:   code/modules/shuttle/shuttle.dm
 	modified:   code/modules/shuttle/special.dm
 	modified:   code/modules/shuttle/supply.dm
 	modified:   code/modules/spells/spell.dm
 	modified:   code/modules/spells/spell_types/charge.dm
 	modified:   code/modules/spells/spell_types/ethereal_jaunt.dm
 	modified:   code/modules/spells/spell_types/wizard.dm
 	modified:   code/modules/stock_market/computer.dm
 	modified:   code/modules/surgery/bodyparts/bodyparts.dm
 	modified:   code/modules/surgery/bodyparts/dismemberment.dm
 	modified:   code/modules/surgery/organs/augments_arms.dm
 	modified:   code/modules/surgery/organs/augments_chest.dm
 	modified:   code/modules/surgery/organs/augments_eyes.dm
 	modified:   code/modules/uplink/uplink_item.dm
 	modified:   code/modules/zombie/items.dm
 	modified:   code/modules/zombie/organs.dm
 	modified:   code/world.dm
 	modified:   config/admins.txt
 	modified:   html/changelog.html
 	modified:   html/changelogs/.all_changelog.yml
 	new file:   html/changelogs/AutoChangeLog-pr-20748.yml
 	modified:   icons/mob/hud.dmi
 	modified:   icons/mob/inhands/items_lefthand.dmi
 	modified:   icons/mob/inhands/items_righthand.dmi
 	modified:   icons/mob/talk.dmi
 	modified:   icons/mob/ties.dmi
 	modified:   icons/obj/chemical.dmi
 	modified:   icons/obj/clothing/ties.dmi
 	modified:   icons/obj/objects.dmi
 	modified:   icons/turf/floors.dmi
 	deleted:    icons/turf/floors/warning.dmi
2016-09-30 20:00:39 -04:00

562 lines
22 KiB
Plaintext

//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
/*
* GAMEMODES (by Rastaf0)
*
* In the new mode system all special roles are fully supported.
* You can have proper wizards/traitors/changelings/cultists during any mode.
* Only two things really depends on gamemode:
* 1. Starting roles, equipment and preparations
* 2. Conditions of finishing the round.
*
*/
/datum/game_mode
var/name = "invalid"
var/config_tag = null
var/votable = 1
var/probability = 0
var/station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm
var/explosion_in_progress = 0 //sit back and relax
var/round_ends_with_antag_death = 0 //flags the "one verse the station" antags as such
var/list/datum/mind/modePlayer = new
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
var/list/protected_jobs = list() // Jobs that can't be traitors because
var/required_players = 0
var/required_enemies = 0
var/recommended_enemies = 0
var/antag_flag = null //preferences flag such as BE_WIZARD that need to be turned on for players to be antag
var/mob/living/living_antag_player = null
var/list/datum/game_mode/replacementmode = null
var/round_converted = 0 //0: round not converted, 1: round going to convert, 2: round converted
var/reroll_friendly //During mode conversion only these are in the running
var/continuous_sanity_checked //Catches some cases where config options could be used to suggest that modes without antagonists should end when all antagonists die
var/enemy_minimum_age = 7 //How many days must players have been playing before they can play this antagonist
var/announce_span = "warning" //The gamemode's name will be in this span during announcement.
var/announce_text = "This gamemode forgot to set a descriptive text! Uh oh!" //Used to describe a gamemode when it's announced.
var/const/waittime_l = 600
var/const/waittime_h = 1800 // started at 1800
var/list/datum/station_goal/station_goals = list()
/datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description.
world << "<b>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>"
world << "<b>[announce_text]</b>"
///Checks to see if the game can be setup and ran with the current number of players or whatnot.
/datum/game_mode/proc/can_start()
var/playerC = 0
for(var/mob/new_player/player in player_list)
if((player.client)&&(player.ready))
playerC++
if(!Debug2)
if(playerC < required_players)
return 0
antag_candidates = get_players_for_role(antag_flag)
if(!Debug2)
if(antag_candidates.len < required_enemies)
return 0
return 1
else
message_admins("<span class='notice'>DEBUG: GAME STARTING WITHOUT PLAYER NUMBER CHECKS, THIS WILL PROBABLY BREAK SHIT.</span>")
return 1
///Attempts to select players for special roles the mode might have.
/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=0) //Gamemodes can override the intercept report. Passing a 1 as the argument will force a report.
if(!report)
report = config.intercept
spawn (ROUNDSTART_LOGOUT_REPORT_TIME)
display_roundstart_logout_report()
feedback_set_details("round_start","[time2text(world.realtime)]")
if(ticker && ticker.mode)
feedback_set_details("game_mode","[ticker.mode]")
if(revdata.commit)
feedback_set_details("revision","[revdata.commit]")
feedback_set_details("server_ip","[world.internet_address]:[world.port]")
if(report)
spawn (rand(waittime_l, waittime_h))
send_intercept(0)
generate_station_goals()
start_state = new /datum/station_state()
start_state.count(1)
return 1
///Handles late-join antag assignments
/datum/game_mode/proc/make_antag_chance(mob/living/carbon/human/character)
if(replacementmode && round_converted == 2)
replacementmode.make_antag_chance(character)
return
///Allows rounds to basically be "rerolled" should the initial premise fall through
/datum/game_mode/proc/convert_roundtype()
var/list/living_crew = list()
for(var/mob/Player in mob_list)
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player))
living_crew += Player
if(living_crew.len / joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh
message_admins("Convert_roundtype failed due to too many dead people. Limit is [config.midround_antag_life_check * 100]% living crew")
return null
var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew.len)
var/list/datum/game_mode/usable_modes = list()
for(var/datum/game_mode/G in runnable_modes)
if(G.reroll_friendly)
usable_modes += G
else
qdel(G)
if(!usable_modes)
message_admins("Convert_roundtype failed due to no valid modes to convert to. Please report this error to the Coders.")
return null
replacementmode = pickweight(usable_modes)
switch(SSshuttle.emergency.mode) //Rounds on the verge of ending don't get new antags, they just run out
if(SHUTTLE_STRANDED, SHUTTLE_ESCAPE)
return 1
if(SHUTTLE_CALL)
if(SSshuttle.emergency.timeLeft(1) < initial(SSshuttle.emergencyCallTime)*0.5)
return 1
if(world.time >= (config.midround_antag_time_check * 600))
message_admins("Convert_roundtype failed due to round length. Limit is [config.midround_antag_time_check] minutes.")
return null
var/list/antag_canadates = list()
for(var/mob/living/carbon/human/H in living_crew)
if(H.client && H.client.prefs.allow_midround_antag)
antag_canadates += H
if(!antag_canadates)
message_admins("Convert_roundtype failed due to no antag canadates.")
return null
antag_canadates = shuffle(antag_canadates)
if(config.protect_roles_from_antagonist)
replacementmode.restricted_jobs += replacementmode.protected_jobs
if(config.protect_assistant_from_antagonist)
replacementmode.restricted_jobs += "Assistant"
message_admins("The roundtype will be converted. If you have other plans for the station or think the round should end <A HREF='?_src_=holder;toggle_midround_antag=\ref[usr]'>stop the creation of antags</A> or <A HREF='?_src_=holder;end_round=\ref[usr]'>end the round now</A>.")
spawn(rand(1200,3000)) //somewhere between 2 and 5 minutes from now
if(!config.midround_antag[ticker.mode.config_tag])
round_converted = 0
return 1
for(var/mob/living/carbon/human/H in antag_canadates)
replacementmode.make_antag_chance(H)
round_converted = 2
message_admins("-- IMPORTANT: The roundtype has been converted to [replacementmode.name], antagonists may have been created! --")
return 1
///Called by the gameticker
/datum/game_mode/process()
return 0
/datum/game_mode/proc/check_finished() //to be called by ticker
if(replacementmode && round_converted == 2)
return replacementmode.check_finished()
if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_ENDGAME))
return TRUE
if(station_was_nuked)
return TRUE
if(!round_converted && (!config.continuous[config_tag] || (config.continuous[config_tag] && config.midround_antag[config_tag]))) //Non-continuous or continous with replacement antags
if(!continuous_sanity_checked) //make sure we have antags to be checking in the first place
for(var/mob/Player in mob_list)
if(Player.mind)
if(Player.mind.special_role)
continuous_sanity_checked = 1
return 0
if(!continuous_sanity_checked)
message_admins("The roundtype ([config_tag]) has no antagonists, continuous round has been defaulted to on and midround_antag has been defaulted to off.")
config.continuous[config_tag] = 1
config.midround_antag[config_tag] = 0
SSshuttle.clearHostileEnvironment(src)
return 0
if(living_antag_player && living_antag_player.mind && isliving(living_antag_player) && living_antag_player.stat != DEAD && !isnewplayer(living_antag_player) &&!isbrain(living_antag_player))
return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
for(var/mob/Player in living_mob_list)
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player))
if(Player.mind.special_role) //Someone's still antaging!
living_antag_player = Player
return 0
if(!config.continuous[config_tag])
return 1
else
round_converted = convert_roundtype()
if(!round_converted)
if(round_ends_with_antag_death)
return 1
else
config.midround_antag[config_tag] = 0
return 0
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 player_list)
if(M.client)
clients++
if(ishuman(M))
if(!M.stat)
surviving_humans++
if(M.z == 2)
escaped_humans++
if(!M.stat)
surviving_total++
if(M.z == 2)
escaped_total++
if(isobserver(M))
ghosts++
if(clients > 0)
feedback_set("round_end_clients",clients)
if(ghosts > 0)
feedback_set("round_end_ghosts",ghosts)
if(surviving_humans > 0)
feedback_set("survived_human",surviving_humans)
if(surviving_total > 0)
feedback_set("survived_total",surviving_total)
if(escaped_humans > 0)
feedback_set("escaped_human",escaped_humans)
if(escaped_total > 0)
feedback_set("escaped_total",escaped_total)
send2irc("Server", "Round just ended.")
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 = "<b><i>Central Command Status Summary</i></b><hr>"
intercepttext += "<b>Central Command has intercepted and partially decoded a Syndicate transmission with vital information regarding their movements. The following report outlines the most \
likely threats to appear in your sector.</b>"
var/list/possible_modes = list()
possible_modes.Add("blob", "changeling", "clock_cult", "cult", "extended", "gang", "malf", "nuclear", "revolution", "traitor", "wizard")
possible_modes -= name //remove the current gamemode to prevent it from being randomly deleted, it will be readded later
for(var/i in 1 to 6) //Remove a few modes to leave four
possible_modes -= pick(possible_modes)
possible_modes |= name //Re-add the actual gamemode - the intercept will thus always have the correct mode in its list
possible_modes = shuffle(possible_modes) //Meta prevention
var/datum/intercept_text/i_text = new /datum/intercept_text
for(var/V in possible_modes)
intercepttext += i_text.build(V)
if(station_goals.len)
intercepttext += "<hr><b>Special Orders for [station_name()]:</b>"
for(var/datum/station_goal/G in station_goals)
G.on_report()
intercepttext += G.get_report()
print_command_report(intercepttext, "Central Command Status Summary")
priority_announce("A summary has been copied and printed to all communications consoles.", "Enemy communication intercepted. Security level elevated.", 'sound/AI/intercept.ogg')
if(security_level < SEC_LEVEL_BLUE)
set_security_level(SEC_LEVEL_BLUE)
/datum/game_mode/proc/get_players_for_role(role)
var/list/players = list()
var/list/candidates = list()
var/list/drafted = list()
var/datum/mind/applicant = null
// Ultimate randomizing code right here
for(var/mob/new_player/player in player_list)
if(player.client && player.ready)
players += player
// Shuffling, the players list is now ping-independent!!!
// Goodbye antag dante
players = shuffle(players)
for(var/mob/new_player/player in players)
if(player.client && player.ready)
if(role in player.client.prefs.be_special)
if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
if(age_check(player.client)) //Must be older than the minimum age
candidates += player.mind // Get a list of all the people who want to be the antagonist for this round
if(restricted_jobs)
for(var/datum/mind/player in candidates)
for(var/job in restricted_jobs) // Remove people who want to be antagonist but have a job already that precludes it
if(player.assigned_role == job)
candidates -= player
if(candidates.len < recommended_enemies)
for(var/mob/new_player/player in players)
if(player.client && player.ready)
if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a seperate list of people who don't want to be one
if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
drafted += player.mind
if(restricted_jobs)
for(var/datum/mind/player in drafted) // Remove people who can't be an antagonist
for(var/job in restricted_jobs)
if(player.assigned_role == job)
drafted -= player
drafted = shuffle(drafted) // Will hopefully increase randomness, Donkie
while(candidates.len < recommended_enemies) // Pick randomlly just the number of people we need and add them to our list of candidates
if(drafted.len > 0)
applicant = pick(drafted)
if(applicant)
candidates += applicant
drafted.Remove(applicant)
else // Not enough scrubs, ABORT ABORT ABORT
break
/*
if(candidates.len < recommended_enemies && override_jobbans) //If we still don't have enough people, we're going to start drafting banned people.
for(var/mob/new_player/player in players)
if (player.client && player.ready)
if(jobban_isbanned(player, "Syndicate") || jobban_isbanned(player, roletext)) //Nodrak/Carn: Antag Job-bans
drafted += player.mind
*/
if(restricted_jobs)
for(var/datum/mind/player in drafted) // Remove people who can't be an antagonist
for(var/job in restricted_jobs)
if(player.assigned_role == job)
drafted -= player
drafted = shuffle(drafted) // Will hopefully increase randomness, Donkie
while(candidates.len < recommended_enemies) // Pick randomlly just the number of people we need and add them to our list of candidates
if(drafted.len > 0)
applicant = pick(drafted)
if(applicant)
candidates += applicant
drafted.Remove(applicant)
else // Not enough scrubs, ABORT ABORT ABORT
break
return candidates // Returns: The number of people who had the antagonist role set to yes, regardless of recomended_enemies, if that number is greater than recommended_enemies
// recommended_enemies if the number of people with that role set to yes is less than recomended_enemies,
// Less if there are not enough valid players in the game entirely to make recommended_enemies.
/*
/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/new_player/player)
if(player.preferences.be_special & role)
return 1
return 0
*/
/datum/game_mode/proc/num_players()
. = 0
for(var/mob/new_player/P in player_list)
if(P.client && P.ready)
. ++
///////////////////////////////////
//Keeps track of all living heads//
///////////////////////////////////
/datum/game_mode/proc/get_living_heads()
. = list()
for(var/mob/living/carbon/human/player in mob_list)
if(player.stat != DEAD && player.mind && (player.mind.assigned_role in command_positions))
. |= player.mind
////////////////////////////
//Keeps track of all heads//
////////////////////////////
/datum/game_mode/proc/get_all_heads()
. = list()
for(var/mob/player in mob_list)
if(player.mind && (player.mind.assigned_role in command_positions))
. |= player.mind
//////////////////////////////////////////////
//Keeps track of all living security members//
//////////////////////////////////////////////
/datum/game_mode/proc/get_living_sec()
. = list()
for(var/mob/living/carbon/human/player in mob_list)
if(player.stat != DEAD && player.mind && (player.mind.assigned_role in security_positions))
. |= player.mind
////////////////////////////////////////
//Keeps track of all security members//
////////////////////////////////////////
/datum/game_mode/proc/get_all_sec()
. = list()
for(var/mob/living/carbon/human/player in mob_list)
if(player.mind && (player.mind.assigned_role in security_positions))
. |= player.mind
//////////////////////////
//Reports player logouts//
//////////////////////////
/proc/display_roundstart_logout_report()
var/msg = "<span class='boldnotice'>Roundstart logout report\n\n</span>"
for(var/mob/living/L in mob_list)
if(L.ckey)
var/found = 0
for(var/client/C in clients)
if(C.ckey == L.ckey)
found = 1
break
if(!found)
msg += "<b>[L.name]</b> ([L.ckey]), the [L.job] (<font color='#ffcc00'><b>Disconnected</b></font>)\n"
if(L.ckey && L.client)
if(L.client.inactivity >= (ROUNDSTART_LOGOUT_REPORT_TIME / 2)) //Connected, but inactive (alt+tabbed or something)
msg += "<b>[L.name]</b> ([L.ckey]), the [L.job] (<font color='#ffcc00'><b>Connected, Inactive</b></font>)\n"
continue //AFK client
if(L.stat)
if(L.suiciding) //Suicider
msg += "<b>[L.name]</b> ([L.ckey]), the [L.job] (<span class='boldannounce'>Suicide</span>)\n"
continue //Disconnected client
if(L.stat == UNCONSCIOUS)
msg += "<b>[L.name]</b> ([L.ckey]), the [L.job] (Dying)\n"
continue //Unconscious
if(L.stat == DEAD)
msg += "<b>[L.name]</b> ([L.ckey]), the [L.job] (Dead)\n"
continue //Dead
continue //Happy connected client
for(var/mob/dead/observer/D in mob_list)
if(D.mind && D.mind.current == L)
if(L.stat == DEAD)
if(L.suiciding) //Suicider
msg += "<b>[L.name]</b> ([ckey(D.mind.key)]), the [L.job] (<span class='boldannounce'>Suicide</span>)\n"
continue //Disconnected client
else
msg += "<b>[L.name]</b> ([ckey(D.mind.key)]), the [L.job] (Dead)\n"
continue //Dead mob, ghost abandoned
else
if(D.can_reenter_corpse)
continue //Adminghost, or cult/wizard ghost
else
msg += "<b>[L.name]</b> ([ckey(D.mind.key)]), the [L.job] (<span class='boldannounce'>Ghosted</span>)\n"
continue //Ghosted while alive
for(var/mob/M in mob_list)
if(M.client && M.client.holder)
M << msg
/datum/game_mode/proc/printplayer(datum/mind/ply, fleecheck)
var/text = "<br><b>[ply.key]</b> was <b>[ply.name]</b> the <b>[ply.assigned_role]</b> and"
if(ply.current)
if(ply.current.stat == DEAD)
text += " <span class='boldannounce'>died</span>"
else
text += " <span class='greenannounce'>survived</span>"
if(fleecheck && ply.current.z > ZLEVEL_STATION)
text += " while <span class='boldannounce'>fleeing the station</span>"
if(ply.current.real_name != ply.name)
text += " as <b>[ply.current.real_name]</b>"
else
text += " <span class='boldannounce'>had their body destroyed</span>"
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 += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='greenannounce'>Success!</span>"
else
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='boldannounce'>Fail.</span>"
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)
return 1 //Available in 0 days = available right now = player is old enough to play.
return 0
/datum/game_mode/proc/get_remaining_days(client/C)
if(!C)
return 0
if(!config.use_age_restriction_for_jobs)
return 0
if(!isnum(C.player_age))
return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced
if(!isnum(enemy_minimum_age))
return 0
return max(0, enemy_minimum_age - C.player_age)
/datum/game_mode/proc/replace_jobbaned_player(mob/living/M, role_type, pref)
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [role_type]?", "[role_type]", null, pref, 50, M)
var/mob/dead/observer/theghost = null
if(candidates.len)
theghost = pick(candidates)
M << "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!"
message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)]) to replace a jobbaned player.")
M.ghostize(0)
M.key = theghost.key
/datum/game_mode/proc/remove_antag_for_borging(datum/mind/newborgie)
ticker.mode.remove_cultist(newborgie, 0, 0)
ticker.mode.remove_revolutionary(newborgie, 0)
ticker.mode.remove_gangster(newborgie, 0, remove_bosses=1)
/datum/game_mode/proc/generate_station_goals()
var/list/possible = list()
for(var/T in subtypesof(/datum/station_goal))
var/datum/station_goal/G = T
if(config_tag in initial(G.gamemode_blacklist))
continue
//if(num_players() < initial(G.required_crew))
// continue
possible += T
var/goal_weights = 0
while(possible.len && goal_weights < STATION_GOAL_BUDGET)
var/datum/station_goal/picked = pick_n_take(possible)
goal_weights += initial(picked.weight)
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()