mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-28 19:11:37 +00:00
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>
679 lines
18 KiB
Plaintext
679 lines
18 KiB
Plaintext
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
|
|
|
/*
|
|
SwapMaps library by Lummox JR
|
|
developed for digitalBYOND
|
|
http://www.digitalbyond.org
|
|
|
|
Version 2.1
|
|
|
|
The purpose of this library is to make it easy for authors to swap maps
|
|
in and out of their game using savefiles. Swapped-out maps can be
|
|
transferred between worlds for an MMORPG, sent to the client, etc.
|
|
This is facilitated by the use of a special datum and a global list.
|
|
|
|
Uses of swapmaps:
|
|
|
|
- Temporary battle arenas
|
|
- House interiors
|
|
- Individual custom player houses
|
|
- Virtually unlimited terrain
|
|
- Sharing maps between servers running different instances of the same
|
|
game
|
|
- Loading and saving pieces of maps for reusable room templates
|
|
*/
|
|
|
|
/*
|
|
User Interface:
|
|
|
|
VARS:
|
|
|
|
swapmaps_iconcache
|
|
An associative list of icon files with names, like
|
|
'player.dmi' = "player"
|
|
swapmaps_mode
|
|
This must be set at runtime, like in world/New().
|
|
|
|
SWAPMAPS_SAV 0 (default)
|
|
Uses .sav files for raw /savefile output.
|
|
SWAPMAPS_TEXT 1
|
|
Uses .txt files via ExportText() and ImportText(). These maps
|
|
are easily editable and appear to take up less space in the
|
|
current version of BYOND.
|
|
|
|
PROCS:
|
|
|
|
SwapMaps_Find(id)
|
|
Find a map by its id
|
|
SwapMaps_Load(id)
|
|
Load a map by its id
|
|
SwapMaps_Save(id)
|
|
Save a map by its id (calls swapmap.Save())
|
|
SwapMaps_Unload(id)
|
|
Save and unload a map by its id (calls swapmap.Unload())
|
|
SwapMaps_Save_All()
|
|
Save all maps
|
|
SwapMaps_DeleteFile(id)
|
|
Delete a map file
|
|
SwapMaps_CreateFromTemplate(id)
|
|
Create a new map by loading another map to use as a template.
|
|
This map has id==src and will not be saved. To make it savable,
|
|
change id with swapmap.SetID(newid).
|
|
SwapMaps_LoadChunk(id,turf/locorner)
|
|
Load a swapmap as a "chunk", at a specific place. A new datum is
|
|
created but it's not added to the list of maps to save or unload.
|
|
The new datum can be safely deleted without affecting the turfs
|
|
it loaded. The purpose of this is to load a map file onto part of
|
|
another swapmap or an existing part of the world.
|
|
locorner is the corner turf with the lowest x,y,z values.
|
|
SwapMaps_SaveChunk(id,turf/corner1,turf/corner2)
|
|
Save a piece of the world as a "chunk". A new datum is created
|
|
for the chunk, but it can be deleted without destroying any turfs.
|
|
The chunk file can be reloaded as a swapmap all its own, or loaded
|
|
via SwapMaps_LoadChunk() to become part of another map.
|
|
SwapMaps_GetSize(id)
|
|
Return a list corresponding to the x,y,z sizes of a map file,
|
|
without loading the map.
|
|
Returns null if the map is not found.
|
|
SwapMaps_AddIconToCache(name,icon)
|
|
Cache an icon file by name for space-saving storage
|
|
|
|
swapmap.New(id,x,y,z)
|
|
Create a new map; specify id, width (x), height (y), and
|
|
depth (z)
|
|
Default size is world.maxx,world.maxy,1
|
|
swapmap.New(id,turf1,turf2)
|
|
Create a new map; specify id and 2 corners
|
|
This becomes a /swapmap for one of the compiled-in maps, for
|
|
easy saving.
|
|
swapmap.New()
|
|
Create a new map datum, but does not allocate space or assign an
|
|
ID (used for loading).
|
|
swapmap.Del()
|
|
Deletes a map but does not save
|
|
swapmap.Save()
|
|
Saves to map_[id].sav
|
|
Maps with id==src are not saved.
|
|
swapmap.Unload()
|
|
Saves the map and then deletes it
|
|
Maps with id==src are not saved.
|
|
swapmap.SetID(id)
|
|
Change the map's id and make changes to the lookup list
|
|
swapmap.AllTurfs(z)
|
|
Returns a block of turfs encompassing the entire map, or on just
|
|
one z-level
|
|
z is in world coordinates; it is optional
|
|
swapmap.Contains(turf/T)
|
|
Returns nonzero if T is inside the map's boundaries.
|
|
Also works for objs and mobs, but the proc is not area-safe.
|
|
swapmap.InUse()
|
|
Returns nonzero if a mob with a key is within the map's
|
|
boundaries.
|
|
swapmap.LoCorner(z=z1)
|
|
Returns locate(x1,y1,z), where z=z1 if none is specified.
|
|
swapmap.HiCorner(z=z2)
|
|
Returns locate(x2,y2,z), where z=z2 if none is specified.
|
|
swapmap.BuildFilledRectangle(turf/corner1,turf/corner2,item)
|
|
Builds a filled rectangle of item from one corner turf to the
|
|
other, on multiple z-levels if necessary. The corners may be
|
|
specified in any order.
|
|
item is a type path like /turf/wall or /obj/barrel{full=1}.
|
|
swapmap.BuildRectangle(turf/corner1,turf/corner2,item)
|
|
Builds an unfilled rectangle of item from one corner turf to
|
|
the other, on multiple z-levels if necessary.
|
|
swapmap.BuildInTurfs(list/turfs,item)
|
|
Builds item on all of the turfs listed. The list need not
|
|
contain only turfs, or even only atoms.
|
|
*/
|
|
|
|
swapmap
|
|
var/id // a string identifying this map uniquely
|
|
var/x1 // minimum x,y,z coords
|
|
var/y1
|
|
var/z1
|
|
var/x2 // maximum x,y,z coords (also used as width,height,depth until positioned)
|
|
var/y2
|
|
var/z2
|
|
var/tmp/locked // don't move anyone to this map; it's saving or loading
|
|
var/tmp/mode // save as text-mode
|
|
var/ischunk // tells the load routine to load to the specified location
|
|
|
|
New(_id,x,y,z)
|
|
if(isnull(_id)) return
|
|
id=_id
|
|
mode=swapmaps_mode
|
|
if(isturf(x) && isturf(y))
|
|
/*
|
|
Special format: Defines a map as an existing set of turfs;
|
|
this is useful for saving a compiled map in swapmap format.
|
|
Because this is a compiled-in map, its turfs are not deleted
|
|
when the datum is deleted.
|
|
*/
|
|
x1=min(x:x,y:x);x2=max(x:x,y:x)
|
|
y1=min(x:y,y:y);y2=max(x:y,y:y)
|
|
z1=min(x:z,y:z);z2=max(x:z,y:z)
|
|
InitializeSwapMaps()
|
|
if(z2>swapmaps_compiled_maxz ||\
|
|
y2>swapmaps_compiled_maxy ||\
|
|
x2>swapmaps_compiled_maxx)
|
|
del(src)
|
|
return
|
|
x2=x?(x):world.maxx
|
|
y2=y?(y):world.maxy
|
|
z2=z?(z):1
|
|
AllocateSwapMap()
|
|
|
|
Del()
|
|
// a temporary datum for a chunk can be deleted outright
|
|
// for others, some cleanup is necessary
|
|
if(!ischunk)
|
|
swapmaps_loaded-=src
|
|
swapmaps_byname-=id
|
|
if(z2>swapmaps_compiled_maxz ||\
|
|
y2>swapmaps_compiled_maxy ||\
|
|
x2>swapmaps_compiled_maxx)
|
|
var/list/areas=new
|
|
for(var/atom/A in block(locate(x1,y1,z1),locate(x2,y2,z2)))
|
|
for(var/obj/O in A) del(O)
|
|
for(var/mob/M in A)
|
|
if(!M.key) del(M)
|
|
else M.loc=null
|
|
areas[A.loc]=null
|
|
del(A)
|
|
// delete areas that belong only to this map
|
|
for(var/area/a in areas)
|
|
if(a && !a.contents.len) del(a)
|
|
if(x2>=world.maxx || y2>=world.maxy || z2>=world.maxz) CutXYZ()
|
|
del(areas)
|
|
..()
|
|
|
|
/*
|
|
Savefile format:
|
|
map
|
|
id
|
|
x // size, not coords
|
|
y
|
|
z
|
|
areas // list of areas, not including default
|
|
[each z; 1 to depth]
|
|
[each y; 1 to height]
|
|
[each x; 1 to width]
|
|
type // of turf
|
|
AREA // if non-default; saved as a number (index into areas list)
|
|
vars // all other changed vars
|
|
*/
|
|
Write(savefile/S)
|
|
var/x
|
|
var/y
|
|
var/z
|
|
var/n
|
|
var/list/areas
|
|
var/area/defarea=locate(world.area)
|
|
if(!defarea) defarea=new world.area
|
|
areas=list()
|
|
for(var/turf/T in block(locate(x1,y1,z1),locate(x2,y2,z2)))
|
|
areas[T.loc]=null
|
|
for(n in areas) // quickly eliminate associations for smaller storage
|
|
areas-=n
|
|
areas+=n
|
|
areas-=defarea
|
|
InitializeSwapMaps()
|
|
locked=1
|
|
S["id"] << id
|
|
S["z"] << z2-z1+1
|
|
S["y"] << y2-y1+1
|
|
S["x"] << x2-x1+1
|
|
S["areas"] << areas
|
|
for(n in 1 to areas.len) areas[areas[n]]=n
|
|
var/oldcd=S.cd
|
|
for(z=z1,z<=z2,++z)
|
|
S.cd="[z-z1+1]"
|
|
for(y=y1,y<=y2,++y)
|
|
S.cd="[y-y1+1]"
|
|
for(x=x1,x<=x2,++x)
|
|
S.cd="[x-x1+1]"
|
|
var/turf/T=locate(x,y,z)
|
|
S["type"] << T.type
|
|
if(T.loc!=defarea) S["AREA"] << areas[T.loc]
|
|
T.Write(S)
|
|
S.cd=".."
|
|
S.cd=".."
|
|
sleep()
|
|
S.cd=oldcd
|
|
locked=0
|
|
del(areas)
|
|
|
|
Read(savefile/S,_id,turf/locorner)
|
|
var/x
|
|
var/y
|
|
var/z
|
|
var/n
|
|
var/list/areas
|
|
var/area/defarea=locate(world.area)
|
|
id=_id
|
|
if(locorner)
|
|
ischunk=1
|
|
x1=locorner.x
|
|
y1=locorner.y
|
|
z1=locorner.z
|
|
if(!defarea) defarea=new world.area
|
|
if(!_id)
|
|
S["id"] >> id
|
|
else
|
|
var/dummy
|
|
S["id"] >> dummy
|
|
S["z"] >> z2 // these are depth,
|
|
S["y"] >> y2 // height,
|
|
S["x"] >> x2 // width
|
|
S["areas"] >> areas
|
|
locked=1
|
|
AllocateSwapMap() // adjust x1,y1,z1 - x2,y2,z2 coords
|
|
var/oldcd=S.cd
|
|
for(z=z1,z<=z2,++z)
|
|
S.cd="[z-z1+1]"
|
|
for(y=y1,y<=y2,++y)
|
|
S.cd="[y-y1+1]"
|
|
for(x=x1,x<=x2,++x)
|
|
S.cd="[x-x1+1]"
|
|
var/tp
|
|
S["type"]>>tp
|
|
var/turf/T=locate(x,y,z)
|
|
T.loc.contents-=T
|
|
T=new tp(locate(x,y,z))
|
|
if("AREA" in S.dir)
|
|
S["AREA"]>>n
|
|
var/area/A=areas[n]
|
|
A.contents+=T
|
|
else defarea.contents+=T
|
|
// clear the turf
|
|
for(var/obj/O in T) del(O)
|
|
for(var/mob/M in T)
|
|
if(!M.key) del(M)
|
|
else M.loc=null
|
|
// finish the read
|
|
T.Read(S)
|
|
S.cd=".."
|
|
S.cd=".."
|
|
sleep()
|
|
S.cd=oldcd
|
|
locked=0
|
|
del(areas)
|
|
|
|
/*
|
|
Find an empty block on the world map in which to load this map.
|
|
If no space is found, increase world.maxz as necessary. (If the
|
|
map is greater in x,y size than the current world, expand
|
|
world.maxx and world.maxy too.)
|
|
|
|
Ignore certain operations if loading a map as a chunk. Use the
|
|
x1,y1,z1 position for it, and *don't* count it as a loaded map.
|
|
*/
|
|
proc/AllocateSwapMap()
|
|
InitializeSwapMaps()
|
|
world.maxx=max(x2,world.maxx) // stretch x/y if necessary
|
|
world.maxy=max(y2,world.maxy)
|
|
if(!ischunk)
|
|
if(world.maxz<=swapmaps_compiled_maxz)
|
|
z1=swapmaps_compiled_maxz+1
|
|
x1=1;y1=1
|
|
else
|
|
var/list/l=ConsiderRegion(1,1,world.maxx,world.maxy,swapmaps_compiled_maxz+1)
|
|
x1=l[1]
|
|
y1=l[2]
|
|
z1=l[3]
|
|
del(l)
|
|
x2+=x1-1
|
|
y2+=y1-1
|
|
z2+=z1-1
|
|
world.maxz=max(z2,world.maxz) // stretch z if necessary
|
|
if(!ischunk)
|
|
swapmaps_loaded[src]=null
|
|
swapmaps_byname[id]=src
|
|
|
|
proc/ConsiderRegion(X1,Y1,X2,Y2,Z1,Z2)
|
|
while(1)
|
|
var/nextz=0
|
|
var/swapmap/M
|
|
for(M in swapmaps_loaded)
|
|
if(M.z2<Z1 || (Z2 && M.z1>Z2) || M.z1>=Z1+z2 ||\
|
|
M.x1>X2 || M.x2<X1 || M.x1>=X1+x2 ||\
|
|
M.y1>Y2 || M.y2<Y1 || M.y1>=Y1+y2) continue
|
|
// look for sub-regions with a defined ceiling
|
|
var/nz2=Z2?(Z2):Z1+z2-1+M.z2-M.z1
|
|
if(M.x1>=X1+x2)
|
|
.=ConsiderRegion(X1,Y1,M.x1-1,Y2,Z1,nz2)
|
|
if(.) return
|
|
else if(M.x2<=X2-x2)
|
|
.=ConsiderRegion(M.x2+1,Y1,X2,Y2,Z1,nz2)
|
|
if(.) return
|
|
if(M.y1>=Y1+y2)
|
|
.=ConsiderRegion(X1,Y1,X2,M.y1-1,Z1,nz2)
|
|
if(.) return
|
|
else if(M.y2<=Y2-y2)
|
|
.=ConsiderRegion(X1,M.y2+1,X2,Y2,Z1,nz2)
|
|
if(.) return
|
|
nextz=nextz?min(nextz,M.z2+1):(M.z2+1)
|
|
if(!M)
|
|
/* If nextz is not 0, then at some point there was an overlap that
|
|
could not be resolved by using an area to the side */
|
|
if(nextz) Z1=nextz
|
|
if(!nextz || (Z2 && Z2-Z1+1<z2))
|
|
return (!Z2 || Z2-Z1+1>=z2)?list(X1,Y1,Z1):null
|
|
X1=1;X2=world.maxx
|
|
Y1=1;Y2=world.maxy
|
|
|
|
proc/CutXYZ()
|
|
var/mx=swapmaps_compiled_maxx
|
|
var/my=swapmaps_compiled_maxy
|
|
var/mz=swapmaps_compiled_maxz
|
|
for(var/swapmap/M in swapmaps_loaded) // may not include src
|
|
mx=max(mx,M.x2)
|
|
my=max(my,M.y2)
|
|
mz=max(mz,M.z2)
|
|
world.maxx=mx
|
|
world.maxy=my
|
|
world.maxz=mz
|
|
|
|
// save and delete
|
|
proc/Unload()
|
|
Save()
|
|
del(src)
|
|
|
|
proc/Save()
|
|
if(id==src) return 0
|
|
var/savefile/S=mode?(new):new("map_[id].sav")
|
|
S << src
|
|
while(locked) sleep(1)
|
|
if(mode)
|
|
fdel("map_[id].txt")
|
|
S.ExportText("/","map_[id].txt")
|
|
return 1
|
|
|
|
// this will not delete existing savefiles for this map
|
|
proc/SetID(newid)
|
|
swapmaps_byname-=id
|
|
id=newid
|
|
swapmaps_byname[id]=src
|
|
|
|
proc/AllTurfs(z)
|
|
if(isnum(z) && (z<z1 || z>z2)) return null
|
|
return block(LoCorner(z),HiCorner(z))
|
|
|
|
// this could be safely called for an obj or mob as well, but
|
|
// probably not an area
|
|
proc/Contains(turf/T)
|
|
return (T && T.x>=x1 && T.x<=x2\
|
|
&& T.y>=y1 && T.y<=y2\
|
|
&& T.z>=z1 && T.z<=z2)
|
|
|
|
proc/InUse()
|
|
for(var/turf/T in AllTurfs())
|
|
for(var/mob/M in T) if(M.key) return 1
|
|
|
|
proc/LoCorner(z=z1)
|
|
return locate(x1,y1,z)
|
|
proc/HiCorner(z=z2)
|
|
return locate(x2,y2,z)
|
|
|
|
/*
|
|
Build procs: Take 2 turfs as corners, plus an item type.
|
|
An item may be like:
|
|
|
|
/turf/wall
|
|
/obj/fence{icon_state="iron"}
|
|
*/
|
|
proc/BuildFilledRectangle(turf/T1,turf/T2,item)
|
|
if(!Contains(T1) || !Contains(T2)) return
|
|
var/turf/T=T1
|
|
// pick new corners in a block()-friendly form
|
|
T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z))
|
|
T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z))
|
|
for(T in block(T1,T2)) new item(T)
|
|
|
|
proc/BuildRectangle(turf/T1,turf/T2,item)
|
|
if(!Contains(T1) || !Contains(T2)) return
|
|
var/turf/T=T1
|
|
// pick new corners in a block()-friendly form
|
|
T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z))
|
|
T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z))
|
|
if(T2.x-T1.x<2 || T2.y-T1.y<2) BuildFilledRectangle(T1,T2,item)
|
|
else
|
|
//for(T in block(T1,T2)-block(locate(T1.x+1,T1.y+1,T1.z),locate(T2.x-1,T2.y-1,T2.z)))
|
|
for(T in block(T1,locate(T2.x,T1.y,T2.z))) new item(T)
|
|
for(T in block(locate(T1.x,T2.y,T1.z),T2)) new item(T)
|
|
for(T in block(locate(T1.x,T1.y+1,T1.z),locate(T1.x,T2.y-1,T2.z))) new item(T)
|
|
for(T in block(locate(T2.x,T1.y+1,T1.z),locate(T2.x,T2.y-1,T2.z))) new item(T)
|
|
|
|
/*
|
|
Supplementary build proc: Takes a list of turfs, plus an item
|
|
type. Actually the list doesn't have to be just turfs.
|
|
*/
|
|
proc/BuildInTurfs(list/turfs,item)
|
|
for(var/T in turfs) new item(T)
|
|
|
|
atom
|
|
Write(savefile/S)
|
|
for(var/V in vars-"x"-"y"-"z"-"contents"-"icon"-"overlays"-"underlays")
|
|
if(issaved(vars[V]))
|
|
if(vars[V]!=initial(vars[V])) S[V]<<vars[V]
|
|
else S.dir.Remove(V)
|
|
if(icon!=initial(icon))
|
|
if(swapmaps_iconcache && swapmaps_iconcache[icon])
|
|
S["icon"]<<swapmaps_iconcache[icon]
|
|
else S["icon"]<<icon
|
|
// do not save mobs with keys; do save other mobs
|
|
var/mob/M
|
|
for(M in src) if(M.key) break
|
|
if(overlays.len) S["overlays"]<<overlays
|
|
if(underlays.len) S["underlays"]<<underlays
|
|
if(contents.len && !isarea(src))
|
|
var/list/l=contents
|
|
if(M)
|
|
l=l.Copy()
|
|
for(M in src) if(M.key) l-=M
|
|
if(l.len) S["contents"]<<l
|
|
if(l!=contents) del(l)
|
|
Read(savefile/S)
|
|
var/list/l
|
|
if(contents.len) l=contents
|
|
..()
|
|
// if the icon was a text string, it would not have loaded properly
|
|
// replace it from the cache list
|
|
if(!icon && ("icon" in S.dir))
|
|
var/ic
|
|
S["icon"]>>ic
|
|
if(istext(ic)) icon=swapmaps_iconcache[ic]
|
|
if(l && contents!=l)
|
|
contents+=l
|
|
del(l)
|
|
|
|
|
|
// set this up (at runtime) as follows:
|
|
// list(\
|
|
// 'player.dmi'="player",\
|
|
// 'monster.dmi'="monster",\
|
|
// ...
|
|
// 'item.dmi'="item")
|
|
var/list/swapmaps_iconcache
|
|
|
|
// preferred mode; sav or text
|
|
var/const/SWAPMAPS_SAV=0
|
|
var/const/SWAPMAPS_TEXT=1
|
|
var/swapmaps_mode=SWAPMAPS_SAV
|
|
|
|
var/swapmaps_compiled_maxx
|
|
var/swapmaps_compiled_maxy
|
|
var/swapmaps_compiled_maxz
|
|
var/swapmaps_initialized
|
|
var/swapmaps_loaded
|
|
var/swapmaps_byname
|
|
|
|
proc/InitializeSwapMaps()
|
|
if(swapmaps_initialized) return
|
|
swapmaps_initialized=1
|
|
swapmaps_compiled_maxx=world.maxx
|
|
swapmaps_compiled_maxy=world.maxy
|
|
swapmaps_compiled_maxz=world.maxz
|
|
swapmaps_loaded=list()
|
|
swapmaps_byname=list()
|
|
if(swapmaps_iconcache)
|
|
for(var/V in swapmaps_iconcache)
|
|
// reverse-associate everything
|
|
// so you can look up an icon file by name or vice-versa
|
|
swapmaps_iconcache[swapmaps_iconcache[V]]=V
|
|
|
|
proc/SwapMaps_AddIconToCache(name,icon)
|
|
if(!swapmaps_iconcache) swapmaps_iconcache=list()
|
|
swapmaps_iconcache[name]=icon
|
|
swapmaps_iconcache[icon]=name
|
|
|
|
proc/SwapMaps_Find(id)
|
|
InitializeSwapMaps()
|
|
return swapmaps_byname[id]
|
|
|
|
proc/SwapMaps_Load(id)
|
|
InitializeSwapMaps()
|
|
var/swapmap/M=swapmaps_byname[id]
|
|
if(!M)
|
|
var/savefile/S
|
|
var/text=0
|
|
if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt"))
|
|
text=1
|
|
else if(fexists("map_[id].sav"))
|
|
S=new("map_[id].sav")
|
|
else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt"))
|
|
text=1
|
|
else return // no file found
|
|
if(text)
|
|
S=new
|
|
S.ImportText("/",file("map_[id].txt"))
|
|
S >> M
|
|
while(M.locked) sleep(1)
|
|
M.mode=text
|
|
return M
|
|
|
|
proc/SwapMaps_Save(id)
|
|
InitializeSwapMaps()
|
|
var/swapmap/M=swapmaps_byname[id]
|
|
if(M) M.Save()
|
|
return M
|
|
|
|
proc/SwapMaps_Save_All()
|
|
InitializeSwapMaps()
|
|
for(var/swapmap/M in swapmaps_loaded)
|
|
if(M) M.Save()
|
|
|
|
proc/SwapMaps_Unload(id)
|
|
InitializeSwapMaps()
|
|
var/swapmap/M=swapmaps_byname[id]
|
|
if(!M) return // return silently from an error
|
|
M.Unload()
|
|
return 1
|
|
|
|
proc/SwapMaps_DeleteFile(id)
|
|
fdel("map_[id].sav")
|
|
fdel("map_[id].txt")
|
|
|
|
proc/SwapMaps_CreateFromTemplate(template_id)
|
|
var/swapmap/M=new
|
|
var/savefile/S
|
|
var/text=0
|
|
if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[template_id].txt"))
|
|
text=1
|
|
else if(fexists("map_[template_id].sav"))
|
|
S=new("map_[template_id].sav")
|
|
else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[template_id].txt"))
|
|
text=1
|
|
else
|
|
world.log << "SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found."
|
|
return
|
|
if(text)
|
|
S=new
|
|
S.ImportText("/",file("map_[template_id].txt"))
|
|
/*
|
|
This hacky workaround is needed because S >> M will create a brand new
|
|
M to fill with data. There's no way to control the Read() process
|
|
properly otherwise. The //.0 path should always match the map, however.
|
|
*/
|
|
S.cd="//.0"
|
|
M.Read(S,M)
|
|
M.mode=text
|
|
while(M.locked) sleep(1)
|
|
return M
|
|
|
|
proc/SwapMaps_LoadChunk(chunk_id,turf/locorner)
|
|
var/swapmap/M=new
|
|
var/savefile/S
|
|
var/text=0
|
|
if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[chunk_id].txt"))
|
|
text=1
|
|
else if(fexists("map_[chunk_id].sav"))
|
|
S=new("map_[chunk_id].sav")
|
|
else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[chunk_id].txt"))
|
|
text=1
|
|
else
|
|
world.log << "SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found."
|
|
return
|
|
if(text)
|
|
S=new
|
|
S.ImportText("/",file("map_[chunk_id].txt"))
|
|
/*
|
|
This hacky workaround is needed because S >> M will create a brand new
|
|
M to fill with data. There's no way to control the Read() process
|
|
properly otherwise. The //.0 path should always match the map, however.
|
|
*/
|
|
S.cd="//.0"
|
|
M.Read(S,M,locorner)
|
|
while(M.locked) sleep(1)
|
|
del(M)
|
|
return 1
|
|
|
|
proc/SwapMaps_SaveChunk(chunk_id,turf/corner1,turf/corner2)
|
|
if(!corner1 || !corner2)
|
|
world.log << "SwapMaps error in SwapMaps_SaveChunk():"
|
|
if(!corner1) world.log << " corner1 turf is null"
|
|
if(!corner2) world.log << " corner2 turf is null"
|
|
return
|
|
var/swapmap/M=new
|
|
M.id=chunk_id
|
|
M.ischunk=1 // this is a chunk
|
|
M.x1=min(corner1.x,corner2.x)
|
|
M.y1=min(corner1.y,corner2.y)
|
|
M.z1=min(corner1.z,corner2.z)
|
|
M.x2=max(corner1.x,corner2.x)
|
|
M.y2=max(corner1.y,corner2.y)
|
|
M.z2=max(corner1.z,corner2.z)
|
|
M.mode=swapmaps_mode
|
|
M.Save()
|
|
while(M.locked) sleep(1)
|
|
del(M)
|
|
return 1
|
|
|
|
proc/SwapMaps_GetSize(id)
|
|
var/savefile/S
|
|
var/text=0
|
|
if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt"))
|
|
text=1
|
|
else if(fexists("map_[id].sav"))
|
|
S=new("map_[id].sav")
|
|
else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt"))
|
|
text=1
|
|
else
|
|
world.log << "SwapMaps error in SwapMaps_GetSize(): map_[id] file not found."
|
|
return
|
|
if(text)
|
|
S=new
|
|
S.ImportText("/",file("map_[id].txt"))
|
|
/*
|
|
The //.0 path should always be the map. There's no other way to
|
|
read this data.
|
|
*/
|
|
S.cd="//.0"
|
|
var/x
|
|
var/y
|
|
var/z
|
|
S["x"] >> x
|
|
S["y"] >> y
|
|
S["z"] >> z
|
|
return list(x,y,z)
|