Conflicts:
	README.txt
	SQL/tgstation_schema.sql
	baystation12.dme
	code/ATMOSPHERICS/components/unary/vent_pump.dm
	code/ATMOSPHERICS/pipes.dm
	code/FEA/FEA_airgroup.dm
	code/FEA/FEA_fire.dm
	code/FEA/FEA_gas_mixture.dm
	code/FEA/FEA_turf_tile.dm
	code/TriDimension/Pipes.dm
	code/WorkInProgress/buildmode.dm
	code/WorkInProgress/organs/organs.dm
	code/WorkInProgress/virus2/Disease2/analyser.dm
	code/WorkInProgress/virus2/Disease2/biohazard destroyer.dm
	code/WorkInProgress/virus2/Disease2/cureimplanter.dm
	code/WorkInProgress/virus2/Disease2/diseasesplicer.dm
	code/WorkInProgress/virus2/Disease2/dishincubator.dm
	code/WorkInProgress/virus2/Disease2/isolator.dm
	code/WorkInProgress/virus2/Disease2/monkeydispensor.dm
	code/WorkInProgress/virus2/analyser.dm
	code/WorkInProgress/virus2/antibodies.dm
	code/WorkInProgress/virus2/base.dm
	code/WorkInProgress/virus2/biohazard destroyer.dm
	code/WorkInProgress/virus2/cureimplanter.dm
	code/WorkInProgress/virus2/curer.dm
	code/WorkInProgress/virus2/diseasesplicer.dm
	code/WorkInProgress/virus2/dishincubator.dm
	code/WorkInProgress/virus2/isolator.dm
	code/WorkInProgress/virus2/monkeydispensor.dm
	code/datums/ai_laws.dm
	code/datums/configuration.dm
	code/datums/datumvars.dm
	code/datums/diseases/alien_embryo.dm
	code/datums/diseases/appendicitis.dm
	code/datums/diseases/robotic_transformation.dm
	code/datums/diseases/xeno_transformation.dm
	code/datums/helper_datums/getrev.dm
	code/datums/helper_datums/teleport.dm
	code/datums/helper_datums/tension.dm
	code/datums/mind.dm
	code/datums/mixed.dm
	code/datums/shuttle_controller.dm
	code/datums/spell.dm
	code/datums/spells/ethereal_jaunt.dm
	code/datums/spells/genetic.dm
	code/datums/spells/wizard.dm
	code/defines/area/Space Station 13 areas.dm
	code/defines/atom.dm
	code/defines/global.dm
	code/defines/mob/dead/observer.dm
	code/defines/mob/living/carbon/alien.dm
	code/defines/mob/living/carbon/alien_humanoid.dm
	code/defines/mob/living/carbon/carbon.dm
	code/defines/mob/living/carbon/metroid.dm
	code/defines/mob/living/carbon/monkey.dm
	code/defines/mob/living/living.dm
	code/defines/mob/living/silicon/ai.dm
	code/defines/mob/living/silicon/robot.dm
	code/defines/obj.dm
	code/defines/obj/closet.dm
	code/defines/obj/clothing.dm
	code/defines/obj/clothing/costume.dm
	code/defines/obj/computer.dm
	code/defines/obj/costume.dm
	code/defines/obj/decal.dm
	code/defines/obj/door.dm
	code/defines/obj/hydro.dm
	code/defines/obj/machinery.dm
	code/defines/obj/storage.dm
	code/defines/obj/supplypacks.dm
	code/defines/obj/toy.dm
	code/defines/obj/vending.dm
	code/defines/obj/weapon.dm
	code/defines/procs/AStar.dm
	code/defines/procs/command_name.dm
	code/defines/procs/dbcore.dm
	code/defines/procs/forum_activation.dm
	code/defines/procs/gamehelpers.dm
	code/defines/procs/helpers.dm
	code/defines/procs/icon_procs.dm
	code/defines/procs/station_name.dm
	code/defines/procs/statistics.dm
	code/defines/turf.dm
	code/game/algorithm.dm
	code/game/area/areas.dm
	code/game/asteroid/artifacts.dm
	code/game/atom_procs.dm
	code/game/cellautomata.dm
	code/game/dna.dm
	code/game/events/EventProcs/clang.dm
	code/game/events/EventProcs/dust.dm
	code/game/events/EventProcs/ninja_abilities.dm
	code/game/events/EventProcs/ninja_equipment.dm
	code/game/events/EventProcs/space_ninja.dm
	code/game/events/EventProcs/spacevines.dm
	code/game/gamemodes/blob/blob.dm
	code/game/gamemodes/blob/blob_finish.dm
	code/game/gamemodes/blob/blob_report.dm
	code/game/gamemodes/blob/theblob.dm
	code/game/gamemodes/changeling/changeling.dm
	code/game/gamemodes/changeling/changeling_powers.dm
	code/game/gamemodes/changeling/modularchangling.dm
	code/game/gamemodes/changeling/traitor_chan.dm
	code/game/gamemodes/cult/cult.dm
	code/game/gamemodes/cult/cult_items.dm
	code/game/gamemodes/cult/cult_structures.dm
	code/game/gamemodes/events.dm
	code/game/gamemodes/events/black_hole.dm
	code/game/gamemodes/events/miniblob.dm
	code/game/gamemodes/factions.dm
	code/game/gamemodes/game_mode.dm
	code/game/gamemodes/gameticker.dm
	code/game/gamemodes/malfunction/malfunction.dm
	code/game/gamemodes/meteor/meteor.dm
	code/game/gamemodes/meteor/meteors.dm
	code/game/gamemodes/nuclear/nuclear.dm
	code/game/gamemodes/nuclear/nuclearbomb.dm
	code/game/gamemodes/nuclear/pinpointer.dm
	code/game/gamemodes/objective.dm
	code/game/gamemodes/revolution/revolution.dm
	code/game/gamemodes/sandbox/h_sandbox.dm
	code/game/gamemodes/sandbox/sandbox.dm
	code/game/gamemodes/setupgame.dm
	code/game/gamemodes/traitor/traitor.dm
	code/game/gamemodes/wizard/rightandwrong.dm
	code/game/gamemodes/wizard/soulstone.dm
	code/game/gamemodes/wizard/spellbook.dm
	code/game/gamemodes/wizard/spells.dm
	code/game/gamemodes/wizard/veilrender.dm
	code/game/gamemodes/wizard/wizard.dm
	code/game/hud.dm
	code/game/jobs/access.dm
	code/game/jobs/job/captain.dm
	code/game/jobs/job/civilian.dm
	code/game/jobs/job/civilian_chaplain.dm
	code/game/jobs/job/engineering.dm
	code/game/jobs/job/job.dm
	code/game/jobs/job/medical.dm
	code/game/jobs/job/science.dm
	code/game/jobs/job/security.dm
	code/game/jobs/job/silicon.dm
	code/game/jobs/job_controller.dm
	code/game/jobs/jobs.dm
	code/game/machinery/Beacon.dm
	code/game/machinery/OpTable.dm
	code/game/machinery/Sleeper.dm
	code/game/machinery/alarm.dm
	code/game/machinery/atmo_control.dm
	code/game/machinery/atmoalter/area_atmos_computer.dm
	code/game/machinery/autolathe.dm
	code/game/machinery/biogenerator.dm
	code/game/machinery/bots/bots.dm
	code/game/machinery/bots/cleanbot.dm
	code/game/machinery/bots/ed209bot.dm
	code/game/machinery/bots/floorbot.dm
	code/game/machinery/bots/medbot.dm
	code/game/machinery/bots/mulebot.dm
	code/game/machinery/camera.dm
	code/game/machinery/cell_charger.dm
	code/game/machinery/cloning.dm
	code/game/machinery/computer/HolodeckControl.dm
	code/game/machinery/computer/Operating.dm
	code/game/machinery/computer/ai_core.dm
	code/game/machinery/computer/arcade.dm
	code/game/machinery/computer/atmos_alert.dm
	code/game/machinery/computer/buildandrepair.dm
	code/game/machinery/computer/card.dm
	code/game/machinery/computer/cloning.dm
	code/game/machinery/computer/communications.dm
	code/game/machinery/computer/computer.dm
	code/game/machinery/computer/crew.dm
	code/game/machinery/computer/hologram.dm
	code/game/machinery/computer/law.dm
	code/game/machinery/computer/medical.dm
	code/game/machinery/computer/message.dm
	code/game/machinery/computer/pod.dm
	code/game/machinery/computer/power.dm
	code/game/machinery/computer/prisoner.dm
	code/game/machinery/computer/robot.dm
	code/game/machinery/computer/security.dm
	code/game/machinery/computer/shuttle.dm
	code/game/machinery/constructable_frame.dm
	code/game/machinery/deployable.dm
	code/game/machinery/door_control.dm
	code/game/machinery/doors/airlock.dm
	code/game/machinery/doors/airlock_electronics.dm
	code/game/machinery/doors/brigdoors.dm
	code/game/machinery/doors/door.dm
	code/game/machinery/doors/firedoor.dm
	code/game/machinery/doors/poddoor.dm
	code/game/machinery/doors/unpowered.dm
	code/game/machinery/doors/windowdoor.dm
	code/game/machinery/flasher.dm
	code/game/machinery/gateway.dm
	code/game/machinery/hologram.dm
	code/game/machinery/hydroponics.dm
	code/game/machinery/kitchen/gibber.dm
	code/game/machinery/morgue.dm
	code/game/machinery/newscaster.dm
	code/game/machinery/pipe/construction.dm
	code/game/machinery/pipe/pipe_dispenser.dm
	code/game/machinery/portable_turret.dm
	code/game/machinery/recharger.dm
	code/game/machinery/rechargestation.dm
	code/game/machinery/requests_console.dm
	code/game/machinery/shieldgen.dm
	code/game/machinery/spaceheater.dm
	code/game/machinery/suit_storage_unit.dm
	code/game/machinery/syndicatebeacon.dm
	code/game/machinery/telecomms/broadcaster.dm
	code/game/machinery/telecomms/logbrowser.dm
	code/game/machinery/telecomms/machine_interactions.dm
	code/game/machinery/telecomms/telemonitor.dm
	code/game/machinery/telecomms/traffic_control.dm
	code/game/machinery/teleporter.dm
	code/game/machinery/turrets.dm
	code/game/machinery/vending.dm
	code/game/magic/cultist/ritual.dm
	code/game/magic/cultist/runes.dm
	code/game/magic/library.dm
	code/game/magic/musician.dm
	code/game/master_controller.dm
	code/game/mecha/combat/combat.dm
	code/game/mecha/combat/gygax.dm
	code/game/mecha/equipment/mecha_equipment.dm
	code/game/mecha/equipment/tools/tools.dm
	code/game/mecha/equipment/weapons/weapons.dm
	code/game/mecha/mech_fabricator.dm
	code/game/mecha/mecha.dm
	code/game/mecha/mecha_construction_paths.dm
	code/game/mecha/mecha_wreckage.dm
	code/game/mecha/medical/medical.dm
	code/game/mecha/medical/odysseus.dm
	code/game/mecha/working/ripley.dm
	code/game/objects/alien/facehugger.dm
	code/game/objects/alien/resin.dm
	code/game/objects/bodybag.dm
	code/game/objects/closets.dm
	code/game/objects/closets/emergency.dm
	code/game/objects/closets/extinguisher.dm
	code/game/objects/closets/fireaxe.dm
	code/game/objects/closets/firecloset.dm
	code/game/objects/closets/fitnesscloset.dm
	code/game/objects/closets/janitor.dm
	code/game/objects/closets/kitchen.dm
	code/game/objects/closets/nuclear.dm
	code/game/objects/closets/secure/bar.dm
	code/game/objects/closets/secure/cargo.dm
	code/game/objects/closets/secure/engineering.dm
	code/game/objects/closets/secure/hydroponics.dm
	code/game/objects/closets/secure/medical.dm
	code/game/objects/closets/secure/personal.dm
	code/game/objects/closets/secure/scientist.dm
	code/game/objects/closets/secure/secure_closets.dm
	code/game/objects/closets/secure/security.dm
	code/game/objects/closets/syndicate.dm
	code/game/objects/closets/wardrobe.dm
	code/game/objects/contraband.dm
	code/game/objects/crates.dm
	code/game/objects/devices/PDA/PDA.dm
	code/game/objects/devices/PDA/cart.dm
	code/game/objects/devices/PDA/chatroom.dm
	code/game/objects/devices/aicard.dm
	code/game/objects/devices/flash.dm
	code/game/objects/devices/flashlight.dm
	code/game/objects/devices/paicard.dm
	code/game/objects/devices/scanners.dm
	code/game/objects/devices/taperecorder.dm
	code/game/objects/devices/traitordevices.dm
	code/game/objects/door_assembly.dm
	code/game/objects/effect_system.dm
	code/game/objects/electricchair.dm
	code/game/objects/explosion.dm
	code/game/objects/gibs.dm
	code/game/objects/grille.dm
	code/game/objects/items.dm
	code/game/objects/items/blueprints.dm
	code/game/objects/items/candle.dm
	code/game/objects/items/clothing.dm
	code/game/objects/items/food.dm
	code/game/objects/items/helper_procs.dm
	code/game/objects/items/item.dm
	code/game/objects/items/robot_items.dm
	code/game/objects/items/robot_parts.dm
	code/game/objects/items/tk_grab.dm
	code/game/objects/items/weapons/AI_modules.dm
	code/game/objects/items/weapons/RCD.dm
	code/game/objects/items/weapons/RSF.dm
	code/game/objects/items/weapons/cameras.dm
	code/game/objects/items/weapons/cards_ids.dm
	code/game/objects/items/weapons/cigs_lighters.dm
	code/game/objects/items/weapons/clown_items.dm
	code/game/objects/items/weapons/dna_injector.dm
	code/game/objects/items/weapons/explosives.dm
	code/game/objects/items/weapons/flamethrower.dm
	code/game/objects/items/weapons/grenades.dm
	code/game/objects/items/weapons/hand_lablers.dm
	code/game/objects/items/weapons/hydroponics.dm
	code/game/objects/items/weapons/implants/implant.dm
	code/game/objects/items/weapons/implants/implantcase.dm
	code/game/objects/items/weapons/implants/implantchair.dm
	code/game/objects/items/weapons/implants/implanter.dm
	code/game/objects/items/weapons/implants/implantfreedom.dm
	code/game/objects/items/weapons/implants/implantnanoaug.dm
	code/game/objects/items/weapons/implants/implantpad.dm
	code/game/objects/items/weapons/kitchen.dm
	code/game/objects/items/weapons/manuals.dm
	code/game/objects/items/weapons/medical.dm
	code/game/objects/items/weapons/mops_cleaners.dm
	code/game/objects/items/weapons/papers_bins.dm
	code/game/objects/items/weapons/stunbaton.dm
	code/game/objects/items/weapons/surgery_tools.dm
	code/game/objects/items/weapons/swords_axes_etc.dm
	code/game/objects/items/weapons/table_rack_parts.dm
	code/game/objects/items/weapons/tools.dm
	code/game/objects/items/weapons/twohanded.dm
	code/game/objects/items/weapons/wrappingpaper.dm
	code/game/objects/mineral_doors.dm
	code/game/objects/radio/beacon.dm
	code/game/objects/radio/electropack.dm
	code/game/objects/radio/encryptionkey.dm
	code/game/objects/radio/headset.dm
	code/game/objects/radio/intercom.dm
	code/game/objects/radio/radio.dm
	code/game/objects/secstorage/sbriefcase.dm
	code/game/objects/secstorage/ssafe.dm
	code/game/objects/stacks/glass.dm
	code/game/objects/stacks/metal.dm
	code/game/objects/stacks/stack.dm
	code/game/objects/stacks/wood.dm
	code/game/objects/stool.dm
	code/game/objects/storage/backpack.dm
	code/game/objects/storage/belt.dm
	code/game/objects/storage/bible.dm
	code/game/objects/storage/briefcase.dm
	code/game/objects/storage/lockbox.dm
	code/game/objects/storage/storage.dm
	code/game/objects/storage/uplink_kits.dm
	code/game/objects/structures.dm
	code/game/objects/tables_racks.dm
	code/game/objects/tank.dm
	code/game/objects/tanks/emergency.dm
	code/game/objects/tanks/jetpack.dm
	code/game/objects/toys.dm
	code/game/objects/transfer_valve.dm
	code/game/objects/uplinks.dm
	code/game/objects/watercloset.dm
	code/game/objects/weapons.dm
	code/game/objects/windoor_assembly.dm
	code/game/objects/window.dm
	code/game/prisonshuttle.dm
	code/game/smoothwall.dm
	code/game/sound.dm
	code/game/step_triggers.dm
	code/game/structure/structure.dm
	code/game/supplyshuttle.dm
	code/game/throwing.dm
	code/game/topic.dm
	code/game/turf.dm
	code/game/vehicles/airtight/airtight.dm
	code/game/vehicles/airtight/land.dm
	code/game/vehicles/airtight/space.dm
	code/game/vehicles/vehicle.dm
	code/game/verbs/ooc.dm
	code/game/verbs/sound.dm
	code/game/verbs/suicide.dm
	code/game/verbs/who.dm
	code/game/vote.dm
	code/modules/admin/IsBanned.dm
	code/modules/admin/NewBan.dm
	code/modules/admin/admin.dm
	code/modules/admin/admin_investigate.dm
	code/modules/admin/admin_memo.dm
	code/modules/admin/admin_verbs.dm
	code/modules/admin/banjob.dm
	code/modules/admin/create_mob.dm
	code/modules/admin/create_object.dm
	code/modules/admin/create_turf.dm
	code/modules/admin/player_panel.dm
	code/modules/admin/verbs/MC.dm
	code/modules/admin/verbs/adminhelp.dm
	code/modules/admin/verbs/adminjump.dm
	code/modules/admin/verbs/adminpm.dm
	code/modules/admin/verbs/adminsay.dm
	code/modules/admin/verbs/atmosdebug.dm
	code/modules/admin/verbs/cinematic.dm
	code/modules/admin/verbs/deadsay.dm
	code/modules/admin/verbs/debug.dm
	code/modules/admin/verbs/diagnostics.dm
	code/modules/admin/verbs/getlogs.dm
	code/modules/admin/verbs/mapping.dm
	code/modules/admin/verbs/massmodvar.dm
	code/modules/admin/verbs/modifyvariables.dm
	code/modules/admin/verbs/onlyone.dm
	code/modules/admin/verbs/playsound.dm
	code/modules/admin/verbs/possess.dm
	code/modules/admin/verbs/pray.dm
	code/modules/admin/verbs/randomverbs.dm
	code/modules/admin/verbs/striketeam.dm
	code/modules/admin/verbs/striketeam_syndicate.dm
	code/modules/assembly/assembly.dm
	code/modules/assembly/signaler.dm
	code/modules/chemical/Chemistry-Machinery.dm
	code/modules/chemical/Chemistry-Tools.dm
	code/modules/client/client defines.dm
	code/modules/client/client procs.dm
	code/modules/clothing/costume.dm
	code/modules/clothing/gimmick.dm
	code/modules/clothing/glasses.dm
	code/modules/clothing/glasses/glasses.dm
	code/modules/clothing/glasses/hud.dm
	code/modules/clothing/gloves.dm
	code/modules/clothing/head/hardhat.dm
	code/modules/clothing/jumpsuit.dm
	code/modules/clothing/mask.dm
	code/modules/clothing/shoes.dm
	code/modules/clothing/spacesuit.dm
	code/modules/clothing/spacesuits/captain.dm
	code/modules/clothing/spacesuits/miscellaneous.dm
	code/modules/clothing/spacesuits/ninja.dm
	code/modules/clothing/spacesuits/rig.dm
	code/modules/clothing/spacesuits/syndi.dm
	code/modules/clothing/spacesuits/void.dm
	code/modules/clothing/suit.dm
	code/modules/clothing/suits/armor.dm
	code/modules/clothing/suits/bio.dm
	code/modules/clothing/suits/bomb.dm
	code/modules/clothing/suits/detective.dm
	code/modules/clothing/suits/fire.dm
	code/modules/clothing/suits/heavy.dm
	code/modules/clothing/suits/hos.dm
	code/modules/clothing/suits/labcoat.dm
	code/modules/clothing/suits/miscellaneous.dm
	code/modules/clothing/suits/wiz_robe.dm
	code/modules/clothing/uniforms/lawyer.dm
	code/modules/critters/critter.dm
	code/modules/critters/critter_AI.dm
	code/modules/critters/critters.dm
	code/modules/critters/hivebots/hivebot.dm
	code/modules/flufftext/Dreaming.dm
	code/modules/flufftext/Hallucination.dm
	code/modules/flufftext/TextFilters.dm
	code/modules/food/food.dm
	code/modules/food/meat.dm
	code/modules/food/recipes_microwave.dm
	code/modules/maps/SwapMaps.dm
	code/modules/maps/dmm_suite.dm
	code/modules/maps/fromdmp.dm
	code/modules/maps/randomZlevel.dm
	code/modules/maps/reader.dm
	code/modules/maps/writer.dm
	code/modules/mining/machine_processing.dm
	code/modules/mining/machine_stacking.dm
	code/modules/mining/machine_unloading.dm
	code/modules/mining/mine_items.dm
	code/modules/mining/mine_turfs.dm
	code/modules/mining/mint.dm
	code/modules/mining/ores_materials_coins.dm
	code/modules/mining/satchel_ore_boxdm.dm
	code/modules/mob/dead/death.dm
	code/modules/mob/dead/observer/observer.dm
	code/modules/mob/death.dm
	code/modules/mob/living/blob/blob.dm
	code/modules/mob/living/carbon/alien/alien.dm
	code/modules/mob/living/carbon/alien/death.dm
	code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
	code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
	code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
	code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
	code/modules/mob/living/carbon/alien/humanoid/death.dm
	code/modules/mob/living/carbon/alien/humanoid/hud.dm
	code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
	code/modules/mob/living/carbon/alien/humanoid/life.dm
	code/modules/mob/living/carbon/alien/humanoid/login.dm
	code/modules/mob/living/carbon/alien/humanoid/queen.dm
	code/modules/mob/living/carbon/alien/larva/death.dm
	code/modules/mob/living/carbon/alien/larva/hud.dm
	code/modules/mob/living/carbon/alien/larva/larva.dm
	code/modules/mob/living/carbon/alien/larva/life.dm
	code/modules/mob/living/carbon/alien/larva/login.dm
	code/modules/mob/living/carbon/alien/larva/powers.dm
	code/modules/mob/living/carbon/alien/special/_main.dm
	code/modules/mob/living/carbon/alien/special/snakeman.dm
	code/modules/mob/living/carbon/brain/MMI.dm
	code/modules/mob/living/carbon/brain/brain.dm
	code/modules/mob/living/carbon/brain/death.dm
	code/modules/mob/living/carbon/brain/hud.dm
	code/modules/mob/living/carbon/brain/life.dm
	code/modules/mob/living/carbon/brain/say.dm
	code/modules/mob/living/carbon/carbon.dm
	code/modules/mob/living/carbon/human/death.dm
	code/modules/mob/living/carbon/human/emote.dm
	code/modules/mob/living/carbon/human/examine.dm
	code/modules/mob/living/carbon/human/hud.dm
	code/modules/mob/living/carbon/human/human.dm
	code/modules/mob/living/carbon/human/human_attackalien.dm
	code/modules/mob/living/carbon/human/human_attackhand.dm
	code/modules/mob/living/carbon/human/human_damage.dm
	code/modules/mob/living/carbon/human/human_defense.dm
	code/modules/mob/living/carbon/human/life.dm
	code/modules/mob/living/carbon/human/login.dm
	code/modules/mob/living/carbon/human/say.dm
	code/modules/mob/living/carbon/human/whisper.dm
	code/modules/mob/living/carbon/metroid/death.dm
	code/modules/mob/living/carbon/metroid/examine.dm
	code/modules/mob/living/carbon/metroid/life.dm
	code/modules/mob/living/carbon/metroid/login.dm
	code/modules/mob/living/carbon/metroid/metroid.dm
	code/modules/mob/living/carbon/metroid/powers.dm
	code/modules/mob/living/carbon/monkey/death.dm
	code/modules/mob/living/carbon/monkey/examine.dm
	code/modules/mob/living/carbon/monkey/hud.dm
	code/modules/mob/living/carbon/monkey/life.dm
	code/modules/mob/living/carbon/monkey/login.dm
	code/modules/mob/living/carbon/monkey/monkey.dm
	code/modules/mob/living/carbon/monkey/powers.dm
	code/modules/mob/living/damage_procs.dm
	code/modules/mob/living/living.dm
	code/modules/mob/living/living_defense.dm
	code/modules/mob/living/login.dm
	code/modules/mob/living/say.dm
	code/modules/mob/living/silicon/ai/ai.dm
	code/modules/mob/living/silicon/ai/death.dm
	code/modules/mob/living/silicon/ai/examine.dm
	code/modules/mob/living/silicon/ai/life.dm
	code/modules/mob/living/silicon/ai/login.dm
	code/modules/mob/living/silicon/ai/move.dm
	code/modules/mob/living/silicon/death.dm
	code/modules/mob/living/silicon/decoy/death.dm
	code/modules/mob/living/silicon/pai/death.dm
	code/modules/mob/living/silicon/pai/hud.dm
	code/modules/mob/living/silicon/pai/pai.dm
	code/modules/mob/living/silicon/pai/recruit.dm
	code/modules/mob/living/silicon/pai/software.dm
	code/modules/mob/living/silicon/robot/death.dm
	code/modules/mob/living/silicon/robot/emote.dm
	code/modules/mob/living/silicon/robot/examine.dm
	code/modules/mob/living/silicon/robot/hud.dm
	code/modules/mob/living/silicon/robot/life.dm
	code/modules/mob/living/silicon/robot/login.dm
	code/modules/mob/living/silicon/robot/robot.dm
	code/modules/mob/living/silicon/robot/robot_modules.dm
	code/modules/mob/living/silicon/robot/say.dm
	code/modules/mob/living/silicon/robot/wires.dm
	code/modules/mob/living/silicon/say.dm
	code/modules/mob/living/simple_animal/life.dm
	code/modules/mob/login.dm
	code/modules/mob/logout.dm
	code/modules/mob/mob.dm
	code/modules/mob/mob_cleanup.dm
	code/modules/mob/mob_defines.dm
	code/modules/mob/mob_grab.dm
	code/modules/mob/mob_helpers.dm
	code/modules/mob/mob_movement.dm
	code/modules/mob/mob_transformation_simple.dm
	code/modules/mob/new_player/login.dm
	code/modules/mob/new_player/new_player.dm
	code/modules/mob/new_player/preferences.dm
	code/modules/mob/new_player/preferences_setup.dm
	code/modules/mob/new_player/savefile.dm
	code/modules/mob/new_player/sprite_accessories.dm
	code/modules/mob/organ/organ.dm
	code/modules/mob/organ/organ_external.dm
	code/modules/mob/organ/pain.dm
	code/modules/mob/say.dm
	code/modules/mob/screen.dm
	code/modules/mob/simple_animal/crab.dm
	code/modules/mob/transform_procs.dm
	code/modules/paperwork/clipboard.dm
	code/modules/paperwork/filingcabinet.dm
	code/modules/paperwork/folders.dm
	code/modules/paperwork/handlabeler.dm
	code/modules/paperwork/paper.dm
	code/modules/paperwork/paperbin.dm
	code/modules/paperwork/pen.dm
	code/modules/paperwork/photocopier.dm
	code/modules/paperwork/stamps.dm
	code/modules/power/antimatter/computer.dm
	code/modules/power/antimatter/engine.dm
	code/modules/power/antimatter/fuel.dm
	code/modules/power/apc.dm
	code/modules/power/cable.dm
	code/modules/power/cable_heavyduty.dm
	code/modules/power/cell.dm
	code/modules/power/generator.dm
	code/modules/power/generator_type2.dm
	code/modules/power/gravitygenerator.dm
	code/modules/power/lighting.dm
	code/modules/power/port_gen.dm
	code/modules/power/sd_DynamicAreaLighting.dm
	code/modules/power/singularity/collector.dm
	code/modules/power/singularity/containment_field.dm
	code/modules/power/singularity/emitter.dm
	code/modules/power/singularity/field_generator.dm
	code/modules/power/singularity/generator.dm
	code/modules/power/singularity/investigate.dm
	code/modules/power/singularity/particle_accelerator/particle.dm
	code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
	code/modules/power/singularity/particle_accelerator/particle_chamber.dm
	code/modules/power/singularity/particle_accelerator/particle_control.dm
	code/modules/power/singularity/particle_accelerator/particle_emitter.dm
	code/modules/power/singularity/particle_accelerator/particle_power.dm
	code/modules/power/singularity/singularity.dm
	code/modules/power/smes.dm
	code/modules/power/solar.dm
	code/modules/power/switch.dm
	code/modules/power/turbine.dm
	code/modules/projectiles/ammunition.dm
	code/modules/projectiles/gun.dm
	code/modules/projectiles/guns/energy.dm
	code/modules/projectiles/guns/energy/laser.dm
	code/modules/projectiles/guns/energy/nuclear.dm
	code/modules/projectiles/guns/energy/pulse.dm
	code/modules/projectiles/guns/energy/special.dm
	code/modules/projectiles/guns/energy/stun.dm
	code/modules/projectiles/guns/projectile.dm
	code/modules/projectiles/guns/projectile/pistol.dm
	code/modules/projectiles/guns/projectile/revolver.dm
	code/modules/projectiles/guns/projectile/shotgun.dm
	code/modules/projectiles/projectile.dm
	code/modules/projectiles/projectile/beams.dm
	code/modules/projectiles/projectile/bullets.dm
	code/modules/projectiles/projectile/change.dm
	code/modules/projectiles/projectile/special.dm
	code/modules/reagents/Chemistry-Holder.dm
	code/modules/reagents/Chemistry-Reagents.dm
	code/modules/reagents/Chemistry-Recipes.dm
	code/modules/recycling/conveyor2.dm
	code/modules/recycling/disposal-construction.dm
	code/modules/recycling/disposal.dm
	code/modules/recycling/sortingmachinery.dm
	code/modules/research/designs.dm
	code/modules/research/destructive_analyzer.dm
	code/modules/research/message_server.dm
	code/modules/research/protolathe.dm
	code/modules/research/rdconsole.dm
	code/modules/research/rdmachines.dm
	code/modules/research/research.dm
	code/modules/research/server.dm
	code/modules/scripting/AST/Operators/Binary Operators.dm
	code/modules/scripting/Implementations/Telecomms.dm
	code/modules/scripting/Parser/Keywords.dm
	code/modules/scripting/Scanner/Tokens.dm
	code/modules/scripting/stack.dm
	code/modules/security levels/keycard authentication.dm
	code/modules/security levels/security levels.dm
	code/setup.dm
	code/stylesheet.dm
	code/unused/AI_Visibility.dm
	code/unused/Ultralight.dm
	code/unused/airtunnel.dm
	code/unused/beast/bodypart.dm
	code/unused/conveyor.dm
	code/unused/disease2/analyser.dm
	code/unused/disease2/base.dm
	code/unused/disease2/biohazard destroyer.dm
	code/unused/disease2/cureimplanter.dm
	code/unused/disease2/curer.dm
	code/unused/disease2/diseasesplicer.dm
	code/unused/disease2/dishincubator.dm
	code/unused/disease2/isolator.dm
	code/unused/disease2/monkeydispensor.dm
	code/unused/dna.dm
	code/unused/gamemodes/deathmatch.dm
	code/unused/jobs.dm
	code/unused/mining/datum_processing_recipe.dm
	code/unused/mining/spaceship_builder_unused.dm
	code/unused/new_year.dm
	code/unused/spacecraft/manufacturing.dm
	code/unused/spacecraft/shipcore.dm
	config/README feedback.txt
	config/admins.txt
	config/config.txt
	config/rules.html
	data/mode.txt
	html/add-to-changelog.html
	html/archivedchangelog.html
	html/changelog.css
	html/changelog.html
	html/changelog.js
	icons/effects/blood.dmi
	icons/effects/genetics.dmi
	icons/misc/fullscreen.dmi
	icons/mob/AI.dmi
	icons/mob/alien.dmi
	icons/mob/animal.dmi
	icons/mob/back.dmi
	icons/mob/belt.dmi
	icons/mob/blob.dmi
	icons/mob/critter.dmi
	icons/mob/dam_human.dmi
	icons/mob/eyes.dmi
	icons/mob/feet.dmi
	icons/mob/hands.dmi
	icons/mob/head.dmi
	icons/mob/human.dmi
	icons/mob/human_face.dmi
	icons/mob/items_lefthand.dmi
	icons/mob/items_righthand.dmi
	icons/mob/livestock.dmi
	icons/mob/mask.dmi
	icons/mob/mecha.dmi
	icons/mob/mob.dmi
	icons/mob/monkey.dmi
	icons/mob/robots.dmi
	icons/mob/screen1.dmi
	icons/mob/screen1_Midnight.dmi
	icons/mob/screen1_Orange.dmi
	icons/mob/screen1_alien.dmi
	icons/mob/screen1_old.dmi
	icons/mob/suit.dmi
	icons/mob/uniform.dmi
	icons/mob/zone_sel.dmi
	icons/obj/Cryogenic2.dmi
	icons/obj/aibots.dmi
	icons/obj/ammo.dmi
	icons/obj/atmos.dmi
	icons/obj/bureaucracy.dmi
	icons/obj/card.dmi
	icons/obj/cigarettes.dmi
	icons/obj/closet.dmi
	icons/obj/clothing/glasses.dmi
	icons/obj/clothing/gloves.dmi
	icons/obj/clothing/hats.dmi
	icons/obj/clothing/masks.dmi
	icons/obj/clothing/shoes.dmi
	icons/obj/clothing/suits.dmi
	icons/obj/clothing/uniforms.dmi
	icons/obj/computer.dmi
	icons/obj/contraband.dmi
	icons/obj/decals.dmi
	icons/obj/device.dmi
	icons/obj/doors/DoorHazard.dmi
	icons/obj/doors/door_assembly.dmi
	icons/obj/drinks.dmi
	icons/obj/engine.dmi
	icons/obj/food.dmi
	icons/obj/grenade.dmi
	icons/obj/gun.dmi
	icons/obj/harvest.dmi
	icons/obj/hydroponics.dmi
	icons/obj/items.dmi
	icons/obj/janitor.dmi
	icons/obj/library.dmi
	icons/obj/lighting.dmi
	icons/obj/machines/field_generator.dmi
	icons/obj/machines/gateway.dmi
	icons/obj/machines/mining_machines.dmi
	icons/obj/machines/particle_accelerator.dmi
	icons/obj/meter.dmi
	icons/obj/mining.dmi
	icons/obj/objects.dmi
	icons/obj/paper.dmi
	icons/obj/pda.dmi
	icons/obj/pipes/disposal.dmi
	icons/obj/plants.dmi
	icons/obj/power.dmi
	icons/obj/projectiles.dmi
	icons/obj/robotics.dmi
	icons/obj/seeds.dmi
	icons/obj/singularity.dmi
	icons/obj/stationobjs.dmi
	icons/obj/stock_parts.dmi
	icons/obj/storage.dmi
	icons/obj/structures.dmi
	icons/obj/surgery.dmi
	icons/obj/syringe.dmi
	icons/obj/tank.dmi
	icons/obj/terminals.dmi
	icons/obj/toy.dmi
	icons/obj/vending.dmi
	icons/obj/watercloset.dmi
	icons/obj/weapons.dmi
	icons/obj/wizard.dmi
	icons/turf/areas.dmi
	icons/turf/floors.dmi
	icons/turf/walls.dmi
	interface/interface.dm
	interface/skin.dmf
	maps/Antiqua.dmm
	maps/RandomZLevels/assistantChamber.dmm
	maps/RandomZLevels/fileList.txt
	maps/tgstation.2.0.9.dmm
	sound/AI/animes.ogg
	sound/AI/newroundsexy.ogg
	sound/AI/newroundsexy2.ogg
	sound/effects/adminhelp.ogg
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM.sln
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.Designer.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Form1.resx
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Program.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/AssemblyInfo.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Resources.Designer.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Resources.resx
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Settings.Designer.cs
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties/Settings.settings
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/UnstandardnessTestForDM.csproj
tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug/UnstandardnessTestForDM.vshost.exe.manifest
	tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug/UnstandardnessTestForDM.csproj.FileListAbsolute.txt
	tools/expand_filedir_paths.py
	tools/readme.txt

Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
Cael_Aislinn
2012-08-22 04:00:11 +10:00
1232 changed files with 108006 additions and 78117 deletions
@@ -50,7 +50,7 @@ max volume of plasma storeable by the field = the total volume of a number of ti
var/obj/machinery/rust/em_field/owned_field
var/field_strength = 0.01
//
req_access = list(ACCESS_ENGINE)
req_access = list(access_engine)
//
use_power = 1
idle_power_usage = 10
@@ -19,7 +19,7 @@
var/targetting_field = 0
layer = 4
//
req_access = list(ACCESS_ENGINE)
req_access = list(access_engine)
//
use_power = 1
idle_power_usage = 10
@@ -16,7 +16,7 @@
var/on = 1
var/remoteenabled = 1
//
req_access = list(ACCESS_ENGINE)
req_access = list(access_engine)
//
use_power = 1
idle_power_usage = 10
@@ -114,7 +114,7 @@
A.fired()
*/
proc/Emit()
var/obj/item/projectile/beam/ehf_beam/A = new /obj/item/projectile/beam/ehf_beam( src.loc )
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
A.frequency = frequency
A.damage = mega_energy * 500
//
@@ -141,7 +141,7 @@
else // Any other
A.yo = -20
A.xo = 0
A.fired()
A.process()
//
flick("emitter-active",src)
if(emitting)
@@ -55,7 +55,7 @@
anchored = 1
/obj/beam/e_beam/New()
ul_SetLuminosity(1, 1, 4)
sd_SetLuminosity(1, 1, 4)
/obj/beam/e_beam/proc/updatebeam()
if(!next)
@@ -63,7 +63,7 @@
var/datum/gas_mixture/env = L.return_air()
//Remove gas from surrounding area
var/transfer_moles = gasefficency * env.total_moles
var/transfer_moles = gasefficency * env.total_moles()
var/datum/gas_mixture/removed = env.remove(transfer_moles)
if (!removed)
@@ -88,8 +88,8 @@
explosion(loc,explosion_power,explosion_power*2,explosion_power*3,explosion_power*4,1)
del src
var/nitrogen_mod = abs((removed.nitrogen / removed.total_moles)) * NITROGEN_RETARDATION_FACTOR
var/oxygen = max(min(removed.oxygen / removed.total_moles - nitrogen_mod, 1), 0)
var/nitrogen_mod = abs((removed.nitrogen / removed.total_moles())) * NITROGEN_RETARDATION_FACTOR
var/oxygen = max(min(removed.oxygen / removed.total_moles() - nitrogen_mod, 1), 0)
var/temp_factor = 0
if(oxygen > 0.8)
@@ -4,8 +4,8 @@
//work out if the listener can understand or not
var/ending = copytext(text, length(text))
if (src.disease_symptoms & DISEASE_HOARSE)
return "rasps, \"[text]\"";
/*if (src.disease_symptoms & DISEASE_HOARSE)
return "rasps, \"[text]\"";*/
if (src.stuttering)
return "stammers, \"[text]\"";
if (src.slurring)
@@ -130,7 +130,7 @@
//account for darkness
var/turf/T = get_turf(src)
var/in_darkness = 0
if(max(T.ul_GetRed(), T.ul_GetGreen(), T.ul_GetBlue()) == 0 && !istype(T, /turf/simulated))
if(T.luminosity == 0 && !istype(T, /turf/simulated))
in_darkness = 1
//see if we're able to do stuff
+1 -1
View File
@@ -11,7 +11,7 @@
circuit = "/obj/item/weapon/circuitboard/atmoscontrol"
var/obj/machinery/alarm/current
var/overridden = 0 //not set yet, can't think of a good way to do it
req_access = list(ACCESS_CE)
req_access = list(access_ce)
/obj/machinery/computer/atmoscontrol/attack_hand(mob/user)
if(..())
+2 -2
View File
@@ -9,7 +9,7 @@
/obj/item/tape/police
name = "police tape"
desc = "A length of police tape. Do not cross."
req_access = list(ACCESS_SECURITY)
req_access = list(access_security)
icon_base = "police"
/obj/item/taperoll/engineering
@@ -22,7 +22,7 @@
/obj/item/tape/engineering
name = "engineering tape"
desc = "A length of engineering tape. Better not cross it."
req_access = list(ACCESS_ENGINE,ACCESS_ATMOSPHERICS)
req_access = list(access_engine,access_atmospherics)
icon_base = "engineering"
/obj/item/taperoll/attack_self(mob/user as mob)
+2 -2
View File
@@ -178,7 +178,7 @@
cost = 10
containertype = "/obj/structure/closet/critter"
containername = "Chicken crate"
group = "Hydroponics"
//group = "Hydroponics"
/datum/supply_packs/cow
name = "\improper Cow crate"
@@ -187,4 +187,4 @@
cost = 50
containertype = "/obj/structure/closet/critter"
containername = "Cow crate"
group = "Hydroponics"
//group = "Hydroponics"
+4 -4
View File
@@ -1,4 +1,4 @@
/proc/togglebuildmode(mob/M as mob in world)
/proc/togglebuildmode(mob/M as mob in player_list)
set name = "Toggle Build Mode"
set category = "Special Verbs"
if(M.client)
@@ -39,7 +39,7 @@
anchored = 1
layer = 20
dir = NORTH
icon = 'buildmode.dmi'
icon = 'icons/misc/buildmode.dmi'
var/obj/effect/bmode/buildholder/master = null
/obj/effect/bmode/builddir
@@ -60,7 +60,7 @@
return
/obj/effect/bmode/buildhelp
icon = 'buildmode.dmi'
icon = 'icons/misc/buildmode.dmi'
icon_state = "buildhelp"
screen_loc = "NORTH,WEST+1"
Click()
@@ -165,7 +165,7 @@
if("number")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value", 123) as num
if("mob-reference")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as mob in world
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as mob in mob_list
if("obj-reference")
master.buildmode.valueholder = input(usr,"Enter variable value:" ,"Value") as obj in world
if("turf-reference")
@@ -0,0 +1,86 @@
//Inefficient as hell so don't copypasta this anywhere! It's only here as a tool for debugging
//prints a map of the powernetworks on z-level 1
/client/verb/print_powernets()
set name = "print powernets"
var/file = file("powernets_map.html")
var/list/grid[255][255]
var/list/checklist = list()
for(var/obj/structure/cable/C in world)
if(C.z != 1) continue
if(C.x < 1 || C.x > 255) continue
if(C.y < 1 || C.y > 255) continue
grid[C.x][C.y] = C.netnum
checklist |= C.netnum
sleep(1)
file << "<font size='1'><tt>"
for(var/netnum in checklist)
file << "[netnum]<br>"
for(var/j=255, j>=1, j--)
var/line = "<br>"
for(var/i=1, i<=255, i++)
switch(grid[i][j])
if(null) line += "&nbsp;"
if(0 to 9) line += "[grid[i][j]]"
if(10) line += "a"
if(11) line += "b"
if(12) line += "c"
if(13) line += "d"
if(14) line += "e"
if(15) line += "f"
if(16) line += "g"
if(17) line += "h"
if(18) line += "i"
if(19) line += "j"
if(20) line += "k"
if(21) line += "l"
if(22) line += "m"
if(23) line += "n"
if(24) line += "o"
if(25) line += "p"
if(26) line += "q"
if(27) line += "r"
if(28) line += "s"
if(29) line += "t"
if(30) line += "u"
if(31) line += "v"
if(32) line += "w"
if(33) line += "x"
if(34) line += "y"
if(35) line += "z"
if(36) line += "A"
if(37) line += "B"
if(38) line += "C"
if(39) line += "D"
if(40) line += "E"
if(41) line += "F"
if(42) line += "G"
if(43) line += "H"
if(44) line += "I"
if(45) line += "J"
if(46) line += "K"
if(47) line += "L"
if(48) line += "M"
if(49) line += "N"
if(50) line += "O"
if(51) line += "P"
if(52) line += "Q"
if(53) line += "R"
if(54) line += "S"
if(55) line += "T"
if(56) line += "U"
if(57) line += "V"
if(58) line += "W"
if(59) line += "X"
if(60) line += "Y"
if(61) line += "Z"
else line += "#"
file << line
file << "</tt></font>"
src << "printed to powernets_map.html"
src << browse(file)
@@ -0,0 +1,258 @@
//Nothing spectacular, just a slightly more configurable MC.
var/global/datum/controller/game_controller/master_controller //Set in world.New()
var/global/datum/failsafe/Failsafe
var/global/controller_iteration = 0
var/global/last_tick_timeofday = world.timeofday
var/global/last_tick_duration = 0
var/global/obj/machinery/last_obj_processed //Used for MC 'proc break' debugging
var/global/datum/disease/last_disease_processed //Used for MC 'proc break' debugging
var/global/obj/machinery/last_machine_processed //Used for MC 'proc break' debugging
datum/controller/game_controller
var/processing = 0
var/breather_ticks = 1 //a somewhat crude attempt to iron over the 'bumps' caused by high-cpu use by letting the MC have a breather for this many ticks after every step
var/minimum_ticks = 10 //The minimum length of time between MC ticks
var/global/air_master_ready = 0
var/global/tension_master_ready = 0
var/global/sun_ready = 0
var/global/mobs_ready = 0
var/global/diseases_ready = 0
var/global/machines_ready = 0
var/global/objects_ready = 0
var/global/networks_ready = 0
var/global/powernets_ready = 0
var/global/ticker_ready = 0
datum/controller/game_controller/New()
//There can be only one master_controller. Out with the old and in with the new.
if(master_controller)
if(master_controller != src)
del(master_controller)
master_controller = src
if(!air_master)
air_master = new /datum/controller/air_system()
air_master.setup()
if(!job_master)
job_master = new /datum/controller/occupations()
if(job_master.SetupOccupations())
world << "\red \b Job setup complete"
job_master.LoadJobs("config/jobs.txt")
if(!tension_master) tension_master = new /datum/tension()
if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase()
if(!syndicate_code_response) syndicate_code_response = generate_code_phrase()
if(!ticker) ticker = new /datum/controller/gameticker()
if(!emergency_shuttle) emergency_shuttle = new /datum/shuttle_controller/emergency_shuttle()
datum/controller/game_controller/proc/setup()
world.tick_lag = config.Ticklag
createRandomZlevel()
setup_objects()
setupgenetics()
setupfactions()
for(var/i = 0, i < max_secret_rooms, i++)
make_mining_asteroid_secret()
spawn(0)
if(ticker)
ticker.pregame()
datum/controller/game_controller/proc/setup_objects()
world << "\red \b Initializing objects"
sleep(-1)
for(var/obj/object in world)
object.initialize()
world << "\red \b Initializing pipe networks"
sleep(-1)
for(var/obj/machinery/atmospherics/machine in world)
machine.build_network()
world << "\red \b Initializing atmos machinery."
sleep(-1)
for(var/obj/machinery/atmospherics/unary/vent_pump/T in world)
T.broadcast_status()
for(var/obj/machinery/atmospherics/unary/vent_scrubber/T in world)
T.broadcast_status()
world << "\red \b Initializations complete."
sleep(-1)
datum/controller/game_controller/proc/process()
set background = 1
processing = 1
while(1) //far more efficient than recursively calling ourself
if(!Failsafe) new /datum/failsafe()
var/currenttime = world.timeofday
last_tick_duration = (currenttime - last_tick_timeofday) / 10
last_tick_timeofday = currenttime
if(processing)
var/start_time = world.timeofday
controller_iteration++
air_master_ready = 0
tension_master_ready = 0
sun_ready = 0
mobs_ready = 0
diseases_ready = 0
machines_ready = 0
objects_ready = 0
networks_ready = 0
powernets_ready = 0
ticker_ready = 0
spawn(0)
air_master.process()
air_master_ready = 1
sleep(breather_ticks)
spawn(0)
tension_master.process()
tension_master_ready = 1
sleep(breather_ticks)
spawn(0)
sun.calc_position()
sun_ready = 1
sleep(breather_ticks)
spawn(0)
for(var/mob/living/M in world) //only living mobs have life processes
M.Life()
mobs_ready = 1
sleep(breather_ticks)
spawn(0)
for(var/datum/disease/D in active_diseases)
last_disease_processed = D
D.process()
diseases_ready = 1
sleep(breather_ticks)
spawn(0)
for(var/obj/machinery/machine in machines)
if(machine)
last_machine_processed = machine
machine.process()
if(machine && machine.use_power)
machine.auto_use_power()
machines_ready = 1
sleep(breather_ticks)
spawn(0)
for(var/obj/object in processing_objects)
last_obj_processed = object
object.process()
objects_ready = 1
sleep(breather_ticks)
spawn(0)
for(var/datum/pipe_network/network in pipe_networks)
network.process()
networks_ready = 1
sleep(breather_ticks)
spawn(0)
for(var/datum/powernet/P in powernets)
P.reset()
powernets_ready = 1
sleep(breather_ticks)
spawn(0)
ticker.process()
ticker_ready = 1
sleep( minimum_ticks - max(world.timeofday-start_time,0) ) //to prevent long delays happening at midnight
var/IL_check = 0 //Infinite loop check (To report when the master controller breaks.)
while(!air_master_ready || !tension_master_ready || !sun_ready || !mobs_ready || !diseases_ready || !machines_ready || !objects_ready || !networks_ready || !powernets_ready || !ticker_ready)
IL_check++
if(IL_check > 200)
var/MC_report = "air_master_ready = [air_master_ready]; tension_master_ready = [tension_master_ready]; sun_ready = [sun_ready]; mobs_ready = [mobs_ready]; diseases_ready = [diseases_ready]; machines_ready = [machines_ready]; objects_ready = [objects_ready]; networks_ready = [networks_ready]; powernets_ready = [powernets_ready]; ticker_ready = [ticker_ready];"
var/MC_admin_report = "<b><font color='red'>PROC BREAKAGE WARNING:</font> The game's master contorller appears to be stuck in one of it's cycles. It has looped through it's delaying loop [IL_check] times.<br>The master controller reports: [MC_report]</b><br>"
if(!diseases_ready)
if(last_disease_processed)
MC_admin_report += "<b>DISEASE PROCESSING stuck on </b><A HREF='?src=%holder_ref%;adminplayervars=\ref[last_disease_processed]'>[last_disease_processed]</A><br>"
else
MC_admin_report += "<b>DISEASE PROCESSING stuck on </b>unknown<br>"
if(!machines_ready)
if(last_machine_processed)
MC_admin_report += "<b>MACHINE PROCESSING stuck on </b><A HREF='?src=%holder_ref%;adminplayervars=\ref[last_machine_processed]'>[last_machine_processed]</A><br>"
else
MC_admin_report += "<b>MACHINE PROCESSING stuck on </b>unknown<br>"
if(!objects_ready)
if(last_obj_processed)
MC_admin_report += "<b>OBJ PROCESSING stuck on </b><A HREF='?src=ADMINHOLDERREF;adminplayervars=\ref[last_obj_processed]'>[last_obj_processed]</A><br>"
else
MC_admin_report += "<b>OBJ PROCESSING stuck on </b>unknown<br>"
MC_admin_report += "<font color='red'><b>Master controller breaking out of delaying loop. Restarting the round is advised if problem persists. DO NOT manually restart the master controller.</b></font><br>"
message_admins(MC_admin_report)
log_admin("PROC BREAKAGE WARNING: infinite_loop_check = [IL_check]; [MC_report];")
break
sleep(3)
else
sleep(10)
/datum/failsafe // This thing pretty much just keeps poking the master controller
var/spinning = 1
var/current_iteration = 0
var/ticks_per_spin = 200 //poke the MC every 20 seconds
var/defcon = 0 //alert level. For every poke that fails this is raised by 1. When it reaches 5 the MC is replaced with a new one. (effectively killing any master_controller.process() and starting a new one)
/datum/failsafe/New()
//There can be only one failsafe. Out with the old in with the new (that way we can restart the Failsafe by spawning a new one)
if(Failsafe && (Failsafe != src))
del(Failsafe)
Failsafe = src
current_iteration = controller_iteration
spawn(0)
Failsafe.spin()
/datum/failsafe/proc/spin()
set background = 1
while(1) //more efficient than recursivly calling ourself over and over. background = 1 ensures we do not trigger an infinite loop
if(master_controller)
if(spinning && master_controller.processing) //only poke if these overrides aren't in effect
if(current_iteration == controller_iteration) //master_controller hasn't finished processing in the defined interval
switch(defcon)
if(0 to 3)
defcon++
if(4)
defcon = 5
for(var/client/C)
if(C.holder)
C << "<font color='red' size='2'><b>Warning. The Master Controller has not fired in the last [4*ticks_per_spin] ticks. Automatic restart in [ticks_per_spin] ticks.</b></font>"
if(5)
for(var/client/C)
if(C.holder)
C << "<font color='red' size='2'><b>Warning. The Master Controller has still not fired within the last [5*ticks_per_spin] ticks. Killing and restarting...</b></font>"
spawn(0)
new /datum/controller/game_controller() //replace the old master_controller (hence killing the old one's process)
master_controller.process() //Start it rolling again
defcon = 0
else
defcon = 0
current_iteration = controller_iteration
else
defcon = 0
else
new /datum/controller/game_controller() //replace the missing master_controller! This should never happen.
sleep(ticks_per_spin)
@@ -0,0 +1,209 @@
//simplified MC that is designed to fail when procs 'break'. When it fails it's just replaced with a new one.
//It ensures master_controller.process() is never doubled up by killing the MC (hence terminating any of its sleeping procs)
//WIP, needs lots of work still
var/global/datum/controller/game_controller/master_controller //Set in world.New()
var/global/datum/failsafe/Failsafe
var/global/controller_iteration = 0
var/global/last_tick_timeofday = world.timeofday
var/global/last_tick_duration = 0
var/global/obj/machinery/last_obj_processed //Used for MC 'proc break' debugging
var/global/datum/disease/last_disease_processed //Used for MC 'proc break' debugging
var/global/obj/machinery/last_machine_processed //Used for MC 'proc break' debugging
datum/controller/game_controller
var/processing = 0
var/breather_ticks = 2 //a somewhat crude attempt to iron over the 'bumps' caused by high-cpu use by letting the MC have a breather for this many ticks after every loop
var/minimum_ticks = 20 //The minimum length of time between MC ticks
var/global/air_master_ready = 0
var/global/tension_master_ready = 0
var/global/sun_ready = 0
var/global/mobs_ready = 0
var/global/diseases_ready = 0
var/global/machines_ready = 0
var/global/objects_ready = 0
var/global/networks_ready = 0
var/global/powernets_ready = 0
var/global/ticker_ready = 0
datum/controller/game_controller/New()
//There can be only one master_controller. Out with the old and in with the new.
if(master_controller)
if(master_controller != src)
del(master_controller)
master_controller = src
if(!air_master)
air_master = new /datum/controller/air_system()
air_master.setup()
if(!job_master)
job_master = new /datum/controller/occupations()
if(job_master.SetupOccupations())
world << "\red \b Job setup complete"
job_master.LoadJobs("config/jobs.txt")
if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase()
if(!syndicate_code_response) syndicate_code_response = generate_code_phrase()
if(!ticker) ticker = new /datum/controller/gameticker()
if(!emergency_shuttle) emergency_shuttle = new /datum/shuttle_controller/emergency_shuttle()
datum/controller/game_controller/proc/setup()
world.tick_lag = config.Ticklag
createRandomZlevel()
setup_objects()
setupgenetics()
setupfactions()
for(var/i = 0, i < max_secret_rooms, i++)
make_mining_asteroid_secret()
spawn(0)
if(ticker)
ticker.pregame()
datum/controller/game_controller/proc/setup_objects()
world << "\red \b Initializing objects"
sleep(-1)
for(var/obj/object in world)
object.initialize()
world << "\red \b Initializing pipe networks"
sleep(-1)
for(var/obj/machinery/atmospherics/machine in world)
machine.build_network()
world << "\red \b Initializing atmos machinery."
sleep(-1)
for(var/obj/machinery/atmospherics/unary/vent_pump/T in world)
T.broadcast_status()
for(var/obj/machinery/atmospherics/unary/vent_scrubber/T in world)
T.broadcast_status()
world << "\red \b Initializations complete."
sleep(-1)
datum/controller/game_controller/proc/process()
set background = 1
processing = 1
while(1) //far more efficient than recursively calling ourself
if(!Failsafe) new /datum/failsafe()
var/currenttime = world.timeofday
last_tick_duration = (currenttime - last_tick_timeofday) / 10
last_tick_timeofday = currenttime
if(processing)
var/start_time = world.timeofday
controller_iteration++
air_master.process()
sleep(breather_ticks)
sun.calc_position()
sleep(breather_ticks)
for(var/mob/living/M in world) //only living mobs have life processes
M.Life()
sleep(breather_ticks)
for(var/datum/disease/D in active_diseases)
last_disease_processed = D
D.process()
sleep(breather_ticks)
for(var/obj/machinery/machine in machines)
if(machine)
last_machine_processed = machine
machine.process()
if(machine && machine.use_power)
machine.auto_use_power()
sleep(breather_ticks)
for(var/obj/object in processing_objects)
last_obj_processed = object
object.process()
sleep(breather_ticks)
for(var/datum/pipe_network/network in pipe_networks)
network.process()
sleep(breather_ticks)
for(var/datum/powernet/P in powernets)
P.reset()
sleep(breather_ticks)
ticker.process()
sleep( minimum_ticks - max(world.timeofday-start_time,0) ) //to prevent long delays happening at midnight
else
sleep(10)
/datum/failsafe // This thing pretty much just keeps poking the master controller
var/spinning = 1
var/current_iteration = 0
var/ticks_per_spin = 100 //poke the MC every 10 seconds
var/defcon = 0 //alert level. For every poke that fails this is raised by 1. When it reaches 5 the MC is replaced with a new one. (effectively killing any master_controller.process() and starting a new one)
/datum/failsafe/New()
//There can be only one failsafe. Out with the old in with the new (that way we can restart the Failsafe by spawning a new one)
if(Failsafe && (Failsafe != src))
del(Failsafe)
Failsafe = src
current_iteration = controller_iteration
spawn(0)
Failsafe.spin()
/datum/failsafe/proc/spin()
set background = 1
while(1) //more efficient than recursivly calling ourself over and over. background = 1 ensures we do not trigger an infinite loop
if(master_controller)
if(spinning && master_controller.processing) //only poke if these overrides aren't in effect
if(current_iteration == controller_iteration) //master_controller hasn't finished processing in the defined interval
switch(defcon)
if(0 to 3)
defcon++
if(4)
defcon = 5
for(var/client/C)
if(C.holder)
C << "<font color='red' size='2'><b>Warning. The Master Controller has not fired in the last [defcon*ticks_per_spin] ticks. Automatic restart in [ticks_per_spin] ticks.</b></font>"
if(5)
for(var/client/C)
if(C.holder)
C << "<font color='red' size='2'><b>Warning. The Master Controller has still not fired within the last [defcon*ticks_per_spin] ticks. Killing and restarting...</b></font>"
spawn(0)
new /datum/controller/game_controller() //replace the old master_controller (hence killing the old one's process)
master_controller.process() //Start it rolling again
defcon = 0
else
defcon = 0
current_iteration = controller_iteration
else
defcon = 0
else
new /datum/controller/game_controller() //replace the missing master_controller! This should never happen.
sleep(ticks_per_spin)
//DEBUG VERBS
/*
/client/verb/spawn_MC()
new /datum/controller/game_controller()
/client/verb/spawn_FS()
new /datum/failsafe()
*/
+2 -2
View File
@@ -1,6 +1,6 @@
/obj/effect/expl_particles
name = "fire"
icon = 'effects.dmi'
icon = 'icons/effects/effects.dmi'
icon_state = "explosion_particle"
opacity = 1
anchored = 1
@@ -38,7 +38,7 @@
/obj/effect/explosion
name = "fire"
icon = '96x96.dmi'
icon = 'icons/effects/96x96.dmi'
icon_state = "explosion"
opacity = 1
anchored = 1
+351
View File
@@ -1,3 +1,4 @@
<<<<<<< HEAD
/obj/effect/organstructure //used obj for the "contents" var
name = "organs"
@@ -346,4 +347,354 @@
name = "template head"
species = "template"
=======
/obj/effect/organstructure //used obj for the "contents" var
name = "organs"
var/species = "mob" //for speaking in unknown languages purposes
var/obj/effect/organ/limb/arms/arms = null
var/obj/effect/organ/limb/legs/legs = null
var/obj/effect/organ/torso/torso = null
var/obj/effect/organ/head/head = null
proc/GetSpeciesName()
var/list/speciesPresent = list()
for(var/obj/effect/organ/organ in src) //only external organs count, since it's judging by the appearance
if(speciesPresent[organ.species])
speciesPresent[organ.species]++
else
speciesPresent[organ.species] = 1 //not sure, but I think it's not initialised before that, so can't ++
var/list/dominantSpecies = list()
for(var/speciesName in speciesPresent)
if(!dominantSpecies.len)
dominantSpecies += speciesName
else
if(speciesPresent[dominantSpecies[1]] == speciesPresent[speciesName])
dominantSpecies += speciesName
else if(speciesPresent[dominantSpecies[1]] < speciesPresent[speciesName])
dominantSpecies = list(speciesName)
if(!dominantSpecies.len)
species = "mob"
else
species = pick(dominantSpecies)
return species
proc/RecalculateStructure()
var/list/organs = GetAllContents()
arms = locate(/obj/effect/organ/limb/arms) in organs
legs = locate(/obj/effect/organ/limb/legs) in organs
torso = locate(/obj/effect/organ/torso) in organs
head = locate(/obj/effect/organ/head) in organs
GetSpeciesName()
return
proc/ProcessOrgans()
set background = 1
var/list/organs = GetAllContents()
for(var/obj/effect/organ/organ in organs)
organ.ProcessOrgan()
return
New()
..()
RecalculateStructure()
/obj/effect/organstructure/human
name = "human organs"
New()
new /obj/effect/organ/torso/human(src)
..()
/obj/effect/organstructure/alien
name = "alien organs"
New()
new /obj/effect/organ/torso/alien(src)
..()
/obj/effect/organ
name = "organ"
//All types
var/organType = 0 //CYBER and SPELL go here
var/species = "mob"
var/obj/effect/organstructure/rootOrganStructure = null
New(location)
..()
rootOrganStructure = FindRootStructure()
proc/FindRootStructure()
if(istype(loc,/obj/effect/organ))
var/obj/effect/organ/parent = loc
return parent.FindRootStructure()
else if(istype(loc,/obj/effect/organstructure))
return loc
return null
proc/ProcessOrgan()
return
/obj/effect/organ/torso
name = "torso"
var/maxHealth = 50 //right now, the mob's (only humans for now) health depends only on it. Will be fixed later
/obj/effect/organ/torso/human
name = "human torso"
species = "human"
maxHealth = 100
New()
..()
new /obj/effect/organ/limb/arms/human(src)
new /obj/effect/organ/limb/legs/human(src)
new /obj/effect/organ/head/human(src)
/obj/effect/organ/torso/alien
name = "alien torso"
species = "alien"
maxHealth = 100
New()
..()
new /obj/effect/organ/limb/arms/alien(src)
new /obj/effect/organ/limb/legs/alien(src)
new /obj/effect/organ/head/alien(src)
/obj/effect/organ/limb
name = "limb"
/obj/effect/organ/limb/arms
name = "arms"
var/minDamage = 5 //punching damage
var/maxDamage = 5
/obj/effect/organ/limb/arms/alien
name = "alien arms"
species = "alien"
minDamage = 5
maxDamage = 15
/obj/effect/organ/limb/arms/human
name = "human arms"
species = "human"
minDamage = 1
maxDamage = 9
/obj/effect/organ/limb/legs
name = "legs"
/obj/effect/organ/limb/legs/human
name = "human legs"
species = "human"
/obj/effect/organ/limb/legs/alien
name = "alien legs"
species = "alien"
/obj/effect/organ/head
name = "head"
/obj/effect/organ/head/human
name = "human head"
species = "human"
/obj/effect/organ/head/alien
name = "alien head"
species = "alien"
/obj/effect/organ/limb/arms/alien
name = "alien arms"
species = "alien"
minDamage = 5
maxDamage = 15
/obj/effect/organ/limb/legs/alien
name = "alien legs"
species = "alien"
/obj/effect/organ/head/alien
name = "alien head"
species = "alien"
// ++++STUB ORGAN STRUCTURE. THIS IS THE DEFAULT STRUCTURE. USED TO PREVENT EXCEPTIONS++++
/obj/effect/organstructure/stub
name = "stub organs"
New()
new /obj/effect/organ/torso/stub(src)
..()
/obj/effect/organ/torso/stub
name = "stub torso"
species = "stub"
maxHealth = 100
New()
..()
new /obj/effect/organ/limb/arms/stub(src)
new /obj/effect/organ/limb/legs/stub(src)
new /obj/effect/organ/head/stub(src)
/obj/effect/organ/limb/arms/stub
name = "stub arms"
species = "stub"
/obj/effect/organ/limb/legs/stub
name = "stub legs"
species = "stub"
/obj/effect/organ/head/stub
name = "stub head"
species = "stub"
// ++++STUB ORGAN STRUCTURE. END++++
// ++++MONKEY++++
/obj/effect/organstructure/monkey
name = "monkey organs"
New()
new /obj/effect/organ/torso/monkey(src)
..()
/obj/effect/organ/torso/monkey
name = "monkey torso"
species = "monkey"
maxHealth = 100
New()
..()
new /obj/effect/organ/limb/arms/monkey(src)
new /obj/effect/organ/limb/legs/monkey(src)
new /obj/effect/organ/head/monkey(src)
/obj/effect/organ/limb/arms/monkey
name = "monkey arms"
species = "monkey"
/obj/effect/organ/limb/legs/monkey
name = "monkey legs"
species = "monkey"
/obj/effect/organ/head/monkey
name = "monkey head"
species = "monkey"
// +++++CYBORG+++++
/obj/effect/organstructure/cyborg
name = "cyborg organs"
New()
new /obj/effect/organ/torso/cyborg(src)
..()
/obj/effect/organ/torso/cyborg
name = "cyborg torso"
species = "cyborg"
maxHealth = 100
New()
..()
new /obj/effect/organ/limb/arms/cyborg(src)
new /obj/effect/organ/limb/legs/cyborg(src)
new /obj/effect/organ/head/cyborg(src)
/obj/effect/organ/limb/arms/cyborg
name = "cyborg arms"
species = "cyborg"
/obj/effect/organ/limb/legs/cyborg
name = "cyborg legs"
species = "cyborg"
/obj/effect/organ/head/cyborg
name = "cyborg head"
species = "cyborg"
// +++++AI++++++
/obj/effect/organstructure/AI
name = "AI organs"
New()
new /obj/effect/organ/torso/AI(src)
..()
/obj/effect/organ/torso/AI
name = "AI torso"
species = "AI"
maxHealth = 100
New()
..()
new /obj/effect/organ/limb/arms/AI(src)
new /obj/effect/organ/limb/legs/AI(src)
new /obj/effect/organ/head/AI(src)
/obj/effect/organ/limb/arms/AI
name = "AI arms"
species = "AI"
/obj/effect/organ/limb/legs/AI
name = "AI legs"
species = "AI"
/obj/effect/organ/head/AI
name = "AI head"
species = "AI"
/* New organ structure template
/obj/effect/organstructure/template
name = "template organs"
New()
new /obj/effect/organ/torso/template(src)
..()
/obj/effect/organ/torso/template
name = "template torso"
species = "template"
maxHealth = 100
New()
..()
new /obj/effect/organ/limb/arms/template(src)
new /obj/effect/organ/limb/legs/template(src)
new /obj/effect/organ/head/template(src)
/obj/effect/organ/limb/arms/template
name = "template arms"
species = "template"
/obj/effect/organ/limb/legs/template
name = "template legs"
species = "template"
/obj/effect/organ/head/template
name = "template head"
species = "template"
>>>>>>> remotes/git-svn
*/
@@ -0,0 +1,75 @@
/obj/machinery/disease2/diseaseanalyser
name = "Disease Analyser"
icon = 'icons/obj/virology.dmi'
icon_state = "analyser"
anchored = 1
density = 1
var/scanning = 0
var/pause = 0
var/obj/item/weapon/virusdish/dish = null
/obj/machinery/disease2/diseaseanalyser/attackby(var/obj/I as obj, var/mob/user as mob)
if(istype(I,/obj/item/weapon/virusdish))
var/mob/living/carbon/c = user
if(!dish)
dish = I
c.drop_item()
I.loc = src
for(var/mob/M in viewers(src))
if(M == user) continue
M.show_message("\blue [user.name] inserts the [dish.name] in the [src.name]", 3)
else
user << "There is already a dish inserted"
//else
return
/obj/machinery/disease2/diseaseanalyser/process()
if(stat & (NOPOWER|BROKEN))
return
use_power(500)
src.updateDialog()
if(scanning)
scanning -= 1
if(scanning == 0)
var/r = "GNAv2 based virus lifeform"
r += "<BR>Infection rate : [dish.virus2.infectionchance * 10]"
r += "<BR>Spread form : [dish.virus2.spreadtype]"
r += "<BR>Progress Speed : [dish.virus2.stageprob * 10]"
for(var/datum/disease2/effectholder/E in dish.virus2.effects)
r += "<BR>Effect:[E.effect.name]. Strength : [E.multiplier * 8]. Verosity : [E.chance * 15]. Type : [5-E.stage]."
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src.loc)
P.info = r
dish.info = r
dish.analysed = 1
dish.loc = src.loc
dish = null
icon_state = "analyser"
for(var/mob/O in hearers(src, null))
O.show_message("\icon[src] \blue The [src.name] prints a sheet of paper", 3)
else if(dish && !scanning && !pause)
if(dish.virus2 && dish.growth > 50)
dish.growth -= 10
scanning = 25
icon_state = "analyser_processing"
else
pause = 1
spawn(25)
dish.loc = src.loc
dish = null
for(var/mob/M in viewers(src))
M.show_message("\icon[src] \blue The [src.name] buzzes", 2)
pause = 0
return
@@ -0,0 +1,20 @@
/obj/machinery/disease2/biodestroyer
name = "Biohazard destroyer"
icon = 'icons/obj/pipes/disposal.dmi'
icon_state = "disposal"
var/list/accepts = list(/obj/item/clothing,/obj/item/weapon/virusdish/,/obj/item/weapon/cureimplanter,/obj/item/weapon/diseasedisk)
density = 1
anchored = 1
/obj/machinery/disease2/biodestroyer/attackby(var/obj/I as obj, var/mob/user as mob)
for(var/path in accepts)
if(I.type in typesof(path))
user.drop_item()
del(I)
overlays += image('icons/obj/pipes/disposal.dmi', "dispover-handle")
return
user.drop_item()
I.loc = src.loc
for(var/mob/O in hearers(src, null))
O.show_message("\icon[src] \blue The [src.name] beeps", 2)
@@ -0,0 +1,42 @@
/obj/item/weapon/cureimplanter
name = "Hypospray injector"
icon = 'icons/obj/items.dmi'
icon_state = "implanter1"
var/datum/disease2/resistance/resistance = null
var/works = 0
var/datum/disease2/disease/virus2 = null
item_state = "syringe_0"
throw_speed = 1
throw_range = 5
w_class = 2.0
/obj/item/weapon/cureimplanter/attack(mob/target as mob, mob/user as mob)
if(ismob(target))
for(var/mob/O in viewers(world.view, user))
if (target != user)
O.show_message(text("\red <B>[] is trying to inject [] with [src.name]!</B>", user, target), 1)
else
O.show_message("\red <B>[user] is trying to inject themselves with [src.name]!</B>", 1)
if(!do_mob(user, target,60)) return
for(var/mob/O in viewers(world.view, user))
if (target != user)
O.show_message(text("\red [] injects [] with [src.name]!", user, target), 1)
else
O.show_message("\red [user] injects themself with [src.name]!", 1)
var/mob/living/carbon/M = target
if(works == 0 && prob(25))
M.resistances2 += resistance
if(M.virus2)
M.virus2.cure_added(resistance)
else if(works == 1)
M.adjustToxLoss(rand(20,50))
else if(works == 2)
M.adjustToxLoss(rand(50,100))
else if(works == 3)
infect_virus2(M,virus2,1)
@@ -0,0 +1,202 @@
/obj/machinery/computer/diseasesplicer
name = "Disease Splicer"
icon = 'icons/obj/computer.dmi'
icon_state = "crew"
//brightnessred = 0
// brightnessgreen = 2
// brightnessblue = 2
// broken_icon
var/datum/disease2/effectholder/memorybank = null
var/analysed = 0
var/obj/item/weapon/virusdish/dish = null
var/burning = 0
var/splicing = 0
var/scanning = 0
/obj/machinery/computer/diseasesplicer/attackby(var/obj/I as obj, var/mob/user as mob)
/*
if(istype(I, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20))
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard( src.loc )
var/obj/item/weapon/circuitboard/diseasesplicer/M = new /obj/item/weapon/circuitboard/diseasesplicer( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 3
A.icon_state = "3"
A.anchored = 1
del(src)
else
user << "\blue You disconnect the monitor."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/diseasesplicer/M = new /obj/item/weapon/circuitboard/diseasesplicer( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 4
A.icon_state = "4"
A.anchored = 1
del(src)*/
if(istype(I,/obj/item/weapon/virusdish))
var/mob/living/carbon/c = user
if(!dish)
dish = I
c.drop_item()
I.loc = src
if(istype(I,/obj/item/weapon/diseasedisk))
user << "You upload the contents of the disk into the buffer"
memorybank = I:effect
//else
src.attack_hand(user)
return
/obj/machinery/computer/diseasesplicer/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
/obj/machinery/computer/diseasesplicer/attack_paw(var/mob/user as mob)
return src.attack_hand(user)
return
/obj/machinery/computer/diseasesplicer/attack_hand(var/mob/user as mob)
if(..())
return
user.machine = src
var/dat
if(splicing)
dat = "Splicing in progress"
else if(scanning)
dat = "Splicing in progress"
else if(burning)
dat = "Data disk burning in progress"
else
if(dish)
dat = "Virus dish inserted"
dat += "<BR>Current DNA strand : "
if(memorybank)
dat += "<A href='?src=\ref[src];splice=1'>"
if(analysed)
dat += "[memorybank.effect.name] ([5-memorybank.effect.stage])"
else
dat += "Unknown DNA strand ([5-memorybank.effect.stage])"
dat += "</a>"
dat += "<BR><A href='?src=\ref[src];disk=1'>Burn DNA Sequence to data storage disk</a>"
else
dat += "Empty"
dat += "<BR><BR>"
if(dish)
if(dish.virus2)
if(dish.growth >= 50)
for(var/datum/disease2/effectholder/e in dish.virus2.effects)
dat += "<BR><A href='?src=\ref[src];grab=\ref[e]'> DNA strand"
if(dish.analysed)
dat += ": [e.effect.name]"
dat += " (5-[e.effect.stage])</a>"
else
dat += "<BR>Insufficent cells to attempt gene splicing"
else
dat += "<BR>No virus found in dish"
dat += "<BR><BR><A href='?src=\ref[src];eject=1'>Eject disk</a>"
else
dat += "<BR>Please insert dish"
user << browse(dat, "window=computer;size=400x500")
onclose(user, "computer")
return
/obj/machinery/computer/diseasesplicer/process()
if(stat & (NOPOWER|BROKEN))
return
use_power(500)
src.updateDialog()
if(scanning)
scanning -= 1
if(!scanning)
state("The [src.name] beeps")
icon_state = "crew"
if(splicing)
splicing -= 1
if(!splicing)
state("The [src.name] pings")
icon_state = "crew"
if(burning)
burning -= 1
if(!burning)
var/obj/item/weapon/diseasedisk/d = new /obj/item/weapon/diseasedisk(src.loc)
if(analysed)
d.name = "[memorybank.effect.name] GNA disk (Stage: [5-memorybank.effect.stage])"
else
d.name = "Unknown GNA disk (Stage: [5-memorybank.effect.stage])"
d.effect = memorybank
state("The [src.name] zings")
icon_state = "crew"
return
/obj/machinery/computer/diseasesplicer/Topic(href, href_list)
if(..())
return
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.machine = src
if (href_list["grab"])
memorybank = locate(href_list["grab"])
analysed = dish.analysed
del(dish)
dish = null
scanning = 30
icon_state = "crew"
else if(href_list["eject"])
dish.loc = src.loc
dish = null
else if(href_list["splice"])
for(var/datum/disease2/effectholder/e in dish.virus2.effects)
if(e.stage == memorybank.stage)
e.effect = memorybank.effect
splicing = 50
dish.virus2.spreadtype = "Blood"
icon_state = "crew"
else if(href_list["disk"])
burning = 20
icon_state = "crew"
src.add_fingerprint(usr)
src.updateUsrDialog()
return
/obj/machinery/computer/diseasesplicer/proc/state(var/msg)
for(var/mob/O in hearers(src, null))
O.show_message("\icon[src] \blue [msg]", 2)
/obj/item/weapon/diseasedisk
name = "Blank GNA disk"
icon = 'icons/obj/cloning.dmi'
icon_state = "datadisk2"
var/datum/disease2/effectholder/effect = null
var/stage = 1
/obj/item/weapon/diseasedisk/premade/New()
name = "Blank GNA disk (stage: [5-stage])"
effect = new /datum/disease2/effectholder
effect.effect = new /datum/disease2/effect/invisible
effect.stage = stage
@@ -0,0 +1,176 @@
/obj/machinery/disease2/incubator/
name = "Pathogenic incubator"
density = 1
anchored = 1
icon = 'icons/obj/virology.dmi'
icon_state = "incubator"
var/obj/item/weapon/virusdish/dish
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/radiation = 0
var/on = 0
var/power = 0
var/foodsupply = 0
var/toxins = 0
ex_act(severity)
switch(severity)
if(1.0)
del(src)
return
if(2.0)
if (prob(50))
del(src)
return
blob_act()
if (prob(25))
del(src)
meteorhit()
del(src)
return
attackby(var/obj/B as obj, var/mob/user as mob)
if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B,/obj/item/weapon/reagent_containers/syringe))
if(src.beaker)
if(istype(beaker,/obj/item/weapon/reagent_containers/syringe))
user << "A syringe is already loaded into the machine."
else
user << "A beaker is already loaded into the machine."
return
src.beaker = B
user.drop_item()
B.loc = src
if(istype(B,/obj/item/weapon/reagent_containers/syringe))
user << "You add the syringe to the machine!"
src.updateUsrDialog()
else
user << "You add the beaker to the machine!"
src.updateUsrDialog()
else
if(istype(B,/obj/item/weapon/virusdish))
if(src.dish)
user << "A dish is already loaded into the machine."
return
src.dish = B
user.drop_item()
B.loc = src
if(istype(B,/obj/item/weapon/virusdish))
user << "You add the dish to the machine!"
src.updateUsrDialog()
Topic(href, href_list)
if(stat & BROKEN) return
if(usr.stat || usr.restrained()) return
if(!in_range(src, usr)) return
usr.machine = src
if(!dish) return
if (href_list["power"])
on = !on
if(on)
icon_state = "incubator_on"
else
icon_state = "incubator"
if (href_list["ejectchem"])
if(beaker)
beaker.loc = src.loc
beaker = null
if (href_list["ejectdish"])
if(dish)
dish.loc = src.loc
dish = null
if (href_list["rad"])
radiation += 10
if (href_list["flush"])
radiation = 0
toxins = 0
foodsupply = 0
src.add_fingerprint(usr)
src.updateUsrDialog()
attack_hand(mob/user as mob)
if(stat & BROKEN)
return
user.machine = src
var/dat = ""
if(!dish)
dat = "Please insert dish into the incubator.<BR>"
dat += "<A href='?src=\ref[src];close=1'>Close</A>"
var/string = "Off"
if(on)
string = "On"
dat += "Power status : <A href='?src=\ref[src];power=1'>[string]</a>"
dat += "<BR>"
dat += "Food supply : [foodsupply]"
dat += "<BR>"
dat += "Radiation Levels : [radiation] RADS : <A href='?src=\ref[src];rad=1'>Radiate</a>"
dat += "<BR>"
dat += "Toxins : [toxins]"
dat += "<BR><BR>"
if(beaker)
dat += "Eject chemicals : <A href='?src=\ref[src];ejectchem=1'> Eject</a>"
dat += "<BR>"
if(dish)
dat += "Eject Virus dish : <A href='?src=\ref[src];ejectdish=1'> Eject</a>"
dat += "<BR>"
dat += "<BR><BR>"
dat += "<A href='?src=\ref[src];flush=1'>Flush system</a>"
user << browse("<TITLE>Pathogenic incubator</TITLE>incubator menu:<BR><BR>[dat]", "window=incubator;size=575x400")
onclose(user, "incubator")
return
process()
if(dish && on && dish.virus2)
use_power(50,EQUIP)
if(!powered(EQUIP))
on = 0
icon_state = "incubator"
if(foodsupply)
foodsupply -= 1
dish.growth += 1
if(dish.growth == 100)
state("The [src.name] pings")
if(radiation)
if(radiation > 50 & prob(5))
dish.virus2.majormutate()
if(dish.info)
dish.info = "OUTDATED : [dish.info]"
dish.analysed = 0
state("The [src.name] beeps")
else if(prob(5))
dish.virus2.minormutate()
radiation -= 1
if(toxins && prob(5))
dish.virus2.infectionchance -= 1
if(toxins > 50)
dish.virus2 = null
else if(!dish)
on = 0
icon_state = "incubator"
if(beaker)
if(!beaker.reagents.remove_reagent("virusfood",5))
foodsupply += 20
if(!beaker.reagents.remove_reagent("toxins",1))
toxins += 1
proc/state(var/msg)
for(var/mob/O in hearers(src, null))
O.show_message("\icon[src] \blue [msg]", 2)
@@ -0,0 +1,139 @@
/obj/machinery/disease2/isolator/
name = "Pathogenic Isolator"
density = 1
anchored = 1
icon = 'icons/obj/virology.dmi'
icon_state = "isolator"
var/datum/disease2/disease/virus2 = null
var/isolating = 0
var/beaker = null
ex_act(severity)
switch(severity)
if(1.0)
del(src)
return
if(2.0)
if (prob(50))
del(src)
return
blob_act()
if (prob(25))
del(src)
meteorhit()
del(src)
return
attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
if(!istype(B,/obj/item/weapon/reagent_containers/syringe))
return
if(src.beaker)
user << "A syringe is already loaded into the machine."
return
src.beaker = B
user.drop_item()
B.loc = src
if(istype(B,/obj/item/weapon/reagent_containers/syringe))
user << "You add the syringe to the machine!"
src.updateUsrDialog()
icon_state = "isolator_in"
Topic(href, href_list)
if(stat & BROKEN) return
if(usr.stat || usr.restrained()) return
if(!in_range(src, usr)) return
usr.machine = src
if(!beaker) return
var/datum/reagents/R = beaker:reagents
if (href_list["isolate"])
var/datum/reagent/blood/Blood
for(var/datum/reagent/blood/B in R.reagent_list)
if(B)
Blood = B
break
if(Blood.data["virus2"])
virus2 = Blood.data["virus2"]
isolating = 40
icon_state = "isolator_processing"
src.updateUsrDialog()
return
else if (href_list["main"])
attack_hand(usr)
return
else if (href_list["eject"])
beaker:loc = src.loc
beaker = null
icon_state = "isolator"
src.updateUsrDialog()
return
attack_hand(mob/user as mob)
if(stat & BROKEN)
return
user.machine = src
var/dat = ""
if(!beaker)
dat = "Please insert sample into the isolator.<BR>"
dat += "<A href='?src=\ref[src];close=1'>Close</A>"
else if(isolating)
dat = "Isolating"
else
var/datum/reagents/R = beaker:reagents
dat += "<A href='?src=\ref[src];eject=1'>Eject</A><BR><BR>"
if(!R.total_volume)
dat += "[beaker] is empty."
else
dat += "Contained reagents:<BR>"
for(var/datum/reagent/blood/G in R.reagent_list)
dat += " [G.name]: <A href='?src=\ref[src];isolate=[G.id]'>Isolate</a>"
user << browse("<TITLE>Pathogenic Isolator</TITLE>Isolator menu:<BR><BR>[dat]", "window=isolator;size=575x400")
onclose(user, "isolator")
return
process()
if(isolating > 0)
isolating -= 1
if(isolating == 0)
var/obj/item/weapon/virusdish/d = new /obj/item/weapon/virusdish(src.loc)
d.virus2 = virus2.getcopy()
virus2 = null
icon_state = "isolator_in"
/obj/item/weapon/virusdish
name = "Virus containment/growth dish"
icon = 'icons/obj/items.dmi'
icon_state = "implantcase-b"
var/datum/disease2/disease/virus2 = null
var/growth = 0
var/info = 0
var/analysed = 0
/obj/item/weapon/virusdish/attackby(var/obj/item/weapon/W as obj,var/mob/living/carbon/user as mob)
if(istype(W,/obj/item/weapon/hand_labeler))
return
..()
if(prob(50))
user << "The dish shatters"
if(virus2.infectionchance > 0)
infect_virus2(user,virus2)
del src
/obj/item/weapon/virusdish/examine()
usr << "This is a virus containment dish"
if(src.info)
usr << "It has the following information about its contents"
usr << src.info
@@ -0,0 +1,30 @@
/obj/machinery/disease2/monkeycloner
name = "Monkey dispensor"
icon = 'icons/obj/cloning.dmi'
icon_state = "pod_0"
density = 1
anchored = 1
var/cloning = 0
/obj/machinery/disease2/monkeycloner/attack_hand()
if(!cloning)
cloning = 150
icon_state = "pod_g"
/obj/machinery/disease2/monkeycloner/process()
if(stat & (NOPOWER|BROKEN))
return
use_power(500)
src.updateDialog()
if(cloning)
cloning -= 1
if(!cloning)
new /mob/living/carbon/monkey(src.loc)
icon_state = "pod_0"
return
-12
View File
@@ -1,12 +0,0 @@
var/list/prob_G_list = list()
/proc/probG(var/define,var/everyother)
if(prob_G_list["[define]"])
prob_G_list["[define]"] += 1
if(prob_G_list["[define]"] == everyother)
prob_G_list["[define]"] = 0
return 1
else
(prob_G_list["[define]"]) = 0
(prob_G_list["[define]"]) = rand(1,everyother-1)
return 0
+5 -7
View File
@@ -1,4 +1,4 @@
//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:06
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
// pure concentrated antibodies
datum/reagent/antibodies
@@ -9,12 +9,10 @@ datum/reagent/antibodies
color = "#0050F0"
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(istype(M,/mob/living/carbon))
if(istype(M,/mob/living/carbon/human))
if(src.data && method == INGEST)
if(M:virus2) if(src.data["antibodies"] & M:virus2.antigen)
if(src.data["antibodies"] & M:virus2.antigen)
M:virus2.dead = 1
// if the virus is killed this way it immunizes
M:antibodies |= M:virus2.antigen
return
// reserving some numbers for later special antigens
@@ -44,8 +42,8 @@ var/global/list/ANTIGENS = list("[ANTIGEN_A]" = "A", "[ANTIGEN_B]" = "B", "[ANTI
icon_state = "health"
w_class = 2.0
item_state = "electronic"
flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY
slot_flags = SLOT_BELT
flags = FPRINT | TABLEPASS | ONBELT | CONDUCT | USEDELAY
/obj/item/device/antibody_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob)
if(! istype(M, /mob/living/carbon) || !M:antibodies)
+183 -279
View File
@@ -1,3 +1,16 @@
/obj/virus
// a virus instance that is placed on the map, moves, and infects
invisibility = INVISIBILITY_MAXIMUM
var/datum/disease2/disease
New()
..()
step_rand(src)
step_rand(src)
anchored = 1
spawn(300) del(src)
/mob/living/carbon/proc/get_infection_chance()
var/score = 0
var/mob/living/carbon/M = src
@@ -31,22 +44,15 @@
return 1
proc/airborne_can_reach(turf/source, turf/target)
var/obj/dummy = new(source)
dummy.flags = FPRINT | TABLEPASS
dummy.pass_flags = PASSTABLE
for(var/i=0, i<5, i++) if(!step_towards(dummy, target)) break
var/rval = (dummy.loc in range(1,target))
del dummy
return rval
/proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0)
if(M.virus2)
return
if(!disease)
return
//immunity
/*for(var/iii = 1, iii <= M.immunevirus2.len, iii++)
if(disease.issame(M.immunevirus2[iii]))
return*/
// if one of the antibodies in the mob's body matches one of the disease's antigens, don't infect
if(M.antibodies & disease.antigen != 0) return
@@ -97,6 +103,7 @@ proc/airborne_can_reach(turf/source, turf/target)
if(!M.virus2)
M.virus2 = new /datum/disease2/disease
M.virus2.makerandom()
M.virus2.infectionchance = 1
/proc/infect_mob_random_greater(var/mob/living/carbon/M)
if(!M.virus2)
@@ -109,7 +116,7 @@ proc/airborne_can_reach(turf/source, turf/target)
var/infectionchance = 10
var/speed = 1
var/spreadtype = "Blood" // Can also be "Airborne"
var/stage = 0
var/stage = 1
var/stageprob = 10
var/dead = 0
var/clicks = 0
@@ -146,7 +153,7 @@ proc/airborne_can_reach(turf/source, turf/target)
holder.getrandomeffect_lesser()
effects += holder
uniqueID = rand(0,10000)
infectionchance = rand(4,10)
infectionchance = rand(1,10)
// pick 2 antigens
antigen |= text2num(pick(ANTIGENS))
antigen |= text2num(pick(ANTIGENS))
@@ -210,18 +217,19 @@ proc/airborne_can_reach(turf/source, turf/target)
return
// with a certain chance, the mob may become immune to the disease before it starts properly
if(stage <= 1 && clicks == 0)
if(prob(3))
mob.antibodies |= antigen // 3% chance of spontanous immunity
if(prob(20))
mob.antibodies |= antigen // 20% immunity is a good chance IMO, because it allows finding an immune person easily
else
if(mob.radiation > 50)
if(prob(1))
majormutate()
if(mob.reagents.has_reagent("spaceacillin"))
mob.reagents.remove_reagent("spaceacillin",0.3)
return
if(mob.reagents.has_reagent("virusfood"))
mob.reagents.remove_reagent("virusfood",0.1)
clicks += 10
if(clicks > (stage+1)*100 && prob(10))
if(clicks > stage*100 && prob(10))
if(stage == 4)
var/datum/disease2/resistance/res = new /datum/disease2/resistance(src)
src.cure(mob)
@@ -235,20 +243,18 @@ proc/airborne_can_reach(turf/source, turf/target)
e.runeffect(mob,stage)
clicks+=speed
if(prob(50)) spread_airborne(mob)
proc/cure(var/mob/living/carbon/mob)
var/datum/disease2/effectholder/E
if(stage>1)
E = effects[1]
E.effect.deactivate(mob)
if(stage>=2)
if(stage>2)
E = effects[2]
E.effect.deactivate(mob)
if(stage>=3)
if(stage>3)
E = effects[3]
E.effect.deactivate(mob)
if(stage>=4)
if(stage>4)
E = effects[4]
E.effect.deactivate(mob)
@@ -262,13 +268,14 @@ proc/airborne_can_reach(turf/source, turf/target)
proc/getcopy()
// world << "getting copy"
var/datum/disease2/disease/disease = new /datum/disease2/disease
disease.infectionchance = infectionchance
disease.spreadtype = spreadtype
disease.stageprob = stageprob
disease.antigen = antigen
disease.uniqueID = uniqueID
for(var/datum/disease2/effectholder/holder in effects)
// world << "adding effects"
var/datum/disease2/effectholder/newholder = new /datum/disease2/effectholder
newholder.effect = new holder.effect.type
newholder.chance = holder.chance
@@ -277,30 +284,18 @@ proc/airborne_can_reach(turf/source, turf/target)
newholder.happensonce = holder.happensonce
newholder.stage = holder.stage
disease.effects += newholder
// world << "[newholder.effect.name]"
// world << "[disease]"
return disease
proc/spread_airborne(var/mob/living/carbon/mob)
for(var/mob/living/carbon/target in view(null, mob)) if(!target.virus2)
if(airborne_can_reach(mob.loc, target.loc))
if(mob.get_infection_chance() && target.get_infection_chance())
infect_virus2(target,src)
/datum/disease2/effect
var/chance_maxm = 100
var/name = "Blanking effect"
var/stage = 4
var/maxm = 1
var/happensalways = 0
proc/activate(var/mob/living/carbon/mob,var/multiplier)
proc/deactivate(var/mob/living/carbon/mob)
// ================================
// ======= DISEASE SYMPTOMS =======
// ================================
// Special diseases
// --------------------------------
/datum/disease2/effect/alien
name = "Unidentified Foreign Body"
stage = 4
@@ -317,75 +312,18 @@ proc/airborne_can_reach(turf/source, turf/target)
mob:gib()
del D
// Greater Diseases, Stage 1
// --------------------------------
/datum/disease2/effect/greater/gunck
name = "Flemmingtons"
stage = 1
/datum/disease2/effect/greater/gibbingtons
name = "Gibbingtons Syndrome"
stage = 4
activate(var/mob/living/carbon/mob,var/multiplier)
mob << "\red Mucous runs down the back of your throat."
mob.gib()
// Greater Diseases, Stage 2
// --------------------------------
/datum/disease2/effect/greater/cough
name = "Anima Syndrome"
stage = 2
/datum/disease2/effect/greater/radian
name = "Radian's syndrome"
stage = 4
maxm = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*cough")
if(mob.virus2) mob.virus2.spread_airborne(mob)
if(mob.virus2) mob.virus2.spread_airborne(mob)
if(prob(2))
var/obj/effect/decal/cleanable/mucus/this = new(mob.loc)
this.virus2 = mob.virus2
/datum/disease2/effect/greater/vomit
name = "Bad Stomach Syndrome"
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
if(prob(20) && mob.nutrition > 200)
mob.vomit()
/datum/disease2/effect/greater/sneeze
name = "Coldingtons Effect"
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*sneeze")
if(mob.virus2) mob.virus2.spread_airborne(mob)
if(mob.virus2) mob.virus2.spread_airborne(mob)
if(prob(5))
var/obj/effect/decal/cleanable/mucus/this = new(mob.loc)
this.anchored = 0
step(this, mob.dir)
this.anchored = 1
this.virus2 = mob.virus2
// Greater Diseases, Stage 3
// --------------------------------
/datum/disease2/effect/greater/sleepy
name = "Resting syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*collapse")
/datum/disease2/effect/greater/mind
name = "Lazy mind syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.setBrainLoss(50)
/datum/disease2/effect/greater/hallucinations
name = "Hallucinational Syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.hallucination += 25
mob.radiation += (2*multiplier)
/datum/disease2/effect/greater/toxins
name = "Hyperacid Syndrome"
@@ -394,9 +332,15 @@ proc/airborne_can_reach(turf/source, turf/target)
activate(var/mob/living/carbon/mob,var/multiplier)
mob.adjustToxLoss((2*multiplier))
/datum/disease2/effect/greater/scream
name = "Random screaming syndrome"
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*scream")
/datum/disease2/effect/greater/drowsness
name = "Automated sleeping syndrome"
stage = 3
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.drowsyness += 10
@@ -407,6 +351,17 @@ proc/airborne_can_reach(turf/source, turf/target)
activate(var/mob/living/carbon/mob,var/multiplier)
shake_camera(mob,5*multiplier)
/datum/disease2/effect/greater/deaf
name = "Hard of hearing syndrome"
stage = 4
activate(var/mob/living/carbon/mob,var/multiplier)
mob.ear_deaf += 20
/datum/disease2/effect/invisible
name = "Waiting Syndrome"
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
return
/datum/disease2/effect/greater/telepathic
name = "Telepathy Syndrome"
@@ -414,55 +369,13 @@ proc/airborne_can_reach(turf/source, turf/target)
activate(var/mob/living/carbon/mob,var/multiplier)
mob.mutations |= 512
// Greater Diseases, Stage 4
// --------------------------------
/datum/disease2/effect/greater/gibbingtons
name = "Gibbingtons Syndrome"
/*/datum/disease2/effect/greater/noface
name = "Identity Loss syndrome"
stage = 4
activate(var/mob/living/carbon/mob,var/multiplier)
mob.gib()
/datum/disease2/effect/greater/blood_fountain
name = "Blood Fountain Syndrome"
stage = 4
activate(var/mob/living/carbon/mob,var/multiplier)
if(prob(20))
mob.visible_message("\red You see a fountain of blood erupt from [mob.name].","\red <b>Something wet is leaking from you.</b>","You hear a loud splash.")
mob.drip(50)
/datum/disease2/effect/greater/radian
name = "Radian's syndrome"
stage = 4
maxm = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.radiation += (20*multiplier)
/datum/disease2/effect/greater/fever
name = "Fever syndrome"
stage = 4
maxm = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.adjustFireLoss(10 * multiplier)
/datum/disease2/effect/greater/weak_bones
name = "Bone Density Syndrome"
stage = 4
maxm = 2
activate(var/mob/living/carbon/mob,var/multiplier)
var/name = pick(mob.organs)
var/datum/organ/external/organ = mob.organs[name]
if(!(organ.status & ORGAN_BROKEN) && !(organ.status & ORGAN_ROBOT))
mob.adjustBruteLoss(10)
mob.visible_message("\red You hear a loud cracking sound coming from [mob.name].","\red <b>Something feels like it shattered in your [organ.display_name]!</b>","You hear a sickening crack.")
mob.emote("scream")
organ.status |= ORGAN_BROKEN
organ.broken_description = pick("broken","fracture","hairline fracture")
organ.perma_injury = 10
mob.face_dmg++
deactivate(var/mob/living/carbon/mob)
mob.face_dmg--*/
/datum/disease2/effect/greater/monkey
name = "Monkism syndrome"
@@ -472,6 +385,17 @@ proc/airborne_can_reach(turf/source, turf/target)
var/mob/living/carbon/human/h = mob
h.monkeyize()
/datum/disease2/effect/greater/sneeze
name = "Coldingtons Effect"
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*sneeze")
/datum/disease2/effect/greater/gunck
name = "Flemmingtons"
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
mob << "\red Mucous runs down the back of your throat."
/datum/disease2/effect/greater/killertoxins
name = "Toxification syndrome"
@@ -479,137 +403,60 @@ proc/airborne_can_reach(turf/source, turf/target)
activate(var/mob/living/carbon/mob,var/multiplier)
mob.adjustToxLoss(15)
// Lesser Diseases, Stage 1
// --------------------------------
/datum/disease2/effect/lesser/gunck
name = "Flemmingtons"
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
mob << "\red Mucous runs down the back of your throat."
/datum/disease2/effect/lesser/fridge
name = "Refridgerator Syndrome"
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
if(prob(10)) mob << "\blue You feel extremely cold."
/datum/disease2/effect/lesser/pale
name = "Ghost Effect"
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
mob << "\blue If you had a mirror, your reflection would probably look very pale.."
/datum/disease2/effect/lesser/hoarse
name = "Hoarse Throat"
stage = 1
happensalways = 1 // the mob will have a permanently sore throat
activate(var/mob/living/carbon/mob,var/multiplier)
mob.disease_symptoms |= DISEASE_HOARSE
if(prob(3)) mob << "\blue Your throat feels very sore.."
// Lesser Diseases, Stage 2
// --------------------------------
/datum/disease2/effect/lesser/sneeze
name = "Coldingtons Effect"
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*sneeze")
if(mob.virus2) mob.virus2.spread_airborne(mob)
if(mob.virus2) mob.virus2.spread_airborne(mob)
if(prob(10))
var/obj/effect/decal/cleanable/mucus/this = new(mob.loc)
this.anchored = 0
step(this, mob.dir)
this.anchored = 1
this.virus2 = mob.virus2
/datum/disease2/effect/lesser/cough
name = "Anima Syndrome"
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*cough")
if(mob.virus2) mob.virus2.spread_airborne(mob)
if(mob.virus2) mob.virus2.spread_airborne(mob)
if(prob(10))
var/obj/effect/decal/cleanable/mucus/this = new(mob.loc)
this.virus2 = mob.virus2
/datum/disease2/effect/lesser/nosebleed
name = "Nosebleed Effect"
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
if(prob(30))
mob.drip(1)
// Lesser Diseases, Stage 3
// --------------------------------
/datum/disease2/effect/lesser/vomit
name = "Bad Stomach Syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
if(prob(5) && mob.nutrition > 200)
mob.vomit()
// lesser syndromes, partly just copypastes
/datum/disease2/effect/lesser/hallucinations
/*/datum/disease2/effect/greater/hallucinations
name = "Hallucinational Syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.hallucination += 5
mob.hallucination += 25*/
/datum/disease2/effect/greater/sleepy
name = "Resting syndrome"
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*collapse")
/datum/disease2/effect/greater/mind
name = "Lazy mind syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.setBrainLoss(50)
/datum/disease2/effect/greater/suicide
name = "Suicidal syndrome"
stage = 4
activate(var/mob/living/carbon/mob,var/multiplier)
mob.suiciding = 1
//instead of killing them instantly, just put them at -175 health and let 'em gasp for a while
viewers(mob) << "\red <b>[mob.name] is holding \his breath. It looks like \he's trying to commit suicide.</b>"
mob.adjustOxyLoss(175 - mob.getToxLoss() - mob.getFireLoss() - mob.getBruteLoss() - mob.getOxyLoss())
mob.updatehealth()
spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds
mob.suiciding = 0
// lesser syndromes, partly just copypastes
/datum/disease2/effect/lesser/mind
name = "Lazy mind syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.setBrainLoss(20)
/datum/disease2/effect/lesser/drowsy
name = "Bedroom Syndrome"
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.drowsyness = 5
/datum/disease2/effect/lesser/deaf
name = "Hard of hearing syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.ear_deaf = 5
/datum/disease2/effect/lesser/hungry
name = "Appetiser Effect"
stage = 2
/datum/disease2/effect/lesser/gunck
name = "Flemmingtons"
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
mob.nutrition = max(0, mob.nutrition - 1)
/datum/disease2/effect/lesser/groan
name = "Groaning Syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*groan")
/datum/disease2/effect/lesser/twitch
name = "Twitcher"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
if(prob(5)) mob.say("*twitch")
if(prob(20)) mob << "\blue Your muscles feel twitchy.."
/datum/disease2/effect/lesser/stumble
name = "Poor Balance Syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
if(!mob.client) return
// little trick, this way you only stumble while moving
if(world.time < mob.client.move_delay + 10)
step(mob, pick(cardinal))
mob.emote("me",1,"stumbles over their own feet.")
// Lesser Diseases, Stage 4
// --------------------------------
mob << "\red Mucous runs down the back of your throat."
/datum/disease2/effect/lesser/radian
name = "Radian's syndrome"
@@ -618,23 +465,80 @@ proc/airborne_can_reach(turf/source, turf/target)
activate(var/mob/living/carbon/mob,var/multiplier)
mob.radiation += 1
// ============
// END SYMPTOMS
// ============
/datum/disease2/effect/invisible
name = "Waiting Syndrome"
/datum/disease2/effect/lesser/sneeze
name = "Coldingtons Effect"
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
return
mob.say("*sneeze")
/datum/disease2/effect/lesser/cough
name = "Anima Syndrome"
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*cough")
var/global/const/DISEASE_HOARSE = 2
var/global/const/DISEASE_WHISPER = 4
/*/datum/disease2/effect/lesser/hallucinations
name = "Hallucinational Syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.hallucination += 5*/
/*/datum/disease2/effect/lesser/arm
name = "Disarming Syndrome"
stage = 4
activate(var/mob/living/carbon/mob,var/multiplier)
var/datum/organ/external/org = mob.organs["r_arm"]
org.take_damage(3,0,0,0)
mob << "\red You feel a sting in your right arm."*/
/datum/disease2/effect/lesser/hungry
name = "Appetiser Effect"
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.nutrition = max(0, mob.nutrition - 200)
/datum/disease2/effect/lesser/groan
name = "Groaning Syndrome"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*groan")
/datum/disease2/effect/lesser/scream
name = "Loudness Syndrome"
stage = 4
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*scream")
/datum/disease2/effect/lesser/drool
name = "Saliva Effect"
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*drool")
/datum/disease2/effect/lesser/fridge
name = "Refridgerator Syndrome"
stage = 2
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*shiver")
/datum/disease2/effect/lesser/twitch
name = "Twitcher"
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*twitch")
/*Removed on request by Spaceman, due to it being detrimental to RP. -CN
/datum/disease2/effect/lesser/deathgasp
name = "Zombie Syndrome"
stage = 4
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*deathgasp")*/
/datum/disease2/effect/lesser/giggle
name = "Uncontrolled Laughter Effect"
stage = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*giggle")
/datum/disease2/effect/lesser
@@ -650,7 +554,7 @@ var/global/const/DISEASE_WHISPER = 4
var/stage = 0
proc/runeffect(var/mob/living/carbon/human/mob,var/stage)
if(effect.stage <= stage) if(effect.happensalways || (happensonce > -1 && prob(chance)))
if(happensonce > -1 && effect.stage <= stage && prob(chance))
effect.activate(mob)
if(happensonce == 1)
happensonce = -1
@@ -684,4 +588,4 @@ var/global/const/DISEASE_WHISPER = 4
getrandomeffect_greater()
/proc/dprob(var/p)
return(prob(sqrt(p)) && prob(sqrt(p)))
return(prob(sqrt(p)) && prob(sqrt(p)))
+3 -24
View File
@@ -1,15 +1,15 @@
/obj/machinery/computer/curer
name = "Cure Research Machine"
icon = 'computer.dmi'
icon = 'icons/obj/computer.dmi'
icon_state = "dna"
var/curing
var/virusing = 0
var/virusing
var/obj/item/weapon/reagent_containers/container = null
/obj/machinery/computer/curer/attackby(var/obj/I as obj, var/mob/user as mob)
if(istype(I, /obj/item/weapon/screwdriver))
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20))
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
@@ -40,23 +40,6 @@
container = I
C.drop_item()
I.loc = src
state("The [src.name] Buzzes", "blue")
return
if(istype(I,/obj/item/weapon/virusdish))
if(virusing)
user << "<b>The pathogen materializer is still recharging.."
return
var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc)
var/list/data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=null,"antibodies"=0)
data["virus2"] = I:virus2
product.reagents.add_reagent("blood",30,data)
virusing = 1
spawn(1200) virusing = 0
state("The [src.name] Buzzes", "blue")
return
//else
src.attack_hand(user)
@@ -85,9 +68,6 @@
if(B)
dat = "Blood sample inserted."
var/code = ""
for(var/V in ANTIGENS) if(text2num(V) & B.data["antibodies"]) code += ANTIGENS[V]
dat += "<BR>Antibodies: [code]"
dat += "<BR><A href='?src=\ref[src];antibody=1'>Begin antibody production</a>"
else
dat += "<BR>Please check container contents."
@@ -135,7 +115,6 @@
var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc)
var/datum/reagent/blood/B = locate() in container.reagents.reagent_list
if(!B) return
var/list/data = list()
data["antibodies"] = B.data["antibodies"]