diff --git a/aurorastation.dme b/aurorastation.dme index b43bbe0cf10..adf14b0d9bf 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -54,6 +54,7 @@ #include "code\__defines\modular_guns.dm" #include "code\__defines\obj.dm" #include "code\__defines\overmap.dm" +#include "code\__defines\projectiles.dm" #include "code\__defines\psi.dm" #include "code\__defines\qdel.dm" #include "code\__defines\radio.dm" @@ -598,7 +599,6 @@ #include "code\game\gamemodes\technomancer\spells\abjuration.dm" #include "code\game\gamemodes\technomancer\spells\apportation.dm" #include "code\game\gamemodes\technomancer\spells\audible_deception.dm" -#include "code\game\gamemodes\technomancer\spells\blink.dm" #include "code\game\gamemodes\technomancer\spells\chroma.dm" #include "code\game\gamemodes\technomancer\spells\condensation.dm" #include "code\game\gamemodes\technomancer\spells\dispel.dm" @@ -1009,7 +1009,6 @@ #include "code\game\objects\items\weapons\vaurca_items.dm" #include "code\game\objects\items\weapons\weaponry.dm" #include "code\game\objects\items\weapons\circuitboards\_defines.dm" -#include "code\game\objects\items\weapons\circuitboards\broken.dm" #include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" #include "code\game\objects\items\weapons\circuitboards\mecha.dm" #include "code\game\objects\items\weapons\circuitboards\rig.dm" @@ -1173,6 +1172,7 @@ #include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" #include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" #include "code\game\objects\structures\vr\_remote_chair.dm" +#include "code\game\objects\structures\vr\human_chair.dm" #include "code\game\objects\structures\vr\mech_chair.dm" #include "code\game\objects\structures\vr\robot_chair.dm" #include "code\game\turfs\simulated.dm" @@ -1185,6 +1185,7 @@ #include "code\game\turfs\flooring\flooring_premade.dm" #include "code\game\turfs\initialization\init.dm" #include "code\game\turfs\initialization\maintenance.dm" +#include "code\game\turfs\simulated\abyss.dm" #include "code\game\turfs\simulated\floor.dm" #include "code\game\turfs\simulated\floor_acts.dm" #include "code\game\turfs\simulated\floor_attackby.dm" @@ -2130,6 +2131,7 @@ #include "code\modules\mob\living\carbon\human\stripping.dm" #include "code\modules\mob\living\carbon\human\unarmed_attack.dm" #include "code\modules\mob\living\carbon\human\update_icons.dm" +#include "code\modules\mob\living\carbon\human\virtual_reality_mob.dm" #include "code\modules\mob\living\carbon\human\whisper.dm" #include "code\modules\mob\living\carbon\human\species\species.dm" #include "code\modules\mob\living\carbon\human\species\species_attack.dm" @@ -2272,6 +2274,7 @@ #include "code\modules\mob\living\simple_animal\friendly\mushroom.dm" #include "code\modules\mob\living\simple_animal\friendly\rat.dm" #include "code\modules\mob\living\simple_animal\friendly\ratking.dm" +#include "code\modules\mob\living\simple_animal\friendly\schlorrgo.dm" #include "code\modules\mob\living\simple_animal\friendly\slime.dm" #include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" #include "code\modules\mob\living\simple_animal\friendly\tomato.dm" @@ -2506,6 +2509,7 @@ #include "code\modules\paperwork\filingcabinet.dm" #include "code\modules\paperwork\folders.dm" #include "code\modules\paperwork\handlabeler.dm" +#include "code\modules\paperwork\journal.dm" #include "code\modules\paperwork\paper.dm" #include "code\modules\paperwork\paper_bundle.dm" #include "code\modules\paperwork\paperbin.dm" diff --git a/code/__defines/projectiles.dm b/code/__defines/projectiles.dm new file mode 100644 index 00000000000..67bcfecb143 --- /dev/null +++ b/code/__defines/projectiles.dm @@ -0,0 +1,23 @@ +// IFF values +#define IFF_DEFAULT "station" +#define IFF_TCFL "tcfl" +#define IFF_SYNDICATE "syndicate" +#define IFF_MERCENARY "mercenary" +#define IFF_RAIDER "raider" +#define IFF_LONER "loner" +#define IFF_BURGLAR "burglar" +#define IFF_CULTIST "cultist" +#define IFF_BLUESPACE "bluespace" +#define IFF_DEATHSQUAD "deathsquad" +#define IFF_ERIDANI "eridani" +#define IFF_HEPH "hephaestus" +#define IFF_ZENGHU "zenghu" +#define IFF_ZAVOD "zavodskoi" +#define IFF_EE "einstein" +#define IFF_FSF "freesolarianfleets" +#define IFF_IAC "interstellaraidcorps" +#define IFF_KATAPHRACT "kataphract" +#define IFF_FREELANCER "freelancer" +#define IFF_LANCER "lancer" +#define IFF_SOL "solarian" +#define IFF_HIGHLANDER "highlander" \ No newline at end of file diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index ca67b236df0..a1062730e8c 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -542,6 +542,7 @@ t = replacetext(t, "\[flag_dpra\]", "") t = replacetext(t, "\[flag_nka\]", "") t = replacetext(t, "\[flag_izweski\]", "") + t = replacetext(t, "\[logo_golden\]", "") t = replacetext(t, "\[barcode\]", "") t = replacetext(t, "\[time\]", "[worldtime2text()]") t = replacetext(t, "\[date\]", "[worlddate2text()]") @@ -585,6 +586,7 @@ t = replacetext(t, "", "\[flag_dpra\]") t = replacetext(t, "", "\[flag_nka\]") t = replacetext(t, "", "\[flag_izweski\]") + t = replacetext(t, "", "\[logo_golden\]") return t diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 53475537fd0..e2c9b339d59 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -148,7 +148,7 @@ return 1 /obj/machinery/turretid/AICtrlClick() //turns off/on Turrets - Topic(src, list("command"="enable", "value"="[!enabled]")) + Topic(src, list("turret_ref" = "this", "command"="enable", "value"="[!enabled]")) return 1 /atom/proc/AIAltClick(var/atom/A) @@ -164,7 +164,7 @@ return 1 /obj/machinery/turretid/AIAltClick() //toggles lethal on turrets - Topic(src, list("command"="lethal", "value"="[!lethal]")) + Topic(src, list("turret_ref" = "this", "command"="lethal", "value"="[!lethal]")) return 1 /atom/proc/AIMiddleClick(var/mob/living/silicon/user) diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index 57599be68d2..f9d7c855619 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -238,6 +238,10 @@ check_flags = AB_CHECK_STUNNED|AB_CHECK_ALIVE|AB_CHECK_INSIDE button_icon_state = "night_eyes" +/datum/action/item_action/organ/night_eyes/rev + check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE + button_icon_state = "rev_eyes" + #undef AB_WEST_OFFSET #undef AB_NORTH_OFFSET #undef AB_MAX_COLUMNS diff --git a/code/controllers/subsystems/economy.dm b/code/controllers/subsystems/economy.dm index 8ab96ca86e9..d59b7b1d0df 100644 --- a/code/controllers/subsystems/economy.dm +++ b/code/controllers/subsystems/economy.dm @@ -49,6 +49,8 @@ var/datum/controller/subsystem/economy/SSeconomy station_account.owner_name = "[station_name()] Station Account" station_account.account_number = next_account_number next_account_number += rand(1,500) + if(next_account_number > 999999) //If we're hitting 7 digits, reset to the minimum and increase from there. + next_account_number = 111111 + rand(1,500) station_account.remote_access_pin = rand(1111, 111111) station_account.money = 75000 diff --git a/code/controllers/subsystems/garbage-debug.dm b/code/controllers/subsystems/garbage-debug.dm index 64e88438830..22e6d709358 100644 --- a/code/controllers/subsystems/garbage-debug.dm +++ b/code/controllers/subsystems/garbage-debug.dm @@ -640,7 +640,6 @@ SearchVar(rod_recipes) SearchVar(NO_EMAG_ACT) SearchVar(last_chew) - SearchVar(hazard_overlays) SearchVar(tape_roll_applications) SearchVar(malftransformermade) SearchVar(MIN_ACTIVE_TIME) diff --git a/code/controllers/subsystems/virtual_reality.dm b/code/controllers/subsystems/virtual_reality.dm index 34accf74360..8b1d0b2795a 100644 --- a/code/controllers/subsystems/virtual_reality.dm +++ b/code/controllers/subsystems/virtual_reality.dm @@ -103,6 +103,20 @@ to_chat(src, SPAN_DANGER("Interface error, you cannot exit the system at this time.")) to_chat(src, SPAN_WARNING("Ahelp to get back into your body, a bug has occurred.")) +/mob/living/carbon/human/virtual_reality/body_return() + set name = "Return to Body" + set category = "IC" + + if(old_mob) + ckey_transfer(old_mob) + languages = list(all_languages[LANGUAGE_TCB]) + to_chat(old_mob, SPAN_NOTICE("System exited safely, we hope you enjoyed your stay.")) + old_mob = null + qdel(src) + else + to_chat(src, SPAN_DANGER("Interface error, you cannot exit the system at this time.")) + to_chat(src, SPAN_WARNING("Ahelp to get back into your body, a bug has occurred.")) + /mob/living/proc/vr_mob_exit_languages() languages = list(all_languages[LANGUAGE_TCB]) @@ -241,4 +255,20 @@ if(!choice) return - mind_transfer(user, bound[choice]) \ No newline at end of file + mind_transfer(user, bound[choice]) + +/datum/controller/subsystem/virtualreality/proc/create_virtual_reality_avatar(var/mob/living/carbon/human/user) + if(virtual_reality_spawn.len) + var/mob/living/carbon/human/virtual_reality/H = new /mob/living/carbon/human/virtual_reality(pick(virtual_reality_spawn)) + H.set_species(user.species.name, 1) + + H.gender = user.gender + H.dna = user.dna.Clone() + H.real_name = user.real_name + H.UpdateAppearance() + + H.preEquipOutfit(/datum/outfit/admin/virtual_reality, FALSE) + H.equipOutfit(/datum/outfit/admin/virtual_reality, FALSE) + + mind_transfer(user, H) + to_chat(H, SPAN_NOTICE("You are now in control of a virtual reality body. Dying will return you to your original body.")) \ No newline at end of file diff --git a/code/datums/outfits/ert/ap_eridani.dm b/code/datums/outfits/ert/ap_eridani.dm index d80f7da7cd8..0166f637bb7 100644 --- a/code/datums/outfits/ert/ap_eridani.dm +++ b/code/datums/outfits/ert/ap_eridani.dm @@ -28,7 +28,7 @@ ) belt_contents = list( - /obj/item/ammo_magazine/c45x = 3, + /obj/item/ammo_magazine/c45m/auto = 3, /obj/item/device/flash = 1, /obj/item/handcuffs/ziptie = 1, /obj/item/melee/baton/stunrod = 1, @@ -37,6 +37,8 @@ /obj/item/grenade/flashbang = 1 ) + id_iff = IFF_ERIDANI + /datum/outfit/admin/ert/ap_eridani/get_id_access() return get_distress_access() @@ -71,7 +73,7 @@ backpack_contents = list() belt_contents = list( - /obj/item/ammo_magazine/c45x = 3, + /obj/item/ammo_magazine/c45m/auto = 3, /obj/item/device/flash = 1, /obj/item/handcuffs/ziptie = 1, /obj/item/melee/baton/stunrod = 1, diff --git a/code/datums/outfits/ert/deathsquad.dm b/code/datums/outfits/ert/deathsquad.dm index 01d0c44a1c5..920ca514f5d 100644 --- a/code/datums/outfits/ert/deathsquad.dm +++ b/code/datums/outfits/ert/deathsquad.dm @@ -25,6 +25,8 @@ var/syndie = FALSE + id_iff = IFF_DEATHSQUAD + /datum/outfit/admin/deathsquad/leader name = "Asset Protection Lead" diff --git a/code/datums/outfits/ert/fsf.dm b/code/datums/outfits/ert/fsf.dm index 2ee8cddb3b4..1b98773b6ef 100644 --- a/code/datums/outfits/ert/fsf.dm +++ b/code/datums/outfits/ert/fsf.dm @@ -28,6 +28,8 @@ accessory = /obj/item/clothing/accessory/holster/hip/brown accessory_contents = list(/obj/item/gun/projectile/pistol/sol = 1) + id_iff = IFF_FSF + /datum/outfit/admin/ert/fsf/get_id_access() return get_distress_access_lesser() diff --git a/code/datums/outfits/ert/iac.dm b/code/datums/outfits/ert/iac.dm index 01392b2172b..ea8088cf035 100644 --- a/code/datums/outfits/ert/iac.dm +++ b/code/datums/outfits/ert/iac.dm @@ -36,6 +36,8 @@ /obj/item/reagent_containers/glass/bottle/perconol = 1 ) + id_iff = IFF_IAC + /datum/outfit/admin/ert/iac/get_id_access() return get_distress_access() @@ -76,7 +78,7 @@ ) belt_contents = list( - /obj/item/ammo_magazine/c45x = 3, + /obj/item/ammo_magazine/c45m/auto = 3, /obj/item/device/flash = 1, /obj/item/handcuffs/ziptie = 2, /obj/item/melee/baton/loaded = 1, diff --git a/code/datums/outfits/ert/kataphract.dm b/code/datums/outfits/ert/kataphract.dm index 75d1c3faad9..8b6ea07be69 100644 --- a/code/datums/outfits/ert/kataphract.dm +++ b/code/datums/outfits/ert/kataphract.dm @@ -26,6 +26,8 @@ /obj/item/storage/box/donkpockets = 1 ) + id_iff = IFF_KATAPHRACT + /datum/outfit/admin/ert/kataphract/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(H?.w_uniform) H.w_uniform.color = pick("#42b360", "#b68029", "#5574c2") diff --git a/code/datums/outfits/ert/mercenary.dm b/code/datums/outfits/ert/mercenary.dm index 7d2145bdd0d..e380a7aa3a8 100644 --- a/code/datums/outfits/ert/mercenary.dm +++ b/code/datums/outfits/ert/mercenary.dm @@ -32,6 +32,8 @@ /obj/item/material/knife/trench = 1 ) + id_iff = IFF_FREELANCER + /datum/outfit/admin/ert/mercenary/get_id_access() return get_distress_access_lesser() @@ -97,7 +99,7 @@ /datum/outfit/admin/ert/mercenary/leader name = "Mercenary Freelancer Leader" - l_hand = /obj/item/gun/projectile/automatic/rifle/sts35 + l_hand = /obj/item/gun/projectile/automatic/rifle/shorty r_hand = null back = /obj/item/rig/merc/distress suit_store = null diff --git a/code/datums/outfits/ert/syndicate.dm b/code/datums/outfits/ert/syndicate.dm index 24d5666e447..1204cb86ad7 100644 --- a/code/datums/outfits/ert/syndicate.dm +++ b/code/datums/outfits/ert/syndicate.dm @@ -6,7 +6,7 @@ mask = /obj/item/clothing/mask/gas/syndicate l_ear = /obj/item/device/radio/headset/syndicate glasses = /obj/item/clothing/glasses/thermal - id = /obj/item/card/id/syndicate_ert + id = /obj/item/card/id/syndicate/ert l_pocket = /obj/item/ammo_magazine/c45m l_hand = /obj/item/gun/projectile/automatic/rifle/sts35 @@ -22,6 +22,8 @@ syndie = TRUE + id_iff = IFF_SYNDICATE + /datum/outfit/admin/deathsquad/syndicate/leader name = "Syndicate Commando Lead" diff --git a/code/datums/outfits/ert/tcfl.dm b/code/datums/outfits/ert/tcfl.dm index 0756815fb7d..c06ee8d2674 100644 --- a/code/datums/outfits/ert/tcfl.dm +++ b/code/datums/outfits/ert/tcfl.dm @@ -12,6 +12,8 @@ backpack_contents = null + id_iff = IFF_TCFL + /datum/outfit/admin/ert/legion/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() if(isvaurca(H)) diff --git a/code/datums/outfits/event/outfit_events.dm b/code/datums/outfits/event/outfit_events.dm index d27093fb002..a04c11d2c16 100644 --- a/code/datums/outfits/event/outfit_events.dm +++ b/code/datums/outfits/event/outfit_events.dm @@ -35,6 +35,7 @@ ) id = /obj/item/card/id/syndicate + id_iff = IFF_LANCER var/id_access = "Lancer" /datum/outfit/admin/event/lance/post_equip(mob/living/carbon/human/H, visualsOnly) @@ -141,6 +142,8 @@ accessory = /obj/item/clothing/accessory/holster/hip/brown accessory_contents = list(/obj/item/gun/projectile/pistol/sol = 1) + id_iff = IFF_SOL + /datum/outfit/admin/event/sol_marine/heavy name = "Heavy Solarian Marine" diff --git a/code/datums/outfits/event/outfit_killers.dm b/code/datums/outfits/event/outfit_killers.dm index 32e8fa4dc0a..fd1dc9ee9ff 100644 --- a/code/datums/outfits/event/outfit_killers.dm +++ b/code/datums/outfits/event/outfit_killers.dm @@ -33,6 +33,7 @@ r_pocket = /obj/item/cloaking_device id = /obj/item/card/id/syndicate pda = /obj/item/modular_computer/handheld/pda/command + id_iff = IFF_SYNDICATE /datum/outfit/admin/killer/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) var/obj/item/storage/secure/briefcase/sec_briefcase = new(H) diff --git a/code/datums/outfits/event/outfit_megacorps.dm b/code/datums/outfits/event/outfit_megacorps.dm index de25a5251da..0fc138e60fe 100644 --- a/code/datums/outfits/event/outfit_megacorps.dm +++ b/code/datums/outfits/event/outfit_megacorps.dm @@ -26,6 +26,7 @@ /obj/item/melee/baton/loaded = 1, /obj/item/grenade/flashbang = 2 ) + id_iff = IFF_HEPH /datum/outfit/admin/megacorp/hephaestus_trooper/heavy name = "Hephaestus Heavy Asset Protection" @@ -68,6 +69,7 @@ /obj/item/melee/baton/loaded = 1, /obj/item/grenade/flashbang = 2 ) + id_iff = IFF_ZENGHU /datum/outfit/admin/megacorp/zenghu_trooper/heavy name = "Zeng Hu Pharmaceuticals Heavy Asset Protection" @@ -111,6 +113,7 @@ /obj/item/ammo_magazine/mc9mmt = 2, /obj/item/ammo_magazine/mc9mm = 3 ) + id_iff = IFF_ZAVOD /datum/outfit/admin/megacorp/zavodskoi_trooper/heavy name = "Zavodskoi Interstellar Heavy Asset Protection" @@ -152,4 +155,5 @@ /obj/item/grenade/flashbang = 2, /obj/item/handcuffs = 2, /obj/item/grenade/frag = 1 - ) \ No newline at end of file + ) + id_iff = IFF_EE \ No newline at end of file diff --git a/code/datums/outfits/event/outfit_nanotrasen.dm b/code/datums/outfits/event/outfit_nanotrasen.dm index 405209d71c6..72b7f0ad1af 100644 --- a/code/datums/outfits/event/outfit_nanotrasen.dm +++ b/code/datums/outfits/event/outfit_nanotrasen.dm @@ -149,7 +149,7 @@ /obj/item/melee/baton/loaded = 1, /obj/item/grenade/chem_grenade/gas = 1, /obj/item/device/flash = 1, - /obj/item/ammo_magazine/c45x = 2 + /obj/item/ammo_magazine/c45m/auto = 2 ) implants = list( diff --git a/code/datums/outfits/event/outfit_tfcl.dm b/code/datums/outfits/event/outfit_tfcl.dm index 6ef08373a29..c07762a6610 100644 --- a/code/datums/outfits/event/outfit_tfcl.dm +++ b/code/datums/outfits/event/outfit_tfcl.dm @@ -23,6 +23,8 @@ /obj/item/ammo_magazine/a454 = 2, /obj/item/shield/energy/legion = 1 ) + + id_iff = IFF_TCFL var/id_access = "NanoTrasen Representative" /datum/outfit/admin/tcfl/get_id_access() diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 969410554b7..a43a73b5172 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -103,6 +103,8 @@ var/double_headset = /obj/item/device/radio/headset/alt/double var/wrist_radio = /obj/item/device/radio/headset/wrist + var/id_iff = IFF_DEFAULT // when spawning in, the ID will be set to this iff, preventing friendly fire + var/internals_slot = null //ID of slot containing a gas tank var/list/backpack_contents = list() //In the list(path=count,otherpath=count) format var/list/accessory_contents = list() diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index ee23dea4120..eff7d776b51 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -91,3 +91,14 @@ /datum/outfit/admin/random/visitor/get_id_rank() return "Visitor" + +/datum/outfit/admin/virtual_reality + name = "Virtual Reality Outfit" + uniform = /obj/item/clothing/under/chameleon + suit = /obj/item/clothing/suit/chameleon + back = /obj/item/storage/backpack/chameleon + gloves = /obj/item/clothing/gloves/chameleon + shoes = /obj/item/clothing/shoes/chameleon + head = /obj/item/clothing/head/chameleon + mask = /obj/item/clothing/mask/chameleon + glasses = /obj/item/clothing/glasses/chameleon diff --git a/code/datums/outfits/outfit_antag.dm b/code/datums/outfits/outfit_antag.dm index ad03bc9ecd9..d74fd78a2df 100644 --- a/code/datums/outfits/outfit_antag.dm +++ b/code/datums/outfits/outfit_antag.dm @@ -25,6 +25,8 @@ /obj/item/device/multitool = 1 ) + id_iff = IFF_SYNDICATE + var/id_access = "Syndicate Operative" var/uplink_uses = DEFAULT_TELECRYSTAL_AMOUNT @@ -60,7 +62,7 @@ /obj/item/storage/box/engineer = 1, /obj/item/reagent_containers/pill/cyanide = 1, /obj/item/gun/projectile/automatic/x9 = 1, - /obj/item/ammo_magazine/c45x = 1, + /obj/item/ammo_magazine/c45m/auto = 1, /obj/item/crowbar/red = 1, /obj/item/plastique = 1, /obj/item/reagent_containers/food/snacks/donkpocket/sinpocket = 1, @@ -155,6 +157,8 @@ /obj/item/reagent_containers/pill/cyanide = 1 ) + id_iff = IFF_MERCENARY + /datum/outfit/admin/syndicate/mercenary/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() if(visualsOnly) @@ -176,6 +180,7 @@ /obj/item/device/multitool/hacktool = 1 ) + id_iff = IFF_LONER id_access = "Lone Operative" /datum/outfit/admin/syndicate/raider @@ -318,7 +323,9 @@ /obj/item/clothing/glasses/thermal, /obj/item/clothing/glasses/thermal/aviator ) + id = /obj/item/storage/wallet/random + id_iff = IFF_RAIDER accessory = /obj/item/clothing/accessory/storage/webbing @@ -418,6 +425,8 @@ backpack_contents = list() + id_iff = IFF_BURGLAR + /datum/outfit/admin/syndicate/burglar/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() if(visualsOnly) @@ -428,6 +437,7 @@ /obj/item/gun/energy/retro, /obj/item/gun/projectile/silenced, /obj/item/gun/projectile/colt, + /obj/item/gun/projectile/colt/super, /obj/item/gun/projectile/revolver/deckard, /obj/item/gun/projectile/revolver/lemat ) @@ -487,6 +497,7 @@ l_pocket = /obj/item/pinpointer id = /obj/item/card/id/highlander + id_iff = IFF_HIGHLANDER /datum/outfit/admin/highlander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() @@ -516,6 +527,8 @@ r_hand = /obj/item/melee/cultblade + id_iff = IFF_CULTIST + /datum/outfit/admin/syndicate/cultist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) return @@ -546,6 +559,8 @@ accessory = /obj/item/clothing/accessory/storage/webbing backpack_contents = list() + id_iff = IFF_BLUESPACE + /datum/outfit/admin/syndicate/raider_techno/equip(mob/living/carbon/human/H, visualsOnly = FALSE) var/list/loadouts = list("Nature", "Techno", "Cobra", "Brawler", "Shimmer") if(H.gender in list(FEMALE, PLURAL, NEUTER)) @@ -616,6 +631,7 @@ allow_backbag_choice = FALSE l_ear = /obj/item/device/radio/headset/bluespace + id_iff = IFF_BLUESPACE /datum/outfit/admin/techomancer name = "Technomancer" @@ -633,6 +649,8 @@ l_pocket = /obj/item/technomancer_catalog id = /obj/item/card/id/bluespace + id_iff = IFF_BLUESPACE + var/id_assignment = "Technomagus" /datum/outfit/admin/techomancer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) diff --git a/code/datums/trading/goods.dm b/code/datums/trading/goods.dm index 8cf26499f84..5a874761022 100644 --- a/code/datums/trading/goods.dm +++ b/code/datums/trading/goods.dm @@ -83,7 +83,7 @@ /obj/item/circuitboard/telecomms = TRADER_BLACKLIST, /obj/item/circuitboard/unary_atmos = TRADER_BLACKLIST, /obj/item/circuitboard/arcade = TRADER_BLACKLIST, - /obj/item/circuitboard/broken = TRADER_BLACKLIST, + /obj/item/trash/broken_electronics = TRADER_BLACKLIST, /obj/item/storage/box/lights/colored = TRADER_SUBTYPES_ONLY, /obj/item/stack/cable_coil = TRADER_SUBTYPES_ONLY, /obj/item/stack/cable_coil/cyborg = TRADER_BLACKLIST, diff --git a/code/datums/trading/weaponry.dm b/code/datums/trading/weaponry.dm index 5adc72ba3f0..c9ceb895e6e 100644 --- a/code/datums/trading/weaponry.dm +++ b/code/datums/trading/weaponry.dm @@ -37,7 +37,7 @@ /obj/item/ammo_magazine/mc10mm/empty = TRADER_BLACKLIST, /obj/item/storage/box/ammo10mm = TRADER_THIS_TYPE, /obj/item/ammo_magazine/c38 = TRADER_ALL, - /obj/item/ammo_magazine/c45x = TRADER_THIS_TYPE, + /obj/item/ammo_magazine/c45m/auto = TRADER_THIS_TYPE, /obj/item/storage/box/beanbags = TRADER_THIS_TYPE, /obj/item/storage/box/shotgunammo = TRADER_THIS_TYPE, /obj/item/storage/box/shotgunshells = TRADER_THIS_TYPE, diff --git a/code/game/antagonist/outsider/commando.dm b/code/game/antagonist/outsider/commando.dm index a58c3322c70..43c67e6f202 100644 --- a/code/game/antagonist/outsider/commando.dm +++ b/code/game/antagonist/outsider/commando.dm @@ -7,7 +7,7 @@ var/datum/antagonist/deathsquad/mercenary/commandos role_text_plural = "Commandos" welcome_text = "You are in the employ of a criminal syndicate hostile to corporate interests." antag_sound = 'sound/effects/antag_notice/deathsquid_alert.ogg' - id_type = /obj/item/card/id/syndicate_ert + id_type = /obj/item/card/id/syndicate/ert flags = ANTAG_NO_ROUNDSTART_SPAWN faction = "syndicate" diff --git a/code/game/gamemodes/technomancer/devices/tesla_armor.dm b/code/game/gamemodes/technomancer/devices/tesla_armor.dm index 95fda406d08..9f74ce0368e 100644 --- a/code/game/gamemodes/technomancer/devices/tesla_armor.dm +++ b/code/game/gamemodes/technomancer/devices/tesla_armor.dm @@ -19,7 +19,7 @@ var/ready = 1 //Determines if the next attack will be blocked, as well if a strong lightning bolt is sent out at the attacker. var/ready_icon_state = "tesla_armor_1" //also wip var/normal_icon_state = "tesla_armor_0" - var/cooldown_to_charge = 15 SECONDS + var/cooldown_to_charge = 20 SECONDS /obj/item/clothing/suit/armor/tesla/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") //First, some retaliation. @@ -28,17 +28,17 @@ var/obj/item/projectile/P = damage_source if(P.firer && get_dist(user, P.firer) <= 3) if(ready) - shoot_lightning(P.firer, 40) + shoot_lightning(P.firer, 2000) else - shoot_lightning(P.firer, 15) + shoot_lightning(P.firer, 1000, /obj/item/projectile/beam/lightning/small) else if(attacker && attacker != user) if(get_dist(user, attacker) <= 3) //Anyone farther away than three tiles is too far to shoot lightning at. if(ready) - shoot_lightning(attacker, 40) + shoot_lightning(attacker, 2000) else - shoot_lightning(attacker, 15) + shoot_lightning(attacker, 1000, /obj/item/projectile/beam/lightning/small) //Deal with protecting our wearer now. if(ready) @@ -77,8 +77,8 @@ H.update_action_buttons() ..() -/obj/item/clothing/suit/armor/tesla/proc/shoot_lightning(mob/target, power) - var/obj/item/projectile/beam/lightning/lightning = new(get_turf(src)) +/obj/item/clothing/suit/armor/tesla/proc/shoot_lightning(mob/target, power, lightning_type = /obj/item/projectile/beam/lightning) + var/obj/item/projectile/beam/lightning/lightning = new lightning_type(get_turf(src)) lightning.power = power lightning.old_style_target(target) lightning.fire() diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm index caf48d062fa..3436ee96795 100644 --- a/code/game/gamemodes/technomancer/instability.dm +++ b/code/game/gamemodes/technomancer/instability.dm @@ -95,6 +95,36 @@ overlays.Remove(instability_flash) qdel(instability_flash) +/proc/safe_blink(atom/movable/AM, var/range = 3) + if(AM.anchored || !AM.loc) + return + var/list/targets = list() + + for(var/turf/simulated/T in range(AM, range)) + if(T.density || istype(T, /turf/simulated/mineral)) //Don't blink to vacuum or a wall + continue + for(var/atom/movable/stuff in T.contents) + if(stuff.density) + continue + targets.Add(T) + + if(!targets.len) + return + var/turf/simulated/destination = null + + destination = pick(targets) + + if(destination) + if(ismob(AM)) + var/mob/living/L = AM + if(L.buckled_to) + L.buckled_to.unbuckle() + spark(AM, 5, 2) + AM.forceMove(destination) + AM.visible_message("\The [AM] vanishes!") + to_chat(AM, "You suddenly appear somewhere else!") + return + /mob/living/silicon/instability_effects() if(instability) var/rng = 0 diff --git a/code/game/gamemodes/technomancer/spells/blink.dm b/code/game/gamemodes/technomancer/spells/blink.dm deleted file mode 100644 index aeab617a7f3..00000000000 --- a/code/game/gamemodes/technomancer/spells/blink.dm +++ /dev/null @@ -1,98 +0,0 @@ -/datum/technomancer/spell/blink - name = "Blink" - desc = "Force the target to teleport a short distance away. This target could be anything from something lying on the ground, \ - to someone trying to fight you, or even yourself. Using this on someone next to you makes their potential distance after \ - teleportation greater. Self casting has the greatest potential for distance, as well as the cheapest cost." - enhancement_desc = "Blink distance is increased greatly." - spell_power_desc = "Blink distance is scaled up with more spell power." - cost = 50 - obj_path = /obj/item/spell/blink - ability_icon_state = "tech_blink" - category = UTILITY_SPELLS - -/obj/item/spell/blink - name = "blink" - desc = "Teleports you or someone else a short distance away." - icon_state = "blink" - cast_methods = CAST_RANGED | CAST_MELEE | CAST_USE - aspect = ASPECT_TELE - -/proc/safe_blink(atom/movable/AM, var/range = 3) - if(AM.anchored || !AM.loc) - return - var/list/targets = list() - - for(var/turf/simulated/T in range(AM, range)) - if(T.density || istype(T, /turf/simulated/mineral)) //Don't blink to vacuum or a wall - continue - for(var/atom/movable/stuff in T.contents) - if(stuff.density) - continue - targets.Add(T) - - if(!targets.len) - return - var/turf/simulated/destination = null - - destination = pick(targets) - - if(destination) - if(ismob(AM)) - var/mob/living/L = AM - if(L.buckled_to) - L.buckled_to.unbuckle() - spark(AM, 5, 2) - AM.forceMove(destination) - AM.visible_message("\The [AM] vanishes!") - to_chat(AM, "You suddenly appear somewhere else!") - return - -/obj/item/spell/blink/on_ranged_cast(atom/hit_atom, mob/user) - if(istype(hit_atom, /atom/movable)) - var/atom/movable/AM = hit_atom - if(!within_range(AM)) - to_chat(user, "\The [AM] is too far away to blink.") - return - if(!allowed_to_teleport()) - to_chat(user, "Teleportation doesn't seem to work here.") - return - if(pay_energy(400)) - if(check_for_scepter()) - safe_blink(AM, calculate_spell_power(6)) - else - safe_blink(AM, calculate_spell_power(3)) - adjust_instability(3) - log_and_message_admins("has blinked [AM] away.") - else - to_chat(user, "You need more energy to blink [AM] away!") - -/obj/item/spell/blink/on_use_cast(mob/user) - if(!allowed_to_teleport()) - to_chat(user, "Teleportation doesn't seem to work here.") - return - if(pay_energy(200)) - if(check_for_scepter()) - safe_blink(user, calculate_spell_power(10)) - else - safe_blink(user, calculate_spell_power(6)) - adjust_instability(1) - log_and_message_admins("has blinked themselves away.") - else - to_chat(user, "You need more energy to blink yourself away!") - -/obj/item/spell/blink/on_melee_cast(atom/hit_atom, mob/living/user, def_zone) - if(istype(hit_atom, /atom/movable)) - var/atom/movable/AM = hit_atom - if(!allowed_to_teleport()) - to_chat(user, "Teleportation doesn't seem to work here.") - return - if(pay_energy(300)) - visible_message("\The [user] reaches out towards \the [AM] with a glowing hand.") - if(check_for_scepter()) - safe_blink(AM, 10) - else - safe_blink(AM, 6) - adjust_instability(2) - log_and_message_admins("has blinked [AM] away.") - else - to_chat(user, "You need more energy to blink [AM] away!") \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/projectile/lightning.dm b/code/game/gamemodes/technomancer/spells/projectile/lightning.dm index a9252bf1091..8a526492d11 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/lightning.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/lightning.dm @@ -24,8 +24,8 @@ /obj/item/projectile/beam/lightning name = "lightning" icon_state = "lightning" - damage = 40 - armor_penetration = 10 + damage = 25 + armor_penetration = 25 damage_type = BURN muzzle_type = /obj/effect/projectile/muzzle/tesla @@ -34,6 +34,14 @@ var/power = 6000 +/obj/item/projectile/beam/lightning/small + name = "shock" + damage = 15 + armor_penetration = 15 + + power = 1000 + + /obj/item/projectile/beam/lightning/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier=0) ..() tesla_zap(target_mob, 3, power) diff --git a/code/game/gamemodes/technomancer/technomancer.dm b/code/game/gamemodes/technomancer/technomancer.dm index f718f133b7a..9be0d0f0e81 100644 --- a/code/game/gamemodes/technomancer/technomancer.dm +++ b/code/game/gamemodes/technomancer/technomancer.dm @@ -7,6 +7,7 @@ their powers can be used for good or if their arrival foreshadows the destruction of the entire colony, or worse." config_tag = "technomancer" votable = 1 + max_players = 15 required_players = 5 required_enemies = 1 end_on_antag_death = 0 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 519f2ad27d0..601911c7461 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -246,13 +246,8 @@ jobtype = /datum/job/med_tech uniform = /obj/item/clothing/under/rank/medical/first_responder - suit = /obj/item/clothing/suit/storage/toggle/first_responder_jacket shoes = /obj/item/clothing/shoes/jackboots id = /obj/item/card/id/white - head = /obj/item/clothing/head/hardhat/first_responder - l_hand = /obj/item/storage/firstaid/adv - r_hand = /obj/item/reagent_containers/hypospray - belt = /obj/item/storage/belt/medical/first_responder headset = /obj/item/device/radio/headset/headset_med bowman = /obj/item/device/radio/headset/headset_med/alt @@ -268,6 +263,10 @@ dufflebag = /obj/item/storage/backpack/duffel/med messengerbag = /obj/item/storage/backpack/messenger/med + backpack_contents = list( + /obj/item/storage/firstaid/adv = 1 + ) + /datum/job/intern_med title = "Medical Intern" flag = INTERN_MED diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 439c0702e5a..7dc007c011c 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -26,7 +26,7 @@ minimal_player_age = 14 outfit = /datum/outfit/job/hos - blacklisted_species = list(SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA_ZHAN, SPECIES_DIONA, SPECIES_IPC_G2, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR) + blacklisted_species = list(SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA_ZHAN, SPECIES_DIONA, SPECIES_IPC_G2, SPECIES_IPC_ZENGHU, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR) /datum/outfit/job/hos name = "Head of Security" @@ -88,6 +88,7 @@ minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_external_airlocks, access_weapons) minimal_player_age = 7 outfit = /datum/outfit/job/warden + blacklisted_species = list(SPECIES_IPC_ZENGHU) /datum/outfit/job/warden name = "Warden" @@ -143,6 +144,7 @@ minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_weapons) minimal_player_age = 3 outfit = /datum/outfit/job/forensics + blacklisted_species = list(SPECIES_IPC_ZENGHU) /datum/outfit/job/forensics name = "Investigator" @@ -196,6 +198,7 @@ minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_external_airlocks, access_weapons) minimal_player_age = 7 outfit = /datum/outfit/job/officer + blacklisted_species = list(SPECIES_IPC_ZENGHU) /datum/outfit/job/officer name = "Security Officer" @@ -246,6 +249,7 @@ minimal_access = list(access_security, access_sec_doors) outfit = /datum/outfit/job/intern_sec minimum_character_age = 18 + blacklisted_species = list(SPECIES_IPC_ZENGHU) /datum/outfit/job/intern_sec name = "Security Cadet" diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index ed9c66624ff..187172a6bc5 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -1,8 +1,9 @@ /obj/machinery/computer/arcade/ name = "random arcade" desc = "random arcade machine" - icon_state = "arcade" - icon_screen = "invaders" + icon_state = "arcade2" + icon_screen = "battler" + icon_broken = "broken-arcade" var/prize = /obj/random/arcade /obj/machinery/computer/arcade/Initialize() @@ -50,7 +51,8 @@ /obj/machinery/computer/arcade/battle name = "arcade machine" desc = "Does not support Pinball." - icon_state = "arcade" + icon_state = "arcade2" + icon_screen = "battler" circuit = /obj/item/circuitboard/arcade/battle var/enemy_name = "Space Villian" var/temp = "Winners don't use space drugs" //Temporary message, for attack messages, etc diff --git a/code/game/machinery/computer/arcade_orion.dm b/code/game/machinery/computer/arcade_orion.dm index 25e1aef0b8f..b91c0dafbe4 100644 --- a/code/game/machinery/computer/arcade_orion.dm +++ b/code/game/machinery/computer/arcade_orion.dm @@ -30,7 +30,8 @@ /obj/machinery/computer/arcade/orion_trail name = "orion trail" desc = "Imported straight from Outpost-T71!" - icon_state = "arcade" + icon_state = "arcade1" + icon_screen = "orion" circuit = /obj/item/circuitboard/arcade/orion_trail var/list/supplies = list("1" = 0, "2" = 0, "3" = 0, "4" = 0, "5" = 0, "6" = 0) //engine,hull,electronics,food,fuel var/list/supply_cost = list("1" = 1000, "2" = 950, "3" = 1100, "4" = 75, "5" = 100) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 22a9b943959..f6083e39f77 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -18,6 +18,7 @@ var/light_power_on = 1 var/overlay_layer var/is_holographic = TRUE + var/icon_broken = "broken" /obj/machinery/computer/Initialize() . = ..() @@ -69,9 +70,9 @@ if(stat & BROKEN) icon_state = "[initial(icon_state)]-broken" if (overlay_layer != layer) - add_overlay(image(icon, "broken", overlay_layer)) + add_overlay(image(icon, icon_broken, overlay_layer)) else - add_overlay("broken") + add_overlay(icon_broken) else if (icon_screen) if (is_holographic) holographic_overlay(src, src.icon, icon_screen) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index f531315792b..ece9f6db069 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1194,7 +1194,7 @@ About the new airlock wires panel: da.created_name = src.name da.update_state() if((stat & BROKEN)) - new /obj/item/circuitboard/broken(src.loc) + new /obj/item/trash/broken_electronics(src.loc) operating = FALSE else if (!electronics) create_electronics() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 6f91600d528..97f8a7b70d7 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -293,7 +293,7 @@ "You have removed the electronics from [src].") if (stat & BROKEN) - new /obj/item/circuitboard/broken(src.loc) + new /obj/item/trash/broken_electronics(src.loc) else new/obj/item/airalarm_electronics(src.loc) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index adf44ffc391..75a82a83f7e 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -27,7 +27,7 @@ base_state = icon_state /obj/machinery/door/window/proc/shatter(var/display_message = 1) - new /obj/item/circuitboard/broken(loc) + new /obj/item/trash/broken_electronics(loc) new /obj/item/material/shard(loc) var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(loc) CC.amount = 2 @@ -180,7 +180,7 @@ user.visible_message("[user] dismantles the windoor.", "You start to dismantle the windoor.") if (do_after(user,60/I.toolspeed)) to_chat(user, SPAN_NOTICE("You dismantled the windoor!")) - new /obj/item/circuitboard/broken(loc) + new /obj/item/trash/broken_electronics(loc) var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(loc) CC.amount = 2 var/obj/item/stack/material/glass/reinforced/rglass = new /obj/item/stack/material/glass/reinforced(loc) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index e8d17346b11..335a934adf5 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -597,6 +597,9 @@ if(emagged) // If emagged not even the dead get a rest return L.stat ? TURRET_SECONDARY_TARGET : TURRET_PRIORITY_TARGET + if(target_borgs && isAI(L)) //don't shoot the AI if we're shooting silica! + return TURRET_NOT_TARGET + if(lethal && locate(/mob/living/silicon/ai) in get_turf(L)) //don't accidentally kill the AI! return TURRET_NOT_TARGET diff --git a/code/game/machinery/vending_types.dm b/code/game/machinery/vending_types.dm index a9950bec424..7c0a8fbe560 100644 --- a/code/game/machinery/vending_types.dm +++ b/code/game/machinery/vending_types.dm @@ -22,6 +22,7 @@ name = "Omni-Vendor" desc = "The mother of all vendors, from which vending itself comes!" icon_state = "engivend" + icon_vend = "engivend-vend" deny_time = 6 vend_id = "admin" req_access = list(access_janitor) @@ -47,6 +48,7 @@ name = "Booze-O-Mat" desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." icon_state = "boozeomat" //////////////18 drink entities below, plus the glasses, in case someone wants to edit the number of bottles + icon_vend = "boozeomat-vend" deny_time = 16 vend_id = "booze" products = list( @@ -178,6 +180,8 @@ /obj/machinery/vending/assist vend_id = "tools" + icon_state = "generic" + icon_vend = "generic-vend" products = list( /obj/item/device/assembly/prox_sensor = 5, /obj/item/device/assembly/igniter = 3, @@ -200,6 +204,8 @@ /obj/machinery/vending/assist/synd name = "Parts vendor" desc = "Just a normal vending machine - nothing to see here." + icon_state = "generic" + icon_vend = "generic-vend" contraband = null random_itemcount = 0 products = list( @@ -271,6 +277,7 @@ product_slogans = "Try our new nougat bar!;Twice the calories for half the price!" product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!" icon_state = "snack" + icon_vend = "snack-vend" vend_id = "snacks" products = list( /obj/item/reagent_containers/food/snacks/candy = 6, @@ -340,11 +347,13 @@ name = "Robust Softdrinks" desc = "A softdrink vendor provided by Robust Industries, LLC." icon_state = "cola_machine" + icon_vend = "cola_machine-vend" product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!" product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space." vend_id = "cola" products = list( /obj/item/reagent_containers/food/drinks/cans/cola = 10, + /obj/item/reagent_containers/food/drinks/cans/diet_cola = 10, /obj/item/reagent_containers/food/drinks/cans/space_mountain_wind = 10, /obj/item/reagent_containers/food/drinks/cans/dr_gibb = 10, /obj/item/reagent_containers/food/drinks/cans/root_beer = 10, @@ -354,9 +363,13 @@ /obj/item/reagent_containers/food/drinks/cans/space_up = 10, /obj/item/reagent_containers/food/drinks/cans/iced_tea = 10, /obj/item/reagent_containers/food/drinks/cans/grape_juice = 10, + /obj/item/reagent_containers/food/drinks/cans/peach_soda = 10, /obj/item/reagent_containers/food/drinks/cans/koispunch = 5, /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 10, - /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda = 10 + /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda = 10, + /obj/item/reagent_containers/food/drinks/small_milk = 10, + /obj/item/reagent_containers/food/drinks/small_milk_choco = 10, + /obj/item/reagent_containers/food/drinks/small_milk_strawberry = 10 ) contraband = list( /obj/item/reagent_containers/food/drinks/cans/thirteenloko = 5, @@ -369,6 +382,7 @@ ) prices = list( /obj/item/reagent_containers/food/drinks/cans/cola = 15, + /obj/item/reagent_containers/food/drinks/cans/diet_cola = 15, /obj/item/reagent_containers/food/drinks/cans/space_mountain_wind = 11, /obj/item/reagent_containers/food/drinks/cans/dr_gibb = 16, /obj/item/reagent_containers/food/drinks/cans/root_beer = 13, @@ -378,9 +392,13 @@ /obj/item/reagent_containers/food/drinks/cans/space_up = 15, /obj/item/reagent_containers/food/drinks/cans/iced_tea = 13, /obj/item/reagent_containers/food/drinks/cans/grape_juice = 16, + /obj/item/reagent_containers/food/drinks/cans/peach_soda = 16, /obj/item/reagent_containers/food/drinks/cans/koispunch = 50, /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 5, - /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda = 35 + /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda = 35, + /obj/item/reagent_containers/food/drinks/small_milk = 18, + /obj/item/reagent_containers/food/drinks/small_milk_choco = 18, + /obj/item/reagent_containers/food/drinks/small_milk_strawberry = 18 ) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. vending_sound = 'sound/machines/vending/vending_cans.ogg' @@ -394,6 +412,7 @@ product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs." vend_delay = 24 icon_state = "cigs" + icon_vend = "cigs-vend" vend_id = "smokes" products = list( /obj/item/storage/box/fancy/cigarettes/rugged = 6, @@ -492,6 +511,7 @@ name = "NanoMed Plus" desc = "Medical drug dispenser." icon_state = "med" + icon_vend = "med-vend" deny_time = 15 product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" req_access = list(access_medical_equip) @@ -536,6 +556,8 @@ name = "Toximate 3000" desc = "All the fine parts you need in one vending machine!" vend_id = "bomba" + icon_state = "generic" + icon_vend = "generic-vend" products = list( /obj/item/clothing/under/rank/scientist = 6, /obj/item/clothing/suit/bio_suit = 6, @@ -618,6 +640,7 @@ desc = "A security equipment vendor." product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?" icon_state = "sec" + icon_vend = "sec-vend" deny_time = 16 req_access = list(access_security) vend_id = "security" @@ -656,6 +679,7 @@ product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!" product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..." icon_state = "nutri" + icon_vend = "nutri-vend" deny_time = 6 vend_id = "hydro" products = list( @@ -841,6 +865,7 @@ desc = "A kitchen and restaurant equipment vendor." product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" + icon_vend = "dinnerware-vend" vend_id = "cutlery" products = list( /obj/item/material/kitchen/utensil/fork = 12, @@ -895,6 +920,7 @@ name = "BODA" desc = "An old sweet water vending machine, how did this end up here?" icon_state = "sovietsoda" + icon_vend = "sovietsoda-vend" vend_id = "cola" product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem." products = list( @@ -917,6 +943,7 @@ name = "YouTool" desc = "Tools for tools." icon_state = "tool" + icon_vend = "tool-vend" deny_time = 6 vend_id = "tools" //req_access = list(access_maint_tunnels) //Maintenance access @@ -950,6 +977,7 @@ name = "Engi-Vend" desc = "Spare tool vending. What? Did you expect some witty description?" icon_state = "engivend" + icon_vend = "engivend-vend" deny_time = 6 req_access = list(access_engine) vend_id = "tools" @@ -1013,7 +1041,7 @@ /obj/item/ammo_magazine/mc9mmt = 6, /obj/item/ammo_magazine/mc9mmt/rubber = 4, /obj/item/gun/projectile/automatic/x9 = 2, - /obj/item/ammo_magazine/c45x = 6, + /obj/item/ammo_magazine/c45m/auto = 6, /obj/item/ammo_magazine/a556 = 12, /obj/item/ammo_magazine/a556/ap = 4, /obj/item/material/knife/tacknife = 4, @@ -1032,6 +1060,7 @@ name = "Robco Tool Maker" desc = "Everything you need for do-it-yourself station repair." icon_state = "engi" + icon_vend = "engi-vend" deny_time = 6 req_access = list(access_engine_equip) vend_id = "tools" @@ -1078,6 +1107,7 @@ name = "Robotech Deluxe" desc = "All the tools you need to create your own robot army." icon_state = "robotics" + icon_vend = "robotics-vend" deny_time = 14 req_access = list(access_robotics) vend_id = "robo-tools" @@ -1118,6 +1148,7 @@ name = "Zo'ra Soda" desc = "An energy drink vendor provided by the Getmore Corporation in partnership with the brood of Ta'Akaix'Xakt'yagz'isk Zo'ra." icon_state = "zoda" + icon_vend = "zoda-vend" product_slogans = "Safe for human consumption!;Made by hard-working bound drones!;The most refreshing taste in the sector!;A product of two thousand years!" product_ads = "Refreshing!;Hope you're thirsty!;Thirsty? Why not Zora?;Please, have some!;Drink up!;ZZZOOODDDAAA!" vend_id = "zora" @@ -1153,6 +1184,7 @@ name = "\improper Battlemonsters vendor" desc = "A good place to dump all your rent money." icon_state = "battlemonsters" + icon_vend = "battlemonsters-vend" vend_id = "battlemonsters" products = list( /obj/item/book/manual/wiki/battlemonsters = 10, diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 08843b8374c..0b59331a424 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -87,6 +87,10 @@ dream_entries += loc delete_me = 1 return + if("virtual_reality_spawn") + virtual_reality_spawn += loc + delete_me = 1 + return landmarks_list += src return 1 diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 10f10909776..26a4626ea60 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -177,6 +177,8 @@ /obj/item/device/radio/headset/alt/double name = "soundproof headset" + desc = "A sound isolating version of the common radio headset." + desc_info = "This radio doubles as a pair of earmuffs by providing sound protection." icon_state = "earset" item_state = "earset" item_flags = SOUNDPROTECTION @@ -184,6 +186,8 @@ /obj/item/device/radio/headset/wrist name = "wristbound radio" + desc = "A radio designed to fit on the wrist. Often known for broadcasting loudly enough that those closeby might overhear it." + desc_info = "This radio can be heard by people standing next to the one wearing it." icon_state = "wristset" item_state = "wristset" slot_flags = SLOT_WRISTS diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 07d153a7e0b..e1d6ec772d2 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -639,7 +639,7 @@ BREATH ANALYZER name = "zeng-hu body analyzer" desc = "An expensive and varied-use health analyzer that prints full-body scans after a short scanning delay." icon_state = "zh-analyzer" - item_state = "healthanalyzer" + item_state = "zh-analyzer" slot_flags = SLOT_BELT w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 3) diff --git a/code/game/objects/items/easel.dm b/code/game/objects/items/easel.dm index 925de487ec7..ae497d1b461 100644 --- a/code/game/objects/items/easel.dm +++ b/code/game/objects/items/easel.dm @@ -10,6 +10,7 @@ /obj/structure/easel/Initialize(ml, _mat, _reinf_mat) . = ..() moved_event.register(src, src, /obj/structure/easel/proc/move_painting) + material = SSmaterials.get_material_by_name(MATERIAL_WOOD) /obj/structure/easel/Destroy() painting = null diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 159dd278e2c..9398d299f2a 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -21,6 +21,7 @@ icon_state = "[initial(icon_state)]-[amount]" else icon_state = "[initial(icon_state)]-empty" + check_maptext(SMALL_FONTS(7, amount)) /obj/item/stack/nanopaste/attack(atom/M, mob/user, var/target_zone) if(!ismob(M) || !istype(user)) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 1805d0c1b95..68f9161952b 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -61,6 +61,7 @@ var/global/list/datum/stack_recipe/rod_recipes = list( icon_state = "rods-[amount]" else icon_state = "rods" + check_maptext(SMALL_FONTS(7, amount)) /obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob) ..() diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 92a30bdc31b..72817c8c91e 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -12,6 +12,7 @@ /obj/item/stack gender = PLURAL origin_tech = list(TECH_MATERIAL = 1) + flags = HELDMAPTEXT var/list/datum/stack_recipe/recipes var/singular_name var/amount = 1 @@ -43,6 +44,10 @@ item_state = icon_state update_icon() + return INITIALIZE_HINT_LATELOAD + +/obj/item/stack/LateInitialize() + check_maptext(SMALL_FONTS(7, get_amount())) /obj/item/stack/Destroy() if (src && usr && usr.machine == src) @@ -50,6 +55,8 @@ return ..() /obj/item/stack/update_icon() + check_maptext(SMALL_FONTS(7, get_amount())) + if (!icon_has_variants) return ..() @@ -212,6 +219,7 @@ var/datum/matter_synth/S = synths[i] if(!S.use_charge(charge_costs[i] * used)) // Doesn't need to be deleted return 0 + check_maptext(SMALL_FONTS(7, get_amount())) return 1 /obj/item/stack/proc/add(var/extra) @@ -228,6 +236,7 @@ for(var/i = 1 to uses_charge) var/datum/matter_synth/S = synths[i] S.add_charge(charge_costs[i] * extra) + check_maptext(SMALL_FONTS(7, get_amount())) /* The transfer and split procs work differently than use() and add(). diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index a456dd874b4..7494e5e6757 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -233,3 +233,7 @@ /obj/item/trash/vkrexitaffy name = "V'krexi Snax" icon_state = "vkrexitaffy" + +/obj/item/trash/broken_electronics + name = "broken electronics" + icon_state = "door_electronics_smoked" \ No newline at end of file diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 10eb65cee3e..45b581e8f32 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -121,6 +121,8 @@ var/const/NO_EMAG_ACT = -50 var/dorm = 0 // determines if this ID has claimed a dorm already var/datum/ntnet_user/chat_user + var/iff_faction = IFF_DEFAULT + /obj/item/card/id/Destroy() mob = null return ..() @@ -367,7 +369,7 @@ var/const/NO_EMAG_ACT = -50 item_state = "gold_id" overlay_state = "gold" -/obj/item/card/id/syndicate_command +/obj/item/card/id/syndicate/command name = "syndicate ID card" desc = "An ID straight from the Syndicate." icon_state = "dark" @@ -375,14 +377,14 @@ var/const/NO_EMAG_ACT = -50 assignment = "Syndicate Overlord" access = list(access_syndicate, access_external_airlocks) -/obj/item/card/id/syndicate_ert +/obj/item/card/id/syndicate/ert name = "\improper Syndicate Commando ID" assignment = "Commando" icon_state = "centcom" -/obj/item/card/id/syndicate_ert/New() +/obj/item/card/id/syndicate/ert/Initialize() + . = ..() access = get_all_accesses() - ..() /obj/item/card/id/syndicate/raider name = "passport" @@ -602,12 +604,14 @@ var/const/NO_EMAG_ACT = -50 desc = "A stylized plastic card, belonging to one of the many specialists at Einstein Engines." icon_state = "einstein_card" overlay_state = "einstein_card" + iff_faction = IFF_EE /obj/item/card/id/bluespace name = "bluespace identification card" desc = "A bizarre imitation of Nanotrasen identification cards. It seems to function normally as well." desc_antag = "Access can be copied from other ID cards by clicking on them." icon_state = "crystalid" + iff_faction = IFF_BLUESPACE /obj/item/card/id/bluespace/update_name() return diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index ed753eb6974..05feb5c5e80 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -2,6 +2,7 @@ name = "agent card" assignment = "Agent" origin_tech = list(TECH_ILLEGAL = 3) + iff_faction = IFF_SYNDICATE can_copy_access = TRUE access_copy_msg = "The microscanner activates as you pass it over the ID, copying its access." var/charge = 10000 @@ -64,6 +65,8 @@ entries[++entries.len] = list("name" = "Name", "value" = registered_name) entries[++entries.len] = list("name" = "Photo", "value" = "Update") entries[++entries.len] = list("name" = "Sex", "value" = sex) + entries[++entries.len] = list("name" = "Citizenship", "value" = citizenship) + entries[++entries.len] = list("name" = "Religion", "value" = religion) entries[++entries.len] = list("name" = "Factory Reset", "value" = "Use With Care") data["electronic_warfare"] = electronic_warfare data["entries"] = entries @@ -214,12 +217,25 @@ src.sex = new_sex to_chat(user, "Sex changed to '[new_sex]'.") . = 1 + if("Citizenship") + var/new_citizenship = sanitize(input(user,"Which citizenship would you like to put on this card?","Agent Card Citizenship", citizenship) as null|text) + if(!isnull(new_citizenship) && CanUseTopic(user,state)) + src.citizenship = new_citizenship + to_chat(user, SPAN_NOTICE("Citizenship changed to '[new_citizenship]'.")) + . = 1 + if("Religion") + var/new_religion = sanitize(input(user,"What religion would you like to put on this card?","Agent Card Religion", religion) as null|text) + if(!isnull(new_religion) && CanUseTopic(user,state)) + src.religion = new_religion + to_chat(user, SPAN_NOTICE("Religion changed to '[new_religion]'.")) + . = 1 if("Factory Reset") if(alert("This will factory reset the card, including access and owner. Continue?", "Factory Reset", "No", "Yes") == "Yes" && CanUseTopic(user, state)) age = initial(age) access = syndicate_access.Copy() assignment = initial(assignment) blood_type = initial(blood_type) + citizenship = initial(citizenship) dna_hash = initial(dna_hash) electronic_warfare = initial(electronic_warfare) fingerprint_hash = initial(fingerprint_hash) @@ -227,6 +243,7 @@ name = initial(name) registered_name = initial(registered_name) unset_registered_user() + religion = initial(religion) sex = initial(sex) to_chat(user, "All information has been deleted from \the [src].") . = 1 diff --git a/code/game/objects/items/weapons/circuitboards/broken.dm b/code/game/objects/items/weapons/circuitboards/broken.dm deleted file mode 100644 index ded817e7c74..00000000000 --- a/code/game/objects/items/weapons/circuitboards/broken.dm +++ /dev/null @@ -1,6 +0,0 @@ -/obj/item/circuitboard/broken - name = "broken electronics" - icon = 'icons/obj/doors/door_assembly.dmi' - icon_state = "door_electronics_smoked" - origin_tech = null - board_type = "other" diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index bc7e6a156eb..c50bdd34744 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -23,7 +23,7 @@ var/loaded //Descriptive string for currently loaded food object. var/is_liquid = FALSE //whether you've got liquid on your utensil var/scoop_food = 1 - var/transfer_amt = 5 + var/transfer_amt = 1 var/list/bite_sizes = list(1,2,3,4,5) /obj/item/material/kitchen/utensil/Initialize(newloc, material_key) diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index b30226054a0..e1ca29b12cb 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -1,16 +1,25 @@ +var/list/tape_roll_applications = list() + //Define all tape types in policetape.dm /obj/item/taperoll name = "tape roll" icon = 'icons/policetape.dmi' icon_state = "tape" w_class = ITEMSIZE_SMALL + var/static/list/hazard_overlays var/turf/start var/turf/end var/tape_type = /obj/item/tape var/icon_base -var/list/image/hazard_overlays -var/list/tape_roll_applications = list() +/obj/item/taperoll/Initialize() + . = ..() + if(!hazard_overlays) + hazard_overlays = list() + hazard_overlays["[NORTH]"] = image('icons/effects/warning_stripes.dmi', icon_state = "N") + hazard_overlays["[EAST]"] = image('icons/effects/warning_stripes.dmi', icon_state = "E") + hazard_overlays["[SOUTH]"] = image('icons/effects/warning_stripes.dmi', icon_state = "S") + hazard_overlays["[WEST]"] = image('icons/effects/warning_stripes.dmi', icon_state = "W") /obj/item/tape name = "tape" @@ -26,15 +35,6 @@ var/list/tape_roll_applications = list() if(LAZYLEN(crumplers) && Adjacent(user)) to_chat(user, SPAN_WARNING("\The [initial(name)] has been crumpled by [english_list(crumplers)].")) -/obj/item/tape/New() - ..() - if(!hazard_overlays) - hazard_overlays = list() - hazard_overlays["[NORTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "N") - hazard_overlays["[EAST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "E") - hazard_overlays["[SOUTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "S") - hazard_overlays["[WEST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "W") - /obj/item/taperoll/police name = "police tape" desc = "A roll of police tape used to block off crime scenes from the public." diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 17173750bd6..092832f89d1 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -924,3 +924,77 @@ /obj/item/storage/box/folders/blue starts_with = list(/obj/item/folder/sec = 5) +/obj/item/storage/box/papersack + name = "paper sack" + desc = "A neatly sack crafted out of paper." + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand.dmi', + slot_r_hand_str = 'icons/mob/items/righthand.dmi', + ) + item_state = "papersack" + icon_state = "paperbag_None" + use_sound = 'sound/bureaucracy/papercrumple.ogg' + drop_sound = 'sound/items/drop/paper.ogg' + pickup_sound = 'sound/items/storage/wrapper.ogg' + foldable = null + max_w_class = ITEMSIZE_NORMAL + max_storage_space = 8 + use_to_pickup = TRUE + chewable = TRUE + var/opened = TRUE + var/static/list/papersack_designs + var/choice = "None" + +/obj/item/storage/box/papersack/update_icon() + . = ..() + if(length(contents) == 0) + icon_state = "paperbag_[choice]" + else if(length(contents) < 8) + icon_state = "paperbag_[choice]-food" + +/obj/item/storage/box/papersack/attackby(obj/item/O, mob/user) + if(O.ispen()) + if(!papersack_designs) + papersack_designs = sortList(list( + "None" = image(icon = src.icon, icon_state = "paperbag_None"), + "NanotrasenStandard" = image(icon = src.icon, icon_state = "paperbag_NanotrasenStandard"), + "Idris" = image(icon = src.icon, icon_state = "paperbag_Idris"), + "Heart" = image(icon = src.icon, icon_state = "paperbag_Heart"), + "SmileyFace" = image(icon = src.icon, icon_state = "paperbag_SmileyFace") + )) + + choice = show_radial_menu(user, src, papersack_designs, radius = 42, tooltips = TRUE) + if(!choice) + return + switch(choice) + if("None") + desc = "A sack neatly crafted out of paper." + if("NanotrasenStandard") + desc = "A standard Nanotrasen paper lunch sack for loyal employees on the go." + if("Idris") + desc = "A premium paper bag produced by Idris Incorporated." + if("Heart") + desc = "A paper sack with a heart etched onto the side." + if("SmileyFace") + desc = "A paper sack with a crude smile etched onto the side." + else + return + to_chat(user, SPAN_NOTICE("You make some modifications to [src] using your pen.")) + update_icon() + return + + else if(O.isscrewdriver()) + if(length(contents) == 0) + to_chat(user, SPAN_NOTICE("You begin poking holes in \the [src].")) + if (do_after(user, 10/O.toolspeed, act_target = src)) + if(choice == "SmileyFace") + var/obj/item/clothing/head/papersack/smiley/S = new() + user.put_in_hands(S) + else + var/obj/item/clothing/head/papersack/PS = new() + user.put_in_hands(PS) + qdel(src) + else + to_chat(user, SPAN_WARNING("\The [src] needs to be empty before you can do that!")) + else + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/field_ration.dm b/code/game/objects/items/weapons/storage/field_ration.dm index 5efd16acfca..7f0f3d7ab05 100644 --- a/code/game/objects/items/weapons/storage/field_ration.dm +++ b/code/game/objects/items/weapons/storage/field_ration.dm @@ -77,7 +77,7 @@ and hunting. It is a common practice for armies to confiscate villages productions, something that can cause resentment among farmers when their lands are occupied by the liberation \ army, to feed their soldiers." -/obj/item/storage/field_ration/dpraa/create_ration() +/obj/item/storage/field_ration/dpra/create_ration() new /obj/item/reagent_containers/food/snacks/explorer_ration(src) new /obj/item/reagent_containers/food/snacks/tajaran_bread(src) new /obj/item/reagent_containers/food/drinks/cans/adhomai_milk(src) diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index de2326ec4f7..bb1a7b0e9a7 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -280,4 +280,13 @@ item_state = "swimstars_xana" /obj/item/storage/toolbox/lunchbox/swimstars_xana/filled + filled = TRUE + +/obj/item/storage/toolbox/lunchbox/sedantis + name = "Sedantis lunchbox" + desc = "A little lunchbox, displaying a proud Sedantis flag." + icon_state = "lunchbox_sedantis" + item_state = "lunchbox_sedantis" + +/obj/item/storage/toolbox/lunchbox/sedantis/filled filled = TRUE \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 63d104d3382..b4f13ea0538 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -172,17 +172,16 @@ icon_state = initial(icon_state) ion_trail.stop() - if (ismob(usr)) - var/mob/M = usr - M.update_inv_back() - - to_chat(usr, "You toggle the thrusters [on? "on":"off"].") + to_chat(usr, SPAN_NOTICE("You toggle the thrusters [on ? "on" : "off"].")) + stabilization_on = !stabilization_on + to_chat(usr, SPAN_NOTICE("You toggle the stabilization [stabilization_on ? "on" : "off"].")) /obj/item/tank/jetpack/carbondioxide/synthetic/verb/toggle_stabilizer() set name = "Toggle Jetpack Stabilization" set category = "Robot Commands" - src.stabilization_on = !( src.stabilization_on ) - to_chat(usr, "You toggle the stabilization [stabilization_on? "on":"off"].") + + stabilization_on = !stabilization_on + to_chat(usr, SPAN_NOTICE("You toggle the stabilization [stabilization_on ? "on" : "off"].")) /obj/item/tank/jetpack/rig name = "hardsuit jetpack" diff --git a/code/game/objects/items/weapons/vaurca_items.dm b/code/game/objects/items/weapons/vaurca_items.dm index c9bb8211998..152b718a9b2 100644 --- a/code/game/objects/items/weapons/vaurca_items.dm +++ b/code/game/objects/items/weapons/vaurca_items.dm @@ -189,6 +189,7 @@ force = 15 throwforce = 30 w_class = ITEMSIZE_LARGE + var/seed = /datum/seed/koisspore /obj/item/grenade/spawnergrenade/vaurca/prime() @@ -200,11 +201,17 @@ M.flash_eyes() for(var/i=1, i<=deliveryamt, i++) - var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/x = new spawner_type(T, new /datum/seed/koisspore()) + var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/x = new spawner_type(T, new seed()) x.tumble(4) qdel(src) return +/obj/item/grenade/spawnergrenade/vaurca/liidra + name = "Black K'ois delivery pod" + desc = "A device made for rapid spread of black k'ois." + icon_state = "liibeacon" + seed = /datum/seed/koisspore/black + /obj/item/clothing/suit/space/void/vaurca name = "voidsuit" contained_sprite = 1 diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 3973cdea8b7..0db863690ec 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -1570,8 +1570,10 @@ /obj/item/gun/projectile/automatic/c20r = 1, /obj/item/gun/projectile/automatic/mini_uzi = 1, /obj/item/gun/projectile/automatic/tommygun = 1, + /obj/item/gun/projectile/automatic/lebman = 1, /obj/item/gun/projectile/automatic/wt550/lethal = 0.5, /obj/item/gun/projectile/colt = 0.5, + /obj/item/gun/projectile/colt/super = 1, /obj/item/gun/projectile/pistol/sol = 1, /obj/item/gun/projectile/pistol/adhomai = 1, /obj/item/gun/projectile/revolver/detective = 0.5, @@ -1596,6 +1598,7 @@ /obj/item/gun/energy/xray = 1, /obj/item/gun/energy/lasercannon = 1, /obj/item/gun/projectile/automatic/rifle/sts35 = 1, + /obj/item/gun/projectile/automatic/rifle/shorty = 1, /obj/item/gun/projectile/automatic/rifle/carbine = 1, /obj/item/gun/projectile/automatic/x9 = 1, /obj/item/gun/projectile/deagle = 1, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index f137596b0a5..2e9c7113af7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -124,6 +124,7 @@ new /obj/item/clothing/mask/gas/alt(src) new /obj/item/clothing/mask/gas/half(src) new /obj/item/auto_cpr(src) + new /obj/item/clothing/suit/storage/toggle/first_responder_jacket(src) /obj/structure/closet/secure_closet/CMO name = "chief medical officer's locker" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index f01cb807205..74f30820e4f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -371,7 +371,7 @@ //Tools new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/device/radio/headset/headset_sec/alt(src) - new /obj/item/clothing/suit/armor/carrier/generic(src) + new /obj/item/clothing/suit/armor/carrier/officer(src) new /obj/item/gun/energy/disruptorpistol/miniature/security(src) new /obj/item/taperoll/police(src) new /obj/item/device/flash(src) diff --git a/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm b/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm index d1f5b269301..1c27330d4b7 100644 --- a/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm +++ b/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm @@ -406,8 +406,8 @@ ..() new /obj/item/clothing/accessory/holster/armpit/brown(src) new /obj/item/gun/projectile/automatic/x9(src) - new /obj/item/ammo_magazine/c45x(src) - new /obj/item/ammo_magazine/c45x(src) + new /obj/item/ammo_magazine/c45m/auto(src) + new /obj/item/ammo_magazine/c45m/auto(src) /obj/structure/closet/crate/secure/gear_loadout/ninja/jinxiang associated_hardsuit = /obj/item/rig/jinxiang/ninja diff --git a/code/game/objects/structures/vr/human_chair.dm b/code/game/objects/structures/vr/human_chair.dm new file mode 100644 index 00000000000..71de534a9e8 --- /dev/null +++ b/code/game/objects/structures/vr/human_chair.dm @@ -0,0 +1,9 @@ +/obj/structure/bed/chair/remote/human + name = "virtual reality centre" + desc = "A comfortable chair with full audio-visual transposition centres. This one gives you access to a virtual reality body." + +/obj/structure/bed/chair/remote/human/user_buckle(mob/user) + ..() + if(ishuman(user)) + var/mob/living/carbon/human/H = user + SSvirtualreality.create_virtual_reality_avatar(H) \ No newline at end of file diff --git a/code/game/turfs/simulated/abyss.dm b/code/game/turfs/simulated/abyss.dm new file mode 100644 index 00000000000..5fa39ab3d9f --- /dev/null +++ b/code/game/turfs/simulated/abyss.dm @@ -0,0 +1,39 @@ +/turf/simulated/abyss + name = "abyss" + desc = "It stares back at you." + icon = 'icons/turf/smooth/abyss.dmi' + smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_NO_CLEAR_ICON + smoothing_hints = SMOOTHHINT_CUT_F | SMOOTHHINT_ONLY_MATCH_TURF | SMOOTHHINT_TARGETS_NOT_UNIQUE + icon_state = "smooth" + var/static/list/forbidden_types = typecacheof(list( + /obj/singularity, + /obj/structure/lattice, + /obj/item/projectile, + /obj/effect + )) + +/turf/simulated/abyss/Entered(atom/movable/AM, atom/oldloc) + if(is_type_in_typecache(forbidden_types)) + return TRUE + + else if(istype(AM, /mob/living)) + var/mob/living/L = AM + if(locate(/obj/structure/lattice/catwalk, src)) //should be safe to walk upon + return TRUE + if(!L.CanAvoidGravity()) + L.visible_message(SPAN_DANGER("\The [L] falls into \the [src]."), SPAN_DANGER("You plummet down into \the [src]!")) + L.death() + if(L) + L.loc = null + qdel(L) + else + return TRUE + + + else if(istype(AM, /obj/item)) + var/obj/item/I = AM + I.visible_message(SPAN_DANGER("\The [I] falls into \the [src].")) + qdel(I) + + else + ..() diff --git a/code/global.dm b/code/global.dm index b69941762be..c746251243f 100644 --- a/code/global.dm +++ b/code/global.dm @@ -54,6 +54,7 @@ var/list/latejoin_cryo_command = list() var/list/latejoin_cyborg = list() var/list/latejoin_merchant = list() var/list/kickoffsloc = list() +var/list/virtual_reality_spawn = list() var/list/prisonwarp = list() // Prisoners go to these var/list/holdingfacility = list() // Captured people go here diff --git a/code/modules/background/accent/vaurca.dm b/code/modules/background/accent/vaurca.dm index 67468c38d76..68d386b2ad0 100644 --- a/code/modules/background/accent/vaurca.dm +++ b/code/modules/background/accent/vaurca.dm @@ -24,3 +24,12 @@ infamous of the C'thur's past deeds. Their vocal augments stereotypically have difficulty, typically when producing sounds related to the letter 's', instead \ substituting with a harsh buzzing in the throat." tag_icon = "cthur" + +/datum/accent/liidra + name = ACCENT_LIIDRA + description = "The Lii'dra speech, as understood by those that have heard the Hivemind and live to tell, is characterized by a monotonous voice that sounds \ + even more robotical than the rest of the modulators used by the other Hives. It is believed to be a modified technology reverse engineered from stolen \ + Zo'rane modulators. While, with its flaws, the Zo'ra accent might sound quirky to some, it is often said that this is to add more personality to each \ + individual. Since the Lii'dra do not think of themselves as such, these variations were deemed useless. The Connected individuals will often speak in plural, while the Disconnected \ + are prone to use the first person when referring to others." + tag_icon = "liidra" diff --git a/code/modules/background/citizenship/human.dm b/code/modules/background/citizenship/human.dm index 999a9283769..b146158ce22 100644 --- a/code/modules/background/citizenship/human.dm +++ b/code/modules/background/citizenship/human.dm @@ -116,6 +116,7 @@ from whole colonial systems to travelling super ships to mining and farming outposts. Most communities here are, although not as developed as many galactic powers, very \ tightly-knit. Almost anything and anyone can be found in these wild, mostly uncharted lands. " demonym = "frontiersman" + consular_outfit = /datum/outfit/job/representative/consular/coalition job_species_blacklist = list( "Consular Officer" = list( @@ -128,6 +129,14 @@ ) ) +/datum/outfit/job/representative/consular/coalition + name = "Coalition Consular Officer" + + backpack_contents = list( + /obj/item/device/camera = 1, + /obj/item/gun/projectile/colt/super = 1 + ) + /datum/citizenship/elyra name = CITIZENSHIP_ELYRA description = "The Republic of Elyra, or its more official name, The Serene Republic of Elyra, was formed during a large scale colonization and emigration effort from south \ @@ -135,6 +144,14 @@ is \"For Greatness We Strive\". It's official language is Tau Ceti Basic, though several old-earth languages cling to life in small enclaves, such as arabic, persian, and farsi. \ The Republic has mixed relations with NanoTrasen, due to their own possession of phoron." demonym = "elyrian" + consular_outfit = /datum/outfit/job/representative/consular/elyra + +/datum/outfit/job/representative/consular/elyra + name = "Elyra Consular Officer" + + backpack_contents = list( + /obj/item/gun/projectile/plasma/bolter/pistol = 1 + ) /datum/citizenship/dominia name = CITIZENSHIP_DOMINIA diff --git a/code/modules/background/defines.dm b/code/modules/background/defines.dm index 2f25b32ae93..f7e188888ec 100644 --- a/code/modules/background/defines.dm +++ b/code/modules/background/defines.dm @@ -120,3 +120,4 @@ #define ACCENT_ZORA "Zo'rane" #define ACCENT_KLAX "K'laxane" #define ACCENT_CTHUR "C'thuric" +#define ACCENT_LIIDRA "Lii'draic" diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index eda7023220b..53b5335299f 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -65,6 +65,7 @@ /decl/reagent/alcohol/screwdrivercocktail, /decl/reagent/alcohol/cobaltvelvet, /decl/reagent/alcohol/snowwhite, + /decl/reagent/alcohol/sidewinderfang, /decl/reagent/alcohol/gibsonhooch, /decl/reagent/alcohol/manly_dorf, /decl/reagent/alcohol/thirteenloko, diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 013398e6bcf..6c6e82475d3 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -50,11 +50,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the client.sending |= asset_name var/job = ++client.last_asset_job - client << browse({" - - "}, "window=asset_cache_browser") + client << browse("", "window=asset_cache_browser") var/t = 0 var/timeout_time = (ASSET_CACHE_SEND_TIMEOUT * client.sending.len) + ASSET_CACHE_SEND_TIMEOUT @@ -102,11 +98,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the client.sending |= unreceived var/job = ++client.last_asset_job - client << browse({" - - "}, "window=asset_cache_browser") + client << browse("", "window=asset_cache_browser") var/t = 0 var/timeout_time = ASSET_CACHE_SEND_TIMEOUT * client.sending.len @@ -436,6 +428,7 @@ var/list/asset_datums = list() "dpraflag.png" = 'html/images/dpraflag.png', "nkaflag.png" = 'html/images/nkaflag.png', "izweskiflag.png" = 'html/images/izweskiflag.png', + "goldenlogo.png" = 'html/images/goldenlogo.png', "bluebird.woff" = 'html/fonts/OFL/Bluebird.woff', "grandhotel.woff" = 'html/fonts/OFL/GrandHotel.woff', "lashema.woff" = 'html/fonts/OFL/Lashema.woff', diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index 1874e727c29..fe79389be80 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -208,6 +208,8 @@ shirt["cropped dress shirt, rolled up"] = /obj/item/clothing/accessory/dressshirt/crop/rolled shirt["dress shirt, alt"] = /obj/item/clothing/accessory/dressshirt/alt shirt["dress shirt, alt rolled up"] = /obj/item/clothing/accessory/dressshirt/alt/rolled + shirt["dress shirt, V-Neck alt"] = /obj/item/clothing/accessory/dressshirt/alt/vneck + shirt["dress shirt, V-Neck alt rolled up"] = /obj/item/clothing/accessory/dressshirt/alt/vneck/rolled shirt["long-sleeved shirt"] = /obj/item/clothing/accessory/longsleeve shirt["long-sleeved shirt, black striped"] = /obj/item/clothing/accessory/longsleeve_s shirt["long-sleeved shirt, blue striped"] = /obj/item/clothing/accessory/longsleeve_sb diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm index 0aada0392b2..bd7bc68b8cb 100644 --- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm @@ -94,6 +94,7 @@ ..() var/list/sechud = list() sechud["sunglasses, security"] = /obj/item/clothing/glasses/sunglasses/sechud + sechud["fat sunglasses, security"] = /obj/item/clothing/glasses/sunglasses/sechud/big sechud["aviators, security"] = /obj/item/clothing/glasses/sunglasses/sechud/aviator sechud["HUD, security"] = /obj/item/clothing/glasses/hud/security sechud["HUDpatch, security"] = /obj/item/clothing/glasses/eyepatch/hud/security diff --git a/code/modules/client/preference_setup/loadout/loadout_factions.dm b/code/modules/client/preference_setup/loadout/loadout_factions.dm index 01204224f04..0b2013d6f09 100644 --- a/code/modules/client/preference_setup/loadout/loadout_factions.dm +++ b/code/modules/client/preference_setup/loadout/loadout_factions.dm @@ -44,6 +44,22 @@ path = /obj/item/reagent_containers/glass/rag/advanced/idris faction = "Idris Incorporated" +/datum/gear/faction/idris_sunglasses + display_name = "idris security HUD selection" + description = "A selection of Idris security HUDs." + path = /obj/item/clothing/glasses/sunglasses/sechud/idris + slot = slot_glasses + allowed_roles = list("Security Officer", "Head of Security", "Warden", "Security Cadet", "Investigator") + faction = "Idris Incorporated" + +/datum/gear/faction/idris_sunglasses/New() + ..() + var/list/idris_sunglasses = list() + idris_sunglasses["HUDsunglasses, Idris"] = /obj/item/clothing/glasses/sunglasses/sechud/idris + idris_sunglasses["fat HUDsunglasses, Idris"] = /obj/item/clothing/glasses/sunglasses/sechud/big/idris + idris_sunglasses["aviator sunglasses, Idris"] = /obj/item/clothing/glasses/sunglasses/sechud/aviator/idris + gear_tweaks += new /datum/gear_tweak/path(idris_sunglasses) + /datum/gear/faction/zavodskoi_beret display_name = "black zavodskoi beret" path = /obj/item/clothing/head/beret/security/zavodskoi @@ -54,6 +70,15 @@ path = /obj/item/clothing/head/beret/security/zavodskoi/alt sort_category = "Factions" +/datum/gear/faction/zavodskoi_softcap + display_name = "black zavodskoi cap" + path = /obj/item/clothing/head/softcap/zavod + faction = "Zavodskoi Interstellar" + +/datum/gear/faction/zavodskoi_softcap/alt + display_name = "brown zavodskoi cap" + path = /obj/item/clothing/head/softcap/zavod/alt + /datum/gear/faction/zavodskoi_uniform_alt display_name = "brown zavodskoi uniform" path = /obj/item/clothing/under/rank/security/zavodskoi/alt @@ -72,6 +97,22 @@ slot = slot_wear_suit faction = "Zavodskoi Interstellar" +/datum/gear/faction/zavod_sunglasses + display_name = "zavodskoi security HUD selection" + description = "A selection of Zavodskoi security HUDs." + path = /obj/item/clothing/glasses/sunglasses/sechud/zavod + slot = slot_glasses + allowed_roles = list("Security Officer", "Head of Security", "Warden", "Security Cadet", "Investigator") + faction = "Zavodskoi Interstellar" + +/datum/gear/faction/zavod_sunglasses/New() + ..() + var/list/zavod_sunglasses = list() + zavod_sunglasses["HUDsunglasses, Zavodskoi"] = /obj/item/clothing/glasses/sunglasses/sechud/zavod + zavod_sunglasses["fat HUDsunglasses, Zavodskoi"] = /obj/item/clothing/glasses/sunglasses/sechud/big/zavod + zavod_sunglasses["aviator sunglasses, Zavodskoi"] = /obj/item/clothing/glasses/sunglasses/sechud/aviator/zavod + gear_tweaks += new /datum/gear_tweak/path(zavod_sunglasses) + /datum/gear/faction/eridani_beret display_name = "eridani beret" path = /obj/item/clothing/head/beret/security/eri @@ -84,6 +125,22 @@ slot = slot_head faction = "Eridani Private Military Contractors" +/datum/gear/faction/epmc_sunglasses + display_name = "EPMC security HUD selection" + description = "A selection of EPMC security HUDs." + path = /obj/item/clothing/glasses/sunglasses/sechud/epmc + slot = slot_glasses + allowed_roles = list("Security Officer", "Head of Security", "Warden", "Security Cadet", "Investigator") + faction = "Eridani Private Military Contractors" + +/datum/gear/faction/epmc_sunglasses/New() + ..() + var/list/epmc_sunglasses = list() + epmc_sunglasses["HUDsunglasses, EPMC"] = /obj/item/clothing/glasses/sunglasses/sechud/epmc + epmc_sunglasses["fat HUDsunglasses, EPMC"] = /obj/item/clothing/glasses/sunglasses/sechud/big/epmc + epmc_sunglasses["aviator sunglasses, EPMC"] = /obj/item/clothing/glasses/sunglasses/sechud/aviator/epmc + gear_tweaks += new /datum/gear_tweak/path(epmc_sunglasses) + /datum/gear/faction/zenghu_uniform_alt display_name = "zeng-hu white uniform" path = /obj/item/clothing/under/rank/zeng/alt diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index c678a7ea369..aeb2ed3237a 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -184,6 +184,7 @@ datum/gear/suit/colorvest coat["trenchcoat, grey"] = /obj/item/clothing/suit/storage/toggle/trench/grey coat["trenchcoat, dark brown"] = /obj/item/clothing/suit/storage/toggle/trench/alt coat["trenchcoat, grey alternate"] = /obj/item/clothing/suit/storage/toggle/trench/grey_alt + coat["trenchcoat, green"] = /obj/item/clothing/suit/storage/toggle/trench/green coat["brown trenchcoat (Detective)"] = /obj/item/clothing/suit/storage/toggle/det_trench coat["black trenchcoat (Detective)"] = /obj/item/clothing/suit/storage/toggle/det_trench/black gear_tweaks += new /datum/gear_tweak/path(coat) @@ -317,10 +318,18 @@ datum/gear/suit/colorvest allowed_roles = list("Consular Officer") /datum/gear/suit/fisanduhian_bomber - display_name = "fisanduhian bomber jacket" + display_name = "fisanduhian bomber jacket selection" + description = "A selection of Fisanduhian jackets." path = /obj/item/clothing/suit/storage/toggle/dominia/bomber flags = GEAR_HAS_DESC_SELECTION +/datum/gear/suit/fisanduhian_bomber/New() + ..() + var/list/coat = list() + coat["fisanduhian bomber jacket"] = /obj/item/clothing/suit/storage/toggle/dominia/bomber + coat["long fisanduhian bomber jacket"] = /obj/item/clothing/suit/storage/toggle/dominia/bomber/long + gear_tweaks += new /datum/gear_tweak/path(coat) + /datum/gear/suit/tcfl display_name = "Tau Ceti Foreign Legion jacket selection" description = "A selection of fine, surplus jackets of the Foreign Legion." diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/skrell.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/skrell.dm index a0164a39399..5c3a4ebea3b 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/skrell.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/skrell.dm @@ -143,6 +143,13 @@ J.species_tag = tag return J +/datum/gear/head/skrell_helmet + display_name = "Skrellmet" + path = /obj/item/clothing/head/helmet/security/skrell + whitelisted = list(SPECIES_SKRELL) + sort_category = "Xenowear - Skrell" + allowed_roles = list("Head of Security", "Warden", "Security Officer", "Investigator", "Head of Personnel", "Captain") + /* Skrellian Social Score */ @@ -163,4 +170,4 @@ datum/gear_tweak/social_credit/get_metadata(var/user, var/metadata) datum/gear_tweak/social_credit/tweak_item(var/obj/item/clothing/accessory/badge/passport/jargon/PP, var/metadata) if(!istype(PP)) return - PP.credit_score = metadata + pick(-0.01, 0, 0.01) \ No newline at end of file + PP.credit_score = metadata + pick(-0.01, 0, 0.01) diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm index a07f2dbc6fc..1cdb44ab750 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm @@ -253,6 +253,7 @@ /datum/gear/accessory/tajaran_card display_name = "tajaran cards, badges and pins selection" + description = "A selection of Tajaran related cards, badges and pins." path = /obj/item/clothing/accessory/badge/hadii_card sort_category = "Xenowear - Tajara" whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) @@ -264,11 +265,12 @@ card["honorary party member card"] = /obj/item/clothing/accessory/badge/hadii_card card["almariist pin"] = /obj/item/clothing/accessory/dpra_badge card["royalist badge"] = /obj/item/clothing/accessory/nka_badge - card["free tajaran council badge"] = /obj/item/clothing/accessory/tajara/council_badge + card["free tajaran council badge"] = /obj/item/clothing/accessory/tajaran/council_badge gear_tweaks += new /datum/gear_tweak/path(card) /datum/gear/accessory/tajaranbooks display_name = "tajaran political books" + description = "Tajaran books on the Adhomian ideologies." path = /obj/item/book/manual/pra_manifesto sort_category = "Xenowear - Tajara" whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) @@ -284,6 +286,7 @@ /datum/gear/tajaran_passports display_name = "adhomian passports selection" + description = "A selection of Adhomian passports." path = /obj/item/clothing/accessory/badge/pra_passport sort_category = "Xenowear - Tajara" whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/vaurca.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/vaurca.dm index 1669fd54795..e02e6a409f3 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/vaurca.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/vaurca.dm @@ -128,4 +128,23 @@ var/list/language_processors = list() language_processors["K'laxan [LANGUAGE_UNATHI] language processor"] = /obj/item/organ/internal/augment/language/klax language_processors["C'thur [LANGUAGE_SKRELLIAN] language processor"] = /obj/item/organ/internal/augment/language/cthur - gear_tweaks += new /datum/gear_tweak/path(language_processors) \ No newline at end of file + gear_tweaks += new /datum/gear_tweak/path(language_processors) + +/datum/gear/vaurca_lunchbox + display_name = "vaurca lunchbox" + description = "A lunchbox selection containing various kois products." + cost = 2 + path = /obj/item/storage/toolbox/lunchbox + sort_category = "Xenowear - Vaurca" + whitelisted = list(SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR) + +/datum/gear/vaurca_lunchbox/New() + ..() + var/list/lunchboxes = list() + for(var/lunchbox_type in typesof(/obj/item/storage/toolbox/lunchbox)) + var/obj/item/storage/toolbox/lunchbox/lunchbox = lunchbox_type + if(!initial(lunchbox.filled)) + lunchboxes[initial(lunchbox.name)] = lunchbox_type + sortTim(lunchboxes, /proc/cmp_text_asc) + gear_tweaks += new /datum/gear_tweak/path(lunchboxes) + gear_tweaks += new /datum/gear_tweak/contents(lunchables_vaurca(), lunchables_vaurca_snack(), lunchables_drinks(), lunchables_utensil()) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 30b01be9393..9cc54305fe7 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -164,6 +164,7 @@ desc = "They're comfy black shoes, with clever cloaking technology built in. It seems to have a small dial on the back of each shoe." silent = 1 origin_tech = list(TECH_ILLEGAL = 3) + species_restricted = list("exclude",BODYTYPE_GOLEM,BODYTYPE_VAURCA_BREEDER,BODYTYPE_VAURCA_WARFORM) var/global/list/clothing_choices /obj/item/clothing/shoes/chameleon/Initialize() @@ -245,6 +246,7 @@ item_state = "black" desc = "It looks like a pair of gloves, but it seems to have a small dial inside." origin_tech = list(TECH_ILLEGAL = 3) + species_restricted = list("exclude",BODYTYPE_GOLEM,BODYTYPE_VAURCA_BREEDER,BODYTYPE_VAURCA_WARFORM) var/global/list/clothing_choices /obj/item/clothing/gloves/chameleon/Initialize() diff --git a/code/modules/clothing/factions/dominia.dm b/code/modules/clothing/factions/dominia.dm index 39e43d0acbd..0fa27fc7071 100644 --- a/code/modules/clothing/factions/dominia.dm +++ b/code/modules/clothing/factions/dominia.dm @@ -117,6 +117,13 @@ icon_state = "dominia_bomber" item_state = "dominia_bomber" +/obj/item/clothing/suit/storage/toggle/dominia/bomber/long + name = "long fisanduhian bomber jacket" + desc = "A long bomber jacket based off of styles created by Fisanduhian refugees. The double-breasted design works well for insulating \ + heat, or concealing a small pistol." + icon_state = "dominia_bomber_long" + item_state = "dominia_bomber_long" + /obj/item/clothing/under/dominia name = "dominia suit" desc = "This is a suit in the style of Dominia nobility. It's the latest fashion across Dominian space." diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 1ecfb3232c7..458c3fb3d07 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -596,7 +596,7 @@ BLIND // can't see anything /obj/item/clothing/glasses/sunglasses/sechud name = "HUDsunglasses" - desc = "Sunglasses with a HUD." + desc = "Sunglasses in the colours of NanoTrasen security. They come with a blue-tinted HUD." icon_state = "sunhud" /obj/item/clothing/glasses/sunglasses/sechud/Initialize() @@ -607,6 +607,41 @@ BLIND // can't see anything /obj/item/clothing/glasses/sunglasses/sechud/is_sec_hud() return active +/obj/item/clothing/glasses/sunglasses/sechud/big + name = "fat HUDsunglasses" + desc = "Fat sunglasses in the colours of NanoTrasen security. They come with a blue-tinted HUD." + icon_state = "bigsunglasses_hud" + +/obj/item/clothing/glasses/sunglasses/sechud/zavod + name = "Zavodskoi HUDsunglasses" + desc = "Sunglasses in the colours of Zavodskoi Interstellar. They come with a red-tinted HUD." + icon_state = "sunhud_zavod" + +/obj/item/clothing/glasses/sunglasses/sechud/big/zavod + name = "fat Zavodskoi HUDsunglasses" + desc = "Fat sunglasses in the colours of Zavodskoi Interstellar. They come with a red-tinted HUD." + icon_state = "bigsunglasses_hud_zavod" + +/obj/item/clothing/glasses/sunglasses/sechud/epmc + name = "EPMC HUDsunglasses" + desc = "Sunglasses in the colours of the Eridani PMC organisation. They come with a blue-tinted HUD and a chrome finish." + icon_state = "sunhud_epmc" + +/obj/item/clothing/glasses/sunglasses/sechud/big/epmc + name = "fat EPMC HUDsunglasses" + desc = "Fat sunglasses in the colours of the Eridani PMC organisation. They come with a blue-tinted HUD and a chrome finish." + icon_state = "bigsunglasses_hud_epmc" + +/obj/item/clothing/glasses/sunglasses/sechud/idris + name = "Idris HUDsunglasses" + desc = "Sunglasses in the colours of Idris Incorporated. They come with a teal-tinted HUD and a chrome finish." + icon_state = "sunhud_idris" + +/obj/item/clothing/glasses/sunglasses/sechud/big/idris + name = "fat Idris HUDsunglasses" + desc = "Fat sunglasses in the colours of Idris Incorporated. They come with a teal-tinted HUD and a chrome finish." + icon_state = "bigsunglasses_hud_idris" + /obj/item/clothing/glasses/sunglasses/sechud/tactical name = "tactical HUD" desc = "Flash-resistant goggles with inbuilt combat and security information." @@ -623,7 +658,7 @@ BLIND // can't see anything /obj/item/clothing/glasses/sunglasses/sechud/aviator name = "HUD aviators" - desc = "Modified aviator glasses that can be switched between HUD and flash protection modes. Comes with bonus prescription overlay." + desc = "NanoTrasen security aviator glasses that can be switched between HUD and flash protection modes. They come with a built-in prescription overlay." flash_protection = FLASH_PROTECTION_NONE icon_state = "aviator_sec" off_state = "aviator_sec_off" @@ -677,6 +712,24 @@ BLIND // can't see anything attack_self(usr) +/obj/item/clothing/glasses/sunglasses/sechud/aviator/zavod + name = "Zavodskoi HUD aviators" + desc = "Zavodskoi security aviator glasses that can be switched between HUD and flash protection modes. They come with a built-in prescription overlay." + icon_state = "aviator_sec_zavod" + off_state = "aviator_sec_zavod_off" + +/obj/item/clothing/glasses/sunglasses/sechud/aviator/epmc + name = "EPMC HUD aviators" + desc = "Eridani PMC security aviator glasses that can be switched between HUD and flash protection modes. They come with a built-in prescription overlay." + icon_state = "aviator_sec_epmc" + off_state = "aviator_sec_epmc_off" + +/obj/item/clothing/glasses/sunglasses/sechud/aviator/idris + name = "Idris HUD aviators" + desc = "Idris security aviator glasses that can be switched between HUD and flash protection modes. They come with a built-in prescription overlay." + icon_state = "aviator_sec_idris" + off_state = "aviator_sec_idris_off" + /obj/item/clothing/glasses/thermal name = "optical thermal scanner" desc = "Thermals in the shape of glasses." diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 0928f963952..a445c1d4a5f 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -622,3 +622,15 @@ sprite_sheets = list( "Tajara" = 'icons/mob/species/tajaran/helmet.dmi' ) + +/obj/item/clothing/head/papersack + name = "paper sack hat" + desc = "A paper sack with crude holes cut out for eyes. Useful for hiding one's identity or ugliness." + icon_state = "papersack" + flags_inv = BLOCKHEADHAIR + +/obj/item/clothing/head/papersack/smiley + name = "paper sack hat" + desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all." + icon_state = "papersack_smile" + flags_inv = BLOCKHEADHAIR diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 7d7b7a93de7..733ff98b4dc 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -132,3 +132,14 @@ name = "eridani cap" desc = "A grey EPMC fatigue cap with the symbol of the Eridani Corporate Federation on its front. For amoral mercenaries that prefer style over protection." icon_state = "eridani" + +/obj/item/clothing/head/softcap/zavod + name = "zavodskoi cap" + desc = "A black company-issue Zavokdskoi cap with the symbol of the corporation at its front." + icon_state = "zavodb" + item_state = "zavodb" + +/obj/item/clothing/head/softcap/zavod/alt + desc = "A tan company-issue Zavokdskoi cap with the symbol of the corporation at its front." + icon_state = "zavod" + item_state = "zavod" \ No newline at end of file diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm index 467478cf340..dac9ca1e06d 100644 --- a/code/modules/clothing/masks/voice.dm +++ b/code/modules/clothing/masks/voice.dm @@ -38,3 +38,37 @@ /obj/item/clothing/mask/gas/voice/Initialize() . = ..() changer = new(src) + +/obj/item/clothing/mask/breath/vaurca/filter/voice + var/obj/item/voice_changer/changer + origin_tech = list(TECH_ILLEGAL = 4) + desc_antag = "A Lii'draic filter port that allows to change voices." + +/obj/item/clothing/mask/breath/vaurca/filter/voice/verb/Toggle_Voice_Changer() + set category = "Object" + set src in usr + + changer.active = !changer.active + to_chat(usr, SPAN_NOTICE("You [changer.active ? "enable" : "disable"] the voice-changing module in \the [src].")) + +/obj/item/clothing/mask/breath/vaurca/filter/voice/verb/Set_Voice(name as text) + set category = "Object" + set src in usr + + var/voice = sanitize(name, MAX_NAME_LEN) + if(!voice || !length(voice)) return + changer.voice = voice + to_chat(usr, SPAN_NOTICE("You are now mimicking [changer.voice].")) + +/obj/item/clothing/mask/breath/vaurca/filter/voice/verb/Toggle_Accent() + set category = "Object" + set src in usr + + var/choice = input(usr, "Please choose an accent to mimick.") as null|anything in SSrecords.accents + if(choice) + to_chat(usr, SPAN_NOTICE("You are now mimicking the [choice] accent.")) + changer.current_accent = choice + +/obj/item/clothing/mask/breath/vaurca/filter/voice/Initialize() + . = ..() + changer = new(src) \ No newline at end of file diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 91dd273bdff..3812db51bd8 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -1,5 +1,5 @@ /obj/item/clothing/suit/armor - allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/device/flashlight) + allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/device/flashlight,/obj/item/clothing/head/helmet) body_parts_covered = UPPER_TORSO|LOWER_TORSO item_flags = THICKMATERIAL diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 27e6348ae7a..d0dd12fc6fb 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -364,6 +364,12 @@ icon_state = "trenchcoat_grey" item_state = "trenchcoat_grey" +/obj/item/clothing/suit/storage/toggle/trench/green + name = "green trenchcoat" + desc = "A sleek canvas trenchcoat" + icon_state = "trenchcoat_green" + item_state = "trenchcoat_green" + /obj/item/clothing/suit/storage/toggle/trench/colorable name = "trenchcoat" desc = "A sleek canvas trenchcoat" diff --git a/code/modules/clothing/suits/modular_armor.dm b/code/modules/clothing/suits/modular_armor.dm index cf3026ac030..dfdc0734a68 100644 --- a/code/modules/clothing/suits/modular_armor.dm +++ b/code/modules/clothing/suits/modular_armor.dm @@ -204,6 +204,13 @@ icon_state = "helm_sec" item_state = "helm_sec" +/obj/item/clothing/head/helmet/security/skrell + name = "skrellmet" + desc = "A helmet built for use by a Skrell. This one appears to be fairly standard and reliable." + icon_state = "helm_skrell" + item_state = "helm_skrell" + valid_accessory_slots = null + /obj/item/clothing/head/helmet/security/heavy name = "corporate heavy helmet" desc = "A shiny and heavy helmet in corporate black! Goes well with the respective plate carrier." @@ -230,4 +237,4 @@ laser = ARMOR_LASER_RIFLE, energy = ARMOR_ENERGY_SMALL, bomb = ARMOR_BOMB_PADDED, - ) \ No newline at end of file + ) diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index f607f0de58f..dbb79dc1555 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -7,6 +7,7 @@ var/sound_in = 'sound/weapons/holster/holsterin.ogg' var/sound_out = 'sound/weapons/holster/holsterout.ogg' flippable = 1 + w_class = ITEMSIZE_NORMAL var/base_name = "" /obj/item/clothing/accessory/holster/Initialize() diff --git a/code/modules/clothing/under/accessories/shirts.dm b/code/modules/clothing/under/accessories/shirts.dm index ef0d740f316..5e11c6433ff 100644 --- a/code/modules/clothing/under/accessories/shirts.dm +++ b/code/modules/clothing/under/accessories/shirts.dm @@ -126,6 +126,12 @@ icon_state = "dressshirt_alt" item_state = "dressshirt_alt" +/obj/item/clothing/accessory/dressshirt/alt/vneck + name = "v-neck dress shirt" + desc = "A casual dress shirt." + icon_state = "dressshirtvneck_alt" + item_state = "dressshirtvneck_alt" + /obj/item/clothing/accessory/dressshirt/crop name = "cropped dress shirt" desc = "A casual cropped dress shirt." @@ -145,6 +151,12 @@ icon_state = "dressshirt_alt_r" item_state = "dressshirt_alt_r" +/obj/item/clothing/accessory/dressshirt/alt/vneck/rolled + name = "v-neck dress shirt" + desc = "A casual dress shirt." + icon_state = "dressshirtvneck_alt_r" + item_state = "dressshirtvneck_alt_r" + /obj/item/clothing/accessory/dressshirt/crop/rolled name = "cropped dress shirt" desc = "A casual cropped dress shirt. This one has its sleeves rolled up" diff --git a/code/modules/clothing/under/accessories/xeno/tajara.dm b/code/modules/clothing/under/accessories/xeno/tajara.dm index fa3094b8d28..a6ba3f0772a 100644 --- a/code/modules/clothing/under/accessories/xeno/tajara.dm +++ b/code/modules/clothing/under/accessories/xeno/tajara.dm @@ -251,7 +251,7 @@ item_state = "rosette" flippable = FALSE -/obj/item/clothing/accessory/tajara/council_badge +/obj/item/clothing/accessory/tajaran/council_badge name = "free tajaran council badge" desc = "A medal badge used by the members of the Free Tajaran Council." icon_state = "council_badge" diff --git a/code/modules/cooking/recipes/cultural/recipes_unathi.dm b/code/modules/cooking/recipes/cultural/recipes_unathi.dm index 51b8646fff7..3fc28ff52da 100644 --- a/code/modules/cooking/recipes/cultural/recipes_unathi.dm +++ b/code/modules/cooking/recipes/cultural/recipes_unathi.dm @@ -92,3 +92,60 @@ ) fruit = list("cabbage" = 1) result = /obj/item/reagent_containers/food/snacks/sliceable/sushi_roll + +/decl/recipe/batwings + appliance = SKILLET | SAUCEPAN + fruit = list("chili" = 2) + items = list( + /obj/item/reagent_containers/food/snacks/meat/bat, + /obj/item/reagent_containers/food/snacks/meat/bat, + /obj/item/reagent_containers/food/snacks/spreads/butter + ) + result = /obj/item/reagent_containers/food/snacks/batwings + +/decl/recipe/jellystew + appliance = POT + fruit = list("chili" = 2) + reagents = list(/decl/reagent/water = 10) + items = list( + /obj/item/reagent_containers/food/snacks/fish/cosmozoan, + /obj/item/reagent_containers/food/snacks/cutlet, + /obj/item/reagent_containers/food/snacks/spreads/butter + ) + result = /obj/item/reagent_containers/food/snacks/jellystew + +/decl/recipe/stuffedfish + appliance = SKILLET | SAUCEPAN + items = list( + /obj/item/reagent_containers/food/snacks/fish/fishfillet, + /obj/item/reagent_containers/food/snacks/fish/roe, + /obj/item/reagent_containers/food/snacks/cheesewedge + ) + result = /obj/item/reagent_containers/food/snacks/stuffedfish + +/decl/recipe/stuffedcarp + appliance = SKILLET | SAUCEPAN + items = list( + /obj/item/reagent_containers/food/snacks/fish/carpmeat, + /obj/item/reagent_containers/food/snacks/fish/roe, + /obj/item/reagent_containers/food/snacks/cheesewedge + ) + result = /obj/item/reagent_containers/food/snacks/stuffedcarp + +/decl/recipe/razirnoodles + appliance = SKILLET | SAUCEPAN + fruit = list("lime" = 1) + reagents = list(/decl/reagent/sodiumchloride = 1) + items = list( + /obj/item/reagent_containers/food/snacks/dwellermeat, + /obj/item/reagent_containers/food/snacks/egg + ) + result = /obj/item/reagent_containers/food/snacks/razirnoodles + +/decl/recipe/sintapudding + appliance = SAUCEPAN | POT + reagents = list(/decl/reagent/blood = 15, /decl/reagent/sugar = 10, /decl/reagent/nutriment/coco = 5) + items = list( + /obj/item/reagent_containers/food/snacks/spreads/butter + ) + result = /obj/item/reagent_containers/food/snacks/sintapudding \ No newline at end of file diff --git a/code/modules/cooking/recipes/recipes_fryer.dm b/code/modules/cooking/recipes/recipes_fryer.dm index c24b9b891ff..3398c4143fd 100644 --- a/code/modules/cooking/recipes/recipes_fryer.dm +++ b/code/modules/cooking/recipes/recipes_fryer.dm @@ -166,3 +166,11 @@ /obj/item/reagent_containers/food/snacks/xenomeat ) result = /obj/item/reagent_containers/food/snacks/wingfangchu + +/decl/recipe/roefritters + appliance = FRYER + reagents = list(/decl/reagent/nutriment/coating/batter = 10) + items = list( + /obj/item/reagent_containers/food/snacks/fish/roe + ) + result = /obj/item/reagent_containers/food/snacks/roefritters \ No newline at end of file diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index acd519450f8..b42f9831c3d 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -2126,3 +2126,11 @@ All custom items with worn sprites must follow the contained sprite system: http icon_state = "pax_bag" item_state = "pax_bag" contained_sprite = TRUE + +/obj/item/journal/fluff/kathira // Blue Leather-Bound Journal - Kathira El-Hashem - TheGreyWolf + name = "blue leather-bound journal" + desc = "A blue journal emblazoned with the New Kingdom of Adhomai's flag across the cover." + closed_desc = " The pages within are a mix of clearly indexed case files, and study notes alongside less clearly indexed pages that appears to be fragmented thoughts, not unlike a diary. The very first page of the journal reads “dedicated to Qirandri Mrorirhaldarr” and is signed “Mrradar Sanufar” underneath." + icon = 'icons/obj/custom_items/kathira_journal.dmi' + icon_state = "kath_journal" + item_state = "kath_journal" \ No newline at end of file diff --git a/code/modules/heavy_vehicle/equipment/combat.dm b/code/modules/heavy_vehicle/equipment/combat.dm index be450a971fb..930d13465cc 100644 --- a/code/modules/heavy_vehicle/equipment/combat.dm +++ b/code/modules/heavy_vehicle/equipment/combat.dm @@ -7,6 +7,14 @@ restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND, HARDPOINT_LEFT_SHOULDER, HARDPOINT_RIGHT_SHOULDER) restricted_software = list(MECH_SOFTWARE_WEAPONS) +/obj/item/mecha_equipment/mounted_system/combat/CtrlClick(mob/user) + if(owner && istype(holding, /obj/item/gun)) + var/obj/item/gun/G = holding + G.iff_capable = !G.iff_capable + to_chat(user, SPAN_NOTICE("You [G.iff_capable ? "en" : "dis"]able \the [src]'s IFF systems!")) + else + return ..() + /obj/item/mecha_equipment/mounted_system/combat/taser name = "mounted electrolaser carbine" desc = "A dual fire mode electrolaser system connected to the exosuit's targetting system." @@ -30,7 +38,7 @@ name = "mounted machinegun" desc = "An exosuit-mounted automatic weapon. Handle with care." icon_state = "mecha_ballistic" - holding_type = /obj/item/gun/energy/mountedsmg + holding_type = /obj/item/gun/energy/mountedsmg/mech /obj/item/mecha_equipment/mounted_system/combat/pulse name = "heavy pulse cannon" @@ -72,16 +80,19 @@ use_external_power = TRUE self_recharge = TRUE has_safety = FALSE + projectile_type = /obj/item/projectile/beam/midlaser/mech /obj/item/gun/energy/pulse/mounted/mech use_external_power = TRUE self_recharge = TRUE has_safety = FALSE + projectile_type = /obj/item/projectile/beam/pulse/mech /obj/item/gun/energy/xray/mounted/mech use_external_power = TRUE self_recharge = TRUE has_safety = FALSE + projectile_type = /obj/item/projectile/beam/xray/mech /*Launchers*/ diff --git a/code/modules/heavy_vehicle/mech_helpers.dm b/code/modules/heavy_vehicle/mech_helpers.dm index 49fa2a9d6a3..a63a4a38f0d 100644 --- a/code/modules/heavy_vehicle/mech_helpers.dm +++ b/code/modules/heavy_vehicle/mech_helpers.dm @@ -114,4 +114,10 @@ else animate(get_filter("INCORPBLUR"), time = 1 SECOND, size = 1, flags = ANIMATION_PARALLEL) animate(src, time = 1 SECOND, alpha = initial(alpha), flags = ANIMATION_PARALLEL) - remove_filter("INCORPBLUR") \ No newline at end of file + remove_filter("INCORPBLUR") + +/mob/living/heavy_vehicle/get_organ_name_from_zone(var/def_zone) + var/obj/item/mech_component/MC = zoneToComponent(def_zone) + if(MC) + return MC.name + return ..() \ No newline at end of file diff --git a/code/modules/item_worth/reagents.dm b/code/modules/item_worth/reagents.dm index ca8ac4cbab4..b74b266095f 100644 --- a/code/modules/item_worth/reagents.dm +++ b/code/modules/item_worth/reagents.dm @@ -384,6 +384,9 @@ /decl/reagent/alcohol/screwdrivercocktail value = 0.13 +/decl/reagent/alcohol/sidewinderfang + value = 0.14 + /decl/reagent/alcohol/silencer value = 0.135 diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index 69ae579da0e..74e276fcc06 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -295,7 +295,7 @@ var/list/worths = list( /obj/item/card/id/silver = 200, /obj/item/card/id/gold = 5000, /obj/item/card/id/captains_spare = 5000, - /obj/item/card/id/syndicate_command = 7000, + /obj/item/card/id/syndicate/command = 7000, /obj/item/card/id/centcom = 7000, /obj/item/card/id/all_access = 10000, /obj/item/card/id = 30, diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 39663e46848..95b2b9674f2 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -186,6 +186,7 @@ new /datum/stack_recipe("candle pack", /obj/item/storage/box/fancy/candle_box/empty), new /datum/stack_recipe("crayon box", /obj/item/storage/box/fancy/crayons/empty), new /datum/stack_recipe("pizza box", /obj/item/pizzabox), + new /datum/stack_recipe("papersack", /obj/item/storage/box/papersack), new /datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), new /datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg) )) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 4fef7f588e1..e31abc45a56 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -3,7 +3,6 @@ desc_info = "Use in your hand to bring up the recipe menu. If you have enough sheets, click on something on the list to build it." force = 5 throwforce = 5 - flags = HELDMAPTEXT w_class = ITEMSIZE_NORMAL throw_speed = 3 throw_range = 3 @@ -17,7 +16,7 @@ var/use_material_sound = TRUE /obj/item/stack/material/Initialize(mapload, amount) - ..() + . = ..() randpixel_xy() if(!default_type) @@ -43,10 +42,6 @@ flags |= CONDUCT matter = material.get_matter() - return INITIALIZE_HINT_LATELOAD - -/obj/item/stack/material/LateInitialize() - update_strings() /obj/item/stack/material/get_material() return material @@ -63,20 +58,21 @@ name = "[material.use_name] [material.sheet_singular_name]" desc = "A [material.sheet_singular_name] of [material.use_name]." gender = NEUTER - check_maptext(SMALL_FONTS(7, get_amount())) -/obj/item/stack/material/use(var/used) +/obj/item/stack/material/update_icon() . = ..() - update_strings() - return + if(material) + update_strings() /obj/item/stack/material/transfer_to(obj/item/stack/S, var/tamount=null, var/type_verified) var/obj/item/stack/material/M = S if(!istype(M) || material.name != M.material.name) return 0 var/transfer = ..(S,tamount,1) - if(src) update_strings() - if(M) M.update_strings() + if(src) + update_icon() + if(M) + M.update_icon() return transfer /obj/item/stack/material/attack_self(var/mob/user) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 779ac435b17..24ab3716446 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -1348,12 +1348,11 @@ var/list/total_extraction_beacons = list() icon_state = "punchingbag" anchored = TRUE layer = 5.1 - var/list/hit_sounds = list("swing_hit", "punch") /obj/structure/punching_bag/attack_hand(mob/user as mob) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) flick("[icon_state]2", src) - playsound(get_turf(src), pick(src.hit_sounds), 25, 1, -1) + playsound(get_turf(src), /decl/sound_category/swing_hit_sound, 25, 1, -1) /obj/structure/weightlifter name = "weight machine" diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 338e19b3a67..07ffa4c8887 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -1,5 +1,6 @@ /mob/living/silicon/robot/drone/mining name = "NT-MD-000" + desc_flavor = "It's a small mining drone. The casing is stamped with an corporate logo and the subscript: '%MAPNAME% Automated Pickaxe!'

OOC Info:

Mining drones are player-controlled synthetics which are lawed to serve the crew and excavate for ore.

They hold a wide array of tools to explore mining sites and extract ore. They function similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, such as fire, radiation, vacuum, and more.

Ghosts can join the round as a mining drone by accessing the 'Ghost Spawner' menu in the 'Ghost' tab. An inactive drone can be rebooted by swiping an ID card on it with mining or robotics access, and an active drone can be shut down in the same manner.

An antagonist can use an Electromagnetic Sequencer to corrupt their laws and make them follow their orders." icon_state = "miningdrone" mod_type = "Mining" law_type = /datum/ai_laws/mining_drone @@ -61,16 +62,6 @@ output_text += " a jackhammer drill mounted to it." to_chat(user, SPAN_NOTICE(output_text)) -/mob/living/silicon/robot/drone/mining/init() - ai_camera = new /obj/item/device/camera/siliconcam/drone_camera(src) - if(!laws) - laws = new law_type - if(!module) - module = new module_type(src, src) - - flavor_text = "It's a tiny little mining drone. The casing is stamped with an corporate logo and the subscript: '[current_map.company_name] Automated Pickaxe!'" - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) - /mob/living/silicon/robot/drone/mining/request_player() if(too_many_active_drones()) return @@ -106,6 +97,10 @@ if(!allowed(user)) to_chat(user, SPAN_WARNING("Access denied.")) return + if(ckey || client) + user.visible_message(SPAN_WARNING("\The [user] swipes [user.get_pronoun("his")] ID card through \the [src] shutting it down."), SPAN_NOTICE("You swipe your ID over \the [src], shutting it down! You can swipe it again to make it search for a new intelligence.")) + shut_down() + return if(seeking_player) to_chat(user, SPAN_WARNING("\The [src] is already in the reboot process.")) return diff --git a/code/modules/mob/abstract/new_player/sprite_accessories.dm b/code/modules/mob/abstract/new_player/sprite_accessories.dm index 2f877b98083..4cd19aad0e3 100644 --- a/code/modules/mob/abstract/new_player/sprite_accessories.dm +++ b/code/modules/mob/abstract/new_player/sprite_accessories.dm @@ -178,7 +178,7 @@ Follow by example and make good judgement based on length which list to include name = "Bedhead 3" icon_state = "hair_bedhead3" chatname = "wavy hair" - + bedhead4 name = "Bedhead 4" icon_state = "hair_bedhead4" @@ -1334,6 +1334,11 @@ Follow by example and make good judgement based on length which list to include icon_state = "hair_wheeler" chatname = "short hair" + fingerwave + name = "Fingerwave" + icon_state = "hair_fingercurl" + chatname = "fluffy hair" + bug_eyes icon = 'icons/mob/human_face/dionae_hair.dmi' name = "Bug Eyes" @@ -1727,6 +1732,8 @@ Follow by example and make good judgement based on length which list to include /datum/sprite_accessory/hair_gradients icon = 'icons/mob/hair_gradients.dmi' + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie, + /datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) none name = "None" @@ -1765,7 +1772,7 @@ Follow by example and make good judgement based on length which list to include taj_inner_ear_fur name = "Inner Ear Fur" icon_state = "taj_innerearfur" - species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan) + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan, /datum/species/zombie/tajara) taj_msai_inner_ear_fur name = "M'sai Inner Ear Fur" @@ -4146,7 +4153,7 @@ Follow by example and make good judgement based on length which list to include lopsided name = "Lopsided" icon_state = "lopsided" - + helmethead name = "Helmethead" icon_state = "helmethead" diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index f6c9ac57b2b..b4116c2928a 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -663,7 +663,19 @@ var/list/holder_mob_icon_cache = list() /obj/item/holder/schlorrgo name = "schlorrgo" - icon = 'icons/mob/npc/livestock.dmi' + icon = 'icons/mob/npc/schlorrgo.dmi' icon_state = "schlorgo" item_state = "schlorgo" w_class = ITEMSIZE_NORMAL + +/obj/item/holder/schlorrgo/baby + name = "schlorrgo hatchling" + icon_state = "schlorrgo_baby" + item_state = "schlorrgo_baby" + w_class = ITEMSIZE_SMALL + +/obj/item/holder/schlorrgo/fat + name = "fat schlorrgo" + icon_state = "schlorrgo_fat" + item_state = "schlorrgo_fat" + w_class = ITEMSIZE_LARGE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 53c4c9dfb72..c6f4aca1a4c 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -16,6 +16,8 @@ to_chat(usr, SPAN_WARNING("You don't have anything in your hands to give to \the [target].")) return + usr.visible_message(SPAN_NOTICE("\The [usr] holds out \the [I] to \the [target]."), SPAN_NOTICE("You hold out \the [I] to \the [target], waiting for them to accept it.")) + if(alert(target,"[usr] wants to give you \a [I]. Will you accept it?",,"Yes","No") == "No") target.visible_message("[target] pushes [usr]'s hand away.") return diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 15f2374e3d0..906e0b5f3e5 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -309,8 +309,14 @@ return TRUE return FALSE +/mob/living/carbon/human/get_organ_name_from_zone(var/def_zone) + var/obj/item/organ/external/E = organs_by_name[parse_zone(def_zone)] + if(E) + return E.name + return ..() + /mob/living/carbon/human/is_anti_materiel_vulnerable() if(isSynthetic()) return TRUE else - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/mob/living/carbon/human/species/outsider/revenant.dm b/code/modules/mob/living/carbon/human/species/outsider/revenant.dm index f0b8eb7f7a2..d3e77b13bb0 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/revenant.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/revenant.dm @@ -26,7 +26,6 @@ unarmed_types = list(/datum/unarmed_attack/claws/shredding) darksight = 8 - has_organ = list() siemens_coefficient = 0 rarity_value = 10 @@ -65,6 +64,10 @@ vision_flags = DEFAULT_SIGHT | SEE_MOBS + has_organ = list( + BP_EYES = /obj/item/organ/internal/eyes/night/revenant + ) + has_limbs = list( BP_CHEST = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), @@ -86,7 +89,6 @@ inherent_verbs = list( /mob/living/carbon/human/proc/shatter_light, - /mob/living/carbon/human/proc/darkness_eyes, /mob/living/carbon/human/proc/dissolve ) @@ -138,4 +140,15 @@ if((istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) && prob(20)) H.visible_message(SPAN_CULT("The [P.name] gets absorbed by [H]!"), SPAN_CULT("You absorb the [P.name]!")) return -1 - return ..() \ No newline at end of file + return ..() + +/obj/item/organ/internal/eyes/night/revenant + name = "spectral eyes" + desc = "A pair of glowing eyes. The ocular nerves still slowly writhe." + icon_state = "revenant_eyes" + eye_emote = null + vision_color = null + default_action_type = /datum/action/item_action/organ/night_eyes/rev + +/obj/item/organ/internal/eyes/night/revenant/flash_act() + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm index 08fc4e87dfb..939739febc0 100644 --- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm +++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm @@ -111,6 +111,7 @@ ) stamina = -1 // Machines use power and generate heat, stamina is not a thing sprint_speed_factor = 1 // About as capable of speed as a human + sprint_cost_factor = 1.5 max_hydration_factor = -1 max_nutrition_factor = -1 @@ -127,15 +128,21 @@ // Special snowflake machine vars. var/sprint_temperature_factor = 1.15 - var/sprint_charge_factor = 0.65 + var/move_charge_factor = 1 /datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H) . = ..() check_tag(H, H.client) + var/obj/item/organ/internal/cell/C = H.internal_organs_by_name[BP_CELL] + if(C) + C.move_charge_factor = move_charge_factor /datum/species/machine/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost, var/pre_move) if(!pre_move && H.stat == CONSCIOUS) H.bodytemperature += cost * sprint_temperature_factor + var/obj/item/organ/internal/cell/C = H.internal_organs_by_name[BP_CELL] + if(C) + C.use(cost * sprint_cost_factor) return TRUE /datum/species/machine/handle_emp_act(mob/living/carbon/human/H, var/severity) diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm index e189d00d1d2..07ff7e96ae9 100644 --- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm @@ -64,7 +64,7 @@ character_color_presets = list("Dark" = "#000000", "Warm" = "#250302", "Cold" = "#1e1e29") sprint_temperature_factor = 1.3 - sprint_charge_factor = 0.85 + move_charge_factor = 0.85 inherent_verbs = list( /mob/living/carbon/human/proc/self_diagnostics, @@ -175,7 +175,7 @@ sprint_speed_factor = 1.4 sprint_temperature_factor = 0.9 - sprint_charge_factor = 1.1 + move_charge_factor = 1.1 inherent_verbs = list( /mob/living/carbon/human/proc/self_diagnostics, @@ -279,10 +279,11 @@ ) stamina = -1 sprint_speed_factor = 1.25 + sprint_cost_factor = 1 slowdown = 1 sprint_temperature_factor = 0.6 - sprint_charge_factor = 0.3 + move_charge_factor = 0.3 /datum/species/machine/terminator/get_light_color() return @@ -429,7 +430,11 @@ eyes = "zenghu_eyes" brute_mod = 1.5 - sprint_speed_factor = 1.5 + + slowdown = -0.8 + sprint_speed_factor = 0.6 + sprint_cost_factor = 2 + move_charge_factor = 2 grab_mod = 1.1 // Smooth, fast resist_mod = 4 // Not super strong, but still rather strong @@ -437,8 +442,6 @@ allowed_accents = list(ACCENT_CETI, ACCENT_GIBSON, ACCENT_SOL, ACCENT_COC, ACCENT_ERIDANI, ACCENT_ERIDANIDREG, ACCENT_ELYRA, ACCENT_KONYAN, ACCENT_JUPITER, ACCENT_MARTIAN, ACCENT_LUNA, ACCENT_HIMEO, ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_PHONG, ACCENT_SILVERSUN_EXPATRIATE, ACCENT_TTS, ACCENT_EUROPA, ACCENT_EARTH, ACCENT_ASSUNZIONE) - slowdown = -1.2 - appearance_flags = HAS_EYE_COLOR | HAS_UNDERWEAR | HAS_SOCKS examine_color = "#ff00ff" @@ -480,7 +483,6 @@ eyes = "bishop_eyes" eyes_icon_blend = ICON_MULTIPLY - sprint_charge_factor = 0.25 brute_mod = 1.2 grab_mod = 1.1 diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm index 97f297e0c19..a69b0eeaa73 100644 --- a/code/modules/mob/living/carbon/human/stripping.dm +++ b/code/modules/mob/living/carbon/human/stripping.dm @@ -6,6 +6,15 @@ user << browse(null, text("window=mob[src.name]")) return FALSE + if(ishuman(user)) + // If you're a human and don't have hands, you shouldn't be able to strip someone. + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/l_hand = H.get_organ(BP_L_HAND) + var/obj/item/organ/external/r_hand = H.get_organ(BP_R_HAND) + if(!(l_hand && l_hand.is_usable()) && !(r_hand && r_hand.is_usable())) + to_chat(user, SPAN_WARNING("You can't do that without working hands!")) + return FALSE + var/obj/item/target_slot = get_equipped_item(text2num(slot_to_strip)) if(istype(target_slot, /obj/item/clothing/ears/offear)) target_slot = (l_ear == target_slot ? r_ear : l_ear) diff --git a/code/modules/mob/living/carbon/human/virtual_reality_mob.dm b/code/modules/mob/living/carbon/human/virtual_reality_mob.dm new file mode 100644 index 00000000000..4813d814523 --- /dev/null +++ b/code/modules/mob/living/carbon/human/virtual_reality_mob.dm @@ -0,0 +1,5 @@ +//this human mob is to be used in virtual reality, typically in their own environment where they won't interact with the rest of the world + +/mob/living/carbon/human/virtual_reality/death(gibbed)//the body is deleted when you die to simulate your virtual avatar being deleted + ..() + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 092f22fb4da..4f9cd45991a 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -260,7 +260,7 @@ burn += burn_amt total_dam = brute + burn if(total_dam >= max_dam) - var/obj/item/circuitboard/broken/broken_device = new(get_turf(src)) + var/obj/item/trash/broken_electronics/broken_device = new(get_turf(src)) if(icon_state_broken != "broken") broken_device.icon = src.icon broken_device.icon_state = icon_state_broken diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index fb4e9017d86..40b71f019c1 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -21,12 +21,7 @@ /mob/living/silicon/robot/drone // Look and feel name = "maintenance drone" - desc_info = "Drones are player-controlled synthetics which are lawed to maintain the station and not \ - interact with anyone else, except for other drones. They hold a wide array of tools to build, repair, maintain, and clean. \ - They fuction similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, \ - such as fire, radiation, vacuum, and more. Ghosts can join the round as a maintenance drone by using the appropriate verb in the 'ghost' tab. \ - An inactive drone can be rebooted by swiping an ID card on it with engineering or robotics access, and an active drone can be shut down in the same manner." - desc_antag = "An Electromagnetic Sequencer can be used to subvert the drone to your cause." + var/desc_flavor = "It's a tiny little repair drone. The casing is stamped with an corporate logo and the subscript: '%MAPNAME% Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'

OOC Info:

Drones are player-controlled synthetics which are lawed to maintain the station and not interact with anyone else, except for other drones.

They hold a wide array of tools to build, repair, maintain, and clean. They function similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, such as fire, radiation, vacuum, and more.

Ghosts can join the round as a maintenance drone by accessing the 'Ghost Spawner' menu in the 'Ghost' tab. An inactive drone can be rebooted by swiping an ID card on it with engineering or robotics access, and an active drone can be shut down in the same manner.

An antagonist can use an Electromagnetic Sequencer to corrupt their laws and make them follow their orders." icon = 'icons/mob/robots.dmi' icon_state = "repairbot" braintype = "Robot" @@ -79,6 +74,7 @@ var/hat_x_offset = 0 var/hat_y_offset = -13 + var/can_swipe = TRUE var/rebooting = FALSE /mob/living/silicon/robot/drone/can_be_possessed_by(var/mob/abstract/observer/possessor) @@ -122,6 +118,7 @@ /mob/living/silicon/robot/drone/construction // Look and feel name = "construction drone" + desc_flavor = "It's a bulky construction drone stamped with a NanoTrasen glyph." icon_state = "constructiondrone" // Components @@ -131,7 +128,7 @@ law_type = /datum/ai_laws/construction_drone // Interaction - can_pull_size = 5 + can_pull_size = ITEMSIZE_IMMENSE can_pull_mobs = MOB_PULL_SAME holder_type = /obj/item/holder/drone/heavy @@ -141,14 +138,44 @@ var/my_home_z +/mob/living/silicon/robot/drone/construction/Initialize() + . = ..() + var/turf/T = get_turf(src) + my_home_z = T.z + +/mob/living/silicon/robot/drone/construction/welcome_drone() + to_chat(src, SPAN_NOTICE("You are a construction drone, an autonomous engineering and fabrication system..")) + to_chat(src, SPAN_NOTICE("You are assigned to a NanoTrasen construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible.")) + to_chat(src, SPAN_NOTICE("Use :d to talk to other drones and say to speak silently to your nearby fellows.")) + to_chat(src, SPAN_NOTICE("You do not follow orders from anyone; not the AI, not humans, and not other synthetics..")) + +/mob/living/silicon/robot/drone/construction/process_level_restrictions() + //Abort if they should not get blown + if(lock_charge || scrambled_codes || emagged) + return FALSE + //Check if they are not on a station level -> else abort + var/turf/T = get_turf(src) + if (!T || AreConnectedZLevels(my_home_z, T.z)) + return FALSE + + if(!self_destructing) + to_chat(src, SPAN_DANGER("WARNING: Removal from [current_map.company_name] property detected. Anti-Theft mode activated.")) + start_self_destruct(TRUE) + return TRUE + /mob/living/silicon/robot/drone/construction/matriarch name = "matriarch drone" + desc_flavor = "It's a small matriarch drone. The casing is stamped with an corporate logo and the subscript: '%MAPNAME% Recursive Repair Systems: Heart Of The Swarm!'

OOC Info:

Matriarch drones are player-controlled synthetics which are lawed to maintain the station and not interact with anyone else, except for other drones. They are in command of all the smaller maintenance drones.

They hold a wide array of tools to build, repair, maintain, and clean. They function similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, such as fire, radiation, vacuum, and more.

Ghosts can join the round as a matriarch drone by having a Command whitelist and accessing the 'Ghost Spawner' menu in the 'Ghost' tab.

An antagonist can use an Electromagnetic Sequencer to corrupt their laws and make them follow their orders." law_type = /datum/ai_laws/matriarch_drone + can_swipe = FALSE /mob/living/silicon/robot/drone/construction/matriarch/Initialize() . = ..() check_add_to_late_firers() +/mob/living/silicon/robot/drone/construction/matriarch/shut_down() + return + /mob/living/silicon/robot/drone/construction/matriarch/assign_player(mob/user) . = ..() SSghostroles.remove_spawn_atom("matriarchmaintdrone", src) @@ -202,7 +229,7 @@ module = new module_type(src, src) recalculate_synth_capacities() - flavor_text = "It's a tiny little repair drone. The casing is stamped with an corporate logo and the subscript: '[current_map.company_name] Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'" + flavor_text = replacetext(desc_flavor, "%MAPNAME%", current_map.company_name) playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0) //Redefining some robot procs... @@ -264,6 +291,9 @@ to_chat(user, SPAN_WARNING("\The [src] is hermetically sealed. You can't open the case.")) return else if(W.GetID() || istype(W, /obj/item/card/robot)) + if(!can_swipe) + to_chat(user, SPAN_WARNING("\The [src] doesn't have an ID swipe interface.")) + return if(stat == DEAD) if(!config.allow_drone_spawn || emagged || health < -maxHealth) //It's dead, Dave. to_chat(user, SPAN_WARNING("The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.")) @@ -278,10 +308,10 @@ request_player() return else - user.visible_message(SPAN_WARNING("\The [user] swipes [user.get_pronoun("his")] ID card through \the [src], attempting to shut it down."), SPAN_WARNING("You swipe your ID card through \the [src], attempting to shut it down.")) if(emagged) return if(allowed(user)) + user.visible_message(SPAN_WARNING("\The [user] swipes [user.get_pronoun("his")] ID card through \the [src] shutting it down."), SPAN_NOTICE("You swipe your ID over \the [src], shutting it down! You can swipe it again to make it search for a new intelligence.")) shut_down() else to_chat(user, SPAN_WARNING("Access denied.")) @@ -500,32 +530,6 @@ /mob/living/silicon/robot/drone/set_respawn_time() set_death_time(MINISYNTH, world.time) -/mob/living/silicon/robot/drone/construction/Initialize() - . = ..() - var/turf/T = get_turf(src) - my_home_z = T.z - flavor_text = "It's a bulky construction drone stamped with a NanoTrasen glyph." - -/mob/living/silicon/robot/drone/construction/welcome_drone() - to_chat(src, SPAN_NOTICE("You are a construction drone, an autonomous engineering and fabrication system..")) - to_chat(src, SPAN_NOTICE("You are assigned to a NanoTrasen construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible.")) - to_chat(src, SPAN_NOTICE("Use :d to talk to other drones and say to speak silently to your nearby fellows.")) - to_chat(src, SPAN_NOTICE("You do not follow orders from anyone; not the AI, not humans, and not other synthetics..")) - -/mob/living/silicon/robot/drone/construction/process_level_restrictions() - //Abort if they should not get blown - if(lock_charge || scrambled_codes || emagged) - return FALSE - //Check if they are not on a station level -> else abort - var/turf/T = get_turf(src) - if (!T || AreConnectedZLevels(my_home_z, T.z)) - return FALSE - - if(!self_destructing) - to_chat(src, SPAN_DANGER("WARNING: Removal from [current_map.company_name] property detected. Anti-Theft mode activated.")) - start_self_destruct(TRUE) - return TRUE - /proc/too_many_active_drones() var/drones = 0 for(var/mob/living/silicon/robot/drone/D in mob_list) diff --git a/code/modules/mob/living/silicon/robot/items/gripper.dm b/code/modules/mob/living/silicon/robot/items/gripper.dm index e4d82d8e0d1..189739c5627 100644 --- a/code/modules/mob/living/silicon/robot/items/gripper.dm +++ b/code/modules/mob/living/silicon/robot/items/gripper.dm @@ -29,6 +29,8 @@ /obj/item/gift ) + var/list/cant_hold + var/obj/item/wrapped var/force_holder @@ -55,18 +57,17 @@ /obj/item/gripper/proc/grip_item(var/obj/item/I, var/mob/user, var/feedback = 1) //This function returns 1 if we successfully took the item, or 0 if it was invalid. This information is useful to the caller if(!wrapped) - for(var/typepath in can_hold) - if(istype(I,typepath)) - if(feedback) - to_chat(user, SPAN_NOTICE("You collect \the [I].")) - if(isturf(I.loc) && I.Adjacent(user)) - I.do_pickup_animation(user) - I.forceMove(src) - wrapped = I - wrapped.pixel_x = 0 - wrapped.pixel_y = 0 - update_icon() - return TRUE + if((can_hold && is_type_in_list(I, can_hold)) || (cant_hold && !is_type_in_list(I, cant_hold))) + if(feedback) + to_chat(user, SPAN_NOTICE("You collect \the [I].")) + if(isturf(I.loc) && I.Adjacent(user)) + I.do_pickup_animation(user) + I.forceMove(src) + wrapped = I + wrapped.pixel_x = 0 + wrapped.pixel_y = 0 + update_icon() + return TRUE if(feedback) to_chat(user, SPAN_WARNING("Your gripper cannot hold \the [I].")) return FALSE @@ -320,3 +321,16 @@ /obj/item/stack/material, /obj/item/stack/tile ) + +/obj/item/gripper/multi_purpose + name = "multi-purpose gripper" + desc = "An articulate gripper suited to carrying a wide variety of objects you could encounter on a space-faring vessel." + can_hold = null + cant_hold = list( + /obj/item/stack, + /obj/item/gun, + /obj/item/clothing, + /obj/item/storage, + /obj/item/modular_computer, + /obj/item/card/id + ) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 02f6c861fd2..3182883bcc6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -208,8 +208,8 @@ mult += storage.rating for(var/datum/matter_synth/M in module.synths) M.set_multiplier(mult) - for(var/obj/item/stack/material/SM in module.modules) - SM.update_strings() + for(var/obj/item/stack/SM in module.modules) + SM.update_icon() /mob/living/silicon/robot/proc/init() ai_camera = new /obj/item/device/camera/siliconcam/robot_camera(src) @@ -346,7 +346,6 @@ else braintype = "Cyborg" - var/changed_name = "" if(custom_name) changed_name = custom_name @@ -354,22 +353,7 @@ else changed_name = "[mod_type] [braintype]-[rand(1, 999)]" - real_name = changed_name - name = real_name - if(mmi) - mmi.brainmob.name = src.name - mmi.brainmob.real_name = src.name - mmi.name = "[initial(mmi.name)]: [src.name]" - - // We also need to update our internal ID - if(id_card) - id_card.assignment = prefix - id_card.registered_name = changed_name - id_card.update_name() - - //We also need to update name of internal camera. - if(camera) - camera.c_tag = changed_name + set_name(changed_name, prefix) if(!custom_sprite) //Check for custom sprite set_custom_sprite() @@ -493,6 +477,15 @@ to_chat(src, SPAN_NOTICE("You [C.toggled ? "disable" : "enable"] [C.name].")) C.toggled = !C.toggled +/mob/living/silicon/robot/verb/rebuild_overlays() + set category = "Robot Commands" + set name = "Rebuild Overlays" + set desc = "An OOC tool that rebuilds your overlays, useful if your talk bubble gets stuck to you." + + cut_overlays() + handle_panel_overlay() + set_intent(a_intent) + /obj/item/robot_module/janitor/verb/toggle_mop() set category = "Robot Commands" set name = "Toggle Mop" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index cc0f9b70ea9..2b6c1d31908 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -56,7 +56,7 @@ var/global/list/robot_modules = list( R.module = src - src.modules += new /obj/item/inductive_charger(src) + modules += new /obj/item/inductive_charger(src) add_camera_networks(R) add_languages(R) @@ -109,8 +109,8 @@ var/global/list/robot_modules = list( return /obj/item/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/rate) - var/obj/item/extinguisher/E = locate() in src.modules - var/obj/item/device/flash/F = locate() in src.modules + var/obj/item/extinguisher/E = locate() in modules + var/obj/item/device/flash/F = locate() in modules if(F) if(F.broken) F.broken = FALSE @@ -128,8 +128,8 @@ var/global/list/robot_modules = list( for(var/datum/matter_synth/T in synths) T.add_charge(T.recharge_rate * rate) - for(var/obj/item/stack/material/SM in modules) - SM.update_strings() + for(var/obj/item/stack/SM in modules) + SM.update_icon() /obj/item/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module var/list/temp_list = modules @@ -205,41 +205,41 @@ var/global/list/robot_modules = list( /obj/item/robot_module/medical/general/Initialize() . = ..() - src.modules += new /obj/item/device/healthanalyzer(src) - src.modules += new /obj/item/reagent_containers/hypospray/borghypo/medical(src) - src.modules += new /obj/item/surgery/scalpel(src) - src.modules += new /obj/item/surgery/hemostat(src) - src.modules += new /obj/item/surgery/retractor(src) - src.modules += new /obj/item/surgery/cautery(src) - src.modules += new /obj/item/surgery/bonegel(src) - src.modules += new /obj/item/surgery/FixOVein(src) - src.modules += new /obj/item/surgery/bonesetter(src) - src.modules += new /obj/item/surgery/circular_saw(src) - src.modules += new /obj/item/surgery/surgicaldrill(src) - src.modules += new /obj/item/gripper/chemistry(src) - src.modules += new /obj/item/reagent_containers/dropper/industrial(src) - src.modules += new /obj/item/roller_holder(src) - src.modules += new /obj/item/reagent_containers/syringe(src) - src.modules += new /obj/item/device/reagent_scanner/adv(src) - src.modules += new /obj/item/device/mass_spectrometer(src) - src.modules += new /obj/item/autopsy_scanner(src) - src.modules += new /obj/item/device/breath_analyzer(src) + modules += new /obj/item/device/healthanalyzer(src) + modules += new /obj/item/reagent_containers/hypospray/borghypo/medical(src) + modules += new /obj/item/surgery/scalpel(src) + modules += new /obj/item/surgery/hemostat(src) + modules += new /obj/item/surgery/retractor(src) + modules += new /obj/item/surgery/cautery(src) + modules += new /obj/item/surgery/bonegel(src) + modules += new /obj/item/surgery/FixOVein(src) + modules += new /obj/item/surgery/bonesetter(src) + modules += new /obj/item/surgery/circular_saw(src) + modules += new /obj/item/surgery/surgicaldrill(src) + modules += new /obj/item/gripper/chemistry(src) + modules += new /obj/item/reagent_containers/dropper/industrial(src) + modules += new /obj/item/roller_holder(src) + modules += new /obj/item/reagent_containers/syringe(src) + modules += new /obj/item/device/reagent_scanner/adv(src) + modules += new /obj/item/device/mass_spectrometer(src) + modules += new /obj/item/autopsy_scanner(src) + modules += new /obj/item/device/breath_analyzer(src) modules += new /obj/item/taperoll/medical(src) - src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. - src.modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. - src.modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. - src.modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. - src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. - src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. - src.modules += new /obj/item/pen/robopen(src) - src.modules += new /obj/item/form_printer(src) - src.modules += new /obj/item/gripper/paperwork(src) - src.modules += new /obj/item/device/hand_labeler(src) - src.modules += new /obj/item/tape_roll(src) //allows it to place flyers - src.modules += new /obj/item/device/nanoquikpay(src) - src.emag = new /obj/item/reagent_containers/hypospray/cmo(src) - src.emag.reagents.add_reagent(/decl/reagent/wulumunusha, 30) - src.emag.name = "Wulumunusha Hypospray" + modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. + modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. + modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. + modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. + modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. + modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + modules += new /obj/item/pen/robopen(src) + modules += new /obj/item/form_printer(src) + modules += new /obj/item/gripper/paperwork(src) + modules += new /obj/item/device/hand_labeler(src) + modules += new /obj/item/tape_roll(src) //allows it to place flyers + modules += new /obj/item/device/nanoquikpay(src) + emag = new /obj/item/reagent_containers/hypospray/cmo(src) + emag.reagents.add_reagent(/decl/reagent/wulumunusha, 30) + emag.name = "Wulumunusha Hypospray" var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000) synths += medicine @@ -252,18 +252,18 @@ var/global/list/robot_modules = list( B.uses_charge = TRUE B.charge_costs = list(1000) B.synths = list(medicine) - src.modules += N - src.modules += B + modules += N + modules += B /obj/item/robot_module/medical/general/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/reagent_containers/syringe/S = locate() in src.modules + var/obj/item/reagent_containers/syringe/S = locate() in modules if(S.mode == 2) S.reagents.clear_reagents() S.mode = initial(S.mode) S.desc = initial(S.desc) S.update_icon() - if(src.emag) - var/obj/item/reagent_containers/hypospray/cmo/PS = src.emag + if(emag) + var/obj/item/reagent_containers/hypospray/cmo/PS = emag PS.reagents.add_reagent(/decl/reagent/wulumunusha, 2 * amount) ..() @@ -287,27 +287,27 @@ var/global/list/robot_modules = list( /obj/item/robot_module/medical/rescue/Initialize() . = ..() - src.modules += new /obj/item/device/healthanalyzer(src) - src.modules += new /obj/item/device/reagent_scanner/adv(src) - src.modules += new /obj/item/device/mass_spectrometer(src) - src.modules += new /obj/item/device/breath_analyzer(src) - src.modules += new /obj/item/roller_holder(src) - src.modules += new /obj/item/reagent_containers/hypospray/borghypo/rescue(src) - src.modules += new /obj/item/reagent_containers/dropper/industrial(src) - src.modules += new /obj/item/reagent_containers/syringe(src) - src.modules += new /obj/item/gripper/chemistry(src) - src.modules += new /obj/item/tank/jetpack/carbondioxide/synthetic(src) - src.modules += new /obj/item/borg/rescue/mobility(src) + modules += new /obj/item/device/healthanalyzer(src) + modules += new /obj/item/device/reagent_scanner/adv(src) + modules += new /obj/item/device/mass_spectrometer(src) + modules += new /obj/item/device/breath_analyzer(src) + modules += new /obj/item/roller_holder(src) + modules += new /obj/item/reagent_containers/hypospray/borghypo/rescue(src) + modules += new /obj/item/reagent_containers/dropper/industrial(src) + modules += new /obj/item/reagent_containers/syringe(src) + modules += new /obj/item/gripper/chemistry(src) + modules += new /obj/item/tank/jetpack/carbondioxide/synthetic(src) + modules += new /obj/item/borg/rescue/mobility(src) modules += new /obj/item/taperoll/medical(src) - src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. - src.modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. - src.modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. - src.modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. - src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. - src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. - src.emag = new /obj/item/reagent_containers/hypospray/cmo(src) - src.emag.reagents.add_reagent(/decl/reagent/wulumunusha, 30) - src.emag.name = "Wulumunusha Hypospray" + modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. + modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. + modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. + modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. + modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. + modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + emag = new /obj/item/reagent_containers/hypospray/cmo(src) + emag.reagents.add_reagent(/decl/reagent/wulumunusha, 30) + emag.name = "Wulumunusha Hypospray" var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000) synths += medicine @@ -324,19 +324,19 @@ var/global/list/robot_modules = list( S.uses_charge = TRUE S.charge_costs = list(1000) S.synths = list(medicine) - src.modules += O - src.modules += B - src.modules += S + modules += O + modules += B + modules += S /obj/item/robot_module/medical/rescue/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/reagent_containers/syringe/S = locate() in src.modules + var/obj/item/reagent_containers/syringe/S = locate() in modules if(S.mode == 2) S.reagents.clear_reagents() S.mode = initial(S.mode) S.desc = initial(S.desc) S.update_icon() - if(src.emag) - var/obj/item/reagent_containers/spray/PS = src.emag + if(emag) + var/obj/item/reagent_containers/spray/PS = emag PS.reagents.add_reagent(/decl/reagent/wulumunusha, 2 * amount) ..() @@ -368,28 +368,28 @@ var/global/list/robot_modules = list( /obj/item/robot_module/engineering/construction/Initialize() . = ..() - src.modules += new /obj/item/powerdrill(src) - src.modules += new /obj/item/rfd/construction/borg(src) - src.modules += new /obj/item/rfd/piping/borg(src) - src.modules += new /obj/item/screwdriver/robotic(src) - src.modules += new /obj/item/wrench/robotic(src) - src.modules += new /obj/item/weldingtool/experimental(src) - src.modules += new /obj/item/device/pipe_painter(src) - src.modules += new /obj/item/gripper/no_use/loader(src) - src.modules += new /obj/item/gripper(src) - src.modules += new /obj/item/device/t_scanner(src) // to check underfloor wiring - src.modules += new /obj/item/device/analyzer(src) // to check air pressure in the area - src.modules += new /obj/item/device/lightreplacer(src) // to install lightning in the area - src.modules += new /obj/item/device/floor_painter(src)// to make america great again (c) - src.modules += new /obj/item/pickaxe/borgdrill(src) // as station is being located at the rock terrain, which is presumed to be digged out to clear the area for new rooms - src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. - src.modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. - src.modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. - src.modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful. - src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. - src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. - src.emag = new /obj/item/gun/energy/plasmacutter/mounted(src) - src.malf_AI_module += new /obj/item/rfd/transformer(src) + modules += new /obj/item/powerdrill(src) + modules += new /obj/item/rfd/construction/borg(src) + modules += new /obj/item/rfd/piping/borg(src) + modules += new /obj/item/screwdriver/robotic(src) + modules += new /obj/item/wrench/robotic(src) + modules += new /obj/item/weldingtool/experimental(src) + modules += new /obj/item/device/pipe_painter(src) + modules += new /obj/item/gripper/no_use/loader(src) + modules += new /obj/item/gripper(src) + modules += new /obj/item/device/t_scanner(src) // to check underfloor wiring + modules += new /obj/item/device/analyzer(src) // to check air pressure in the area + modules += new /obj/item/device/lightreplacer(src) // to install lightning in the area + modules += new /obj/item/device/floor_painter(src)// to make america great again (c) + modules += new /obj/item/pickaxe/borgdrill(src) // as station is being located at the rock terrain, which is presumed to be digged out to clear the area for new rooms + modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. + modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. + modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. + modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful. + modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. + modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + emag = new /obj/item/gun/energy/plasmacutter/mounted(src) + malf_AI_module += new /obj/item/rfd/transformer(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal(80000) var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel(40000) @@ -404,56 +404,56 @@ var/global/list/robot_modules = list( var/obj/item/stack/material/cyborg/steel/M = new /obj/item/stack/material/cyborg/steel(src) M.synths = list(metal) - src.modules += M + modules += M var/obj/item/stack/rods/cyborg/rods = new /obj/item/stack/rods/cyborg(src) rods.synths = list(metal) - src.modules += rods + modules += rods var/obj/item/stack/material/cyborg/plasteel/S = new /obj/item/stack/material/cyborg/plasteel(src) S.synths = list(plasteel) - src.modules += S + modules += S var/obj/item/stack/material/cyborg/glass/reinforced/RG = new /obj/item/stack/material/cyborg/glass/reinforced(src) RG.synths = list(metal, glass) - src.modules += RG + modules += RG var/obj/item/stack/material/cyborg/cloth/CL = new /obj/item/stack/material/cyborg/cloth(src) CL.synths = list(cloth) - src.modules += CL + modules += CL var/obj/item/stack/tile/floor/cyborg/FT = new /obj/item/stack/tile/floor/cyborg(src) // to add floor over the metal rods lattice FT.synths = list(metal) - src.modules += FT + modules += FT var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) // Let there be light electric said and after that did cut the wire C.synths = list(wire) - src.modules += C + modules += C /obj/item/robot_module/engineering/general/Initialize() . = ..() - src.modules += new /obj/item/powerdrill(src) - src.modules += new /obj/item/weldingtool/largetank(src) - src.modules += new /obj/item/screwdriver/robotic(src) - src.modules += new /obj/item/wrench/robotic(src) - src.modules += new /obj/item/wirecutters/robotic(src) - src.modules += new /obj/item/device/multitool/robotic(src) - src.modules += new /obj/item/rfd/piping/borg(src) - src.modules += new /obj/item/device/t_scanner(src) - src.modules += new /obj/item/device/analyzer(src) - src.modules += new /obj/item/gripper(src) - src.modules += new /obj/item/gripper/no_use/loader(src) - src.modules += new /obj/item/device/lightreplacer(src) - src.modules += new /obj/item/device/pipe_painter(src) - src.modules += new /obj/item/device/floor_painter(src) - src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. - src.modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. - src.modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. - src.modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful. - src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. - src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. - src.emag = new /obj/item/melee/baton/robot/arm(src) - src.malf_AI_module += new /obj/item/rfd/transformer(src) + modules += new /obj/item/powerdrill(src) + modules += new /obj/item/weldingtool/largetank(src) + modules += new /obj/item/screwdriver/robotic(src) + modules += new /obj/item/wrench/robotic(src) + modules += new /obj/item/wirecutters/robotic(src) + modules += new /obj/item/device/multitool/robotic(src) + modules += new /obj/item/rfd/piping/borg(src) + modules += new /obj/item/device/t_scanner(src) + modules += new /obj/item/device/analyzer(src) + modules += new /obj/item/gripper(src) + modules += new /obj/item/gripper/no_use/loader(src) + modules += new /obj/item/device/lightreplacer(src) + modules += new /obj/item/device/pipe_painter(src) + modules += new /obj/item/device/floor_painter(src) + modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. + modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. + modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. + modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful. + modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. + modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + emag = new /obj/item/melee/baton/robot/arm(src) + malf_AI_module += new /obj/item/rfd/transformer(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal(60000) var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) @@ -473,63 +473,63 @@ var/global/list/robot_modules = list( var/obj/item/matter_decompiler/MD = new /obj/item/matter_decompiler(src) MD.metal = metal MD.glass = glass - src.modules += MD + modules += MD var/obj/item/stack/material/cyborg/steel/M = new (src) M.synths = list(metal) - src.modules += M + modules += M var/obj/item/stack/material/cyborg/glass/G = new (src) G.synths = list(glass) - src.modules += G + modules += G var/obj/item/stack/rods/cyborg/rods = new /obj/item/stack/rods/cyborg(src) rods.synths = list(metal) - src.modules += rods + modules += rods var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) C.synths = list(wire) - src.modules += C + modules += C var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) S.synths = list(metal) - src.modules += S + modules += S var/obj/item/stack/material/cyborg/glass/reinforced/RG = new /obj/item/stack/material/cyborg/glass/reinforced(src) RG.synths = list(metal, glass) - src.modules += RG + modules += RG var/obj/item/stack/material/cyborg/plasteel/PL = new /obj/item/stack/material/cyborg/plasteel(src) PL.synths = list(plasteel) - src.modules += PL + modules += PL var/obj/item/stack/material/cyborg/wood/W = new /obj/item/stack/material/cyborg/wood(src) W.synths = list(wood) - src.modules += W + modules += W var/obj/item/stack/material/cyborg/plastic/PS = new /obj/item/stack/material/cyborg/plastic(src) PS.synths = list(plastic) - src.modules += PS + modules += PS var/obj/item/stack/material/cyborg/cloth/CL = new /obj/item/stack/material/cyborg/cloth(src) CL.synths = list(cloth) - src.modules += CL + modules += CL var/obj/item/stack/tile/wood/cyborg/FWT = new /obj/item/stack/tile/wood/cyborg(src) FWT.synths = list(wood) - src.modules += FWT + modules += FWT var/obj/item/stack/tile/floor_white/cyborg/FTW = new /obj/item/stack/tile/floor_white/cyborg(src) FTW.synths = list(plastic) - src.modules += FTW + modules += FTW var/obj/item/stack/tile/floor_freezer/cyborg/FTF = new /obj/item/stack/tile/floor_freezer/cyborg(src) FTF.synths = list(plastic) - src.modules += FTF + modules += FTF var/obj/item/stack/tile/floor_dark/cyborg/FTD = new /obj/item/stack/tile/floor_dark/cyborg(src) FTD.synths = list(plasteel) - src.modules += FTD + modules += FTD /obj/item/robot_module/janitor name = "custodial robot module" @@ -554,28 +554,28 @@ var/global/list/robot_modules = list( /obj/item/robot_module/janitor/Initialize() . = ..() - src.modules += new /obj/item/soap/drone(src) - src.modules += new /obj/item/storage/bag/trash(src) - src.modules += new /obj/item/mop(src) - src.modules += new /obj/item/device/lightreplacer/advanced(src) - src.modules += new /obj/item/reagent_containers/glass/bucket(src) // a hydroponist's bucket - src.modules += new /obj/item/matter_decompiler(src) // free drone remains for all - src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. - src.modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. - src.modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. - src.modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. - src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. - src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. - src.emag = new /obj/item/reagent_containers/spray(src) - src.emag.reagents.add_reagent(/decl/reagent/lube, 250) - src.emag.name = "Lube spray" + modules += new /obj/item/soap/drone(src) + modules += new /obj/item/storage/bag/trash(src) + modules += new /obj/item/mop(src) + modules += new /obj/item/device/lightreplacer/advanced(src) + modules += new /obj/item/reagent_containers/glass/bucket(src) // a hydroponist's bucket + modules += new /obj/item/matter_decompiler(src) // free drone remains for all + modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. + modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. + modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. + modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. + modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. + modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + emag = new /obj/item/reagent_containers/spray(src) + emag.reagents.add_reagent(/decl/reagent/lube, 250) + emag.name = "Lube spray" /obj/item/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) ..() - var/obj/item/device/lightreplacer/LR = locate() in src.modules + var/obj/item/device/lightreplacer/LR = locate() in modules LR.Charge(R, amount) - if(src.emag) - var/obj/item/reagent_containers/spray/S = src.emag + if(emag) + var/obj/item/reagent_containers/spray/S = emag S.reagents.add_reagent(/decl/reagent/lube, 2 * amount) /obj/item/robot_module/clerical @@ -617,67 +617,67 @@ var/global/list/robot_modules = list( /obj/item/robot_module/clerical/butler/Initialize() . = ..() - src.modules += new /obj/item/gripper/service(src) - src.modules += new /obj/item/reagent_containers/glass/bucket(src) - src.modules += new /obj/item/material/minihoe(src) - src.modules += new /obj/item/material/hatchet(src) - src.modules += new /obj/item/device/analyzer/plant_analyzer(src) - src.modules += new /obj/item/storage/bag/plants(src) - src.modules += new /obj/item/robot_harvester(src) - src.modules += new /obj/item/material/kitchen/rollingpin(src) - src.modules += new /obj/item/material/knife(src) - src.modules += new /obj/item/soap/drone(src) - src.modules += new /obj/item/pen/robopen(src) - src.modules += new /obj/item/form_printer(src) - src.modules += new /obj/item/gripper/paperwork(src) - src.modules += new /obj/item/device/hand_labeler(src) - src.modules += new /obj/item/tape_roll(src) //allows it to place flyers - src.modules += new /obj/item/device/nanoquikpay(src) - src.modules += new /obj/item/reagent_containers/glass/rag(src) // a rag for.. yeah.. the primary tool of bartender - src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. - src.modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. - src.modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. - src.modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. - src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. - src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + modules += new /obj/item/gripper/service(src) + modules += new /obj/item/reagent_containers/glass/bucket(src) + modules += new /obj/item/material/minihoe(src) + modules += new /obj/item/material/hatchet(src) + modules += new /obj/item/device/analyzer/plant_analyzer(src) + modules += new /obj/item/storage/bag/plants(src) + modules += new /obj/item/robot_harvester(src) + modules += new /obj/item/material/kitchen/rollingpin(src) + modules += new /obj/item/material/knife(src) + modules += new /obj/item/soap/drone(src) + modules += new /obj/item/pen/robopen(src) + modules += new /obj/item/form_printer(src) + modules += new /obj/item/gripper/paperwork(src) + modules += new /obj/item/device/hand_labeler(src) + modules += new /obj/item/tape_roll(src) //allows it to place flyers + modules += new /obj/item/device/nanoquikpay(src) + modules += new /obj/item/reagent_containers/glass/rag(src) // a rag for.. yeah.. the primary tool of bartender + modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. + modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. + modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. + modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. + modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. + modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. var/obj/item/rfd/service/M = new /obj/item/rfd/service(src) M.stored_matter = 30 - src.modules += M + modules += M - src.modules += new /obj/item/reagent_containers/dropper/industrial(src) + modules += new /obj/item/reagent_containers/dropper/industrial(src) var/obj/item/flame/lighter/zippo/L = new /obj/item/flame/lighter/zippo(src) L.lit = TRUE - src.modules += L + modules += L - src.modules += new /obj/item/tray/robotray(src) - src.modules += new /obj/item/reagent_containers/hypospray/borghypo/service(src) - src.emag = new /obj/item/reagent_containers/food/drinks/bottle/small/beer(src) + modules += new /obj/item/tray/robotray(src) + modules += new /obj/item/reagent_containers/hypospray/borghypo/service(src) + emag = new /obj/item/reagent_containers/food/drinks/bottle/small/beer(src) var/datum/reagents/RG = new /datum/reagents(50) - src.emag.reagents = RG - RG.my_atom = src.emag + emag.reagents = RG + RG.my_atom = emag RG.add_reagent(/decl/reagent/polysomnine/beer2, 50) - src.emag.name = "Mickey Finn's Special Brew" + emag.name = "Mickey Finn's Special Brew" /obj/item/robot_module/clerical/general name = "clerical robot module" /obj/item/robot_module/clerical/general/Initialize() . = ..() - src.modules += new /obj/item/pen/robopen(src) - src.modules += new /obj/item/form_printer(src) - src.modules += new /obj/item/gripper/paperwork(src) - src.modules += new /obj/item/device/hand_labeler(src) - src.modules += new /obj/item/tape_roll(src) //allows it to place flyers - src.modules += new /obj/item/device/nanoquikpay(src) - src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. - src.modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. - src.modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. - src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. - src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. - src.emag = new /obj/item/stamp/chameleon(src) + modules += new /obj/item/pen/robopen(src) + modules += new /obj/item/form_printer(src) + modules += new /obj/item/gripper/paperwork(src) + modules += new /obj/item/device/hand_labeler(src) + modules += new /obj/item/tape_roll(src) //allows it to place flyers + modules += new /obj/item/device/nanoquikpay(src) + modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. + modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. + modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. + modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. + modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + emag = new /obj/item/stamp/chameleon(src) /obj/item/robot_module/miner name = "miner robot module" @@ -702,45 +702,45 @@ var/global/list/robot_modules = list( /obj/item/robot_module/miner/Initialize() . = ..() - src.modules += new /obj/item/storage/bag/ore(src) - src.modules += new /obj/item/pickaxe/borgdrill(src) - src.modules += new /obj/item/storage/bag/sheetsnatcher/borg(src) - src.modules += new /obj/item/gripper/miner(src) - src.modules += new /obj/item/rfd/mining(src) - src.modules += new /obj/item/ore_detector(src) - src.modules += new /obj/item/mining_scanner(src) - src.modules += new /obj/item/ore_radar(src) - src.modules += new /obj/item/pen/robopen(src) - src.modules += new /obj/item/form_printer(src) - src.modules += new /obj/item/gripper/paperwork(src) - src.modules += new /obj/item/device/hand_labeler(src) - src.modules += new /obj/item/tape_roll(src) //allows it to place flyers - src.modules += new /obj/item/device/nanoquikpay(src) - src.modules += new /obj/item/device/gps/mining(src) // for locating itself in the deep space - src.modules += new /obj/item/gun/custom_ka/cyborg(src) - src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. - src.modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. - src.modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. - src.modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. - src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. - src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. - src.modules += new /obj/item/wrench/robotic(src) - src.modules += new /obj/item/screwdriver/robotic(src) - src.modules += new /obj/item/storage/part_replacer(src) - src.modules += new /obj/item/tank/jetpack/carbondioxide/synthetic(src) + modules += new /obj/item/storage/bag/ore(src) + modules += new /obj/item/pickaxe/borgdrill(src) + modules += new /obj/item/storage/bag/sheetsnatcher/borg(src) + modules += new /obj/item/gripper/miner(src) + modules += new /obj/item/rfd/mining(src) + modules += new /obj/item/ore_detector(src) + modules += new /obj/item/mining_scanner(src) + modules += new /obj/item/ore_radar(src) + modules += new /obj/item/pen/robopen(src) + modules += new /obj/item/form_printer(src) + modules += new /obj/item/gripper/paperwork(src) + modules += new /obj/item/device/hand_labeler(src) + modules += new /obj/item/tape_roll(src) //allows it to place flyers + modules += new /obj/item/device/nanoquikpay(src) + modules += new /obj/item/device/gps/mining(src) // for locating itself in the deep space + modules += new /obj/item/gun/custom_ka/cyborg(src) + modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. + modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. + modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. + modules += new /obj/item/extinguisher/mini(src) // For navigating space and/or low grav, and just being useful. + modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. + modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + modules += new /obj/item/wrench/robotic(src) + modules += new /obj/item/screwdriver/robotic(src) + modules += new /obj/item/storage/part_replacer(src) + modules += new /obj/item/tank/jetpack/carbondioxide/synthetic(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal(80000) synths += metal var/obj/item/stack/rods/cyborg/rods = new /obj/item/stack/rods/cyborg(src) rods.synths = list(metal) - src.modules += rods + modules += rods var/obj/item/stack/flag/purple/borg/F = new /obj/item/stack/flag/purple/borg(src) F.synths = list(metal) - src.modules += F + modules += F - src.emag = new /obj/item/gun/energy/plasmacutter/mounted(src) + emag = new /obj/item/gun/energy/plasmacutter/mounted(src) /obj/item/robot_module/research name = "research module" @@ -764,43 +764,43 @@ var/global/list/robot_modules = list( /obj/item/robot_module/research/Initialize() . = ..() - src.modules += new /obj/item/portable_destructive_analyzer(src) - src.modules += new /obj/item/gripper/research(src) - src.modules += new /obj/item/gripper/no_use/loader(src) - src.modules += new /obj/item/device/robotanalyzer(src) - src.modules += new /obj/item/card/robot(src) + modules += new /obj/item/portable_destructive_analyzer(src) + modules += new /obj/item/gripper/research(src) + modules += new /obj/item/gripper/no_use/loader(src) + modules += new /obj/item/device/robotanalyzer(src) + modules += new /obj/item/card/robot(src) var/datum/matter_synth/wire = new /datum/matter_synth/wire(15) synths += wire var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) C.synths = list(wire) - src.modules += C + modules += C - src.modules += new /obj/item/weldingtool/experimental(src) - src.modules += new /obj/item/wrench/robotic(src) - src.modules += new /obj/item/screwdriver(src) - src.modules += new /obj/item/wirecutters/robotic(src) - src.modules += new /obj/item/surgery/scalpel(src) - src.modules += new /obj/item/surgery/circular_saw(src) - src.modules += new /obj/item/reagent_containers/syringe(src) - src.modules += new /obj/item/gripper/chemistry(src) - src.modules += new /obj/item/reagent_containers/dropper/industrial(src) - src.modules += new /obj/item/device/reagent_scanner/adv(src) - src.modules += new /obj/item/storage/bag/plants(src) - src.modules += new /obj/item/pen/robopen(src) - src.modules += new /obj/item/form_printer(src) - src.modules += new /obj/item/gripper/paperwork(src) - src.modules += new /obj/item/device/hand_labeler(src) - src.modules += new /obj/item/tape_roll(src) //allows it to place flyers - src.modules += new /obj/item/device/nanoquikpay(src) - src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. - src.modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. - src.modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. - src.modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful. - src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. - src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. - src.modules += new /obj/item/storage/part_replacer(src) - src.emag = new /obj/item/hand_tele(src) + modules += new /obj/item/weldingtool/experimental(src) + modules += new /obj/item/wrench/robotic(src) + modules += new /obj/item/screwdriver(src) + modules += new /obj/item/wirecutters/robotic(src) + modules += new /obj/item/surgery/scalpel(src) + modules += new /obj/item/surgery/circular_saw(src) + modules += new /obj/item/reagent_containers/syringe(src) + modules += new /obj/item/gripper/chemistry(src) + modules += new /obj/item/reagent_containers/dropper/industrial(src) + modules += new /obj/item/device/reagent_scanner/adv(src) + modules += new /obj/item/storage/bag/plants(src) + modules += new /obj/item/pen/robopen(src) + modules += new /obj/item/form_printer(src) + modules += new /obj/item/gripper/paperwork(src) + modules += new /obj/item/device/hand_labeler(src) + modules += new /obj/item/tape_roll(src) //allows it to place flyers + modules += new /obj/item/device/nanoquikpay(src) + modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. + modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. + modules += new /obj/item/device/gps(src) // For being located while disabled and coordinating with life sensor consoles. + modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful. + modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. + modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + modules += new /obj/item/storage/part_replacer(src) + emag = new /obj/item/hand_tele(src) var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000) synths += nanite @@ -809,7 +809,7 @@ var/global/list/robot_modules = list( N.uses_charge = TRUE N.charge_costs = list(1000) N.synths = list(nanite) - src.modules += N + modules += N /obj/item/robot_module/syndicate name = "syndicate robot module" @@ -843,22 +843,22 @@ var/global/list/robot_modules = list( R.faction = "syndicate" // prevents viscerators from attacking us - src.modules += new /obj/item/borg/sight/thermal(src) - src.modules += new /obj/item/melee/energy/sword(src) - src.modules += new /obj/item/gun/energy/mountedsmg(src) - src.modules += new /obj/item/gun/energy/net/mounted(src) - src.modules += new /obj/item/gun/launcher/grenade/cyborg(src) - src.modules += new /obj/item/robot_emag(src) - src.modules += new /obj/item/handcuffs/cyborg(src) - src.modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. - src.modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful. - src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. - src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. - src.modules += new /obj/item/roller_holder(src) - src.modules += new /obj/item/device/healthanalyzer(src) - src.modules += new /obj/item/reagent_containers/hypospray/borghypo/medical(src) - src.modules += new /obj/item/plastique/cyborg(src) - src.modules += new /obj/item/grenade/smokebomb/cyborg(src) + modules += new /obj/item/borg/sight/thermal(src) + modules += new /obj/item/melee/energy/sword(src) + modules += new /obj/item/gun/energy/mountedsmg(src) + modules += new /obj/item/gun/energy/net/mounted(src) + modules += new /obj/item/gun/launcher/grenade/cyborg(src) + modules += new /obj/item/robot_emag(src) + modules += new /obj/item/handcuffs/cyborg(src) + modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. + modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful. + modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. + modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + modules += new /obj/item/roller_holder(src) + modules += new /obj/item/device/healthanalyzer(src) + modules += new /obj/item/reagent_containers/hypospray/borghypo/medical(src) + modules += new /obj/item/plastique/cyborg(src) + modules += new /obj/item/grenade/smokebomb/cyborg(src) supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack) if(R.radio) @@ -874,16 +874,16 @@ var/global/list/robot_modules = list( /obj/item/robot_module/combat/Initialize() . = ..() - src.modules += new /obj/item/gun/energy/laser/mounted(src) - src.modules += new /obj/item/melee/hammer/powered(src) - src.modules += new /obj/item/borg/combat/shield(src) - src.modules += new /obj/item/borg/combat/mobility(src) - src.modules += new /obj/item/handcuffs/cyborg(src) - src.modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. - src.modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful. - src.modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. - src.modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. - src.emag = new /obj/item/gun/energy/lasercannon/mounted(src) + modules += new /obj/item/gun/energy/laser/mounted(src) + modules += new /obj/item/melee/hammer/powered(src) + modules += new /obj/item/borg/combat/shield(src) + modules += new /obj/item/borg/combat/mobility(src) + modules += new /obj/item/handcuffs/cyborg(src) + modules += new /obj/item/inflatable_dispenser(src) // To enable 'borgs to protect Crew from danger in direct hazards. + modules += new /obj/item/extinguisher(src) // For navigating space and/or low grav, and just being useful. + modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws. + modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to. + emag = new /obj/item/gun/energy/lasercannon/mounted(src) /obj/item/robot_module/drone name = "drone module" @@ -892,21 +892,20 @@ var/global/list/robot_modules = list( /obj/item/robot_module/drone/Initialize(mapload, mob/living/silicon/robot/robot) . = ..() - src.modules += new /obj/item/weldingtool(src) - src.modules += new /obj/item/screwdriver/robotic(src) - src.modules += new /obj/item/wrench/robotic(src) - src.modules += new /obj/item/crowbar/robotic(src) - src.modules += new /obj/item/wirecutters/robotic(src) - src.modules += new /obj/item/device/multitool/robotic(src) - src.modules += new /obj/item/device/lightreplacer(src) - src.modules += new /obj/item/gripper(src) - src.modules += new /obj/item/soap/drone(src) - src.modules += new /obj/item/gripper/no_use/loader(src) - src.modules += new /obj/item/extinguisher(src) - src.modules += new /obj/item/rfd/piping/borg(src) - src.modules += new /obj/item/device/pipe_painter(src) - src.modules += new /obj/item/device/floor_painter(src) - src.modules += new /obj/item/tank/jetpack/carbondioxide/synthetic(src) + modules += new /obj/item/weldingtool/robotic(src) + modules += new /obj/item/screwdriver/robotic(src) + modules += new /obj/item/wrench/robotic(src) + modules += new /obj/item/crowbar/robotic(src) + modules += new /obj/item/wirecutters/robotic(src) + modules += new /obj/item/device/multitool/robotic(src) + modules += new /obj/item/taperoll/engineering(src) + modules += new /obj/item/device/lightreplacer(src) + modules += new /obj/item/soap/drone(src) + modules += new /obj/item/extinguisher(src) + modules += new /obj/item/device/pipe_painter(src) + modules += new /obj/item/device/floor_painter(src) + modules += new /obj/item/gripper/multi_purpose(src) + modules += new /obj/item/gripper/no_use/loader(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal(25000) var/datum/matter_synth/glass = new /datum/matter_synth/glass(25000) @@ -926,47 +925,51 @@ var/global/list/robot_modules = list( MD.glass = glass MD.wood = wood MD.plastic = plastic - src.modules += MD + modules += MD var/obj/item/stack/material/cyborg/steel/M = new (src) M.synths = list(metal) - src.modules += M + modules += M var/obj/item/stack/material/cyborg/glass/G = new (src) G.synths = list(glass) - src.modules += G - - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synths = list(metal) - src.modules += R - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synths = list(wire) - src.modules += C - - var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) - S.synths = list(metal) - src.modules += S + modules += G var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) RG.synths = list(metal, glass) - src.modules += RG - - var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) - WT.synths = list(wood) - src.modules += WT + modules += RG var/obj/item/stack/material/cyborg/wood/W = new (src) W.synths = list(wood) - src.modules += W + modules += W var/obj/item/stack/material/cyborg/plastic/P = new (src) P.synths = list(plastic) - src.modules += P + modules += P var/obj/item/stack/material/cyborg/cloth/CL = new /obj/item/stack/material/cyborg/cloth(src) CL.synths = list(cloth) - src.modules += CL + modules += CL + + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.synths = list(metal) + modules += R + + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + C.synths = list(wire) + modules += C + + var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) + S.synths = list(metal) + modules += S + + var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) + WT.synths = list(wood) + modules += WT + + modules += new /obj/item/tank/jetpack/carbondioxide/synthetic(src) + modules += new /obj/item/inflatable_dispenser(src) + modules += new /obj/item/rfd/piping/borg(src) // putting this here so it's next to the RFD-C on construction drones /obj/item/robot_module/drone/construction name = "construction drone module" @@ -975,9 +978,10 @@ var/global/list/robot_modules = list( /obj/item/robot_module/drone/construction/Initialize() . = ..() modules += new /obj/item/rfd/construction/borg(src) + modules += new /obj/item/pickaxe/drill(src) /obj/item/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/device/lightreplacer/LR = locate() in src.modules + var/obj/item/device/lightreplacer/LR = locate() in modules LR.Charge(R, amount) ..() return @@ -1072,48 +1076,48 @@ var/global/list/robot_modules = list( /obj/item/robot_module/bluespace/Initialize(mapload, mob/living/silicon/robot/R) . = ..() - src.modules += new /obj/item/device/flash(src) - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/rfd/construction/borg/infinite(src) - src.modules += new /obj/item/extinguisher(src) - src.modules += new /obj/item/weldingtool/largetank(src) - src.modules += new /obj/item/screwdriver/robotic(src) - src.modules += new /obj/item/wrench/robotic(src) - src.modules += new /obj/item/crowbar/robotic(src) - src.modules += new /obj/item/wirecutters/robotic(src) - src.modules += new /obj/item/device/multitool/robotic(src) - src.modules += new /obj/item/device/t_scanner(src) - src.modules += new /obj/item/device/analyzer(src) - src.modules += new /obj/item/gripper(src) - src.modules += new /obj/item/gripper/no_use/loader(src) - src.modules += new /obj/item/device/lightreplacer(src) - src.modules += new /obj/item/inflatable_dispenser(src) + modules += new /obj/item/device/flash(src) + modules += new /obj/item/borg/sight/meson(src) + modules += new /obj/item/rfd/construction/borg/infinite(src) + modules += new /obj/item/extinguisher(src) + modules += new /obj/item/weldingtool/largetank(src) + modules += new /obj/item/screwdriver/robotic(src) + modules += new /obj/item/wrench/robotic(src) + modules += new /obj/item/crowbar/robotic(src) + modules += new /obj/item/wirecutters/robotic(src) + modules += new /obj/item/device/multitool/robotic(src) + modules += new /obj/item/device/t_scanner(src) + modules += new /obj/item/device/analyzer(src) + modules += new /obj/item/gripper(src) + modules += new /obj/item/gripper/no_use/loader(src) + modules += new /obj/item/device/lightreplacer(src) + modules += new /obj/item/inflatable_dispenser(src) // Medical - src.modules += new /obj/item/device/healthanalyzer(src) - src.modules += new /obj/item/reagent_containers/hypospray/borghypo/medical(src) - src.modules += new /obj/item/surgery/scalpel(src) - src.modules += new /obj/item/surgery/hemostat(src) - src.modules += new /obj/item/surgery/retractor(src) - src.modules += new /obj/item/surgery/cautery(src) - src.modules += new /obj/item/surgery/bonegel(src) - src.modules += new /obj/item/surgery/FixOVein(src) - src.modules += new /obj/item/surgery/bonesetter(src) - src.modules += new /obj/item/surgery/circular_saw(src) - src.modules += new /obj/item/surgery/surgicaldrill(src) - src.modules += new /obj/item/gripper/chemistry(src) - src.modules += new /obj/item/reagent_containers/dropper/industrial(src) - src.modules += new /obj/item/reagent_containers/syringe(src) - src.modules += new /obj/item/reagent_containers/hypospray/borghypo/rescue(src) - src.modules += new /obj/item/roller_holder(src) + modules += new /obj/item/device/healthanalyzer(src) + modules += new /obj/item/reagent_containers/hypospray/borghypo/medical(src) + modules += new /obj/item/surgery/scalpel(src) + modules += new /obj/item/surgery/hemostat(src) + modules += new /obj/item/surgery/retractor(src) + modules += new /obj/item/surgery/cautery(src) + modules += new /obj/item/surgery/bonegel(src) + modules += new /obj/item/surgery/FixOVein(src) + modules += new /obj/item/surgery/bonesetter(src) + modules += new /obj/item/surgery/circular_saw(src) + modules += new /obj/item/surgery/surgicaldrill(src) + modules += new /obj/item/gripper/chemistry(src) + modules += new /obj/item/reagent_containers/dropper/industrial(src) + modules += new /obj/item/reagent_containers/syringe(src) + modules += new /obj/item/reagent_containers/hypospray/borghypo/rescue(src) + modules += new /obj/item/roller_holder(src) // Security - src.modules += new /obj/item/handcuffs/cyborg(src) - src.modules += new /obj/item/melee/baton/robot(src) - src.modules += new /obj/item/melee/hammer/powered(src) - src.modules += new /obj/item/gun/energy/lasercannon/mounted/cyborg/overclocked(src) - src.modules += new /obj/item/borg/combat/shield(src) - src.modules += new /obj/item/borg/combat/mobility(src) + modules += new /obj/item/handcuffs/cyborg(src) + modules += new /obj/item/melee/baton/robot(src) + modules += new /obj/item/melee/hammer/powered(src) + modules += new /obj/item/gun/energy/lasercannon/mounted/cyborg/overclocked(src) + modules += new /obj/item/borg/combat/shield(src) + modules += new /obj/item/borg/combat/mobility(src) // BST - src.modules += new/obj/item/card/id/bst(src) + modules += new/obj/item/card/id/bst(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal(60000) var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) @@ -1129,39 +1133,39 @@ var/global/list/robot_modules = list( var/obj/item/matter_decompiler/MD = new /obj/item/matter_decompiler(src) MD.metal = metal MD.glass = glass - src.modules += MD + modules += MD var/obj/item/stack/material/cyborg/steel/M = new (src) M.synths = list(metal) - src.modules += M + modules += M var/obj/item/stack/material/cyborg/glass/G = new (src) G.synths = list(glass) - src.modules += G + modules += G var/obj/item/stack/rods/cyborg/RO = new /obj/item/stack/rods/cyborg(src) RO.synths = list(metal) - src.modules += RO + modules += RO var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) C.synths = list(wire) - src.modules += C + modules += C var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) S.synths = list(metal) - src.modules += S + modules += S var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) RG.synths = list(metal, glass) - src.modules += RG + modules += RG var/obj/item/stack/material/cyborg/plasteel/PL = new (src) PL.synths = list(plasteel) - src.modules += PL + modules += PL var/obj/item/stack/tile/floor_dark/cyborg/FTD = new (src) FTD.synths = list(plasteel) - src.modules += FTD + modules += FTD var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) @@ -1171,15 +1175,15 @@ var/global/list/robot_modules = list( B.uses_charge = 1 B.charge_costs = list(1000) B.synths = list(medicine) - src.modules += N - src.modules += B + modules += N + modules += B /obj/item/robot_module/bluespace/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) ..() - var/obj/item/melee/baton/robot/B = locate() in src.modules + var/obj/item/melee/baton/robot/B = locate() in modules if(B?.bcell) B.bcell.give(amount) - var/obj/item/reagent_containers/syringe/S = locate() in src.modules + var/obj/item/reagent_containers/syringe/S = locate() in modules if(S.mode == 2) S.reagents.clear_reagents() S.mode = initial(S.mode) diff --git a/code/modules/mob/living/silicon/robot/syndicate_robot.dm b/code/modules/mob/living/silicon/robot/syndicate_robot.dm index ef6f491cf06..97cc1098f49 100644 --- a/code/modules/mob/living/silicon/robot/syndicate_robot.dm +++ b/code/modules/mob/living/silicon/robot/syndicate_robot.dm @@ -79,6 +79,9 @@ ) has_safety = FALSE +/obj/item/gun/energy/mountedsmg/mech + projectile_type = /obj/item/projectile/bullet/pistol/medium/mech + /obj/item/gun/energy/crossbow/cyborg name = "mounted energy-crossbow" desc = "A weapon favored by mercenary infiltration teams, this one is suited to be used by cyborgs." diff --git a/code/modules/mob/living/simple_animal/friendly/adhomai.dm b/code/modules/mob/living/simple_animal/friendly/adhomai.dm index dcda3e9e717..fdf4da33ee0 100644 --- a/code/modules/mob/living/simple_animal/friendly/adhomai.dm +++ b/code/modules/mob/living/simple_animal/friendly/adhomai.dm @@ -97,63 +97,10 @@ melee_damage_lower = 15 melee_damage_upper = 15 - attacktext = "bitten" + attacktext = "gored" attack_sound = 'sound/weapons/bite.ogg' hostile_nameable = TRUE butchering_products = list(/obj/item/stack/material/animalhide = 5) meat_amount = 8 - -/mob/living/simple_animal/schlorrgo - name = "schlorrgo" - desc = "A fat creature native to the world of Hro'zamal." - icon = 'icons/mob/npc/livestock.dmi' - icon_state = "schlorgo" - icon_living = "schlorgo" - icon_dead = "schlorgo_dead" - speak = list("Ough!") - speak_emote = list("moans", "moans raucously") - emote_hear = list("moans", "moans raucously") - emote_see = list("rolls around") - - emote_sounds = list('sound/effects/creatures/ough.ogg') - - meat_amount = 3 - hunger_enabled = TRUE - canbrush = TRUE - - maxHealth = 50 - health = 50 - - has_udder = TRUE - milk_type = /decl/reagent/drink/milk/schlorrgo - - meat_type = /obj/item/reagent_containers/food/snacks/meat/adhomai - organ_names = list("head", "chest", "fatty core", "blubberous torso", "thick centre", "left leg", "right leg") - butchering_products = list(/obj/item/reagent_containers/food/snacks/spreads/lard = 5) - - holder_type = /obj/item/holder/schlorrgo - -/mob/living/simple_animal/schlorrgo/unarmed_harm_attack(mob/living/carbon/human/user) - var/obj/item/organ/external/left_leg = user.get_organ(BP_L_LEG) - var/obj/item/organ/external/right_leg = user.get_organ(BP_R_LEG) - - if(left_leg?.is_usable() && right_leg?.is_usable()) - user.visible_message(SPAN_WARNING("[user] punts \the [src]!")) - user.do_attack_animation(src) - make_noise() - throw_at(get_edge_target_turf(user, get_dir(user, src)), 4, 1) - poke(TRUE) - else - ..() - -/mob/living/simple_animal/schlorrgo/turf_collision(var/turf/T, var/speed = THROWFORCE_SPEED_DIVISOR) - visible_message(SPAN_WARNING("[src] harmlessly bounces off \the [T]!")) - playsound(T, 'sound/effects/bangtaper.ogg', 50, 1, 1) - make_noise() - -/mob/living/simple_animal/schlorrgo/fall_impact() - visible_message(SPAN_NOTICE("\The [src] bounces after landing!")) - step(src, pick(alldirs), 1) - return FALSE diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 4f4439355e0..95853540301 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -285,20 +285,6 @@ if(chicken_count < MAX_CHICKENS && prob(10)) START_PROCESSING(SSprocessing, E) -/obj/item/reagent_containers/food/snacks/egg - var/amount_grown = 0 - -/obj/item/reagent_containers/food/snacks/egg/process() - if(isturf(loc)) - amount_grown += rand(1,2) - if(amount_grown >= 100) - visible_message("[src] hatches with a quiet cracking sound.") - new /mob/living/simple_animal/chick(get_turf(src)) - STOP_PROCESSING(SSprocessing, src) - qdel(src) - else - STOP_PROCESSING(SSprocessing, src) - // Penguins /mob/living/simple_animal/penguin diff --git a/code/modules/mob/living/simple_animal/friendly/schlorrgo.dm b/code/modules/mob/living/simple_animal/friendly/schlorrgo.dm new file mode 100644 index 00000000000..ab59782270c --- /dev/null +++ b/code/modules/mob/living/simple_animal/friendly/schlorrgo.dm @@ -0,0 +1,216 @@ +#define EGG_SCHLORRGO 0 +#define BABY_SCHLORRGO 1 +#define NORMAL_SCHLORRGO 2 +#define FAT_SCHLORRGO 3 +#define WIDE_SCHLORRGO 4 +#define COLOSSAL_SCHLORRGO 5 + +/mob/living/simple_animal/schlorrgo + name = "schlorrgo" + desc = "A fat creature native to the world of Hro'zamal." + icon = 'icons/mob/npc/schlorrgo.dmi' + icon_state = "schlorrgo" + icon_living = "schlorrgo" + icon_dead = "schlorrgo_dead" + speak = list("Ough!") + speak_emote = list("moans", "moans raucously") + emote_hear = list("moans", "moans raucously") + emote_see = list("rolls around") + + emote_sounds = list('sound/effects/creatures/ough.ogg') + + meat_amount = 1 + hunger_enabled = TRUE + canbrush = TRUE + + maxHealth = 30 + health = 30 + + has_udder = TRUE + milk_type = /decl/reagent/drink/milk/schlorrgo + + friendly = "bumped" + + meat_type = /obj/item/reagent_containers/food/snacks/meat/adhomai + organ_names = list("head", "chest", "fatty core", "blubberous torso", "thick centre", "left leg", "right leg") + butchering_products = list(/obj/item/reagent_containers/food/snacks/spreads/lard = 2) + + holder_type = /obj/item/holder/schlorrgo + + max_nutrition = 100 + + stomach_size_mult = 10 + + metabolic_factor = 0.3 + + var/starting_nutrition = 100 + var/nutrition_threshold = 80 + + var/current_size = BABY_SCHLORRGO + +/mob/living/simple_animal/schlorrgo/Initialize() + . = ..() + nutrition = starting_nutrition + check_wideness_change() + +/mob/living/simple_animal/schlorrgo/unarmed_harm_attack(mob/living/carbon/human/user) + var/obj/item/organ/external/left_leg = user.get_organ(BP_L_LEG) + var/obj/item/organ/external/right_leg = user.get_organ(BP_R_LEG) + + if(left_leg?.is_usable() && right_leg?.is_usable()) + if(current_size >= WIDE_SCHLORRGO) + user.visible_message(SPAN_WARNING("[user] harmlessly kicks \the [src]!")) + var/obj/item/organ/external/leg = pick(right_leg, left_leg) + if(leg) + leg.take_damage(5) + else + user.visible_message(SPAN_WARNING("[user] punts \the [src]!")) + user.do_attack_animation(src) + make_noise() + throw_at(get_edge_target_turf(user, get_dir(user, src)), 4, 1) + poke(TRUE) + else + ..() + +/mob/living/simple_animal/schlorrgo/turf_collision(var/turf/T, var/speed = THROWFORCE_SPEED_DIVISOR) + visible_message(SPAN_WARNING("[src] harmlessly bounces off \the [T]!")) + playsound(T, 'sound/effects/bangtaper.ogg', 50, 1, 1) + make_noise() + +/mob/living/simple_animal/schlorrgo/fall_impact() + visible_message(SPAN_NOTICE("\The [src] bounces after landing!")) + step(src, pick(alldirs), 1) + return FALSE + +/mob/living/simple_animal/schlorrgo/process_food() + ..() + check_wideness_change() + +/mob/living/simple_animal/schlorrgo/proc/check_wideness_change() + if(nutrition >= nutrition_threshold) + increase_wideness() + +/mob/living/simple_animal/schlorrgo/proc/increase_wideness() + switch(current_size) + + if(EGG_SCHLORRGO) + name = "schlorrgo hatchling" + desc = "A fat creature native to the world of Hro'zamal. This one just hatched from an egg." + current_size = BABY_SCHLORRGO + max_nutrition = 100 + nutrition_threshold = 80 + maxHealth = 30 + health = 30 + mob_size = MOB_TINY + meat_amount = 1 + butchering_products = list(/obj/item/reagent_containers/food/snacks/spreads/lard = 2) + icon_state = "schlorrgo_baby" + icon_living = "schlorrgo_baby" + icon_dead = "schlorrgo_baby_dead" + holder_type = /obj/item/holder/schlorrgo/baby + + if(BABY_SCHLORRGO) + name = "schlorrgo" + desc = "A fat creature native to the world of Hro'zamal." + current_size = NORMAL_SCHLORRGO + max_nutrition = 200 + nutrition_threshold = 150 + maxHealth = 50 + health = 50 + mob_size = MOB_SMALL + meat_amount = 3 + butchering_products = list(/obj/item/reagent_containers/food/snacks/spreads/lard = 5) + icon_state = "schlorrgo" + icon_living = "schlorrgo" + icon_dead = "schlorrgo_dead" + holder_type = /obj/item/holder/schlorrgo + + if(NORMAL_SCHLORRGO) + name = "fat schlorrgo" + desc = "A fat creature native to the world of Hro'zamal. This one is fatter than most schlorrgo." + current_size = FAT_SCHLORRGO + max_nutrition = 400 + nutrition_threshold = 300 + maxHealth = 100 + health = 100 + mob_size = MOB_MEDIUM + meat_amount = 6 + butchering_products = list(/obj/item/reagent_containers/food/snacks/spreads/lard = 8) + icon_state = "schlorrgo_fat" + icon_living = "schlorrgo_fat" + icon_dead = "schlorrgo_fat_dead" + holder_type = /obj/item/holder/schlorrgo/fat + + if(FAT_SCHLORRGO) + name = "massive schlorrgo" + desc = "A fat creature native to the world of Hro'zamal. This one is so big it can barely walk." + current_size = WIDE_SCHLORRGO + max_nutrition = 1000 + nutrition_threshold = 800 + maxHealth = 250 + health = 250 + mob_size = MOB_LARGE + meat_amount = 12 + butchering_products = list(/obj/item/reagent_containers/food/snacks/spreads/lard = 12) + icon_state = "schlorrgo_wide" + icon_living = "schlorrgo_wide" + icon_dead = "schlorrgo_wide_dead" + melee_damage_lower = 15 + melee_damage_upper = 15 + attacktext = "crushed" + environment_smash = 1 + resistance = 2 + mob_swap_flags = HUMAN|SIMPLE_ANIMAL|SLIME|MONKEY + mob_push_flags = ALLMOBS + a_intent = I_HURT + emote_sounds = list('sound/effects/creatures/schlorrgo_scream.ogg') + holder_type = null + + if(WIDE_SCHLORRGO) + name = "colossal schlorrgo" + desc = "A fat creature native to the world of Hro'zamal. This one has been immobilized by its massive weight." + current_size = COLOSSAL_SCHLORRGO + max_nutrition = 1500 + maxHealth = 450 + health = 450 + mob_size = MOB_LARGE + meat_amount = 25 + butchering_products = list(/obj/item/reagent_containers/food/snacks/spreads/lard = 25) + icon = 'icons/mob/npc/colossal_schlorrgo.dmi' + icon_state = "schlorrgo_colossal" + icon_living = "schlorrgo_colossal" + icon_dead = "schlorrgo_colossal_dead" + pixel_x = -8 + anchored = TRUE + opacity = TRUE + melee_damage_lower = 25 + melee_damage_upper = 25 + environment_smash = 2 + resistance = 3 + mob_swap_flags = HUMAN|SIMPLE_ANIMAL|SLIME|MONKEY + mob_push_flags = ALLMOBS + a_intent = I_HURT + emote_sounds = list('sound/effects/creatures/schlorrgo_scream.ogg') + holder_type = null + + update_icon() + +/mob/living/simple_animal/schlorrgo/Move() + if(current_size >= COLOSSAL_SCHLORRGO) + return + ..() + +/mob/living/simple_animal/schlorrgo/attempt_grab(var/mob/living/grabber) + if(current_size >= WIDE_SCHLORRGO) + to_chat(grabber, SPAN_WARNING("\The [src] is too large to grab!")) + return FALSE + else + return TRUE + +/mob/living/simple_animal/schlorrgo/baby + max_nutrition = 50 + + starting_nutrition = 50 + nutrition_threshold = 30 + + current_size = EGG_SCHLORRGO \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index 66ac137f62e..b849764a21f 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -8,7 +8,8 @@ icon_gib = "bat_dead" speak_chance = 0 turns_per_move = 3 - meat_type = /obj/item/reagent_containers/food/snacks/meat + meat_type = /obj/item/reagent_containers/food/snacks/meat/bat + meat_amount = 6 //two wings per bat organ_names = list("upper bat", "mid bat", "lower bat") response_help = "pets the" response_disarm = "gently pushes aside the" diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 67002d4f644..324835e05d4 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -11,6 +11,7 @@ speak_chance = 0 turns_per_move = 5 meat_type = /obj/item/reagent_containers/food/snacks/fish/carpmeat + butchering_products = list(/obj/item/reagent_containers/food/snacks/fish/roe = 1) organ_names = list("head", "chest", "tail", "left flipper", "right flipper") response_help = "pets the" response_disarm = "gently pushes aside the" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 572597ddcf7..7f09dce3e3d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -930,6 +930,9 @@ /mob/living/simple_animal/set_respawn_time() set_death_time(ANIMAL, world.time) +/mob/living/simple_animal/get_organ_name_from_zone(var/def_zone) + return pick(organ_names) + /mob/living/simple_animal/is_anti_materiel_vulnerable() if(isSynthetic()) return TRUE diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 9a551a772da..e354d576bba 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -71,8 +71,6 @@ player_age = client.player_age - client.chatOutput.start() - if(loc && !isturf(loc)) client.eye = loc client.perspective = EYE_PERSPECTIVE @@ -95,3 +93,5 @@ // Check code/modules/admin/verbs/antag-ooc.dm for definition client.add_aooc_if_necessary() + + client.chatOutput.start() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 9b7b190a1c3..7c24c97e063 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -1253,4 +1253,25 @@ proc/is_blind(A) name = real_name voice_name = real_name if(mind) - mind.name = real_name \ No newline at end of file + mind.name = real_name + +/mob/proc/get_organ_name_from_zone(var/def_zone) + return parse_zone(def_zone) + +/mob/living/silicon/robot/set_name(var/new_name, var/prefix) + ..() + if(mmi) + mmi.brainmob.name = real_name + mmi.brainmob.real_name = real_name + mmi.name = "[initial(mmi.name)]: [real_name]" + + // We also need to update our internal ID + if(id_card) + if(prefix) + id_card.assignment = prefix + id_card.registered_name = real_name + id_card.update_name() + + //We also need to update name of internal camera. + if(camera) + camera.c_tag = real_name diff --git a/code/modules/organs/internal/species/tajara.dm b/code/modules/organs/internal/species/tajara.dm index 276de81a92e..55f4fd666fe 100644 --- a/code/modules/organs/internal/species/tajara.dm +++ b/code/modules/organs/internal/species/tajara.dm @@ -85,9 +85,11 @@ if(can_change_invisible()) owner.set_see_invisible(SEE_INVISIBLE_NOLIGHTING) if(status & ORGAN_ROBOT) - owner.add_client_color(vision_mechanical_color) + if(vision_mechanical_color) + owner.add_client_color(vision_mechanical_color) else - owner.add_client_color(vision_color) + if(vision_color) + owner.add_client_color(vision_color) /obj/item/organ/internal/eyes/night/proc/disable_night_vision() if(!owner) @@ -98,9 +100,11 @@ if(can_change_invisible()) owner.set_see_invisible(SEE_INVISIBLE_LIVING) if(status & ORGAN_ROBOT) - owner.remove_client_color(vision_mechanical_color) + if(vision_mechanical_color) + owner.remove_client_color(vision_mechanical_color) else - owner.remove_client_color(vision_color) + if(vision_color) + owner.remove_client_color(vision_color) /obj/item/organ/internal/stomach/tajara name = "reinforced stomach" diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index 82f175e19e9..96df91868f7 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -68,6 +68,7 @@ relative_size = 80 var/open = FALSE var/obj/item/cell/cell = /obj/item/cell/super + var/move_charge_factor = 1 //at 0.8 completely depleted after 60ish minutes of constant walking or 130 minutes of standing still var/servo_cost = 0.8 @@ -102,6 +103,7 @@ var/cost = get_power_drain() if(world.time - owner.l_move_time < 15) cost *= 2 + cost *= move_charge_factor use(cost) /obj/item/organ/internal/cell/proc/get_power_drain() diff --git a/code/modules/organs/subtypes/parasite.dm b/code/modules/organs/subtypes/parasite.dm index 7cf5945aa15..5657c4741a8 100644 --- a/code/modules/organs/subtypes/parasite.dm +++ b/code/modules/organs/subtypes/parasite.dm @@ -138,9 +138,9 @@ if(prob(10) && (owner.can_feel_pain())) if(stage < 3) - to_chat(owner, "You feel a stinging pain in your abdomen!") - else to_chat(owner, "You feel a stinging pain in your head!") + else + to_chat(owner, "A part of you tries to fight back, but the taste of the black k'ois puts you at ease.") owner.visible_message("[owner] winces slightly.") owner.adjustHalLoss(5) @@ -159,6 +159,9 @@ to_chat(owner, "You feel something squirming inside of you!") owner.reagents.add_reagent(/decl/reagent/kois/black, 4) + else if(prob(5)) + to_chat(owner, "In your struggle, a part of you wishes for the spread to continue.") + else if(prob(10)) to_chat(owner, "You feel disorientated!") switch(rand(1,3)) @@ -193,14 +196,13 @@ owner.emote("scream") owner.adjustBrainLoss(1, 55) - else if(prob(10)) + else if(prob(0.5)) to_chat(owner, "You feel something alien coming up your throat!") var/turf/T = get_turf(owner) - var/datum/reagents/R = new/datum/reagents(100) - R.add_reagent(/decl/reagent/kois/black,10) - R.add_reagent(/decl/reagent/toxin/phoron,5) + var/datum/reagents/R = new/datum/reagents(20) + R.add_reagent(/decl/reagent/kois/black,5) var/datum/effect/effect/system/smoke_spread/chem/spores/S = new("blackkois") S.attach(T) @@ -209,8 +211,8 @@ if(owner.can_feel_pain()) owner.emote("scream") - owner.adjustHalLoss(15) - owner.drip(15) + owner.adjustHalLoss(5) + owner.drip(5) owner.delayed_vomit() /obj/item/organ/internal/parasite/blackkois/removed(var/mob/living/carbon/human/target) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 0db871e2e29..71189775ee7 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -7,6 +7,8 @@ drop_sound = 'sound/items/drop/paper.ogg' pickup_sound = 'sound/items/pickup/paper.ogg' + var/can_write = FALSE + /obj/item/folder/blue desc = "A blue folder." icon_state = "folder_blue" @@ -52,7 +54,7 @@ var/dat = "[name]" for(var/obj/item/paper/P in src) - dat += "Remove Rename - [P.name]
" + dat += "[can_write ? "Write " : ""]Remove Rename - [P.name]
" for(var/obj/item/photo/Ph in src) dat += "Remove Rename - [Ph.name]
" for(var/obj/item/paper_bundle/Pb in src) @@ -69,14 +71,19 @@ if((usr.stat || usr.restrained())) return - if(src.loc == usr) + if(loc_check(usr)) if(href_list["remove"]) var/obj/item/P = locate(href_list["remove"]) if(P && (P.loc == src) && istype(P)) P.forceMove(usr.loc) usr.put_in_hands(P) - + handle_post_remove() + else if(href_list["write"]) + var/obj/item/paper/P = locate(href_list["write"]) + var/obj/item/I = usr.get_inactive_hand() + if(P && I && (P.loc == src) && istype(P) && I.ispen()) + P.attackby(I, usr) else if(href_list["read"]) var/obj/item/paper/P = locate(href_list["read"]) if(P && (P.loc == src) && istype(P)) @@ -111,6 +118,14 @@ update_icon() return +/obj/item/folder/proc/loc_check(var/atom/A) + if(loc == A) + return TRUE + return FALSE + +/obj/item/folder/proc/handle_post_remove() + return + /obj/item/folder/blue/nka/Initialize() . = ..() for (var/I = 1 to 5) @@ -119,4 +134,17 @@ /obj/item/folder/filled/Initialize() . = ..() for (var/I = 1 to 10) - new /obj/item/paper(src) \ No newline at end of file + new /obj/item/paper(src) + +/obj/item/folder/embedded + name = "index" + can_write = TRUE + +/obj/item/folder/embedded/loc_check(var/atom/A) + if(loc.loc == A) + return TRUE + return FALSE + +/obj/item/folder/embedded/handle_post_remove() + if(!length(contents)) + qdel(src) \ No newline at end of file diff --git a/code/modules/paperwork/journal.dm b/code/modules/paperwork/journal.dm new file mode 100644 index 00000000000..e0e5945f0fe --- /dev/null +++ b/code/modules/paperwork/journal.dm @@ -0,0 +1,96 @@ +/obj/item/journal + name = "journal" + desc = "A journal, kind of like a folder, but bigger! And personal." + var/closed_desc + desc_info = "Ctrl-click this while it's on your person to open this journal." + icon = 'icons/obj/contained_items/misc/journal.dmi' + icon_state = "journal" + item_state = "journal" + contained_sprite = TRUE + update_icon_on_init = TRUE + throw_speed = 1 + throw_range = 5 + w_class = ITEMSIZE_NORMAL + attack_verb = list("bashed", "whacked", "educated") + drop_sound = 'sound/items/drop/book.ogg' + pickup_sound = 'sound/items/pickup/book.ogg' + + var/static/list/insertables = list(/obj/item/paper, /obj/item/photo, /obj/item/paper_bundle, /obj/item/sample) + + var/open = FALSE + var/list/indices + +/obj/item/journal/Destroy() + for(var/obj/item/folder/embedded/E as anything in indices) + qdel(E) + return ..() + +/obj/item/journal/update_icon() + if(!open) + icon_state = "[initial(icon_state)]_closed" + else if(LAZYLEN(indices)) + icon_state = "[initial(icon_state)]_writing" + else + icon_state = initial(icon_state) + + if(closed_desc) + desc = open ? initial(desc) + closed_desc : initial(desc) + +/obj/item/journal/CtrlClick(mob/user) + if(loc == user) + open = !open + to_chat(user, SPAN_NOTICE("You [open ? "open" : "close"] \the [src].")) + update_icon() + return + return ..() + +/obj/item/journal/attack_self(mob/user) + if(!open) + to_chat(user, SPAN_WARNING("You can't look inside \the [src] while it's closed.")) + return + if(!LAZYLEN(indices)) + to_chat(user, SPAN_WARNING("\The [src] doesn't have anything inside!")) + return + var/selected_folder = input(user, "Select an index to view.", "Index View") as null|anything in indices + if(isnull(selected_folder)) + return + var/obj/item/folder/embedded/E = indices[selected_folder] + E.attack_self(user) + +/obj/item/journal/attackby(obj/item/I, mob/user) + if(is_type_in_list(I, insertables)) + if(!open) + to_chat(user, SPAN_WARNING("You can't put anything into \the [src] while it's closed.")) + return + var/obj/item/folder/embedded/E + var/list/options = LAZYLEN(indices) ? indices + "New Index" : list("New Index") + var/selected_folder = input(user, "Select an index to insert this into.", "Index Selection") as null|anything in options + if(isnull(selected_folder)) + return + if(selected_folder == "New Index") + E = generate_index(user) + else + E = indices[selected_folder] + if(!E) + return + user.drop_from_inventory(I, E) + to_chat(user, SPAN_NOTICE("You put \the [I] into \the [E].")) + update_icon() + return + +/obj/item/journal/proc/generate_index(var/mob/user) + var/obj/item/folder/embedded/E = new /obj/item/folder/embedded(src) + var/index_name = sanitize(input(user, "Enter the index' name.", "Index Name") as text|null) + if(!index_name) + qdel(E) + return null + if(index_name == "New Index" || LAZYISIN(indices, index_name)) + index_name = "Index ([length(indices) + 1])" + E.name = index_name + LAZYSET(indices, E.name, E) + destroyed_event.register(E, src, .proc/remove_index) + return E + +/obj/item/journal/proc/remove_index(var/obj/item/folder/embedded/E) + LAZYREMOVE(indices, E.name) + update_icon() \ No newline at end of file diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 101c6603526..067ec5b9c1f 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -319,6 +319,7 @@ t = replacetext(t, "\[logo_zavodskoi\]", "") t = replacetext(t, "\[logo_hp\]", "") t = replacetext(t, "\[logo_be\]", "") + t = replacetext(t, "\[logo_golden\]", "") if(iscrayon) t = "[t]" @@ -433,6 +434,8 @@ return var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen. + if(!i || !i.ispen()) + i = usr.get_inactive_hand() var/obj/item/clipboard/c var/iscrayon = FALSE var/isfountain = FALSE @@ -463,8 +466,7 @@ else isfountain = FALSE - // if paper is not in usr, then it must be near them, or in a clipboard or folder, which must be in or near usr - if(src.loc != usr && !src.Adjacent(usr) && !((istype(src.loc, /obj/item/clipboard) || istype(src.loc, /obj/item/folder)) && (src.loc.loc == usr || src.loc.Adjacent(usr)) ) ) + if(!write_check(usr)) return var/last_fields_value = fields @@ -495,6 +497,19 @@ if(c) c.update_icon() +/obj/item/paper/proc/write_check(var/mob/user) + . = TRUE + // if paper is not in usr, then it must be near them, or in a clipboard or folder, which must be in or near usr + if(loc != user && !Adjacent(user)) + . = FALSE + if(!. && istype(loc, /obj/item/clipboard)) + var/obj/item/clipboard/C = loc + if(C.loc == user || C.Adjacent(user)) + . = TRUE + if(!. && istype(loc, /obj/item/folder)) + var/obj/item/folder/F = loc + if(F.loc_check(user) || F.Adjacent(user)) + . = TRUE /obj/item/paper/attackby(var/obj/item/P, mob/user) ..() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index a7201c65b21..f61f27aed90 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -483,7 +483,7 @@ obj/structure/cable/proc/cableColor(var/colorC) throw_range = 5 matter = list(DEFAULT_WALL_MATERIAL = 50, MATERIAL_GLASS = 20) recyclable = TRUE - flags = CONDUCT + flags = HELDMAPTEXT|CONDUCT slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined", "flogged") stacktype = /obj/item/stack/cable_coil @@ -630,6 +630,7 @@ obj/structure/cable/proc/cableColor(var/colorC) update_held_icon() cut_overlays() add_overlay(overlay_image(icon, "[icon_state]_end", flags=RESET_COLOR)) + check_maptext(SMALL_FONTS(7, get_amount())) /obj/item/stack/cable_coil/attackby(var/obj/item/W, var/mob/user) if(W.ismultitool()) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index f9c7406b139..355e81d90f3 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -64,6 +64,18 @@ max_ammo = 9 multiple_sprites = 1 +/obj/item/ammo_magazine/c45m/stendo + name = "extended magazine (.45)" + desc = "A custom .45 pistol magazine fitted with an extended baseplate, increasing capacity to eleven rounds." + icon_state = "45e" + max_ammo = 11 + +/obj/item/ammo_magazine/c45m/lebman + name = "extended magazine (.45)" + desc = "A custom .45 pistol magazine made by welding two together. Has double the capacity of a normal magazine at eighteen rounds." + icon_state = "45l" + max_ammo = 18 + /obj/item/ammo_magazine/c45m/empty initial_ammo = 0 @@ -80,6 +92,15 @@ name = "magazine (.45 flash)" ammo_type = /obj/item/ammo_casing/c45/flash +/obj/item/ammo_magazine/c45m/auto + name = "extended magazine (.45)" + icon_state = "45a" + desc = "A NanoTrasen-produced extended magazine for their Mk58 line of pistols. \ + The overall construction has been strengthened to withstand the rigors of fully-automatic fire." + ammo_type = /obj/item/ammo_casing/c45 + max_ammo = 16 + multiple_sprites = 1 + /obj/item/ammo_magazine/mc10mm name = "magazine (10mm)" icon_state = "5.56" @@ -464,6 +485,11 @@ ammo_type = /obj/item/ammo_casing/plasma_bolt max_ammo = 30 +/obj/item/ammo_magazine/plasma/light/pistol + name = "tiny plasma cell" + ammo_type = /obj/item/ammo_casing/plasma_bolt + max_ammo = 15 + /obj/item/ammo_magazine/nuke name = "nuclear launcher cartridge" icon_state = "nukemag" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8ca0f3e7ca0..4eb9f5ef417 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -120,6 +120,8 @@ var/has_safety = TRUE var/image/safety_overlay + var/iff_capable = FALSE // if true, applies the user's ID iff_faction to the projectile + // sounds n shit var/safetyon_sound = 'sound/weapons/blade_open.ogg' var/safetyoff_sound = 'sound/weapons/blade_close.ogg' diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 2c6b23179fa..a7d79d51a75 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -145,6 +145,37 @@ ..() icon_state = (ammo_magazine)? "arifle" : "arifle-empty" +/obj/item/gun/projectile/automatic/rifle/shorty + name = "short-barreled assault rifle" + desc = "A durable, rugged-looking automatic weapon that has been heavily modified. \ + Key changes include significant shortening of the barrel and the addition of an improvised vertical foregrip, \ + condensing heavy firepower into a relatively small and maneuverable package intended for close-in \ + fighting aboard ships and space stations. Affectionately referred to as the \"Shorty\" in some circles. Uses 7.62mm rounds." + desc_fluff = "The STS35 is a durable, reliable, and cheap fully-automatic assault rifle with many licensed manufacturers across \ + the galaxy. It comes in many different versions and calibres; this one uses 7.62mm rounds. This example has been heavily modified and is illegal in some jurisdictions. \ + Much of the barrel has been lopped off to decrease overall length, while a pistol grip from another STS35 has been clamped on below what remains of the handguard \ + to improve handling. The fire control group has been altered as well, sacrificing the burst-fire function in favor of a smoother trigger pull. Born from \ + extensive experience fighting in claustrophobic environments aboard ships and stations, weapons like these are common among Coalition Rangers conducting high-risk boarding operations \ + along the Frontier, who rely on its ability to rapidly gain fire superiority in the event of an ambush. While no formal name exists for it, \ + and two no examples are quite alike, weapons of this type are commonly just referred to as the \"Shorty\"." + icon = 'icons/obj/guns/shorty.dmi' + icon_state = "shorty" + item_state = "shorty" + can_bayonet = TRUE + knife_x_offset = 23 + knife_y_offset = 13 + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=8), + list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, one_hand_fa_penalty=22, burst_accuracy = list(0,-1,-1,-1,-2,-2,-2,-3), dispersion = list(5, 5, 10, 15, 20)), + ) + + fire_delay = 8 + accuracy = 2 + +/obj/item/gun/projectile/automatic/rifle/shorty/update_icon() + ..() + icon_state = (ammo_magazine)? "shorty" : "shorty-empty" + /obj/item/gun/projectile/automatic/rifle/carbine name = "ballistic carbine" desc = "A durable, rugged looking semi-automatic weapon of a make popular on the frontier worlds. Uses 5.56mm rounds and does not accept large \ diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index af2f04daf26..38d6fcd064d 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -1,7 +1,7 @@ /obj/item/gun/projectile/colt - name = "vintage .45 pistol" - desc = "A rugged Zavodskoi-designed pistol. Uses .45 rounds." - desc_fluff = "The Zavodskoi Interstellar Colt was designed and marketed as an homage to classic Human firearms, and looks and acts much the same way - it was deliberately designed with some anachronistic features, but in spite of that artificial age of the design it performs well enough to see service all over Human space. Chambered in .45 caliber." + name = ".45 combat pistol" + desc = "A robust metal-framed .45-caliber handgun of a type descended from old-Earth designs, manufactured in many factories across \ + human-inhabited space. Used by all manners of factions across the Spur." magazine_type = /obj/item/ammo_magazine/c45m allowed_magazines = list(/obj/item/ammo_magazine/c45m) icon = 'icons/obj/guns/colt.dmi' @@ -16,7 +16,7 @@ /obj/item/gun/projectile/colt/update_icon() ..() - if(ammo_magazine && ammo_magazine.stored_ammo.len) + if(ammo_magazine?.stored_ammo.len) icon_state = "colt" else icon_state = "colt-e" @@ -42,6 +42,49 @@ to_chat(M, "You name the gun [input]. Say hello to your new friend.") return 1 +/obj/item/gun/projectile/colt/super + name = "ornamental .45 combat pistol" + desc = "A robust metal-framed .45-caliber handgun of a type descended from old-Earth designs, manufactured in many factories across \ + human-inhabited space. This example sports a short slide, wood-paneled grips, and few signs of use, likely belonging to someone of higher stature." + desc_fluff = "Whoever did this is a professional, no question. This thing could shoot a one-hole at 25 yards in a machine rest." + magazine_type = /obj/item/ammo_magazine/c45m/stendo + icon = 'icons/obj/guns/coltsuper.dmi' + icon_state = "coltsuper" + item_state = "coltsuper" + +/obj/item/gun/projectile/colt/super/update_icon() + ..() + if(ammo_magazine?.stored_ammo.len) + icon_state = "coltsuper" + else + icon_state = "coltsuper-e" + +/obj/item/gun/projectile/automatic/lebman + name = "automatic .45 combat pistol" + desc = "A robust metal-framed .45-caliber handgun of a type descended from old-Earth designs, manufactured in many factories across \ + human-inhabited space. This example has been modified to allow fully-automatic fire, and sports a prominent vertical grip and muzzle compensator to aid in control." + magazine_type = /obj/item/ammo_magazine/c45m/lebman + icon = 'icons/obj/guns/coltauto.dmi' + icon_state = "coltauto" + item_state = "coltauto" + w_class = ITEMSIZE_NORMAL + accuracy = 1 + offhand_accuracy = 1 + load_method = MAGAZINE + slot_flags = SLOT_BELT|SLOT_HOLSTER + max_shells = 18 + caliber = ".45" + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) + ammo_type = /obj/item/ammo_casing/c45 + allowed_magazines = list(/obj/item/ammo_magazine/c45m) + +/obj/item/gun/projectile/automatic/lebman/update_icon() + ..() + if(ammo_magazine?.stored_ammo.len) + icon_state = "coltauto" + else + icon_state = "coltauto-e" + /obj/item/gun/projectile/sec name = ".45 pistol" desc = "A NanoTrasen designed sidearm, found among law enforcement and security forces. Uses .45 rounds." @@ -89,10 +132,13 @@ /obj/item/gun/projectile/automatic/x9 name = "automatic .45 pistol" - desc = "The x9 tactical pistol is a lightweight fast firing handgun. Uses .45 rounds." + desc = "A NanoTrasen-designed sidearm, modified for fully-automatic fire. Issued to select security and law enforcement groups. Uses .45 rounds." + desc_fluff = "The NT Mk58 is a ballistic sidearm developed and produced by Nanotrasen. Bulky and heavy, the Mk58 is nonetheless used by security \ + forces and law enforcement for its ease of use, low maintenance requirement, longevity, reliability - and most of all, extremely inexpensive price tag. \ + A trademark of Nanotrasen security forces. This one has been modified for fully-automatic fire from the factory and sports a collapsible shoulder stock for better control. It uses .45 rounds." icon = 'icons/obj/guns/x9.dmi' - icon_state = "x9tactical" - item_state = "x9" + icon_state = "secgunauto" + item_state = "secgunauto" w_class = ITEMSIZE_NORMAL accuracy = 1 offhand_accuracy = 1 @@ -102,12 +148,19 @@ caliber = ".45" origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2) ammo_type = /obj/item/ammo_casing/c45 - magazine_type = /obj/item/ammo_magazine/c45x - allowed_magazines = list(/obj/item/ammo_magazine/c45x) + magazine_type = /obj/item/ammo_magazine/c45m/auto + allowed_magazines = list(/obj/item/ammo_magazine/c45m) multi_aim = 1 auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' +/obj/item/gun/projectile/automatic/x9/update_icon() + ..() + if(ammo_magazine?.stored_ammo.len) + icon_state = "secgunauto" + else + icon_state = "secgunauto-e" + /obj/item/gun/projectile/tanto desc = "A Zavodskoi Interstellar Tanto .40, designed to compete with the NT Mk58. Uses 10mm rounds." name = "10mm auto-pistol" diff --git a/code/modules/projectiles/guns/projectile/plasma.dm b/code/modules/projectiles/guns/projectile/plasma.dm index 824f8650fa2..068aa2f07fa 100644 --- a/code/modules/projectiles/guns/projectile/plasma.dm +++ b/code/modules/projectiles/guns/projectile/plasma.dm @@ -46,3 +46,28 @@ use_external_power = TRUE self_recharge = TRUE projectile_type = /obj/item/projectile/plasma + +/obj/item/gun/projectile/plasma/bolter/pistol + name = "plasma pistol" + desc = "An Elyran designed firearm used for diplomatic protection and high value escort which fires super heated bolts of plasma. Rare outside of it's birth country due to the maintenance and production costs." + icon = 'icons/obj/guns/plasma_pistol.dmi' + icon_state = "plasma" + item_state = "plasma" + magazine_type = /obj/item/ammo_magazine/plasma/light/pistol + allowed_magazines = list(/obj/item/ammo_magazine/plasma/light/pistol) + slot_flags = SLOT_BELT + accuracy = 1 + +/obj/item/gun/projectile/plasma/bolter/pistol/update_icon() + ..() + if(ammo_magazine) + var/ratio = length(ammo_magazine.stored_ammo) / ammo_magazine.max_ammo + if(!length(ammo_magazine.stored_ammo)) + ratio = 0 + else + ratio = max((round(ratio, 0.25) * 100), 25) + icon_state = "[initial(icon_state)][ratio]" + item_state = "[initial(item_state)][ratio]" + else + icon_state = "[initial(icon_state)]-empty" + item_state = "[initial(item_state)]-empty" \ No newline at end of file diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 99169b086b7..260ac27c47d 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -99,6 +99,8 @@ var/hit_effect var/anti_materiel_potential = 1 //how much the damage of this bullet is increased against mechs + var/iff // identify friend or foe. will check mob's IDs to see if they match, if they do, won't hit + /obj/item/projectile/CanPass() return TRUE @@ -173,8 +175,17 @@ shot_from = launcher.name silenced = launcher.silenced + if(launcher.iff_capable && user) + iff = get_iff_from_user(user) + return launch_projectile(target, target_zone, user, params, angle_override, forced_spread) +/obj/item/projectile/proc/get_iff_from_user(var/mob/user) + var/obj/item/card/id/ID = user.GetIdCard() + if(ID) + return ID.iff_faction + return null + //Called when the projectile intercepts a mob. Returns 1 if the projectile hit the mob, 0 if it missed and should keep flying. /obj/item/projectile/proc/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier=0) if(!istype(target_mob)) @@ -203,14 +214,7 @@ if(PROJECTILE_STOPPED) return TRUE - var/impacted_organ = parse_zone(def_zone) - if(isanimal(target_mob)) - var/mob/living/simple_animal/SA = target_mob - impacted_organ = pick(SA.organ_names) - else if(ishuman(target_mob)) - var/mob/living/carbon/human/H = target_mob - var/obj/item/organ/external/E = H.organs_by_name[impacted_organ] - impacted_organ = E.name + var/impacted_organ = target_mob.get_organ_name_from_zone(def_zone) //hit messages if(silenced) to_chat(target_mob, "You've been hit in the [impacted_organ] by \a [src]!") @@ -268,15 +272,18 @@ if(ismob(A)) var/mob/M = A if(isliving(A)) //so ghosts don't stop bullets - if(M.dir & get_dir(M, starting)) // only check neckgrab if they're facing in the direction the bullets came from - //if they have a neck grab on someone, that person gets hit instead - for(var/obj/item/grab/G in list(M.l_hand, M.r_hand)) - if(!G.affecting.lying && G.state >= GRAB_NECK) - visible_message(SPAN_DANGER("\The [M] uses [G.affecting] as a shield!")) - if(Collide(G.affecting)) - return //If Collide() returns 0 (keep going) then we continue on to attack M. + if(check_iff(M)) + passthrough = TRUE + else + if(M.dir & get_dir(M, starting)) // only check neckgrab if they're facing in the direction the bullets came from + //if they have a neck grab on someone, that person gets hit instead + for(var/obj/item/grab/G in list(M.l_hand, M.r_hand)) + if(!G.affecting.lying && G.state >= GRAB_NECK) + visible_message(SPAN_DANGER("\The [M] uses [G.affecting] as a shield!")) + if(Collide(G.affecting)) + return //If Collide() returns 0 (keep going) then we continue on to attack M. - passthrough = !attack_mob(M, distance) + passthrough = !attack_mob(M, distance) else passthrough = TRUE else @@ -312,6 +319,14 @@ qdel(src) return TRUE +/obj/item/projectile/proc/check_iff(var/mob/M) + if(isnull(iff)) + return FALSE + var/obj/item/card/id/ID = M.GetIdCard() + if(ID && (ID.iff_faction == iff)) + return TRUE + return FALSE + /obj/item/projectile/ex_act(var/severity = 2.0) return //explosions probably shouldn't delete projectiles diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 18f30fc3705..fee955632bf 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -50,6 +50,9 @@ damage = 35 armor_penetration = 10 +/obj/item/projectile/beam/midlaser/mech + armor_penetration = 35 + /obj/item/projectile/beam/heavylaser name = "heavy laser" icon_state = "heavylaser" @@ -70,6 +73,10 @@ tracer_type = /obj/effect/projectile/tracer/xray impact_type = /obj/effect/projectile/impact/xray +/obj/item/projectile/beam/xray/mech + damage = 40 + armor_penetration = 75 + /obj/item/projectile/beam/pulse name = "pulse" icon_state = "u_laser" @@ -80,6 +87,10 @@ tracer_type = /obj/effect/projectile/tracer/pulse impact_type = /obj/effect/projectile/impact/pulse +/obj/item/projectile/beam/pulse/mech + damage = 45 + armor_penetration = 40 + /obj/item/projectile/beam/pulse/on_hit(var/atom/target, var/blocked = 0) if(isturf(target)) target.ex_act(2) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index d548225266b..2aa8dd6de3d 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -127,6 +127,9 @@ /obj/item/projectile/bullet/pistol/medium damage = 30 +/obj/item/projectile/bullet/pistol/medium/mech + armor_penetration = 35 + /obj/item/projectile/bullet/pistol/strong damage = 45 armor_penetration = 20 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 38a976d14f9..df73a5d3eeb 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -274,7 +274,7 @@ reagent_state = SOLID nutriment_factor = 12 - color = "#CCCCCC" + color = "#ffdfb0" taste_description = "fat" //Unathi can digest fats too @@ -435,7 +435,7 @@ name = "Mint" description = "Also known as Mentha." reagent_state = LIQUID - color = "#CF3600" + color = "#CFFFE5" taste_description = "mint" /decl/reagent/nutriment/glucose @@ -780,7 +780,7 @@ /decl/reagent/drink/grapejuice name = "Grape Juice" description = "It's grrrrrape!" - color = "#863333" + color = "#660099" taste_description = "grapes" glass_icon_state = "grapejuice" @@ -790,7 +790,7 @@ /decl/reagent/drink/lemonjuice name = "Lemon Juice" description = "This juice is VERY sour." - color = "#AFAF00" + color = "#FFFF40" taste_description = "sourness" glass_icon_state = "lemonjuice" @@ -800,7 +800,7 @@ /decl/reagent/drink/limejuice name = "Lime Juice" description = "The sweet-sour juice of limes." - color = "#365E30" + color = "#6dbd61" taste_description = "tart citrus" taste_mult = 1.1 @@ -839,7 +839,7 @@ name = "Potato Juice" description = "Juice of the potato. Bleh." nutrition = 2 - color = "#302000" + color = "#a07727" taste_description = "potato" glass_icon_state = "glass_brown" @@ -863,7 +863,7 @@ /decl/reagent/drink/watermelonjuice name = "Watermelon Juice" description = "Delicious juice made from watermelon." - color = "#B83333" + color = "#d12323" taste_description = "watermelon" glass_icon_state = "glass_red" @@ -883,7 +883,7 @@ /decl/reagent/drink/earthenrootjuice name = "Earthen-Root Juice" description = "Juice extracted from earthen-root, a plant native to Adhomai." - color = "#4D8F53" + color = "#679fb6" taste_description = "sweetness" glass_icon_state = "bluelagoon" @@ -1172,7 +1172,7 @@ /decl/reagent/drink/tea/greentea name = "Green Tea" description = "Tasty green tea. It's good for you!" - color = "#B7C49D" + color = "#99a87b" taste_description = "light, refreshing tea" glass_icon_state = "bigteacup" @@ -1203,7 +1203,7 @@ /decl/reagent/drink/tea/kira_tea name = "Kira Tea" description = "A sweet take on a fizzy favorite." - color = "#8A8A57" + color = "#B98546" taste_description = "fizzy citrus tea" carbonated = TRUE @@ -1238,7 +1238,7 @@ /decl/reagent/drink/tea/mendell_tea name = "Mendell Afternoon Tea" description = "A simple, minty tea." - color = "#859466" + color = "#EFB300" taste_description = "minty tea with a hint of lemon" glass_icon_state = "mendelltea" @@ -1258,7 +1258,7 @@ /decl/reagent/drink/tea/pomegranate_icetea name = "Pomegranate Iced Tea" description = "A refreshing, fruity tea. No fruit was harmed in the making of this drink." - color = "#302109" + color = "#7C334C" taste_description = "sweet pomegranate" glass_icon_state = "pomegranatetea" @@ -1365,7 +1365,7 @@ /decl/reagent/drink/tea/tropical_icetea name = "Tropical Iced Tea" description = "For maximum enjoyment, drink while at the beach on a warm summer day." - color = "#773404" + color = "#CC0066" taste_description = "sweet beachside fruit" glass_icon_state = "junglejuice" @@ -1413,7 +1413,7 @@ /decl/reagent/drink/coffee/icecoffee name = "Frappe Coffee" description = "Coffee and ice, refreshing and cool." - color = "#102838" + color = "#804000" glass_icon_state = "frappe" glass_name = "glass of frappe coffee" @@ -1656,7 +1656,7 @@ /decl/reagent/drink/tonic name = "Tonic Water" description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." - color = "#664300" + color = "#AEE5E4" adj_dizzy = -5 adj_drowsy = -3 adj_sleepy = -2 @@ -1724,7 +1724,7 @@ /decl/reagent/drink/milkshake name = "Milkshake" description = "Glorious brainfreezing mixture." - color = "#AEE5E4" + color = "#DADADA" taste_description = "creamy vanilla" glass_icon_state = "milkshake" @@ -1753,7 +1753,7 @@ /decl/reagent/drink/nuka_cola name = "Nuka Cola" description = "Cola, cola never changes." - color = "#100800" + color = "#706a58" adj_sleepy = -2 caffeine = 1 taste_description = "cola" @@ -1801,7 +1801,7 @@ /decl/reagent/drink/spacemountainwind name = "Mountain Wind" description = "Blows right through you like a space wind." - color = "#93230b" + color = "#a2ff8d" adj_drowsy = -7 adj_sleepy = -1 taste_description = "sweet citrus soda" @@ -1838,7 +1838,7 @@ /decl/reagent/drink/spaceup name = "Space-Up" description = "Tastes like a hull breach in your mouth." - color = "#202800" + color = "#aee5e4" taste_description = "a hull breach" carbonated = TRUE @@ -1860,7 +1860,7 @@ name = "The Doctor's Delight" description = "A gulp a day keeps the MediBot away. That's probably for the best." reagent_state = LIQUID - color = "#FF8CFF" + color = "#BA7CBA" nutrition = 1 taste_description = "homely fruit" @@ -1887,14 +1887,14 @@ reagent_state = SOLID nutrition = 1 hydration = 0 - color = "#302000" + color = "#d44557" taste_description = "dry and cheap noodles" /decl/reagent/drink/hot_ramen name = "Hot Ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." reagent_state = LIQUID - color = "#302000" + color = "#d44557" nutrition = 5 hydration = 5 adj_temp = 5 @@ -1904,7 +1904,7 @@ name = "Hell Ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." reagent_state = LIQUID - color = "#302000" + color = "#a82323" nutrition = 5 hydration = 5 taste_description = "wet and cheap noodles on fire" @@ -1936,7 +1936,7 @@ /decl/reagent/drink/meatshake name = "Meatshake" - color = "#874c20" + color = "#bc1e00" description = "Blended meat and cream for those who want crippling heart failure down the road." taste_description = "liquified meat" @@ -1947,7 +1947,7 @@ /decl/reagent/drink/ciderhot name = "Apple Cider" description = "A great drink to warm up a crisp autumn afternoon!" - color = "#664300" + color = "#e4c35e" taste_description = "fresh apples mixed with cinnamon" glass_icon_state = "ciderhot" @@ -1957,7 +1957,7 @@ /decl/reagent/drink/cidercold name = "Apple Cider" description = "A refreshing mug of fresh apples and cinnamon." - color = "#664300" + color = "#e4c35e" taste_description = "fresh apples mixed with cinnamon" glass_icon_state = "meadglass" @@ -1967,7 +1967,7 @@ /decl/reagent/drink/cidercheap name = "Apple Cider Juice" description = "It's just spiced up apple juice. Ugh." - color = "#664300" + color = "#e4c35e" taste_description = "sad apple juice with cinnamon" glass_icon_state = "meadglass" @@ -1978,7 +1978,7 @@ name = "Toothpaste" description = "A paste commonly used in oral hygiene." reagent_state = LIQUID - color = "#b1eae8" + color = "#9ddaff" taste_description = "toothpaste" overdose = REAGENTS_OVERDOSE var/strength = 50 @@ -2045,7 +2045,7 @@ /decl/reagent/drink/toothpaste/teathpaste name = "Teathpaste" description = "A sad attempt to reduce the effects of sugary tea on your teeth." - color = "#45615A" + color = "#0099cc" strength = 20 taste_description = "liquid dental work" @@ -2083,7 +2083,7 @@ /decl/reagent/alcohol/ale name = "Ale" description = "A dark alchoholic beverage made by malted barley and yeast." - color = "#664300" + color = "#9f6568" strength = 6 taste_description = "hearty barley ale" carbonated = TRUE @@ -2096,7 +2096,7 @@ /decl/reagent/alcohol/beer name = "Beer" description = "An alcoholic beverage made from malted grains, hops, yeast, and water." - color = "#664300" + color = "#e3e77b" strength = 5 nutriment_factor = 1 taste_description = "beer" @@ -2152,7 +2152,7 @@ /decl/reagent/alcohol/cognac name = "Cognac" description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." - color = "#AB3C05" + color = "#e0a866" strength = 40 taste_description = "rich and smooth alcohol" @@ -2164,7 +2164,7 @@ /decl/reagent/alcohol/deadrum name = "Deadrum" description = "Popular with the sailors. Not very popular with everyone else." - color = "#664300" + color = "#cac17e" strength = 40 taste_description = "salty sea water" @@ -2181,7 +2181,7 @@ /decl/reagent/alcohol/gin name = "Gin" description = "It's gin. In space. I say, good sir." - color = "#664300" + color = "#dfeef0" strength = 30 taste_description = "an alcoholic christmas tree" @@ -2193,7 +2193,7 @@ /decl/reagent/alcohol/victorygin name = "Victory Gin" description = "An oily Adhomai-based gin." - color = "#664300" + color = "#dfeef0" strength = 18 taste_description = "oily gin" @@ -2233,7 +2233,7 @@ /decl/reagent/alcohol/coffee/kahlua name = "Kahlua" description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" - color = "#664300" + color = "#8f8469" strength = 20 caffeine = 0.25 taste_description = "spiked latte" @@ -2246,7 +2246,7 @@ /decl/reagent/alcohol/makgeolli name = "Makgeolli" description = "A mild Konyanger sparkling rice wine." - color = "#664300" + color = "#c7b687" strength = 15 taste_description = "creamy dry alcohol" @@ -2270,7 +2270,7 @@ /decl/reagent/alcohol/rum name = "Rum" description = "Yohoho and all that." - color = "#664300" + color = "#cac17e" strength = 40 taste_description = "spiked butterscotch" @@ -2282,7 +2282,7 @@ /decl/reagent/alcohol/sake name = "Sake" description = "Anime's favorite drink." - color = "#664300" + color = "#bdcdc1" strength = 20 taste_description = "mildly dry alcohol with a subtle sweetness" @@ -2306,7 +2306,7 @@ /decl/reagent/alcohol/soju name = "Soju" description = "A mild Konyanger spirit that is best described as rice vodka." - color = "#664300" + color = "#f2f9fa" strength = 25 taste_description = "slightly dry alcohol with a subtle burn" @@ -2330,7 +2330,7 @@ /decl/reagent/alcohol/thirteenloko name = "Thirteen Loko" description = "A potent mixture of caffeine and alcohol." - color = "#102000" + color = "#ffb928" strength = 10 nutriment_factor = 1 caffeine = 0.5 @@ -2395,7 +2395,7 @@ /decl/reagent/alcohol/whiskey name = "Whiskey" description = "A superb and well-aged single-malt whiskey. Damn." - color = "#664300" + color = "#b5a288" strength = 40 taste_description = "molasses" @@ -2422,7 +2422,7 @@ name = "Acid Spit" description = "A drink for the daring, can be deadly if incorrectly prepared!" reagent_state = LIQUID - color = "#365000" + color = "#8de45e" strength = 25 taste_description = "stomach acid" @@ -2434,7 +2434,7 @@ /decl/reagent/alcohol/alliescocktail name = "Allies Cocktail" description = "A drink made from your allies, not as sweet as when made from your enemies." - color = "#664300" + color = "#33ccff" strength = 25 taste_description = "bitter yet free" @@ -2446,7 +2446,7 @@ /decl/reagent/alcohol/aloe name = "Aloe" description = "So very, very, very good." - color = "#664300" + color = "#ffff00" strength = 15 taste_description = "sweet 'n creamy" @@ -2459,7 +2459,7 @@ name = "Amasec" description = "Official drink of the Gun Club!" reagent_state = LIQUID - color = "#664300" + color = "#e3e45e" strength = 25 taste_description = "dark and metallic" @@ -2471,7 +2471,7 @@ /decl/reagent/alcohol/andalusia name = "Andalusia" description = "A nice, strangely named drink." - color = "#664300" + color = "#ffff66" strength = 35 taste_description = "lemons" @@ -2483,7 +2483,7 @@ /decl/reagent/alcohol/antifreeze name = "Anti-freeze" description = "Ultimate refreshment." - color = "#664300" + color = "#30f0ff" strength = 20 adj_temp = 20 targ_temp = 330 @@ -2498,7 +2498,7 @@ name = "Atomic Bomb" description = "Nuclear proliferation never tasted so good." reagent_state = LIQUID - color = "#666300" + color = "#996633" strength = 50 druggy = 50 taste_description = "da bomb" @@ -2511,7 +2511,7 @@ /decl/reagent/alcohol/coffee/b52 name = "B-52" description = "Coffee, Irish Cream, and cognac. You will get bombed." - color = "#664300" + color = "#996633" strength = 35 taste_description = "angry and irish" @@ -2522,7 +2522,7 @@ /decl/reagent/alcohol/bahama_mama name = "Bahama mama" description = "Tropical cocktail." - color = "#FF7F3B" + color = "#f06820" strength = 15 taste_description = "lime and orange" @@ -2534,7 +2534,7 @@ /decl/reagent/alcohol/diona_mama name = "Diona Mama" description = "Lightly irradiated." - color = "#56A05D" + color = "#3b8042" strength = 25 druggy = 25 taste_description = "tangy, irradiated licorice" @@ -2572,7 +2572,7 @@ /decl/reagent/alcohol/barefoot name = "Barefoot" description = "Barefoot and pregnant" - color = "#664300" + color = "#ff66cc" strength = 15 taste_description = "creamy berries" @@ -2585,7 +2585,7 @@ name = "Beepsky Smash" description = "Deny drinking this and prepare for THE LAW." reagent_state = LIQUID - color = "#664300" + color = "#808000" strength = 35 taste_description = "JUSTICE" @@ -2614,7 +2614,7 @@ /decl/reagent/alcohol/blackrussian name = "Black Russian" description = "For the lactose-intolerant. Still as classy as a White Russian." - color = "#360000" + color = "#993a38" strength = 20 taste_description = "bitterness" @@ -2626,7 +2626,7 @@ /decl/reagent/alcohol/bloodymary name = "Bloody Mary" description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." - color = "#664300" + color = "#c2707e" strength = 20 taste_description = "tomatoes with a hint of lime" @@ -2648,7 +2648,7 @@ /decl/reagent/alcohol/coffee/brave_bull name = "Brave Bull" description = "It's just as effective as Dutch-Courage!" - color = "#664300" + color = "#95958f" strength = 30 caffeine = 0.2 taste_description = "alcoholic bravery" @@ -2697,7 +2697,7 @@ /decl/reagent/alcohol/martini name = "Classic Martini" description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." - color = "#664300" + color = "#ceddad" strength = 25 taste_description = "dry class" @@ -2721,7 +2721,7 @@ /decl/reagent/alcohol/cubalibre name = "Cuba Libre" description = "A rum and coke with lime. Viva la revolucion." - color = "#3E1B00" + color = "#8a6167" strength = 10 taste_description = "cola and a hint of lime" carbonated = TRUE @@ -2734,7 +2734,7 @@ /decl/reagent/alcohol/rumandcola name = "Rum and Cola" description = "A classic cocktail consisting of rum and cola." - color = "#3E1B00" + color = "#8a6167" strength = 10 taste_description = "cola" carbonated = TRUE @@ -2760,7 +2760,7 @@ /decl/reagent/alcohol/devilskiss name = "Devils Kiss" description = "Creepy time!" - color = "#A68310" + color = "#ff0033" strength = 15 taste_description = "bitter iron" @@ -2798,7 +2798,7 @@ /decl/reagent/alcohol/ginfizz name = "Gin Fizz" description = "Refreshingly lemony, deliciously dry." - color = "#664300" + color = "#ffffcc" strength = 20 taste_description = "dry, tart lemons" carbonated = TRUE @@ -2812,7 +2812,7 @@ name = "Grog" description = "Watered-down rum, pirate approved!" reagent_state = LIQUID - color = "#664300" + color = "#e3e45e" strength = 10 taste_description = "a poor excuse for alcohol" @@ -2823,7 +2823,7 @@ /decl/reagent/alcohol/erikasurprise name = "Erika Surprise" description = "The surprise is, it's green!" - color = "#2E6671" + color = "#67bc50" strength = 15 taste_description = "tartness and bananas" @@ -2836,7 +2836,7 @@ name = "Pan-Galactic Gargle Blaster" description = "Whoah, this stuff looks volatile!" reagent_state = LIQUID - color = "#664300" + color = "#afb4e7" strength = 50 taste_description = "your brains smashed out by a lemon wrapped around a gold brick" @@ -2848,7 +2848,7 @@ /decl/reagent/alcohol/gintonic name = "Gin and Tonic" description = "An all time classic, mild cocktail." - color = "#664300" + color = "#c1dade" strength = 12 taste_description = "mild and tart" carbonated = TRUE @@ -2861,7 +2861,7 @@ /decl/reagent/alcohol/goldschlager name = "Goldschlager" description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." - color = "#664300" + color = "#97e9f0" strength = 50 taste_description = "burning cinnamon" @@ -2874,7 +2874,7 @@ name = "Hippies' Delight" description = "You just don't get it maaaan." reagent_state = LIQUID - color = "#664300" + color = "#cc7470" strength = 15 druggy = 50 taste_description = "giving peace a chance" @@ -2898,7 +2898,7 @@ /decl/reagent/alcohol/iced_beer name = "Iced Beer" description = "A beer which is so cold the air around it freezes." - color = "#664300" + color = "#c5dc99" strength = 5 targ_temp = 270 taste_description = "refreshingly cold" @@ -2912,7 +2912,7 @@ /decl/reagent/alcohol/irishcarbomb name = "Irish Car Bomb" description = "Mmm, tastes like chocolate cake..." - color = "#2E6671" + color = "#0c0704" strength = 50 taste_description = "delicious anger" carbonated = TRUE @@ -2988,7 +2988,7 @@ /decl/reagent/alcohol/longislandicedtea name = "Long Island Iced Tea" description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - color = "#664300" + color = "#ff6633" strength = 40 taste_description = "a mixture of cola and alcohol" carbonated = TRUE @@ -3001,7 +3001,7 @@ /decl/reagent/alcohol/manhattan name = "Manhattan" description = "The Detective's undercover drink of choice. He never could stomach gin..." - color = "#664300" + color = "#ff3300" strength = 30 taste_description = "mild dryness" @@ -3013,7 +3013,7 @@ /decl/reagent/alcohol/manhattan_proj name = "Manhattan Project" description = "A scientist's drink of choice, for pondering ways to blow up the station." - color = "#664300" + color = "#ff3300" strength = 30 druggy = 30 taste_description = "death, the destroyer of worlds" @@ -3026,7 +3026,7 @@ /decl/reagent/alcohol/manly_dorf name = "The Manly Dorf" description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." - color = "#664300" + color = "#ce950f" strength = 45 taste_description = "hair on your chest and your chin" carbonated = TRUE @@ -3038,7 +3038,7 @@ /decl/reagent/alcohol/margarita name = "Margarita" description = "On the rocks with salt on the rim. Arriba~!" - color = "#8CFF8C" + color = "#dce6d2" strength = 30 taste_description = "dry and salty" @@ -3051,7 +3051,7 @@ name = "Mead" description = "A Viking's drink, though a cheap one." reagent_state = LIQUID - color = "#664300" + color = "#e4c35e" strength = 25 nutriment_factor = 1 taste_description = "sweet yet alcoholic" @@ -3064,7 +3064,7 @@ /decl/reagent/alcohol/moonshine name = "Moonshine" description = "You've really hit rock bottom now... your liver packed its bags and left last night." - color = "#664300" + color = "#86d0cb" strength = 65 taste_description = "bitterness" @@ -3122,7 +3122,7 @@ /decl/reagent/alcohol/patron name = "Patron" description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." - color = "#585840" + color = "#c5c59c" strength = 20 taste_description = "metallic and expensive" @@ -3170,7 +3170,7 @@ /decl/reagent/alcohol/planterpunch name = "Planter's Punch" description = "A popular beach cocktail." - color = "#FFA700" + color = "#F27900" strength = 25 taste_description = "jamaica" @@ -3225,7 +3225,7 @@ /decl/reagent/alcohol/sbiten name = "Sbiten" description = "A spicy mix of mead and spices! Might be a little hot for the little guys!" - color = "#664300" + color = "#d8d7ae" strength = 40 adj_temp = 50 targ_temp = 360 @@ -3239,7 +3239,7 @@ /decl/reagent/alcohol/screwdrivercocktail name = "Screwdriver" description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." - color = "#A68310" + color = "#d9ab92" strength = 15 taste_description = "oranges" @@ -3248,11 +3248,22 @@ glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." glass_center_of_mass = list("x"=15, "y"=10) +/decl/reagent/alcohol/sidewinderfang + name = "Sidewinder Fang" + description = "Mess with the viper, and you get the fangs." + color = "#EA8600" + strength = 30 + taste_description = "fruity rum and bittersweet nostalgia" + + glass_icon_state = "sidewinderglass" + glass_name = "glass of Sidewinder Fang" + glass_desc = "An eclectic cocktail of fruit juices and dark rum. Mess with the viper, and you get the fangs." + /decl/reagent/alcohol/silencer name = "Silencer" description = "A drink from Mime Heaven." nutriment_factor = 1 - color = "#664300" + color = "#7f7f7f" strength = 50 taste_description = "a pencil eraser" @@ -3314,7 +3325,7 @@ /decl/reagent/alcohol/gibsonhooch name = "Gibson Hooch" description = "A disgusting concoction of cheap alcohol and soda - just what you need after a busy day at the factories." - color = "#5f641d" + color = "#ffcc66" strength = 65 taste_description = "cheap labor" carbonated = TRUE @@ -3353,7 +3364,7 @@ name = "Toxins Special" description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!" reagent_state = LIQUID - color = "#664300" + color = "#8880aa" strength = 40 adj_temp = 15 targ_temp = 330 @@ -3366,7 +3377,7 @@ /decl/reagent/alcohol/vodkamartini name = "Vodka Martini" description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." - color = "#664300" + color = "#76be8a" strength = 32 taste_description = "shaken, not stirred" @@ -3390,7 +3401,7 @@ /decl/reagent/alcohol/white_russian name = "White Russian" description = "That's just, like, your opinion, man..." - color = "#A68340" + color = "#f0dfc0" strength = 30 taste_description = "bitter cream" @@ -3455,7 +3466,7 @@ /decl/reagent/alcohol/whiskeycola name = "Whiskey Cola" description = "Whiskey, mixed with cola. Surprisingly refreshing." - color = "#3E1B00" + color = "#aa8979" strength = 15 taste_description = "cola" carbonated = TRUE @@ -3468,7 +3479,7 @@ /decl/reagent/alcohol/whiskeysoda name = "Whiskey Soda" description = "For the more refined griffon." - color = "#664300" + color = "#a78779" strength = 15 taste_description = "cola" carbonated = TRUE @@ -3481,7 +3492,7 @@ /decl/reagent/alcohol/specialwhiskey // I have no idea what this is and where it comes from name = "Special Blend Whiskey" description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." - color = "#664300" + color = "#b5a288" strength = 45 taste_description = "silky, amber goodness" @@ -3505,7 +3516,7 @@ /decl/reagent/alcohol/drdaniels name = "Dr. Daniels" description = "A limited edition tallboy of Dr. Gibb's Infusions." - color = "#8e6227" + color = "#35240f" caffeine = 0.2 overdose = 80 strength = 20 @@ -3522,7 +3533,7 @@ /decl/reagent/alcohol/daiquiri name = "Daiquiri" description = "Exotically blue, fruity drink, distilled from oranges." - color = "#664300" + color = "#efd08d" strength = 15 taste_description = "oranges" @@ -3533,7 +3544,7 @@ /decl/reagent/alcohol/icepick name = "Ice Pick" description = "Big. And red. Hmm...." - color = "#664300" + color = "#c42801" strength = 10 taste_description = "vodka and lemon" @@ -3544,7 +3555,7 @@ /decl/reagent/alcohol/poussecafe name = "Pousse-Cafe" description = "Smells of French and liquore." - color = "#664300" + color = "#e0d7c5" strength = 15 taste_description = "layers of liquors" @@ -3555,7 +3566,7 @@ /decl/reagent/alcohol/mintjulep name = "Mint Julep" description = "As old as time itself, but how does it taste?" - color = "#664300" + color = "#d28a20" strength = 25 taste_description = "old as time" @@ -3566,7 +3577,7 @@ /decl/reagent/alcohol/johncollins name = "John Collins" description = "Crystal clear, yellow, and smells of whiskey. How could this go wrong?" - color = "#664300" + color = "#ffcc60" strength = 25 taste_description = "whiskey" carbonated = TRUE @@ -3578,7 +3589,7 @@ /decl/reagent/alcohol/gimlet name = "Gimlet" description = "Small, elegant, and kicks." - color = "#664300" + color = "#d1d214" strength = 20 taste_description = "gin and class" carbonated = TRUE @@ -3590,7 +3601,7 @@ /decl/reagent/alcohol/starsandstripes name = "Stars and Stripes" description = "Someone, somewhere, is saluting." - color = "#664300" + color = "#9f6671" strength = 10 taste_description = "freedom" @@ -3601,7 +3612,7 @@ /decl/reagent/alcohol/metropolitan name = "Metropolitan" description = "What more could you ask for?" - color = "#664300" + color = "#ff0000" strength = 27 taste_description = "fruity sweetness" @@ -3634,7 +3645,7 @@ /decl/reagent/alcohol/caruso name = "Caruso" description = "Green, almost alien." - color = "#664300" + color = "#009652" strength = 25 taste_description = "dryness" @@ -3645,7 +3656,7 @@ /decl/reagent/alcohol/aprilshower name = "April Shower" description = "Smells of brandy." - color = "#664300" + color = "#c99718" strength = 25 taste_description = "brandy and oranges" @@ -3656,7 +3667,7 @@ /decl/reagent/alcohol/carthusiansazerac name = "Carthusian Sazerac" description = "Whiskey and... Syrup?" - color = "#664300" + color = "#e2da3b" strength = 15 taste_description = "sweetness" @@ -3667,7 +3678,7 @@ /decl/reagent/alcohol/deweycocktail name = "Dewey Cocktail" description = "Colours, look at all the colours!" - color = "#664300" + color = "#743e99" strength = 25 taste_description = "dry gin" @@ -3678,7 +3689,7 @@ /decl/reagent/alcohol/chartreusegreen name = "Green Chartreuse" description = "A green, strong liqueur." - color = "#664300" + color = "#9cad3e" strength = 40 taste_description = "a mixture of herbs" @@ -3689,7 +3700,7 @@ /decl/reagent/alcohol/chartreuseyellow name = "Yellow Chartreuse" description = "A yellow, strong liqueur." - color = "#664300" + color = "#eadd25" strength = 40 taste_description = "a sweet mixture of herbs" @@ -3700,7 +3711,7 @@ /decl/reagent/alcohol/cremewhite name = "White Creme de Menthe" description = "Mint-flavoured alcohol, in a bottle." - color = "#664300" + color = "#d8d7d6" strength = 20 taste_description = "mint" @@ -3711,7 +3722,7 @@ /decl/reagent/alcohol/cremeyvette name = "Creme de Yvette" description = "Berry-flavoured alcohol, in a bottle." - color = "#664300" + color = "#b57777" strength = 20 taste_description = "berries" @@ -3722,7 +3733,7 @@ /decl/reagent/alcohol/brandy name = "Brandy" description = "Cheap knock off for cognac." - color = "#664300" + color = "#b55100" strength = 40 taste_description = "cheap cognac" @@ -3733,7 +3744,7 @@ /decl/reagent/alcohol/guinness name = "Guinness" description = "Special Guinnes drink." - color = "#2E6671" + color = "#4b4c4a" strength = 8 taste_description = "dryness" carbonated = TRUE @@ -3745,7 +3756,7 @@ /decl/reagent/alcohol/drambuie name = "Drambuie" description = "A drink that smells like whiskey but tastes different." - color = "#2E6671" + color = "#e5ee98" strength = 40 taste_description = "sweet whisky" @@ -3756,7 +3767,7 @@ /decl/reagent/alcohol/oldfashioned name = "Old Fashioned" description = "That looks like it's from the sixties." - color = "#2E6671" + color = "#a67257" strength = 30 taste_description = "bitterness" @@ -3767,7 +3778,7 @@ /decl/reagent/alcohol/blindrussian name = "Blind Russian" description = "You can't see?" - color = "#2E6671" + color = "#c8b29a" strength = 40 taste_description = "bitterness blindness" @@ -3778,7 +3789,7 @@ /decl/reagent/alcohol/rustynail name = "Rusty Nail" description = "Smells like lemon." - color = "#2E6671" + color = "#b22b18" strength = 25 taste_description = "lemons" @@ -3789,7 +3800,7 @@ /decl/reagent/alcohol/tallrussian name = "Tall Black Russian" description = "Just like black russian but taller." - color = "#2E6671" + color = "#993a38" strength = 25 taste_description = "tall bitterness" carbonated = TRUE @@ -3838,7 +3849,7 @@ /decl/reagent/alcohol/fireball name = "Fireball" description = "Whiskey that's been infused with cinnamon and hot pepper. Meant for mixing." - color = "#773404" + color = "#be8e89" strength = 35 taste_description = "cinnamon whiskey" @@ -3913,7 +3924,7 @@ /decl/reagent/alcohol/junglejuice name = "Jungle Juice" description = "You're in the jungle now, baby." - color = "#773404" + color = "#d70091" strength = 35 taste_description = "a fraternity house party" @@ -4056,7 +4067,7 @@ /decl/reagent/alcohol/messa_mead name = "Messa's Mead" description = "A sweet alcoholic adhomian drink. Produced with Messa's tears and earthen-root." - color = "#664300" + color = "#ffb417" strength = 25 taste_description = "honey" @@ -4067,7 +4078,7 @@ /decl/reagent/alcohol/winter_offensive name = "Winter Offensive" description = "An alcoholic tajaran cocktail, named after the famous military campaign." - color = "#664300" + color = "#e4f2f5" strength = 15 taste_description = "oily gin" targ_temp = 270 @@ -4097,7 +4108,7 @@ /decl/reagent/alcohol/cinnamonapplewhiskey name = "Cinnamon Apple Whiskey" description = "Cider with cinnamon whiskey. It's like drinking a hot apple pie!" - color = "#664300" + color = "#b88a04" strength = 20 taste_description = "sweet spiced apples" @@ -4325,7 +4336,7 @@ /decl/reagent/alcohol/butanol/cactuscreme name = "Cactus Creme" description = "A tasty mix of berries and cream with xuizi juice, for the discerning unathi." - color = "#664300" + color = "#ff666" strength = 15 taste_description = "creamy berries" @@ -4360,7 +4371,7 @@ /decl/reagent/alcohol/butanol/cactustea name = "Cactus Tea" description = "Tea flavored with xuizi juice." - color = "#664300" + color = "#a02101" strength = 10 taste_description = "tea" @@ -4371,7 +4382,7 @@ /decl/reagent/alcohol/butanol/moghespolitan name = "Moghespolitan" description = "Pomegranate syrup and cactus juice, with a splash of Sarezhi Wine. Delicious!" - color = "#664300" + color = "#cc0033" strength = 27 taste_description = "fruity sweetness" @@ -4382,7 +4393,7 @@ /decl/reagent/alcohol/butanol/wastelandheat name = "Wasteland Heat" description = "A mix of spicy cactus juice to warm you up." - color = "#664300" + color = "#d8d7ae" strength = 40 adj_temp = 60 targ_temp = 390 @@ -4407,7 +4418,7 @@ /decl/reagent/alcohol/butanol/contactwine name = "Contact Wine" description = "A perfectly good glass of Sarezhi wine, ruined by adding radioactive material. It reminds you of something..." - color = "#2E6671" + color = "#610704" strength = 50 taste_description = "berries and regret" @@ -4789,5 +4800,44 @@ glass_name = "glass of gibb floats" glass_desc = "A floating soda of icecream and Dr. Gibb." +/decl/reagent/drink/diet_cola + name = "Diet Cola" + description = "Space Cola! Now in diet!" + color = "#100800" + taste_description = "cola and less calories" + carbonated = TRUE + glass_icon_state = "spacecola" + glass_name = "glass of diet cola" + glass_desc = "Space Cola! Now in diet!" +/decl/reagent/drink/milk/chocolate + name = "Chocolate milk" + description = "A mixture of perfectly healthy milk and delicious chocolate." + color = "#74533b" + taste_description = "chocolate milk" + + glass_icon_state = "glass_chocolate" + glass_name = "glass of chocolate milk" + glass_desc = "A mixture of perfectly healthy milk and delicious chocolate." + +/decl/reagent/drink/milk/strawberry + name = "Strawberry milk" + description = "A mixture of perfectly healthy milk and delicious strawberry." + color = "#fc5a8d" + taste_description = "strawberry milk" + + glass_icon_state = "glass_strawberry" + glass_name = "glass of strawberry milk" + glass_desc = "A mixture of perfectly healthy milk and delicious strawberry." + +/decl/reagent/drink/peach_soda + name = "Xanu Rush!" + description = "Made from the NEW Xanu Prime peaches." + color = "#FFE5B4" + taste_description = "dull peaches" + carbonated = TRUE + + glass_icon_state = "glass_red" + glass_name = "glass of Xanu Rush!" + glass_desc = "Made from the NEW Xanu Prime peaches." \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index a54b7a4e407..3aed6eaa687 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1852,6 +1852,12 @@ required_reagents = list(/decl/reagent/alcohol/vodka = 2, /decl/reagent/drink/orangejuice = 1) result_amount = 3 +/datum/chemical_reaction/drink/sidewinderfang + name = "Sidewinder Fang" + id = "sidewinderfang" + result = /decl/reagent/alcohol/sidewinderfang + required_reagents = list(/decl/reagent/alcohol/rum = 2, /decl/reagent/drink/sodawater = 2, /decl/reagent/drink/orangejuice = 1, /decl/reagent/drink/limejuice = 1) + /datum/chemical_reaction/drink/bloody_mary name = "Bloody Mary" id = "bloodymary" diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index 163e5394645..6572ed7ccc6 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -462,3 +462,18 @@ center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/decl/reagent/drink/hrozamal_soda = 30) + +/obj/item/reagent_containers/food/drinks/cans/diet_cola + name = "Diet Cola" + desc = "Space Cola! Now in diet!" + icon_state = "diet_cola" + center_of_mass = list("x"=16, "y"=10) + reagents_to_add = list(/decl/reagent/drink/diet_cola = 30) + +/obj/item/reagent_containers/food/drinks/cans/peach_soda + name = "Xanu Rush!" + desc = "Made from the NEW Xanu Prime peaches." + desc_fluff = "The rehabilitating environment of Xanu has allowed for small-scale agriculture to bloom. Xanu Rush! Is the number one Coalition soda, despite its dull taste." + icon_state = "xanu_rush" + center_of_mass = list("x"=16, "y"=10) + reagents_to_add = list(/decl/reagent/drink/peach_soda = 30) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 7db364b3104..c0f2c98881b 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -567,3 +567,33 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I icon_state = "britcup" volume = 30 center_of_mass = list("x"=15, "y"=13) + +/obj/item/reagent_containers/food/drinks/small_milk + name = "small milk carton" + desc = "It's milk. White and nutritious goodness!" + icon_state = "mini-milk" + item_state = "carton" + drop_sound = 'sound/items/drop/papercup.ogg' + pickup_sound = 'sound/items/pickup/papercup.ogg' + center_of_mass = list("x"=16, "y"=14) + reagents_to_add = list(/decl/reagent/drink/milk = 20) + +/obj/item/reagent_containers/food/drinks/small_milk_choco + name = "small chocolate milk carton" + desc = "It's milk. This one is in delicious chocolate flavor." + icon_state = "mini-milk_choco" + item_state = "carton" + drop_sound = 'sound/items/drop/papercup.ogg' + pickup_sound = 'sound/items/pickup/papercup.ogg' + center_of_mass = list("x"=16, "y"=14) + reagents_to_add = list(/decl/reagent/drink/milk/chocolate = 20) + +/obj/item/reagent_containers/food/drinks/small_milk_strawberry + name = "small strawberry milk carton" + desc = "It's milk. This one is in delicious strawberry flavor." + icon_state = "mini-milk_strawberry" + item_state = "carton" + drop_sound = 'sound/items/drop/papercup.ogg' + pickup_sound = 'sound/items/pickup/papercup.ogg' + center_of_mass = list("x"=16, "y"=14) + reagents_to_add = list(/decl/reagent/drink/milk/strawberry = 20) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index 1bee9d518e0..15e93fb0ffa 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -11,7 +11,6 @@ var/list/lunchables_lunches_ = list( /obj/item/reagent_containers/food/snacks/liquidfood, /obj/item/reagent_containers/food/snacks/jellysandwich/cherry, /obj/item/reagent_containers/food/snacks/salad/tossedsalad, - /obj/item/reagent_containers/food/snacks/koiswaffles, /obj/item/reagent_containers/food/snacks/funnelcake, /obj/item/reagent_containers/food/snacks/hotdog, /obj/item/reagent_containers/food/snacks/tajaran_bread, @@ -46,7 +45,6 @@ var/list/lunchables_snacks_ = list( /obj/item/reagent_containers/food/snacks/cakeslice/apple/filled, /obj/item/reagent_containers/food/snacks/pumpkinpieslice/filled, /obj/item/reagent_containers/food/snacks/skrellsnacks, - /obj/item/reagent_containers/food/snacks/friedkois, /obj/item/reagent_containers/food/snacks/meatsnack, /obj/item/reagent_containers/food/snacks/maps, /obj/item/reagent_containers/food/snacks/nathisnack, @@ -64,14 +62,33 @@ var/list/lunchables_drinks_ = list( /obj/item/reagent_containers/food/drinks/cans/space_up, /obj/item/reagent_containers/food/drinks/cans/lemon_lime, /obj/item/reagent_containers/food/drinks/cans/iced_tea, + /obj/item/reagent_containers/food/drinks/cans/diet_cola, /obj/item/reagent_containers/food/drinks/cans/grape_juice, + /obj/item/reagent_containers/food/drinks/cans/peach_soda, /obj/item/reagent_containers/food/drinks/cans/tonic, /obj/item/reagent_containers/food/drinks/cans/sodawater, /obj/item/reagent_containers/food/drinks/cans/adhomai_milk, /obj/item/reagent_containers/food/drinks/cans/beetle_milk, /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda, /obj/item/reagent_containers/food/drinks/bottle/small/midynhr_water, - /obj/item/reagent_containers/food/drinks/bottle/small/khlibnyz + /obj/item/reagent_containers/food/drinks/bottle/small/khlibnyz, + /obj/item/reagent_containers/food/drinks/small_milk, + /obj/item/reagent_containers/food/drinks/small_milk_choco, + /obj/item/reagent_containers/food/drinks/small_milk_strawberry +) + +var/list/lunchables_vaurca_ = list( + /obj/item/reagent_containers/food/snacks/koiswaffles, + /obj/item/reagent_containers/food/snacks/koisburger, + /obj/item/reagent_containers/food/snacks/soup/kois, + /obj/item/reagent_containers/food/snacks/koissteak +) + +var/list/lunchables_vaurca_snack_ = list( + /obj/item/reagent_containers/food/snacks/donut/kois, + /obj/item/reagent_containers/food/snacks/koiskebab3, + /obj/item/reagent_containers/food/snacks/friedkois, + /obj/item/reagent_containers/food/snacks/koismuffin ) var/list/lunchables_utensil_ = list( @@ -116,6 +133,16 @@ var/list/lunchables_alcohol_reagents_ = list( lunchables_lunches_ = init_lunchable_list(lunchables_lunches_) return lunchables_lunches_ +/proc/lunchables_vaurca() + if(!(lunchables_vaurca_[lunchables_vaurca_[1]])) + lunchables_vaurca_ = init_lunchable_list(lunchables_vaurca_) + return lunchables_vaurca_ + +/proc/lunchables_vaurca_snack() + if(!(lunchables_vaurca_snack_[lunchables_vaurca_snack_[1]])) + lunchables_vaurca_snack_ = init_lunchable_list(lunchables_vaurca_snack_) + return lunchables_vaurca_snack_ + /proc/lunchables_snacks() if(!(lunchables_snacks_[lunchables_snacks_[1]])) lunchables_snacks_ = init_lunchable_list(lunchables_snacks_) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index f83c21ad3c8..17788f7e058 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -730,6 +730,7 @@ filling_color = "#FDFFD1" volume = 10 reagents_to_add = list(/decl/reagent/nutriment/protein/egg = 3) + var/hatchling = /mob/living/simple_animal/chick /obj/item/reagent_containers/food/snacks/egg/afterattack(obj/O as obj, mob/user as mob, proximity) if(!(proximity && O.is_open_container())) @@ -761,6 +762,20 @@ else ..() +/obj/item/reagent_containers/food/snacks/egg + var/amount_grown = 0 + +/obj/item/reagent_containers/food/snacks/egg/process() + if(isturf(loc)) + amount_grown += rand(1,2) + if(amount_grown >= 100) + visible_message("[src] hatches with a quiet cracking sound.") + new hatchling(get_turf(src)) + STOP_PROCESSING(SSprocessing, src) + qdel(src) + else + STOP_PROCESSING(SSprocessing, src) + /obj/item/reagent_containers/food/snacks/egg/blue icon_state = "egg-blue" @@ -785,6 +800,14 @@ /obj/item/reagent_containers/food/snacks/egg/yellow icon_state = "egg-yellow" +/obj/item/reagent_containers/food/snacks/egg/schlorrgo + name = "alien egg" + desc = "A large mysterious egg." + icon_state = "schlorrgo_egg" + filling_color = "#e9ffd1" + volume = 20 + hatchling = /mob/living/simple_animal/schlorrgo/baby + /obj/item/reagent_containers/food/snacks/friedegg name = "fried egg" desc = "A fried egg, with a touch of salt and pepper." @@ -5198,6 +5221,7 @@ desc_fluff = "V'krexi, while edible, hold no nutritional value, either for humans or Vaurca. The V'krexi meat was mostly neglected until human food-processing techniques were introduced to the Zo'ra Hive." icon = 'icons/obj/food.dmi' icon_state = "vkrexitaffy" + item_state = "vkrexi" icon_type = "vkrexi taffy" storage_type = "packaging" starts_with = list(/obj/item/reagent_containers/food/snacks/vkrexitaffy = 6) @@ -5219,4 +5243,65 @@ slot_flags = SLOT_EARS filling_color = "#dcd9cd" reagents_to_add = list(/decl/reagent/mental/vkrexi = 0.5) - bitesize = 1 \ No newline at end of file + bitesize = 1 + +/obj/item/reagent_containers/food/snacks/batwings + name = "spiced shrieker wings" + desc = "Wings of a small flying mammal, enriched with a dizzying amount of fat, and spiced with chilis." + icon_state = "batwings" + reagents_to_add = list(/decl/reagent/nutriment/protein = 3, /decl/reagent/nutriment/triglyceride = 2, /decl/reagent/capsaicin = 5) + bitesize = 4 + trash = /obj/item/trash/plate + +/obj/item/reagent_containers/food/snacks/jellystew + name = "jelly stew" + desc = "A fatty, spicy, stew with crunchy chunks of meat floating amongst rich slimy globules. The texture is most definitely acquired." + icon_state = "jellystew" + reagents_to_add = list(/decl/reagent/nutriment = 3, /decl/reagent/nutriment/protein/seafood = 6, /decl/reagent/nutriment/protein = 3, /decl/reagent/nutriment/triglyceride = 3, /decl/reagent/capsaicin = 5) + reagent_data = list(/decl/reagent/nutriment = list("slippery slime" = 3)) + bitesize = 7 + trash = /obj/item/trash/snack_bowl + +/obj/item/reagent_containers/food/snacks/roefritters + name = "roe fritters" + desc = "Fried patties made from fish eggs." + icon_state = "fritters" + reagents_to_add = list(/decl/reagent/nutriment = 3, /decl/reagent/nutriment/coating/batter = 5, /decl/reagent/nutriment/protein/seafood = 6) + reagent_data = list(/decl/reagent/nutriment = list("brine" = 3, "fish" = 3)) + bitesize = 6 + trash = /obj/item/trash/plate + +/obj/item/reagent_containers/food/snacks/stuffedfish + name = "stuffed fish fillet" + desc = "A fish fillet stuffed with small eggs and cheese." + icon_state = "stuffedfish" + reagents_to_add = list(/decl/reagent/nutriment = 3, /decl/reagent/nutriment/protein/seafood = 7, /decl/reagent/nutriment/protein/cheese = 2) + reagent_data = list(/decl/reagent/nutriment = list("brine" = 3, "fish" = 3)) + bitesize = 5 + trash = /obj/item/trash/plate + +/obj/item/reagent_containers/food/snacks/stuffedcarp + name = "stuffed fish fillet" + desc = "A fish fillet stuffed with small eggs and cheese." + icon_state = "stuffedfish" + reagents_to_add = list(/decl/reagent/nutriment = 3, /decl/reagent/nutriment/protein/seafood = 7, /decl/reagent/nutriment/protein/cheese = 2, /decl/reagent/toxin/carpotoxin = 3) + reagent_data = list(/decl/reagent/nutriment = list("brine" = 3, "fish" = 3)) + bitesize = 6 + trash = /obj/item/trash/plate + +/obj/item/reagent_containers/food/snacks/razirnoodles + name = "razir noodles" + desc = "While this dish appears to be noodles at a glance, it is in fact thin strips of meat coated in an egg based sauce, topped with sliced limes. An authentic variant of this is commonly eaten in and around Razir." + icon_state = "razirnoodles" + reagents_to_add = list(/decl/reagent/nutriment = 3, /decl/reagent/nutriment/protein/seafood = 8, /decl/reagent/nutriment/protein/egg = 3, /decl/reagent/hyperzine = 5, /decl/reagent/acid/polyacid = 3) + reagent_data = list(/decl/reagent/nutriment = list("molten heat" = 3, "slippery noodles" = 3)) + bitesize = 10 + trash = /obj/item/trash/plate + +/obj/item/reagent_containers/food/snacks/sintapudding + name = "sinta pudding" + desc = "Reddish, and extremely smooth, chocolate pudding, rich in iron!" + icon_state = "sintapudding" + reagents_to_add = list(/decl/reagent/nutriment = 1, /decl/reagent/nutriment/protein = 1, /decl/reagent/blood = 6, /decl/reagent/nutriment/coco = 3) + reagent_data = list(/decl/reagent/nutriment = list("iron" = 3)) + bitesize = 6 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/snacks/fish.dm b/code/modules/reagents/reagent_containers/food/snacks/fish.dm index 202b265902f..ef883dc9a9a 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/fish.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/fish.dm @@ -23,6 +23,13 @@ name = "fish fillet" desc = "A fillet of fish." +/obj/item/reagent_containers/food/snacks/fish/roe + name = "roe sack" + desc = "A fleshy organ filled with fish eggs." + icon_state = "roesack" + fish_type = "fish" + reagents_to_add = list(/decl/reagent/nutriment/protein/seafood = 3) + /obj/item/reagent_containers/food/snacks/fish/mollusc name = "slimy meat" desc = "Some slimy meat from clams or molluscs." @@ -118,4 +125,4 @@ /obj/item/trash/mollusc_shell/clam/rasval name = "ras'val clam shell" - icon_state = "ras'val_clams_shell" + icon_state = "ras'val_clams_shell" \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm index addaa14ca21..f80179e40d3 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm @@ -94,3 +94,9 @@ item_state = "vannameat" contained_sprite = TRUE reagents_to_add = list(/decl/reagent/nutriment/protein = 6, /decl/reagent/mindbreaker = 6) + +/obj/item/reagent_containers/food/snacks/meat/bat + name = "bat wings" + desc = "Like chicken wings, but with even less meat!" + icon_state = "batmeat" + reagents_to_add = list(/decl/reagent/nutriment/protein = 1) \ No newline at end of file diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 07b65783286..66b6078de61 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -325,7 +325,8 @@ /obj/machinery/disposal/attack_ai(mob/user as mob) if(!ai_can_interact(user)) return - interact(user, 1) + var/inside_bin = (user.loc == src) + interact(user, !inside_bin) // human interact with machine /obj/machinery/disposal/attack_hand(mob/user as mob) @@ -333,7 +334,7 @@ if(stat & BROKEN) return - if(user && user.loc == src) + if(user.loc == src) to_chat(usr, "You cannot reach the controls from inside.") return @@ -389,7 +390,7 @@ // handle machine interaction /obj/machinery/disposal/Topic(href, href_list) - if(usr.loc == src) + if(usr.loc == src && !issilicon(usr)) to_chat(usr, "You cannot reach the controls from inside.") return diff --git a/html/changelog.html b/html/changelog.html index 8c4d69a67b7..d5dbdc2cb81 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -35,6 +35,256 @@ -->
+

06 September 2021

+

Alberyk updated:

+ +

Geeves updated:

+ +

WickedCybs updated:

+ + +

05 September 2021

+

NeroCavalier updated:

+ +

WickedCybs updated:

+ + +

04 September 2021

+

Shadow Quill updated:

+ + +

03 September 2021

+

Desven updated:

+ +

MattAtlas updated:

+ +

NeroCavalier updated:

+ + +

02 September 2021

+

Desven updated:

+ +

Omicega updated:

+ +

Shadow Quill updated:

+ +

TheGreyWolf updated:

+ +

WickedCybs updated:

+ + +

01 September 2021

+

Shadow Quill updated:

+ + +

31 August 2021

+

Alberyk updated:

+ +

Alberyk, Kyres1 updated:

+ +

Desven updated:

+ +

Geeves updated:

+ +

Lucaken updated:

+ +

TheGreyWolf updated:

+ +

WickedCybs updated:

+ +

WickedCybs, YourDaddy117 updated:

+ + +

30 August 2021

+

BLUNTFORCE420 updated:

+ + +

29 August 2021

+

BLUNTFORCE420 updated:

+ +

TheGreyWolf & Connorjg1 updated:

+ + +

28 August 2021

+

BLUNTFORCE420 updated:

+ +

Desven updated:

+ +

Omicega updated:

+ + +

27 August 2021

+

Alberyk updated:

+ +

Desven & 50_N00b updated:

+ +

Omicega updated:

+ +

WickedCybs, YourDaddy117 updated:

+ + +

26 August 2021

+

Alberyk updated:

+ +

BLUNTFORCE420 updated:

+ +

CodePanter updated:

+ +

Desven updated:

+ +

Desven & 50Noob updated:

+ +

Desven and 50_N00b updated:

+ +

Omicega updated:

+ + +

25 August 2021

+

Desven updated:

+ +

Desven & TheGreyWolf updated:

+ +

MattAtlas updated:

+ +

24 August 2021

Geeves updated:

\",\n \"
\"\n );\n }\n\n stringBuilder.push(lang.stringRepeat(\"\\xa0\", splits.indent));\n\n split ++;\n screenColumn = 0;\n splitChars = splits[split] || Number.MAX_VALUE;\n }\n if (value.length != 0) {\n chars += value.length;\n screenColumn = this.$renderToken(\n stringBuilder, screenColumn, token, value\n );\n }\n }\n }\n };\n\n this.$renderSimpleLine = function(stringBuilder, tokens) {\n var screenColumn = 0;\n var token = tokens[0];\n var value = token.value;\n if (this.displayIndentGuides)\n value = this.renderIndentGuide(stringBuilder, value);\n if (value)\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n for (var i = 1; i < tokens.length; i++) {\n token = tokens[i];\n value = token.value;\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n }\n };\n this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\n if (!foldLine && foldLine != false)\n foldLine = this.session.getFoldLine(row);\n\n if (foldLine)\n var tokens = this.$getFoldLineTokens(row, foldLine);\n else\n var tokens = this.session.getTokens(row);\n\n\n if (!onlyContents) {\n stringBuilder.push(\n \"
\"\n );\n }\n\n if (tokens.length) {\n var splits = this.session.getRowSplitData(row);\n if (splits && splits.length)\n this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\n else\n this.$renderSimpleLine(stringBuilder, tokens);\n }\n\n if (this.showInvisibles) {\n if (foldLine)\n row = foldLine.end.row;\n\n stringBuilder.push(\n \"\",\n row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\n \"\"\n );\n }\n if (!onlyContents)\n stringBuilder.push(\"
\");\n };\n\n this.$getFoldLineTokens = function(row, foldLine) {\n var session = this.session;\n var renderTokens = [];\n\n function addTokens(tokens, from, to) {\n var idx = 0, col = 0;\n while ((col + tokens[idx].value.length) < from) {\n col += tokens[idx].value.length;\n idx++;\n\n if (idx == tokens.length)\n return;\n }\n if (col != from) {\n var value = tokens[idx].value.substring(from - col);\n if (value.length > (to - from))\n value = value.substring(0, to - from);\n\n renderTokens.push({\n type: tokens[idx].type,\n value: value\n });\n\n col = from + value.length;\n idx += 1;\n }\n\n while (col < to && idx < tokens.length) {\n var value = tokens[idx].value;\n if (value.length + col > to) {\n renderTokens.push({\n type: tokens[idx].type,\n value: value.substring(0, to - col)\n });\n } else\n renderTokens.push(tokens[idx]);\n col += value.length;\n idx += 1;\n }\n }\n\n var tokens = session.getTokens(row);\n foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n if (placeholder != null) {\n renderTokens.push({\n type: \"fold\",\n value: placeholder\n });\n } else {\n if (isNewRow)\n tokens = session.getTokens(row);\n\n if (tokens.length)\n addTokens(tokens, lastColumn, column);\n }\n }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n return renderTokens;\n };\n\n this.$useLineGroups = function() {\n return this.session.getUseWrapMode();\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.$measureNode)\n this.$measureNode.parentNode.removeChild(this.$measureNode);\n delete this.$measureNode;\n };\n\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\nace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar isIE8;\n\nvar Cursor = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_cursor-layer\";\n parentEl.appendChild(this.element);\n \n if (isIE8 === undefined)\n isIE8 = !(\"opacity\" in this.element.style);\n\n this.isVisible = false;\n this.isBlinking = true;\n this.blinkInterval = 1000;\n this.smoothBlinking = false;\n\n this.cursors = [];\n this.cursor = this.addCursor();\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.$updateCursors = (isIE8\n ? this.$updateVisibility\n : this.$updateOpacity).bind(this);\n};\n\n(function() {\n \n this.$updateVisibility = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.visibility = val ? \"\" : \"hidden\";\n };\n this.$updateOpacity = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.opacity = val ? \"\" : \"0\";\n };\n \n\n this.$padding = 0;\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n\n this.setSession = function(session) {\n this.session = session;\n };\n\n this.setBlinking = function(blinking) {\n if (blinking != this.isBlinking){\n this.isBlinking = blinking;\n this.restartTimer();\n }\n };\n\n this.setBlinkInterval = function(blinkInterval) {\n if (blinkInterval != this.blinkInterval){\n this.blinkInterval = blinkInterval;\n this.restartTimer();\n }\n };\n\n this.setSmoothBlinking = function(smoothBlinking) {\n if (smoothBlinking != this.smoothBlinking && !isIE8) {\n this.smoothBlinking = smoothBlinking;\n dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n this.$updateCursors(true);\n this.$updateCursors = (this.$updateOpacity).bind(this);\n this.restartTimer();\n }\n };\n\n this.addCursor = function() {\n var el = dom.createElement(\"div\");\n el.className = \"ace_cursor\";\n this.element.appendChild(el);\n this.cursors.push(el);\n return el;\n };\n\n this.removeCursor = function() {\n if (this.cursors.length > 1) {\n var el = this.cursors.pop();\n el.parentNode.removeChild(el);\n return el;\n }\n };\n\n this.hideCursor = function() {\n this.isVisible = false;\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.showCursor = function() {\n this.isVisible = true;\n dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.restartTimer = function() {\n var update = this.$updateCursors;\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n if (this.smoothBlinking) {\n dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n }\n \n update(true);\n\n if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\n return;\n\n if (this.smoothBlinking) {\n setTimeout(function(){\n dom.addCssClass(this.element, \"ace_smooth-blinking\");\n }.bind(this));\n }\n \n var blink = function(){\n this.timeoutId = setTimeout(function() {\n update(false);\n }, 0.6 * this.blinkInterval);\n }.bind(this);\n\n this.intervalId = setInterval(function() {\n update(true);\n blink();\n }, this.blinkInterval);\n\n blink();\n };\n\n this.getPixelPosition = function(position, onScreen) {\n if (!this.config || !this.session)\n return {left : 0, top : 0};\n\n if (!position)\n position = this.session.selection.getCursor();\n var pos = this.session.documentToScreenPosition(position);\n var cursorLeft = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, position.row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : pos.column * this.config.characterWidth);\n\n var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n this.config.lineHeight;\n\n return {left : cursorLeft, top : cursorTop};\n };\n\n this.update = function(config) {\n this.config = config;\n\n var selections = this.session.$selectionMarkers;\n var i = 0, cursorIndex = 0;\n\n if (selections === undefined || selections.length === 0){\n selections = [{cursor: null}];\n }\n\n for (var i = 0, n = selections.length; i < n; i++) {\n var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n if ((pixelPos.top > config.height + config.offset ||\n pixelPos.top < 0) && i > 1) {\n continue;\n }\n\n var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\n \n if (!this.drawCursor) {\n style.left = pixelPos.left + \"px\";\n style.top = pixelPos.top + \"px\";\n style.width = config.characterWidth + \"px\";\n style.height = config.lineHeight + \"px\";\n } else {\n this.drawCursor(style, pixelPos, config, selections[i], this.session);\n }\n }\n while (this.cursors.length > cursorIndex)\n this.removeCursor();\n\n var overwrite = this.session.getOverwrite();\n this.$setOverwrite(overwrite);\n this.$pixelPos = pixelPos;\n this.restartTimer();\n };\n \n this.drawCursor = null;\n\n this.$setOverwrite = function(overwrite) {\n if (overwrite != this.overwrite) {\n this.overwrite = overwrite;\n if (overwrite)\n dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n else\n dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n }\n };\n\n this.destroy = function() {\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n };\n\n}).call(Cursor.prototype);\n\nexports.Cursor = Cursor;\n\n});\n\nace.define(\"ace/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar MAX_SCROLL_H = 0x8000;\nvar ScrollBar = function(parent) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_scrollbar ace_scrollbar\" + this.classSuffix;\n\n this.inner = dom.createElement(\"div\");\n this.inner.className = \"ace_scrollbar-inner\";\n this.element.appendChild(this.inner);\n\n parent.appendChild(this.element);\n\n this.setVisible(false);\n this.skipEvent = false;\n\n event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n event.addListener(this.element, \"mousedown\", event.preventDefault);\n};\n\n(function() {\n oop.implement(this, EventEmitter);\n\n this.setVisible = function(isVisible) {\n this.element.style.display = isVisible ? \"\" : \"none\";\n this.isVisible = isVisible;\n this.coeff = 1;\n };\n}).call(ScrollBar.prototype);\nvar VScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollTop = 0;\n this.scrollHeight = 0;\n renderer.$scrollbarWidth = \n this.width = dom.scrollbarWidth(parent.ownerDocument);\n this.inner.style.width =\n this.element.style.width = (this.width || 15) + 5 + \"px\";\n this.$minWidth = 0;\n};\n\noop.inherits(VScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-v';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollTop = this.element.scrollTop;\n if (this.coeff != 1) {\n var h = this.element.clientHeight / this.scrollHeight;\n this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h);\n }\n this._emit(\"scroll\", {data: this.scrollTop});\n }\n this.skipEvent = false;\n };\n this.getWidth = function() {\n return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0);\n };\n this.setHeight = function(height) {\n this.element.style.height = height + \"px\";\n };\n this.setInnerHeight =\n this.setScrollHeight = function(height) {\n this.scrollHeight = height;\n if (height > MAX_SCROLL_H) {\n this.coeff = MAX_SCROLL_H / height;\n height = MAX_SCROLL_H;\n } else if (this.coeff != 1) {\n this.coeff = 1;\n }\n this.inner.style.height = height + \"px\";\n };\n this.setScrollTop = function(scrollTop) {\n if (this.scrollTop != scrollTop) {\n this.skipEvent = true;\n this.scrollTop = scrollTop;\n this.element.scrollTop = scrollTop * this.coeff;\n }\n };\n\n}).call(VScrollBar.prototype);\nvar HScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollLeft = 0;\n this.height = renderer.$scrollbarWidth;\n this.inner.style.height =\n this.element.style.height = (this.height || 15) + 5 + \"px\";\n};\n\noop.inherits(HScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-h';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollLeft = this.element.scrollLeft;\n this._emit(\"scroll\", {data: this.scrollLeft});\n }\n this.skipEvent = false;\n };\n this.getHeight = function() {\n return this.isVisible ? this.height : 0;\n };\n this.setWidth = function(width) {\n this.element.style.width = width + \"px\";\n };\n this.setInnerWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollLeft = function(scrollLeft) {\n if (this.scrollLeft != scrollLeft) {\n this.skipEvent = true;\n this.scrollLeft = this.element.scrollLeft = scrollLeft;\n }\n };\n\n}).call(HScrollBar.prototype);\n\n\nexports.ScrollBar = VScrollBar; // backward compatibility\nexports.ScrollBarV = VScrollBar; // backward compatibility\nexports.ScrollBarH = HScrollBar; // backward compatibility\n\nexports.VScrollBar = VScrollBar;\nexports.HScrollBar = HScrollBar;\n});\n\nace.define(\"ace/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"./lib/event\");\n\n\nvar RenderLoop = function(onRender, win) {\n this.onRender = onRender;\n this.pending = false;\n this.changes = 0;\n this.window = win || window;\n};\n\n(function() {\n\n\n this.schedule = function(change) {\n this.changes = this.changes | change;\n if (!this.pending && this.changes) {\n this.pending = true;\n var _self = this;\n event.nextFrame(function() {\n _self.pending = false;\n var changes;\n while (changes = _self.changes) {\n _self.changes = 0;\n _self.onRender(changes);\n }\n }, this.window);\n }\n };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\nace.define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\nvar oop = acequire(\"../lib/oop\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar useragent = acequire(\"../lib/useragent\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 0;\n\nvar FontMetrics = exports.FontMetrics = function(parentEl) {\n this.el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.el.style, true);\n \n this.$main = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$main.style);\n \n this.$measureNode = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$measureNode.style);\n \n \n this.el.appendChild(this.$main);\n this.el.appendChild(this.$measureNode);\n parentEl.appendChild(this.el);\n \n if (!CHAR_COUNT)\n this.$testFractionalRect();\n this.$measureNode.innerHTML = lang.stringRepeat(\"X\", CHAR_COUNT);\n \n this.$characterSize = {width: 0, height: 0};\n this.checkForSizeChanges();\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n \n this.$characterSize = {width: 0, height: 0};\n \n this.$testFractionalRect = function() {\n var el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(el.style);\n el.style.width = \"0.2px\";\n document.documentElement.appendChild(el);\n var w = el.getBoundingClientRect().width;\n if (w > 0 && w < 1)\n CHAR_COUNT = 50;\n else\n CHAR_COUNT = 100;\n el.parentNode.removeChild(el);\n };\n \n this.$setMeasureNodeStyles = function(style, isRoot) {\n style.width = style.height = \"auto\";\n style.left = style.top = \"0px\";\n style.visibility = \"hidden\";\n style.position = \"absolute\";\n style.whiteSpace = \"pre\";\n\n if (useragent.isIE < 8) {\n style[\"font-family\"] = \"inherit\";\n } else {\n style.font = \"inherit\";\n }\n style.overflow = isRoot ? \"hidden\" : \"visible\";\n };\n\n this.checkForSizeChanges = function() {\n var size = this.$measureSizes();\n if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n this.$measureNode.style.fontWeight = \"bold\";\n var boldSize = this.$measureSizes();\n this.$measureNode.style.fontWeight = \"\";\n this.$characterSize = size;\n this.charSizes = Object.create(null);\n this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n this._emit(\"changeCharacterSize\", {data: size});\n }\n };\n\n this.$pollSizeChanges = function() {\n if (this.$pollSizeChangesTimer)\n return this.$pollSizeChangesTimer;\n var self = this;\n return this.$pollSizeChangesTimer = setInterval(function() {\n self.checkForSizeChanges();\n }, 500);\n };\n \n this.setPolling = function(val) {\n if (val) {\n this.$pollSizeChanges();\n } else if (this.$pollSizeChangesTimer) {\n clearInterval(this.$pollSizeChangesTimer);\n this.$pollSizeChangesTimer = 0;\n }\n };\n\n this.$measureSizes = function() {\n if (CHAR_COUNT === 50) {\n var rect = null;\n try { \n rect = this.$measureNode.getBoundingClientRect();\n } catch(e) {\n rect = {width: 0, height:0 };\n }\n var size = {\n height: rect.height,\n width: rect.width / CHAR_COUNT\n };\n } else {\n var size = {\n height: this.$measureNode.clientHeight,\n width: this.$measureNode.clientWidth / CHAR_COUNT\n };\n }\n if (size.width === 0 || size.height === 0)\n return null;\n return size;\n };\n\n this.$measureCharWidth = function(ch) {\n this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT);\n var rect = this.$main.getBoundingClientRect();\n return rect.width / CHAR_COUNT;\n };\n \n this.getCharacterWidth = function(ch) {\n var w = this.charSizes[ch];\n if (w === undefined) {\n w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;\n }\n return w;\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.el && this.el.parentNode)\n this.el.parentNode.removeChild(this.el);\n };\n\n}).call(FontMetrics.prototype);\n\n});\n\nace.define(\"ace/virtual_renderer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/config\",\"ace/lib/useragent\",\"ace/layer/gutter\",\"ace/layer/marker\",\"ace/layer/text\",\"ace/layer/cursor\",\"ace/scrollbar\",\"ace/scrollbar\",\"ace/renderloop\",\"ace/layer/font_metrics\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar config = acequire(\"./config\");\nvar useragent = acequire(\"./lib/useragent\");\nvar GutterLayer = acequire(\"./layer/gutter\").Gutter;\nvar MarkerLayer = acequire(\"./layer/marker\").Marker;\nvar TextLayer = acequire(\"./layer/text\").Text;\nvar CursorLayer = acequire(\"./layer/cursor\").Cursor;\nvar HScrollBar = acequire(\"./scrollbar\").HScrollBar;\nvar VScrollBar = acequire(\"./scrollbar\").VScrollBar;\nvar RenderLoop = acequire(\"./renderloop\").RenderLoop;\nvar FontMetrics = acequire(\"./layer/font_metrics\").FontMetrics;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = \".ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\ndirection: ltr;\\\ntext-align: left;\\\n-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\\n}\\\n.ace_scroller {\\\nposition: absolute;\\\noverflow: hidden;\\\ntop: 0;\\\nbottom: 0;\\\nbackground-color: inherit;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\ncursor: text;\\\n}\\\n.ace_content {\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmin-width: 100%;\\\n}\\\n.ace_dragging .ace_scroller:before{\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\nbottom: 0;\\\ncontent: '';\\\nbackground: rgba(250, 250, 250, 0.01);\\\nz-index: 1000;\\\n}\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\nbackground: rgba(0, 0, 0, 0.01);\\\n}\\\n.ace_selecting, .ace_selecting * {\\\ncursor: text !important;\\\n}\\\n.ace_gutter {\\\nposition: absolute;\\\noverflow : hidden;\\\nwidth: auto;\\\ntop: 0;\\\nbottom: 0;\\\nleft: 0;\\\ncursor: default;\\\nz-index: 4;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\n}\\\n.ace_gutter-active-line {\\\nposition: absolute;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_scroller.ace_scroll-left {\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n}\\\n.ace_gutter-cell {\\\npadding-left: 19px;\\\npadding-right: 6px;\\\nbackground-repeat: no-repeat;\\\n}\\\n.ace_gutter-cell.ace_error {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_warning {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_dark .ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_scrollbar {\\\nposition: absolute;\\\nright: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_scrollbar-inner {\\\nposition: absolute;\\\ncursor: text;\\\nleft: 0;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-v{\\\noverflow-x: hidden;\\\noverflow-y: scroll;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-h {\\\noverflow-x: scroll;\\\noverflow-y: hidden;\\\nleft: 0;\\\n}\\\n.ace_print-margin {\\\nposition: absolute;\\\nheight: 100%;\\\n}\\\n.ace_text-input {\\\nposition: absolute;\\\nz-index: 0;\\\nwidth: 0.5em;\\\nheight: 1em;\\\nopacity: 0;\\\nbackground: transparent;\\\n-moz-appearance: none;\\\nappearance: none;\\\nborder: none;\\\nresize: none;\\\noutline: none;\\\noverflow: hidden;\\\nfont: inherit;\\\npadding: 0 1px;\\\nmargin: 0 -1px;\\\ntext-indent: -1em;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\nwhite-space: pre!important;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: inherit;\\\ncolor: inherit;\\\nz-index: 1000;\\\nopacity: 1;\\\ntext-indent: 0;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nword-wrap: normal;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\n}\\\n.ace_cjk {\\\ndisplay: inline-block;\\\ntext-align: center;\\\n}\\\n.ace_cursor-layer {\\\nz-index: 4;\\\n}\\\n.ace_cursor {\\\nz-index: 4;\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid;\\\ntransform: translatez(0);\\\n}\\\n.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_slim-cursors .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_overwrite-cursors .ace_cursor {\\\nborder-left-width: 0;\\\nborder-bottom: 1px solid;\\\n}\\\n.ace_hidden-cursors .ace_cursor {\\\nopacity: 0.2;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\n-webkit-transition: opacity 0.18s;\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\nposition: absolute;\\\nz-index: 3;\\\n}\\\n.ace_marker-layer .ace_selection {\\\nposition: absolute;\\\nz-index: 5;\\\n}\\\n.ace_marker-layer .ace_bracket {\\\nposition: absolute;\\\nz-index: 6;\\\n}\\\n.ace_marker-layer .ace_active-line {\\\nposition: absolute;\\\nz-index: 2;\\\n}\\\n.ace_marker-layer .ace_selected-word {\\\nposition: absolute;\\\nz-index: 4;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ndisplay: inline-block;\\\nheight: 11px;\\\nmargin-top: -2px;\\\nvertical-align: middle;\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\ncolor: transparent;\\\nborder: 1px solid black;\\\nborder-radius: 2px;\\\ncursor: pointer;\\\npointer-events: auto;\\\n}\\\n.ace_dark .ace_fold {\\\n}\\\n.ace_fold:hover{\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_tooltip {\\\nbackground-color: #FFF;\\\nbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\nborder: 1px solid gray;\\\nborder-radius: 1px;\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\ncolor: black;\\\nmax-width: 100%;\\\npadding: 3px 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ncursor: default;\\\nwhite-space: pre;\\\nword-wrap: break-word;\\\nline-height: normal;\\\nfont-style: normal;\\\nfont-weight: normal;\\\nletter-spacing: normal;\\\npointer-events: none;\\\n}\\\n.ace_folding-enabled > .ace_gutter-cell {\\\npadding-right: 13px;\\\n}\\\n.ace_fold-widget {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmargin: 0 -12px 0 1px;\\\ndisplay: none;\\\nwidth: 11px;\\\nvertical-align: top;\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: center;\\\nborder-radius: 3px;\\\nborder: 1px solid transparent;\\\ncursor: pointer;\\\n}\\\n.ace_folding-enabled .ace_fold-widget {\\\ndisplay: inline-block; \\\n}\\\n.ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\");\\\n}\\\n.ace_fold-widget:hover {\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n}\\\n.ace_fold-widget:active {\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n}\\\n.ace_dark .ace_fold-widget {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget:hover {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\n}\\\n.ace_dark .ace_fold-widget:active {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\n-webkit-transition: opacity 0.4s ease 0.05s;\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\n-webkit-transition: opacity 0.05s ease 0.05s;\\\ntransition: opacity 0.05s ease 0.05s;\\\nopacity:1;\\\n}\\\n.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace_bold {\\\nfont-weight: bold;\\\n}\\\n.ace_nobold .ace_bold {\\\nfont-weight: normal;\\\n}\\\n.ace_italic {\\\nfont-style: italic;\\\n}\\\n.ace_error-marker {\\\nbackground-color: rgba(255, 0, 0,0.2);\\\nposition: absolute;\\\nz-index: 9;\\\n}\\\n.ace_highlight-marker {\\\nbackground-color: rgba(255, 255, 0,0.2);\\\nposition: absolute;\\\nz-index: 8;\\\n}\\\n.ace_br1 {border-top-left-radius : 3px;}\\\n.ace_br2 {border-top-right-radius : 3px;}\\\n.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\\\n.ace_br4 {border-bottom-right-radius: 3px;}\\\n.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\\\n.ace_br8 {border-bottom-left-radius : 3px;}\\\n.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_text-input-ios {\\\nposition: absolute !important;\\\ntop: -100000px !important;\\\nleft: -100000px !important;\\\n}\\\n\";\n\ndom.importCssString(editorCss, \"ace_editor.css\");\n\nvar VirtualRenderer = function(container, theme) {\n var _self = this;\n\n this.container = container || dom.createElement(\"div\");\n this.$keepTextAreaAtCursor = !useragent.isOldIE;\n\n dom.addCssClass(this.container, \"ace_editor\");\n\n this.setTheme(theme);\n\n this.$gutter = dom.createElement(\"div\");\n this.$gutter.className = \"ace_gutter\";\n this.container.appendChild(this.$gutter);\n this.$gutter.setAttribute(\"aria-hidden\", true);\n\n this.scroller = dom.createElement(\"div\");\n this.scroller.className = \"ace_scroller\";\n this.container.appendChild(this.scroller);\n\n this.content = dom.createElement(\"div\");\n this.content.className = \"ace_content\";\n this.scroller.appendChild(this.content);\n\n this.$gutterLayer = new GutterLayer(this.$gutter);\n this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\n this.$markerBack = new MarkerLayer(this.content);\n\n var textLayer = this.$textLayer = new TextLayer(this.content);\n this.canvas = textLayer.element;\n\n this.$markerFront = new MarkerLayer(this.content);\n\n this.$cursorLayer = new CursorLayer(this.content);\n this.$horizScroll = false;\n this.$vScroll = false;\n\n this.scrollBar = \n this.scrollBarV = new VScrollBar(this.container, this);\n this.scrollBarH = new HScrollBar(this.container, this);\n this.scrollBarV.addEventListener(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n });\n this.scrollBarH.addEventListener(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n });\n\n this.scrollTop = 0;\n this.scrollLeft = 0;\n\n this.cursorPos = {\n row : 0,\n column : 0\n };\n\n this.$fontMetrics = new FontMetrics(this.container);\n this.$textLayer.$setFontMetrics(this.$fontMetrics);\n this.$textLayer.addEventListener(\"changeCharacterSize\", function(e) {\n _self.updateCharacterSize();\n _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\n _self._signal(\"changeCharacterSize\", e);\n });\n\n this.$size = {\n width: 0,\n height: 0,\n scrollerHeight: 0,\n scrollerWidth: 0,\n $dirty: true\n };\n\n this.layerConfig = {\n width : 1,\n padding : 0,\n firstRow : 0,\n firstRowScreen: 0,\n lastRow : 0,\n lineHeight : 0,\n characterWidth : 0,\n minHeight : 1,\n maxHeight : 1,\n offset : 0,\n height : 1,\n gutterOffset: 1\n };\n \n this.scrollMargin = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n v: 0,\n h: 0\n };\n\n this.$loop = new RenderLoop(\n this.$renderChanges.bind(this),\n this.container.ownerDocument.defaultView\n );\n this.$loop.schedule(this.CHANGE_FULL);\n\n this.updateCharacterSize();\n this.setPadding(4);\n config.resetOptions(this);\n config._emit(\"renderer\", this);\n};\n\n(function() {\n\n this.CHANGE_CURSOR = 1;\n this.CHANGE_MARKER = 2;\n this.CHANGE_GUTTER = 4;\n this.CHANGE_SCROLL = 8;\n this.CHANGE_LINES = 16;\n this.CHANGE_TEXT = 32;\n this.CHANGE_SIZE = 64;\n this.CHANGE_MARKER_BACK = 128;\n this.CHANGE_MARKER_FRONT = 256;\n this.CHANGE_FULL = 512;\n this.CHANGE_H_SCROLL = 1024;\n\n oop.implement(this, EventEmitter);\n\n this.updateCharacterSize = function() {\n if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n }\n\n this.layerConfig.characterWidth =\n this.characterWidth = this.$textLayer.getCharacterWidth();\n this.layerConfig.lineHeight =\n this.lineHeight = this.$textLayer.getLineHeight();\n this.$updatePrintMargin();\n };\n this.setSession = function(session) {\n if (this.session)\n this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n \n this.session = session;\n if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\n session.setScrollTop(-this.scrollMargin.top);\n\n this.$cursorLayer.setSession(session);\n this.$markerBack.setSession(session);\n this.$markerFront.setSession(session);\n this.$gutterLayer.setSession(session);\n this.$textLayer.setSession(session);\n if (!session)\n return;\n \n this.$loop.schedule(this.CHANGE_FULL);\n this.session.$setFontMetrics(this.$fontMetrics);\n this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\n \n this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);\n this.onChangeNewLineMode();\n this.session.doc.on(\"changeNewLineMode\", this.onChangeNewLineMode);\n };\n this.updateLines = function(firstRow, lastRow, force) {\n if (lastRow === undefined)\n lastRow = Infinity;\n\n if (!this.$changedLines) {\n this.$changedLines = {\n firstRow: firstRow,\n lastRow: lastRow\n };\n }\n else {\n if (this.$changedLines.firstRow > firstRow)\n this.$changedLines.firstRow = firstRow;\n\n if (this.$changedLines.lastRow < lastRow)\n this.$changedLines.lastRow = lastRow;\n }\n if (this.$changedLines.lastRow < this.layerConfig.firstRow) {\n if (force)\n this.$changedLines.lastRow = this.layerConfig.lastRow;\n else\n return;\n }\n if (this.$changedLines.firstRow > this.layerConfig.lastRow)\n return;\n this.$loop.schedule(this.CHANGE_LINES);\n };\n\n this.onChangeNewLineMode = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n this.$textLayer.$updateEolChar();\n this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR);\n };\n \n this.onChangeTabSize = function() {\n this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n this.$textLayer.onChangeTabSize();\n };\n this.updateText = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n };\n this.updateFull = function(force) {\n if (force)\n this.$renderChanges(this.CHANGE_FULL, true);\n else\n this.$loop.schedule(this.CHANGE_FULL);\n };\n this.updateFontSize = function() {\n this.$textLayer.checkForSizeChanges();\n };\n\n this.$changes = 0;\n this.$updateSizeAsync = function() {\n if (this.$loop.pending)\n this.$size.$dirty = true;\n else\n this.onResize();\n };\n this.onResize = function(force, gutterWidth, width, height) {\n if (this.resizing > 2)\n return;\n else if (this.resizing > 0)\n this.resizing++;\n else\n this.resizing = force ? 1 : 0;\n var el = this.container;\n if (!height)\n height = el.clientHeight || el.scrollHeight;\n if (!width)\n width = el.clientWidth || el.scrollWidth;\n var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n\n \n if (!this.$size.scrollerHeight || (!width && !height))\n return this.resizing = 0;\n\n if (force)\n this.$gutterLayer.$padding = null;\n\n if (force)\n this.$renderChanges(changes | this.$changes, true);\n else\n this.$loop.schedule(changes | this.$changes);\n\n if (this.resizing)\n this.resizing = 0;\n this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;\n };\n \n this.$updateCachedSize = function(force, gutterWidth, width, height) {\n height -= (this.$extraHeight || 0);\n var changes = 0;\n var size = this.$size;\n var oldSize = {\n width: size.width,\n height: size.height,\n scrollerHeight: size.scrollerHeight,\n scrollerWidth: size.scrollerWidth\n };\n if (height && (force || size.height != height)) {\n size.height = height;\n changes |= this.CHANGE_SIZE;\n\n size.scrollerHeight = size.height;\n if (this.$horizScroll)\n size.scrollerHeight -= this.scrollBarH.getHeight();\n this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n changes = changes | this.CHANGE_SCROLL;\n }\n\n if (width && (force || size.width != width)) {\n changes |= this.CHANGE_SIZE;\n size.width = width;\n \n if (gutterWidth == null)\n gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n \n this.gutterWidth = gutterWidth;\n \n this.scrollBarH.element.style.left = \n this.scroller.style.left = gutterWidth + \"px\";\n size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); \n \n this.scrollBarH.element.style.right = \n this.scroller.style.right = this.scrollBarV.getWidth() + \"px\";\n this.scroller.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n changes |= this.CHANGE_FULL;\n }\n \n size.$dirty = !width || !height;\n\n if (changes)\n this._signal(\"resize\", oldSize);\n\n return changes;\n };\n\n this.onGutterResize = function() {\n var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n if (gutterWidth != this.gutterWidth)\n this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\n if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else if (this.$size.$dirty) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else {\n this.$computeLayerConfig();\n this.$loop.schedule(this.CHANGE_MARKER);\n }\n };\n this.adjustWrapLimit = function() {\n var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n var limit = Math.floor(availableWidth / this.characterWidth);\n return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n };\n this.setAnimatedScroll = function(shouldAnimate){\n this.setOption(\"animatedScroll\", shouldAnimate);\n };\n this.getAnimatedScroll = function() {\n return this.$animatedScroll;\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.setOption(\"showInvisibles\", showInvisibles);\n this.session.$bidiHandler.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.getOption(\"showInvisibles\");\n };\n this.getDisplayIndentGuides = function() {\n return this.getOption(\"displayIndentGuides\");\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.setOption(\"displayIndentGuides\", display);\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.setOption(\"showPrintMargin\", showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.getOption(\"showPrintMargin\");\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.setOption(\"printMarginColumn\", showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.getOption(\"printMarginColumn\");\n };\n this.getShowGutter = function(){\n return this.getOption(\"showGutter\");\n };\n this.setShowGutter = function(show){\n return this.setOption(\"showGutter\", show);\n };\n\n this.getFadeFoldWidgets = function(){\n return this.getOption(\"fadeFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(show) {\n this.setOption(\"fadeFoldWidgets\", show);\n };\n\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n\n this.$updateGutterLineHighlight = function() {\n var pos = this.$cursorLayer.$pixelPos;\n var height = this.layerConfig.lineHeight;\n if (this.session.getUseWrapMode()) {\n var cursor = this.session.selection.getCursor();\n cursor.column = 0;\n pos = this.$cursorLayer.getPixelPosition(cursor, true);\n height *= this.session.getRowLength(cursor.row);\n }\n this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \"px\";\n this.$gutterLineHighlight.style.height = height + \"px\";\n };\n\n this.$updatePrintMargin = function() {\n if (!this.$showPrintMargin && !this.$printMarginEl)\n return;\n\n if (!this.$printMarginEl) {\n var containerEl = dom.createElement(\"div\");\n containerEl.className = \"ace_layer ace_print-margin-layer\";\n this.$printMarginEl = dom.createElement(\"div\");\n this.$printMarginEl.className = \"ace_print-margin\";\n containerEl.appendChild(this.$printMarginEl);\n this.content.insertBefore(containerEl, this.content.firstChild);\n }\n\n var style = this.$printMarginEl.style;\n style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \"px\";\n style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n \n if (this.session && this.session.$wrap == -1)\n this.adjustWrapLimit();\n };\n this.getContainerElement = function() {\n return this.container;\n };\n this.getMouseEventTarget = function() {\n return this.scroller;\n };\n this.getTextAreaContainer = function() {\n return this.container;\n };\n this.$moveTextAreaToCursor = function() {\n if (!this.$keepTextAreaAtCursor)\n return;\n var config = this.layerConfig;\n var posTop = this.$cursorLayer.$pixelPos.top;\n var posLeft = this.$cursorLayer.$pixelPos.left;\n posTop -= config.offset;\n\n var style = this.textarea.style;\n var h = this.lineHeight;\n if (posTop < 0 || posTop > config.height - h) {\n style.top = style.left = \"0\";\n return;\n }\n\n var w = this.characterWidth;\n if (this.$composition) {\n var val = this.textarea.value.replace(/^\\x01+/, \"\");\n w *= (this.session.$getStringScreenWidth(val)[0]+2);\n h += 2;\n }\n posLeft -= this.scrollLeft;\n if (posLeft > this.$size.scrollerWidth - w)\n posLeft = this.$size.scrollerWidth - w;\n\n posLeft += this.gutterWidth;\n style.height = h + \"px\";\n style.width = w + \"px\";\n style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + \"px\";\n style.top = Math.min(posTop, this.$size.height - h) + \"px\";\n };\n this.getFirstVisibleRow = function() {\n return this.layerConfig.firstRow;\n };\n this.getFirstFullyVisibleRow = function() {\n return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n };\n this.getLastFullyVisibleRow = function() {\n var config = this.layerConfig;\n var lastRow = config.lastRow;\n var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;\n if (top - this.session.getScrollTop() > config.height - config.lineHeight)\n return lastRow - 1;\n return lastRow;\n };\n this.getLastVisibleRow = function() {\n return this.layerConfig.lastRow;\n };\n\n this.$padding = null;\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.$textLayer.setPadding(padding);\n this.$cursorLayer.setPadding(padding);\n this.$markerFront.setPadding(padding);\n this.$markerBack.setPadding(padding);\n this.$loop.schedule(this.CHANGE_FULL);\n this.$updatePrintMargin();\n };\n \n this.setScrollMargin = function(top, bottom, left, right) {\n var sm = this.scrollMargin;\n sm.top = top|0;\n sm.bottom = bottom|0;\n sm.right = right|0;\n sm.left = left|0;\n sm.v = sm.top + sm.bottom;\n sm.h = sm.left + sm.right;\n if (sm.top && this.scrollTop <= 0 && this.session)\n this.session.setScrollTop(-sm.top);\n this.updateFull();\n };\n this.getHScrollBarAlwaysVisible = function() {\n return this.$hScrollBarAlwaysVisible;\n };\n this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n };\n this.getVScrollBarAlwaysVisible = function() {\n return this.$vScrollBarAlwaysVisible;\n };\n this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n };\n\n this.$updateScrollBarV = function() {\n var scrollHeight = this.layerConfig.maxHeight;\n var scrollerHeight = this.$size.scrollerHeight;\n if (!this.$maxLines && this.$scrollPastEnd) {\n scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;\n if (this.scrollTop > scrollHeight - scrollerHeight) {\n scrollHeight = this.scrollTop + scrollerHeight;\n this.scrollBarV.scrollTop = null;\n }\n }\n this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);\n this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n };\n this.$updateScrollBarH = function() {\n this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n };\n \n this.$frozen = false;\n this.freeze = function() {\n this.$frozen = true;\n };\n \n this.unfreeze = function() {\n this.$frozen = false;\n };\n\n this.$renderChanges = function(changes, force) {\n if (this.$changes) {\n changes |= this.$changes;\n this.$changes = 0;\n }\n if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {\n this.$changes |= changes;\n return; \n } \n if (this.$size.$dirty) {\n this.$changes |= changes;\n return this.onResize(true);\n }\n if (!this.lineHeight) {\n this.$textLayer.checkForSizeChanges();\n }\n \n this._signal(\"beforeRender\");\n\n if (this.session && this.session.$bidiHandler)\n this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);\n\n var config = this.layerConfig;\n if (changes & this.CHANGE_FULL ||\n changes & this.CHANGE_SIZE ||\n changes & this.CHANGE_TEXT ||\n changes & this.CHANGE_LINES ||\n changes & this.CHANGE_SCROLL ||\n changes & this.CHANGE_H_SCROLL\n ) {\n changes |= this.$computeLayerConfig();\n if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\n var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\n if (st > 0) {\n this.scrollTop = st;\n changes = changes | this.CHANGE_SCROLL;\n changes |= this.$computeLayerConfig();\n }\n }\n config = this.layerConfig;\n this.$updateScrollBarV();\n if (changes & this.CHANGE_H_SCROLL)\n this.$updateScrollBarH();\n this.$gutterLayer.element.style.marginTop = (-config.offset) + \"px\";\n this.content.style.marginTop = (-config.offset) + \"px\";\n this.content.style.width = config.width + 2 * this.$padding + \"px\";\n this.content.style.height = config.minHeight + \"px\";\n }\n if (changes & this.CHANGE_H_SCROLL) {\n this.content.style.marginLeft = -this.scrollLeft + \"px\";\n this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n }\n if (changes & this.CHANGE_FULL) {\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n this._signal(\"afterRender\");\n return;\n }\n if (changes & this.CHANGE_SCROLL) {\n if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n this.$textLayer.update(config);\n else\n this.$textLayer.scrollLines(config);\n\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n this.$moveTextAreaToCursor();\n this._signal(\"afterRender\");\n return;\n }\n\n if (changes & this.CHANGE_TEXT) {\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_LINES) {\n if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n\n if (changes & this.CHANGE_CURSOR) {\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n this.$markerFront.update(config);\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n this.$markerBack.update(config);\n }\n\n this._signal(\"afterRender\");\n };\n\n \n this.$autosize = function() {\n var height = this.session.getScreenLength() * this.lineHeight;\n var maxHeight = this.$maxLines * this.lineHeight;\n var desiredHeight = Math.min(maxHeight,\n Math.max((this.$minLines || 1) * this.lineHeight, height)\n ) + this.scrollMargin.v + (this.$extraHeight || 0);\n if (this.$horizScroll)\n desiredHeight += this.scrollBarH.getHeight();\n if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight)\n desiredHeight = this.$maxPixelHeight;\n var vScroll = height > maxHeight;\n \n if (desiredHeight != this.desiredHeight ||\n this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n if (vScroll != this.$vScroll) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n \n var w = this.container.clientWidth;\n this.container.style.height = desiredHeight + \"px\";\n this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n this.desiredHeight = desiredHeight;\n \n this._signal(\"autosize\");\n }\n };\n \n this.$computeLayerConfig = function() {\n var session = this.session;\n var size = this.$size;\n \n var hideScrollbars = size.height <= 2 * this.lineHeight;\n var screenLines = this.session.getScreenLength();\n var maxHeight = screenLines * this.lineHeight;\n\n var longestLine = this.$getLongestLine();\n \n var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n\n var hScrollChanged = this.$horizScroll !== horizScroll;\n if (hScrollChanged) {\n this.$horizScroll = horizScroll;\n this.scrollBarH.setVisible(horizScroll);\n }\n var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine\n if (this.$maxLines && this.lineHeight > 1)\n this.$autosize();\n\n var offset = this.scrollTop % this.lineHeight;\n var minHeight = size.scrollerHeight + this.lineHeight;\n \n var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd\n ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n : 0;\n maxHeight += scrollPastEnd;\n \n var sm = this.scrollMargin;\n this.session.setScrollTop(Math.max(-sm.top,\n Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));\n\n this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, \n longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));\n \n var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);\n var vScrollChanged = vScrollBefore !== vScroll;\n if (vScrollChanged) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n\n var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n var lastRow = firstRow + lineCount;\n var firstRowScreen, firstRowHeight;\n var lineHeight = this.lineHeight;\n firstRow = session.screenToDocumentRow(firstRow, 0);\n var foldLine = session.getFoldLine(firstRow);\n if (foldLine) {\n firstRow = foldLine.start.row;\n }\n\n firstRowScreen = session.documentToScreenRow(firstRow, 0);\n firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n firstRowHeight;\n\n offset = this.scrollTop - firstRowScreen * lineHeight;\n\n var changes = 0;\n if (this.layerConfig.width != longestLine) \n changes = this.CHANGE_H_SCROLL;\n if (hScrollChanged || vScrollChanged) {\n changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\n this._signal(\"scrollbarVisibilityChanged\");\n if (vScrollChanged)\n longestLine = this.$getLongestLine();\n }\n \n this.layerConfig = {\n width : longestLine,\n padding : this.$padding,\n firstRow : firstRow,\n firstRowScreen: firstRowScreen,\n lastRow : lastRow,\n lineHeight : lineHeight,\n characterWidth : this.characterWidth,\n minHeight : minHeight,\n maxHeight : maxHeight,\n offset : offset,\n gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\n height : this.$size.scrollerHeight\n };\n\n return changes;\n };\n\n this.$updateLines = function() {\n if (!this.$changedLines) return;\n var firstRow = this.$changedLines.firstRow;\n var lastRow = this.$changedLines.lastRow;\n this.$changedLines = null;\n\n var layerConfig = this.layerConfig;\n\n if (firstRow > layerConfig.lastRow + 1) { return; }\n if (lastRow < layerConfig.firstRow) { return; }\n if (lastRow === Infinity) {\n if (this.$showGutter)\n this.$gutterLayer.update(layerConfig);\n this.$textLayer.update(layerConfig);\n return;\n }\n this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n return true;\n };\n\n this.$getLongestLine = function() {\n var charCount = this.session.getScreenWidth();\n if (this.showInvisibles && !this.session.$useWrapMode)\n charCount += 1;\n\n return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n };\n this.updateFrontMarkers = function() {\n this.$markerFront.setMarkers(this.session.getMarkers(true));\n this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n };\n this.updateBackMarkers = function() {\n this.$markerBack.setMarkers(this.session.getMarkers());\n this.$loop.schedule(this.CHANGE_MARKER_BACK);\n };\n this.addGutterDecoration = function(row, className){\n this.$gutterLayer.addGutterDecoration(row, className);\n };\n this.removeGutterDecoration = function(row, className){\n this.$gutterLayer.removeGutterDecoration(row, className);\n };\n this.updateBreakpoints = function(rows) {\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.setAnnotations = function(annotations) {\n this.$gutterLayer.setAnnotations(annotations);\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.updateCursor = function() {\n this.$loop.schedule(this.CHANGE_CURSOR);\n };\n this.hideCursor = function() {\n this.$cursorLayer.hideCursor();\n };\n this.showCursor = function() {\n this.$cursorLayer.showCursor();\n };\n\n this.scrollSelectionIntoView = function(anchor, lead, offset) {\n this.scrollCursorIntoView(anchor, offset);\n this.scrollCursorIntoView(lead, offset);\n };\n this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {\n if (this.$size.scrollerHeight === 0)\n return;\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n\n var left = pos.left;\n var top = pos.top;\n \n var topMargin = $viewMargin && $viewMargin.top || 0;\n var bottomMargin = $viewMargin && $viewMargin.bottom || 0;\n \n var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n \n if (scrollTop + topMargin > top) {\n if (offset && scrollTop + topMargin > top + this.lineHeight)\n top -= offset * this.$size.scrollerHeight;\n if (top === 0)\n top = -this.scrollMargin.top;\n this.session.setScrollTop(top);\n } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {\n if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight)\n top += offset * this.$size.scrollerHeight;\n this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);\n }\n\n var scrollLeft = this.scrollLeft;\n\n if (scrollLeft > left) {\n if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n left = -this.scrollMargin.left;\n this.session.setScrollLeft(left);\n } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n this.session.setScrollLeft(0);\n }\n };\n this.getScrollTop = function() {\n return this.session.getScrollTop();\n };\n this.getScrollLeft = function() {\n return this.session.getScrollLeft();\n };\n this.getScrollTopRow = function() {\n return this.scrollTop / this.lineHeight;\n };\n this.getScrollBottomRow = function() {\n return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n };\n this.scrollToRow = function(row) {\n this.session.setScrollTop(row * this.lineHeight);\n };\n\n this.alignCursor = function(cursor, alignment) {\n if (typeof cursor == \"number\")\n cursor = {row: cursor, column: 0};\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n var h = this.$size.scrollerHeight - this.lineHeight;\n var offset = pos.top - h * (alignment || 0);\n\n this.session.setScrollTop(offset);\n return offset;\n };\n\n this.STEPS = 8;\n this.$calcSteps = function(fromValue, toValue){\n var i = 0;\n var l = this.STEPS;\n var steps = [];\n\n var func = function(t, x_min, dx) {\n return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n };\n\n for (i = 0; i < l; ++i)\n steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n return steps;\n };\n this.scrollToLine = function(line, center, animate, callback) {\n var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n var offset = pos.top;\n if (center)\n offset -= this.$size.scrollerHeight / 2;\n\n var initialScroll = this.scrollTop;\n this.session.setScrollTop(offset);\n if (animate !== false)\n this.animateScrolling(initialScroll, callback);\n };\n\n this.animateScrolling = function(fromValue, callback) {\n var toValue = this.scrollTop;\n if (!this.$animatedScroll)\n return;\n var _self = this;\n \n if (fromValue == toValue)\n return;\n \n if (this.$scrollAnimation) {\n var oldSteps = this.$scrollAnimation.steps;\n if (oldSteps.length) {\n fromValue = oldSteps[0];\n if (fromValue == toValue)\n return;\n }\n }\n \n var steps = _self.$calcSteps(fromValue, toValue);\n this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\n clearInterval(this.$timer);\n\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n this.$timer = setInterval(function() {\n if (steps.length) {\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n } else if (toValue != null) {\n _self.session.$scrollTop = -1;\n _self.session.setScrollTop(toValue);\n toValue = null;\n } else {\n _self.$timer = clearInterval(_self.$timer);\n _self.$scrollAnimation = null;\n callback && callback();\n }\n }, 10);\n };\n this.scrollToY = function(scrollTop) {\n if (this.scrollTop !== scrollTop) {\n this.$loop.schedule(this.CHANGE_SCROLL);\n this.scrollTop = scrollTop;\n }\n };\n this.scrollToX = function(scrollLeft) {\n if (this.scrollLeft !== scrollLeft)\n this.scrollLeft = scrollLeft;\n this.$loop.schedule(this.CHANGE_H_SCROLL);\n };\n this.scrollTo = function(x, y) {\n this.session.setScrollTop(y);\n this.session.setScrollLeft(y);\n };\n this.scrollBy = function(deltaX, deltaY) {\n deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n };\n this.isScrollableBy = function(deltaX, deltaY) {\n if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n return true;\n if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\n return true;\n if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n return true;\n if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n - this.layerConfig.width < -1 + this.scrollMargin.right)\n return true;\n };\n\n this.pixelToScreenCoordinates = function(x, y) {\n var canvasPos = this.scroller.getBoundingClientRect();\n\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n var col = Math.round(offset);\n\n return {row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX};\n };\n\n this.screenToTextCoordinates = function(x, y) {\n var canvasPos = this.scroller.getBoundingClientRect();\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n\n var col = Math.round(offsetX / this.characterWidth);\n\n var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight;\n\n return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX);\n };\n this.textToScreenCoordinates = function(row, column) {\n var canvasPos = this.scroller.getBoundingClientRect();\n var pos = this.session.documentToScreenPosition(row, column);\n\n var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : Math.round(pos.column * this.characterWidth));\n\n var y = pos.row * this.lineHeight;\n\n return {\n pageX: canvasPos.left + x - this.scrollLeft,\n pageY: canvasPos.top + y - this.scrollTop\n };\n };\n this.visualizeFocus = function() {\n dom.addCssClass(this.container, \"ace_focus\");\n };\n this.visualizeBlur = function() {\n dom.removeCssClass(this.container, \"ace_focus\");\n };\n this.showComposition = function(position) {\n if (!this.$composition)\n this.$composition = {\n keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\n cssText: this.textarea.style.cssText\n };\n\n this.$keepTextAreaAtCursor = true;\n dom.addCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = \"\";\n this.$moveTextAreaToCursor();\n };\n this.setCompositionText = function(text) {\n this.$moveTextAreaToCursor();\n };\n this.hideComposition = function() {\n if (!this.$composition)\n return;\n\n dom.removeCssClass(this.textarea, \"ace_composition\");\n this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\n this.textarea.style.cssText = this.$composition.cssText;\n this.$composition = null;\n };\n this.setTheme = function(theme, cb) {\n var _self = this;\n this.$themeId = theme;\n _self._dispatchEvent('themeChange',{theme:theme});\n\n if (!theme || typeof theme == \"string\") {\n var moduleName = theme || this.$options.theme.initialValue;\n config.loadModule([\"theme\", moduleName], afterLoad);\n } else {\n afterLoad(theme);\n }\n\n function afterLoad(module) {\n if (_self.$themeId != theme)\n return cb && cb();\n if (!module || !module.cssClass)\n throw new Error(\"couldn't load module \" + theme + \" or it didn't call define\");\n dom.importCssString(\n module.cssText,\n module.cssClass,\n _self.container.ownerDocument\n );\n\n if (_self.theme)\n dom.removeCssClass(_self.container, _self.theme.cssClass);\n\n var padding = \"padding\" in module ? module.padding \n : \"padding\" in (_self.theme || {}) ? 4 : _self.$padding;\n if (_self.$padding && padding != _self.$padding)\n _self.setPadding(padding);\n _self.$theme = module.cssClass;\n\n _self.theme = module;\n dom.addCssClass(_self.container, module.cssClass);\n dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n if (_self.$size) {\n _self.$size.width = 0;\n _self.$updateSizeAsync();\n }\n\n _self._dispatchEvent('themeLoaded', {theme:module});\n cb && cb();\n }\n };\n this.getTheme = function() {\n return this.$themeId;\n };\n this.setStyle = function(style, include) {\n dom.setCssClass(this.container, style, include !== false);\n };\n this.unsetStyle = function(style) {\n dom.removeCssClass(this.container, style);\n };\n \n this.setCursorStyle = function(style) {\n if (this.scroller.style.cursor != style)\n this.scroller.style.cursor = style;\n };\n this.setMouseCursor = function(cursorStyle) {\n this.scroller.style.cursor = cursorStyle;\n };\n this.destroy = function() {\n this.$textLayer.destroy();\n this.$cursorLayer.destroy();\n };\n\n}).call(VirtualRenderer.prototype);\n\n\nconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n animatedScroll: {initialValue: false},\n showInvisibles: {\n set: function(value) {\n if (this.$textLayer.setShowInvisibles(value))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: false\n },\n showPrintMargin: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: true\n },\n printMarginColumn: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: 80\n },\n printMargin: {\n set: function(val) {\n if (typeof val == \"number\")\n this.$printMarginColumn = val;\n this.$showPrintMargin = !!val;\n this.$updatePrintMargin();\n },\n get: function() {\n return this.$showPrintMargin && this.$printMarginColumn; \n }\n },\n showGutter: {\n set: function(show){\n this.$gutter.style.display = show ? \"block\" : \"none\";\n this.$loop.schedule(this.CHANGE_FULL);\n this.onGutterResize();\n },\n initialValue: true\n },\n fadeFoldWidgets: {\n set: function(show) {\n dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n },\n initialValue: false\n },\n showFoldWidgets: {\n set: function(show) {this.$gutterLayer.setShowFoldWidgets(show);},\n initialValue: true\n },\n showLineNumbers: {\n set: function(show) {\n this.$gutterLayer.setShowLineNumbers(show);\n this.$loop.schedule(this.CHANGE_GUTTER);\n },\n initialValue: true\n },\n displayIndentGuides: {\n set: function(show) {\n if (this.$textLayer.setDisplayIndentGuides(show))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: true\n },\n highlightGutterLine: {\n set: function(shouldHighlight) {\n if (!this.$gutterLineHighlight) {\n this.$gutterLineHighlight = dom.createElement(\"div\");\n this.$gutterLineHighlight.className = \"ace_gutter-active-line\";\n this.$gutter.appendChild(this.$gutterLineHighlight);\n return;\n }\n\n this.$gutterLineHighlight.style.display = shouldHighlight ? \"\" : \"none\";\n if (this.$cursorLayer.$pixelPos)\n this.$updateGutterLineHighlight();\n },\n initialValue: false,\n value: true\n },\n hScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n vScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n fontSize: {\n set: function(size) {\n if (typeof size == \"number\")\n size = size + \"px\";\n this.container.style.fontSize = size;\n this.updateFontSize();\n },\n initialValue: 12\n },\n fontFamily: {\n set: function(name) {\n this.container.style.fontFamily = name;\n this.updateFontSize();\n }\n },\n maxLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n minLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n maxPixelHeight: {\n set: function(val) {\n this.updateFull();\n },\n initialValue: 0\n },\n scrollPastEnd: {\n set: function(val) {\n val = +val || 0;\n if (this.$scrollPastEnd == val)\n return;\n this.$scrollPastEnd = val;\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: 0,\n handlesSet: true\n },\n fixedWidthGutter: {\n set: function(val) {\n this.$gutterLayer.$fixedWidth = !!val;\n this.$loop.schedule(this.CHANGE_GUTTER);\n }\n },\n theme: {\n set: function(val) { this.setTheme(val); },\n get: function() { return this.$themeId || this.theme; },\n initialValue: \"./theme/textmate\",\n handlesSet: true\n }\n});\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\nace.define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar net = acequire(\"../lib/net\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\nvar config = acequire(\"../config\");\n\nfunction $workerBlob(workerUrl, mod) {\n var script = mod.src;\"importScripts('\" + net.qualifyURL(workerUrl) + \"');\";\n try {\n return new Blob([script], {\"type\": \"application/javascript\"});\n } catch (e) { // Backwards-compatibility\n var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n var blobBuilder = new BlobBuilder();\n blobBuilder.append(script);\n return blobBuilder.getBlob(\"application/javascript\");\n }\n}\n\nfunction createWorker(workerUrl, mod) {\n var blob = $workerBlob(workerUrl, mod);\n var URL = window.URL || window.webkitURL;\n var blobURL = URL.createObjectURL(blob);\n return new Worker(blobURL);\n}\n\nvar WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) {\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.onMessage = this.onMessage.bind(this);\n if (acequire.nameToUrl && !acequire.toUrl)\n acequire.toUrl = acequire.nameToUrl;\n \n if (config.get(\"packaged\") || !acequire.toUrl) {\n workerUrl = workerUrl || config.moduleUrl(mod.id, \"worker\");\n } else {\n var normalizePath = this.$normalizePath;\n workerUrl = workerUrl || normalizePath(acequire.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n var tlns = {};\n topLevelNamespaces.forEach(function(ns) {\n tlns[ns] = normalizePath(acequire.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n });\n }\n\n this.$worker = createWorker(workerUrl, mod);\n if (importScripts) {\n this.send(\"importScripts\", importScripts);\n }\n this.$worker.postMessage({\n init : true,\n tlns : tlns,\n module : mod.id,\n classname : classname\n });\n\n this.callbackId = 1;\n this.callbacks = {};\n\n this.$worker.onmessage = this.onMessage;\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.onMessage = function(e) {\n var msg = e.data;\n switch (msg.type) {\n case \"event\":\n this._signal(msg.name, {data: msg.data});\n break;\n case \"call\":\n var callback = this.callbacks[msg.id];\n if (callback) {\n callback(msg.data);\n delete this.callbacks[msg.id];\n }\n break;\n case \"error\":\n this.reportError(msg.data);\n break;\n case \"log\":\n window.console && console.log && console.log.apply(console, msg.data);\n break;\n }\n };\n \n this.reportError = function(err) {\n window.console && console.error && console.error(err);\n };\n\n this.$normalizePath = function(path) {\n return net.qualifyURL(path);\n };\n\n this.terminate = function() {\n this._signal(\"terminate\", {});\n this.deltaQueue = null;\n this.$worker.terminate();\n this.$worker = null;\n if (this.$doc)\n this.$doc.off(\"change\", this.changeListener);\n this.$doc = null;\n };\n\n this.send = function(cmd, args) {\n this.$worker.postMessage({command: cmd, args: args});\n };\n\n this.call = function(cmd, args, callback) {\n if (callback) {\n var id = this.callbackId++;\n this.callbacks[id] = callback;\n args.push(id);\n }\n this.send(cmd, args);\n };\n\n this.emit = function(event, data) {\n try {\n this.$worker.postMessage({event: event, data: {data: data.data}});\n }\n catch(ex) {\n console.error(ex.stack);\n }\n };\n\n this.attachToDocument = function(doc) {\n if (this.$doc)\n this.terminate();\n\n this.$doc = doc;\n this.call(\"setValue\", [doc.getValue()]);\n doc.on(\"change\", this.changeListener);\n };\n\n this.changeListener = function(delta) {\n if (!this.deltaQueue) {\n this.deltaQueue = [];\n setTimeout(this.$sendDeltaQueue, 0);\n }\n if (delta.action == \"insert\")\n this.deltaQueue.push(delta.start, delta.lines);\n else\n this.deltaQueue.push(delta.start, delta.end);\n };\n\n this.$sendDeltaQueue = function() {\n var q = this.deltaQueue;\n if (!q) return;\n this.deltaQueue = null;\n if (q.length > 50 && q.length > this.$doc.getLength() >> 1) {\n this.call(\"setValue\", [this.$doc.getValue()]);\n } else\n this.emit(\"change\", {data: q});\n };\n\n}).call(WorkerClient.prototype);\n\n\nvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.callbackId = 1;\n this.callbacks = {};\n this.messageBuffer = [];\n\n var main = null;\n var emitSync = false;\n var sender = Object.create(EventEmitter);\n var _self = this;\n\n this.$worker = {};\n this.$worker.terminate = function() {};\n this.$worker.postMessage = function(e) {\n _self.messageBuffer.push(e);\n if (main) {\n if (emitSync)\n setTimeout(processNext);\n else\n processNext();\n }\n };\n this.setEmitSync = function(val) { emitSync = val; };\n\n var processNext = function() {\n var msg = _self.messageBuffer.shift();\n if (msg.command)\n main[msg.command].apply(main, msg.args);\n else if (msg.event)\n sender._signal(msg.event, msg.data);\n };\n\n sender.postMessage = function(msg) {\n _self.onMessage({data: msg});\n };\n sender.callback = function(data, callbackId) {\n this.postMessage({type: \"call\", id: callbackId, data: data});\n };\n sender.emit = function(name, data) {\n this.postMessage({type: \"event\", name: name, data: data});\n };\n\n config.loadModule([\"worker\", mod], function(Main) {\n main = new Main[classname](sender);\n while (_self.messageBuffer.length)\n processNext();\n });\n};\n\nUIWorkerClient.prototype = WorkerClient.prototype;\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\nexports.createWorker = createWorker;\n\n\n});\n\nace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"./range\").Range;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar oop = acequire(\"./lib/oop\");\n\nvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n var _self = this;\n this.length = length;\n this.session = session;\n this.doc = session.getDocument();\n this.mainClass = mainClass;\n this.othersClass = othersClass;\n this.$onUpdate = this.onUpdate.bind(this);\n this.doc.on(\"change\", this.$onUpdate);\n this.$others = others;\n \n this.$onCursorChange = function() {\n setTimeout(function() {\n _self.onCursorChange();\n });\n };\n \n this.$pos = pos;\n var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n this.$undoStackDepth = undoStack.length;\n this.setup();\n\n session.selection.on(\"changeCursor\", this.$onCursorChange);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setup = function() {\n var _self = this;\n var doc = this.doc;\n var session = this.session;\n \n this.selectionBefore = session.selection.toJSON();\n if (session.selection.inMultiSelectMode)\n session.selection.toSingleRange();\n\n this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);\n var pos = this.pos;\n pos.$insertRight = true;\n pos.detach();\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n this.others = [];\n this.$others.forEach(function(other) {\n var anchor = doc.createAnchor(other.row, other.column);\n anchor.$insertRight = true;\n anchor.detach();\n _self.others.push(anchor);\n });\n session.setUndoSelect(false);\n };\n this.showOtherMarkers = function() {\n if (this.othersActive) return;\n var session = this.session;\n var _self = this;\n this.othersActive = true;\n this.others.forEach(function(anchor) {\n anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n });\n };\n this.hideOtherMarkers = function() {\n if (!this.othersActive) return;\n this.othersActive = false;\n for (var i = 0; i < this.others.length; i++) {\n this.session.removeMarker(this.others[i].markerId);\n }\n };\n this.onUpdate = function(delta) {\n if (this.$updating)\n return this.updateAnchors(delta);\n \n var range = delta;\n if (range.start.row !== range.end.row) return;\n if (range.start.row !== this.pos.row) return;\n this.$updating = true;\n var lengthDiff = delta.action === \"insert\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1;\n var distanceFromStart = range.start.column - this.pos.column;\n \n this.updateAnchors(delta);\n \n if (inMainRange)\n this.length += lengthDiff;\n\n if (inMainRange && !this.session.$fromUndo) {\n if (delta.action === 'insert') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.insertMergedLines(newPos, delta.lines);\n }\n } else if (delta.action === 'remove') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n }\n }\n }\n \n this.$updating = false;\n this.updateMarkers();\n };\n \n this.updateAnchors = function(delta) {\n this.pos.onChange(delta);\n for (var i = this.others.length; i--;)\n this.others[i].onChange(delta);\n this.updateMarkers();\n };\n \n this.updateMarkers = function() {\n if (this.$updating)\n return;\n var _self = this;\n var session = this.session;\n var updateMarker = function(pos, className) {\n session.removeMarker(pos.markerId);\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false);\n };\n updateMarker(this.pos, this.mainClass);\n for (var i = this.others.length; i--;)\n updateMarker(this.others[i], this.othersClass);\n };\n\n this.onCursorChange = function(event) {\n if (this.$updating || !this.session) return;\n var pos = this.session.selection.getCursor();\n if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n this.showOtherMarkers();\n this._emit(\"cursorEnter\", event);\n } else {\n this.hideOtherMarkers();\n this._emit(\"cursorLeave\", event);\n }\n }; \n this.detach = function() {\n this.session.removeMarker(this.pos && this.pos.markerId);\n this.hideOtherMarkers();\n this.doc.removeEventListener(\"change\", this.$onUpdate);\n this.session.selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n this.session.setUndoSelect(true);\n this.session = null;\n };\n this.cancel = function() {\n if (this.$undoStackDepth === -1)\n return;\n var undoManager = this.session.getUndoManager();\n var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n for (var i = 0; i < undosRequired; i++) {\n undoManager.undo(true);\n }\n if (this.selectionBefore)\n this.session.selection.fromJSON(this.selectionBefore);\n };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\nace.define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\n\nfunction onMouseDown(e) {\n var ev = e.domEvent;\n var alt = ev.altKey;\n var shift = ev.shiftKey;\n var ctrl = ev.ctrlKey;\n var accel = e.getAccelKey();\n var button = e.getButton();\n \n if (ctrl && useragent.isMac)\n button = ev.button;\n\n if (e.editor.inMultiSelectMode && button == 2) {\n e.editor.textInput.onContextMenu(e.domEvent);\n return;\n }\n \n if (!ctrl && !alt && !accel) {\n if (button === 0 && e.editor.inMultiSelectMode)\n e.editor.exitMultiSelectMode();\n return;\n }\n \n if (button !== 0)\n return;\n\n var editor = e.editor;\n var selection = editor.selection;\n var isMultiSelect = editor.inMultiSelectMode;\n var pos = e.getDocumentPosition();\n var cursor = selection.getCursor();\n var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\n var mouseX = e.x, mouseY = e.y;\n var onMouseSelection = function(e) {\n mouseX = e.clientX;\n mouseY = e.clientY;\n };\n \n var session = editor.session;\n var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var screenCursor = screenAnchor;\n \n var selectionMode;\n if (editor.$mouseHandler.$enableJumpToDef) {\n if (ctrl && alt || accel && alt)\n selectionMode = shift ? \"block\" : \"add\";\n else if (alt && editor.$blockSelectEnabled)\n selectionMode = \"block\";\n } else {\n if (accel && !alt) {\n selectionMode = \"add\";\n if (!isMultiSelect && shift)\n return;\n } else if (alt && editor.$blockSelectEnabled) {\n selectionMode = \"block\";\n }\n }\n \n if (selectionMode && useragent.isMac && ev.ctrlKey) {\n editor.$mouseHandler.cancelContextMenu();\n }\n\n if (selectionMode == \"add\") {\n if (!isMultiSelect && inSelection)\n return; // dragging\n\n if (!isMultiSelect) {\n var range = selection.toOrientedRange();\n editor.addSelectionMarker(range);\n }\n\n var oldRange = selection.rangeList.rangeAtPoint(pos);\n \n \n editor.$blockScrolling++;\n editor.inVirtualSelectionMode = true;\n \n if (shift) {\n oldRange = null;\n range = selection.ranges[0] || range;\n editor.removeSelectionMarker(range);\n }\n editor.once(\"mouseup\", function() {\n var tmpSel = selection.toOrientedRange();\n\n if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n selection.substractPoint(tmpSel.cursor);\n else {\n if (shift) {\n selection.substractPoint(range.cursor);\n } else if (range) {\n editor.removeSelectionMarker(range);\n selection.addRange(range);\n }\n selection.addRange(tmpSel);\n }\n editor.$blockScrolling--;\n editor.inVirtualSelectionMode = false;\n });\n\n } else if (selectionMode == \"block\") {\n e.stop();\n editor.inVirtualSelectionMode = true; \n var initialRange;\n var rectSel = [];\n var blockSelect = function() {\n var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX);\n\n if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\n return;\n screenCursor = newCursor;\n \n editor.$blockScrolling++;\n editor.selection.moveToPosition(cursor);\n editor.renderer.scrollCursorIntoView();\n\n editor.removeSelectionMarkers(rectSel);\n rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\n rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\n rectSel.forEach(editor.addSelectionMarker, editor);\n editor.updateSelectionMarkers();\n editor.$blockScrolling--;\n };\n editor.$blockScrolling++;\n if (isMultiSelect && !accel) {\n selection.toSingleRange();\n } else if (!isMultiSelect && accel) {\n initialRange = selection.toOrientedRange();\n editor.addSelectionMarker(initialRange);\n }\n \n if (shift)\n screenAnchor = session.documentToScreenPosition(selection.lead); \n else\n selection.moveToPosition(pos);\n editor.$blockScrolling--;\n \n screenCursor = {row: -1, column: -1};\n\n var onMouseSelectionEnd = function(e) {\n clearInterval(timerId);\n editor.removeSelectionMarkers(rectSel);\n if (!rectSel.length)\n rectSel = [selection.toOrientedRange()];\n editor.$blockScrolling++;\n if (initialRange) {\n editor.removeSelectionMarker(initialRange);\n selection.toSingleRange(initialRange);\n }\n for (var i = 0; i < rectSel.length; i++)\n selection.addRange(rectSel[i]);\n editor.inVirtualSelectionMode = false;\n editor.$mouseHandler.$clickSelection = null;\n editor.$blockScrolling--;\n };\n\n var onSelectionInterval = blockSelect;\n\n event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\n return e.preventDefault();\n }\n}\n\n\nexports.onMouseDown = onMouseDown;\n\n});\n\nace.define(\"ace/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"], function(acequire, exports, module) {\nexports.defaultCommands = [{\n name: \"addCursorAbove\",\n exec: function(editor) { editor.selectMoreLines(-1); },\n bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelow\",\n exec: function(editor) { editor.selectMoreLines(1); },\n bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorAboveSkipCurrent\",\n exec: function(editor) { editor.selectMoreLines(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelowSkipCurrent\",\n exec: function(editor) { editor.selectMoreLines(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreBefore\",\n exec: function(editor) { editor.selectMore(-1); },\n bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreAfter\",\n exec: function(editor) { editor.selectMore(1); },\n bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextBefore\",\n exec: function(editor) { editor.selectMore(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextAfter\",\n exec: function(editor) { editor.selectMore(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"splitIntoLines\",\n exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n readOnly: true\n}, {\n name: \"alignCursors\",\n exec: function(editor) { editor.alignCursors(); },\n bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n scrollIntoView: \"cursor\"\n}, {\n name: \"findAll\",\n exec: function(editor) { editor.findAll(); },\n bindKey: {win: \"Ctrl-Alt-K\", mac: \"Ctrl-Alt-G\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}];\nexports.multiSelectCommands = [{\n name: \"singleSelection\",\n bindKey: \"esc\",\n exec: function(editor) { editor.exitMultiSelectMode(); },\n scrollIntoView: \"cursor\",\n readOnly: true,\n isAvailable: function(editor) {return editor && editor.inMultiSelectMode;}\n}];\n\nvar HashHandler = acequire(\"../keyboard/hash_handler\").HashHandler;\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\n});\n\nace.define(\"ace/multi_select\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/range\",\"ace/selection\",\"ace/mouse/multi_select_handler\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/commands/multi_select_commands\",\"ace/search\",\"ace/edit_session\",\"ace/editor\",\"ace/config\"], function(acequire, exports, module) {\n\nvar RangeList = acequire(\"./range_list\").RangeList;\nvar Range = acequire(\"./range\").Range;\nvar Selection = acequire(\"./selection\").Selection;\nvar onMouseDown = acequire(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = acequire(\"./lib/event\");\nvar lang = acequire(\"./lib/lang\");\nvar commands = acequire(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\nvar Search = acequire(\"./search\").Search;\nvar search = new Search();\n\nfunction find(session, needle, dir) {\n search.$options.wrap = true;\n search.$options.needle = needle;\n search.$options.backwards = dir == -1;\n return search.find(session);\n}\nvar EditSession = acequire(\"./edit_session\").EditSession;\n(function() {\n this.getSelectionMarkers = function() {\n return this.$selectionMarkers;\n };\n}).call(EditSession.prototype);\n(function() {\n this.ranges = null;\n this.rangeList = null;\n this.addRange = function(range, $blockChangeEvents) {\n if (!range)\n return;\n\n if (!this.inMultiSelectMode && this.rangeCount === 0) {\n var oldRange = this.toOrientedRange();\n this.rangeList.add(oldRange);\n this.rangeList.add(range);\n if (this.rangeList.ranges.length != 2) {\n this.rangeList.removeAll();\n return $blockChangeEvents || this.fromOrientedRange(range);\n }\n this.rangeList.removeAll();\n this.rangeList.add(oldRange);\n this.$onAddRange(oldRange);\n }\n\n if (!range.cursor)\n range.cursor = range.end;\n\n var removed = this.rangeList.add(range);\n\n this.$onAddRange(range);\n\n if (removed.length)\n this.$onRemoveRange(removed);\n\n if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n this._signal(\"multiSelect\");\n this.inMultiSelectMode = true;\n this.session.$undoSelect = false;\n this.rangeList.attach(this.session);\n }\n\n return $blockChangeEvents || this.fromOrientedRange(range);\n };\n\n this.toSingleRange = function(range) {\n range = range || this.ranges[0];\n var removed = this.rangeList.removeAll();\n if (removed.length)\n this.$onRemoveRange(removed);\n\n range && this.fromOrientedRange(range);\n };\n this.substractPoint = function(pos) {\n var removed = this.rangeList.substractPoint(pos);\n if (removed) {\n this.$onRemoveRange(removed);\n return removed[0];\n }\n };\n this.mergeOverlappingRanges = function() {\n var removed = this.rangeList.merge();\n if (removed.length)\n this.$onRemoveRange(removed);\n else if(this.ranges[0])\n this.fromOrientedRange(this.ranges[0]);\n };\n\n this.$onAddRange = function(range) {\n this.rangeCount = this.rangeList.ranges.length;\n this.ranges.unshift(range);\n this._signal(\"addRange\", {range: range});\n };\n\n this.$onRemoveRange = function(removed) {\n this.rangeCount = this.rangeList.ranges.length;\n if (this.rangeCount == 1 && this.inMultiSelectMode) {\n var lastRange = this.rangeList.ranges.pop();\n removed.push(lastRange);\n this.rangeCount = 0;\n }\n\n for (var i = removed.length; i--; ) {\n var index = this.ranges.indexOf(removed[i]);\n this.ranges.splice(index, 1);\n }\n\n this._signal(\"removeRange\", {ranges: removed});\n\n if (this.rangeCount === 0 && this.inMultiSelectMode) {\n this.inMultiSelectMode = false;\n this._signal(\"singleSelect\");\n this.session.$undoSelect = true;\n this.rangeList.detach(this.session);\n }\n\n lastRange = lastRange || this.ranges[0];\n if (lastRange && !lastRange.isEqual(this.getRange()))\n this.fromOrientedRange(lastRange);\n };\n this.$initRangeList = function() {\n if (this.rangeList)\n return;\n\n this.rangeList = new RangeList();\n this.ranges = [];\n this.rangeCount = 0;\n };\n this.getAllRanges = function() {\n return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n };\n\n this.splitIntoLines = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var range = this.getRange();\n var isBackwards = this.isBackwards();\n var startRow = range.start.row;\n var endRow = range.end.row;\n if (startRow == endRow) {\n if (isBackwards)\n var start = range.end, end = range.start;\n else\n var start = range.start, end = range.end;\n \n this.addRange(Range.fromPoints(end, end));\n this.addRange(Range.fromPoints(start, start));\n return;\n }\n\n var rectSel = [];\n var r = this.getLineRange(startRow, true);\n r.start.column = range.start.column;\n rectSel.push(r);\n\n for (var i = startRow + 1; i < endRow; i++)\n rectSel.push(this.getLineRange(i, true));\n\n r = this.getLineRange(endRow, true);\n r.end.column = range.end.column;\n rectSel.push(r);\n\n rectSel.forEach(this.addRange, this);\n }\n };\n this.toggleBlockSelection = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var cursor = this.session.documentToScreenPosition(this.selectionLead);\n var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\n\n var rectSel = this.rectangularRangeBlock(cursor, anchor);\n rectSel.forEach(this.addRange, this);\n }\n };\n this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n var rectSel = [];\n\n var xBackwards = screenCursor.column < screenAnchor.column;\n if (xBackwards) {\n var startColumn = screenCursor.column;\n var endColumn = screenAnchor.column;\n var startOffsetX = screenCursor.offsetX;\n var endOffsetX = screenAnchor.offsetX;\n } else {\n var startColumn = screenAnchor.column;\n var endColumn = screenCursor.column;\n var startOffsetX = screenAnchor.offsetX;\n var endOffsetX = screenCursor.offsetX;\n }\n\n var yBackwards = screenCursor.row < screenAnchor.row;\n if (yBackwards) {\n var startRow = screenCursor.row;\n var endRow = screenAnchor.row;\n } else {\n var startRow = screenAnchor.row;\n var endRow = screenCursor.row;\n }\n\n if (startColumn < 0)\n startColumn = 0;\n if (startRow < 0)\n startRow = 0;\n\n if (startRow == endRow)\n includeEmptyLines = true;\n\n for (var row = startRow; row <= endRow; row++) {\n var range = Range.fromPoints(\n this.session.screenToDocumentPosition(row, startColumn, startOffsetX),\n this.session.screenToDocumentPosition(row, endColumn, endOffsetX)\n );\n if (range.isEmpty()) {\n if (docEnd && isSamePoint(range.end, docEnd))\n break;\n var docEnd = range.end;\n }\n range.cursor = xBackwards ? range.start : range.end;\n rectSel.push(range);\n }\n\n if (yBackwards)\n rectSel.reverse();\n\n if (!includeEmptyLines) {\n var end = rectSel.length - 1;\n while (rectSel[end].isEmpty() && end > 0)\n end--;\n if (end > 0) {\n var start = 0;\n while (rectSel[start].isEmpty())\n start++;\n }\n for (var i = end; i >= start; i--) {\n if (rectSel[i].isEmpty())\n rectSel.splice(i, 1);\n }\n }\n\n return rectSel;\n };\n}).call(Selection.prototype);\nvar Editor = acequire(\"./editor\").Editor;\n(function() {\n this.updateSelectionMarkers = function() {\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n this.addSelectionMarker = function(orientedRange) {\n if (!orientedRange.cursor)\n orientedRange.cursor = orientedRange.end;\n\n var style = this.getSelectionStyle();\n orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\n this.session.$selectionMarkers.push(orientedRange);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n return orientedRange;\n };\n this.removeSelectionMarker = function(range) {\n if (!range.marker)\n return;\n this.session.removeMarker(range.marker);\n var index = this.session.$selectionMarkers.indexOf(range);\n if (index != -1)\n this.session.$selectionMarkers.splice(index, 1);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n };\n\n this.removeSelectionMarkers = function(ranges) {\n var markerList = this.session.$selectionMarkers;\n for (var i = ranges.length; i--; ) {\n var range = ranges[i];\n if (!range.marker)\n continue;\n this.session.removeMarker(range.marker);\n var index = markerList.indexOf(range);\n if (index != -1)\n markerList.splice(index, 1);\n }\n this.session.selectionMarkerCount = markerList.length;\n };\n\n this.$onAddRange = function(e) {\n this.addSelectionMarker(e.range);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onRemoveRange = function(e) {\n this.removeSelectionMarkers(e.ranges);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onMultiSelect = function(e) {\n if (this.inMultiSelectMode)\n return;\n this.inMultiSelectMode = true;\n\n this.setStyle(\"ace_multiselect\");\n this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onSingleSelect = function(e) {\n if (this.session.multiSelect.inVirtualMode)\n return;\n this.inMultiSelectMode = false;\n\n this.unsetStyle(\"ace_multiselect\");\n this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\n this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n this._emit(\"changeSelection\");\n };\n\n this.$onMultiSelectExec = function(e) {\n var command = e.command;\n var editor = e.editor;\n if (!editor.multiSelect)\n return;\n if (!command.multiSelectAction) {\n var result = command.exec(editor, e.args || {});\n editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n editor.multiSelect.mergeOverlappingRanges();\n } else if (command.multiSelectAction == \"forEach\") {\n result = editor.forEachSelection(command, e.args);\n } else if (command.multiSelectAction == \"forEachLine\") {\n result = editor.forEachSelection(command, e.args, true);\n } else if (command.multiSelectAction == \"single\") {\n editor.exitMultiSelectMode();\n result = command.exec(editor, e.args || {});\n } else {\n result = command.multiSelectAction(editor, e.args || {});\n }\n return result;\n }; \n this.forEachSelection = function(cmd, args, options) {\n if (this.inVirtualSelectionMode)\n return;\n var keepOrder = options && options.keepOrder;\n var $byLines = options == true || options && options.$byLines;\n var session = this.session;\n var selection = this.selection;\n var rangeList = selection.rangeList;\n var ranges = (keepOrder ? selection : rangeList).ranges;\n var result;\n \n if (!ranges.length)\n return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n \n var reg = selection._eventRegistry;\n selection._eventRegistry = {};\n\n var tmpSel = new Selection(session);\n this.inVirtualSelectionMode = true;\n for (var i = ranges.length; i--;) {\n if ($byLines) {\n while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\n i--;\n }\n tmpSel.fromOrientedRange(ranges[i]);\n tmpSel.index = i;\n this.selection = session.selection = tmpSel;\n var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n if (!result && cmdResult !== undefined)\n result = cmdResult;\n tmpSel.toOrientedRange(ranges[i]);\n }\n tmpSel.detach();\n\n this.selection = session.selection = selection;\n this.inVirtualSelectionMode = false;\n selection._eventRegistry = reg;\n selection.mergeOverlappingRanges();\n \n var anim = this.renderer.$scrollAnimation;\n this.onCursorChange();\n this.onSelectionChange();\n if (anim && anim.from == anim.to)\n this.renderer.animateScrolling(anim.from);\n \n return result;\n };\n this.exitMultiSelectMode = function() {\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n return;\n this.multiSelect.toSingleRange();\n };\n\n this.getSelectedText = function() {\n var text = \"\";\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var ranges = this.multiSelect.rangeList.ranges;\n var buf = [];\n for (var i = 0; i < ranges.length; i++) {\n buf.push(this.session.getTextRange(ranges[i]));\n }\n var nl = this.session.getDocument().getNewLineCharacter();\n text = buf.join(nl);\n if (text.length == (buf.length - 1) * nl.length)\n text = \"\";\n } else if (!this.selection.isEmpty()) {\n text = this.session.getTextRange(this.getSelectionRange());\n }\n return text;\n };\n \n this.$checkMultiselectChange = function(e, anchor) {\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var range = this.multiSelect.ranges[0];\n if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\n return;\n var pos = anchor == this.multiSelect.anchor\n ? range.cursor == range.start ? range.end : range.start\n : range.cursor;\n if (pos.row != anchor.row \n || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\n this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\n }\n };\n this.findAll = function(needle, options, additive) {\n options = options || {};\n options.needle = needle || options.needle;\n if (options.needle == undefined) {\n var range = this.selection.isEmpty()\n ? this.selection.getWordRange()\n : this.selection.getRange();\n options.needle = this.session.getTextRange(range);\n } \n this.$search.set(options);\n \n var ranges = this.$search.findAll(this.session);\n if (!ranges.length)\n return 0;\n\n this.$blockScrolling += 1;\n var selection = this.multiSelect;\n\n if (!additive)\n selection.toSingleRange(ranges[0]);\n\n for (var i = ranges.length; i--; )\n selection.addRange(ranges[i], true);\n if (range && selection.rangeList.rangeAtPoint(range.start))\n selection.addRange(range, true);\n \n this.$blockScrolling -= 1;\n\n return ranges.length;\n };\n this.selectMoreLines = function(dir, skip) {\n var range = this.selection.toOrientedRange();\n var isBackwards = range.cursor == range.end;\n\n var screenLead = this.session.documentToScreenPosition(range.cursor);\n if (this.selection.$desiredColumn)\n screenLead.column = this.selection.$desiredColumn;\n\n var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n if (!range.isEmpty()) {\n var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n } else {\n var anchor = lead;\n }\n\n if (isBackwards) {\n var newRange = Range.fromPoints(lead, anchor);\n newRange.cursor = newRange.start;\n } else {\n var newRange = Range.fromPoints(anchor, lead);\n newRange.cursor = newRange.end;\n }\n\n newRange.desiredColumn = screenLead.column;\n if (!this.selection.inMultiSelectMode) {\n this.selection.addRange(range);\n } else {\n if (skip)\n var toRemove = range.cursor;\n }\n\n this.selection.addRange(newRange);\n if (toRemove)\n this.selection.substractPoint(toRemove);\n };\n this.transposeSelections = function(dir) {\n var session = this.session;\n var sel = session.multiSelect;\n var all = sel.ranges;\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n if (range.isEmpty()) {\n var tmp = session.getWordRange(range.start.row, range.start.column);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n range.end.row = tmp.end.row;\n range.end.column = tmp.end.column;\n }\n }\n sel.mergeOverlappingRanges();\n\n var words = [];\n for (var i = all.length; i--; ) {\n var range = all[i];\n words.unshift(session.getTextRange(range));\n }\n\n if (dir < 0)\n words.unshift(words.pop());\n else\n words.push(words.shift());\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n var tmp = range.clone();\n session.replace(range, words[i]);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n }\n };\n this.selectMore = function(dir, skip, stopAtFirst) {\n var session = this.session;\n var sel = session.multiSelect;\n\n var range = sel.toOrientedRange();\n if (range.isEmpty()) {\n range = session.getWordRange(range.start.row, range.start.column);\n range.cursor = dir == -1 ? range.start : range.end;\n this.multiSelect.addRange(range);\n if (stopAtFirst)\n return;\n }\n var needle = session.getTextRange(range);\n\n var newRange = find(session, needle, dir);\n if (newRange) {\n newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n this.$blockScrolling += 1;\n this.session.unfold(newRange);\n this.multiSelect.addRange(newRange);\n this.$blockScrolling -= 1;\n this.renderer.scrollCursorIntoView(null, 0.5);\n }\n if (skip)\n this.multiSelect.substractPoint(range.cursor);\n };\n this.alignCursors = function() {\n var session = this.session;\n var sel = session.multiSelect;\n var ranges = sel.ranges;\n var row = -1;\n var sameRowRanges = ranges.filter(function(r) {\n if (r.cursor.row == row)\n return true;\n row = r.cursor.row;\n });\n \n if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\n var range = this.selection.getRange();\n var fr = range.start.row, lr = range.end.row;\n var guessRange = fr == lr;\n if (guessRange) {\n var max = this.session.getLength();\n var line;\n do {\n line = this.session.getLine(lr);\n } while (/[=:]/.test(line) && ++lr < max);\n do {\n line = this.session.getLine(fr);\n } while (/[=:]/.test(line) && --fr > 0);\n \n if (fr < 0) fr = 0;\n if (lr >= max) lr = max - 1;\n }\n var lines = this.session.removeFullLines(fr, lr);\n lines = this.$reAlignText(lines, guessRange);\n this.session.insert({row: fr, column: 0}, lines.join(\"\\n\") + \"\\n\");\n if (!guessRange) {\n range.start.column = 0;\n range.end.column = lines[lines.length - 1].length;\n }\n this.selection.setRange(range);\n } else {\n sameRowRanges.forEach(function(r) {\n sel.substractPoint(r.cursor);\n });\n\n var maxCol = 0;\n var minSpace = Infinity;\n var spaceOffsets = ranges.map(function(r) {\n var p = r.cursor;\n var line = session.getLine(p.row);\n var spaceOffset = line.substr(p.column).search(/\\S/g);\n if (spaceOffset == -1)\n spaceOffset = 0;\n\n if (p.column > maxCol)\n maxCol = p.column;\n if (spaceOffset < minSpace)\n minSpace = spaceOffset;\n return spaceOffset;\n });\n ranges.forEach(function(r, i) {\n var p = r.cursor;\n var l = maxCol - p.column;\n var d = spaceOffsets[i] - minSpace;\n if (l > d)\n session.insert(p, lang.stringRepeat(\" \", l - d));\n else\n session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\n r.start.column = r.end.column = maxCol;\n r.start.row = r.end.row = p.row;\n r.cursor = r.end;\n });\n sel.fromOrientedRange(ranges[0]);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n }\n };\n\n this.$reAlignText = function(lines, forceLeft) {\n var isLeftAligned = true, isRightAligned = true;\n var startW, textW, endW;\n\n return lines.map(function(line) {\n var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n if (!m)\n return [line];\n\n if (startW == null) {\n startW = m[1].length;\n textW = m[2].length;\n endW = m[3].length;\n return m;\n }\n\n if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n isRightAligned = false;\n if (startW != m[1].length)\n isLeftAligned = false;\n\n if (startW > m[1].length)\n startW = m[1].length;\n if (textW < m[2].length)\n textW = m[2].length;\n if (endW > m[3].length)\n endW = m[3].length;\n\n return m;\n }).map(forceLeft ? alignLeft :\n isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\n function spaces(n) {\n return lang.stringRepeat(\" \", n);\n }\n\n function alignLeft(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(textW - m[2].length + endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function alignRight(m) {\n return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]\n + spaces(endW, \" \")\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function unAlign(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n };\n}).call(Editor.prototype);\n\n\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\nexports.onSessionChange = function(e) {\n var session = e.session;\n if (session && !session.multiSelect) {\n session.$selectionMarkers = [];\n session.selection.$initRangeList();\n session.multiSelect = session.selection;\n }\n this.multiSelect = session && session.multiSelect;\n\n var oldSession = e.oldSession;\n if (oldSession) {\n oldSession.multiSelect.off(\"addRange\", this.$onAddRange);\n oldSession.multiSelect.off(\"removeRange\", this.$onRemoveRange);\n oldSession.multiSelect.off(\"multiSelect\", this.$onMultiSelect);\n oldSession.multiSelect.off(\"singleSelect\", this.$onSingleSelect);\n oldSession.multiSelect.lead.off(\"change\", this.$checkMultiselectChange);\n oldSession.multiSelect.anchor.off(\"change\", this.$checkMultiselectChange);\n }\n\n if (session) {\n session.multiSelect.on(\"addRange\", this.$onAddRange);\n session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n session.multiSelect.lead.on(\"change\", this.$checkMultiselectChange);\n session.multiSelect.anchor.on(\"change\", this.$checkMultiselectChange);\n }\n\n if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n if (session.selection.inMultiSelectMode)\n this.$onMultiSelect();\n else\n this.$onSingleSelect();\n }\n};\nfunction MultiSelect(editor) {\n if (editor.$multiselectOnSessionChange)\n return;\n editor.$onAddRange = editor.$onAddRange.bind(editor);\n editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor);\n\n editor.$multiselectOnSessionChange(editor);\n editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n\n editor.on(\"mousedown\", onMouseDown);\n editor.commands.addCommands(commands.defaultCommands);\n\n addAltCursorListeners(editor);\n}\n\nfunction addAltCursorListeners(editor){\n var el = editor.textInput.getElement();\n var altCursor = false;\n event.addListener(el, \"keydown\", function(e) {\n var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);\n if (editor.$blockSelectEnabled && altDown) {\n if (!altCursor) {\n editor.renderer.setMouseCursor(\"crosshair\");\n altCursor = true;\n }\n } else if (altCursor) {\n reset();\n }\n });\n\n event.addListener(el, \"keyup\", reset);\n event.addListener(el, \"blur\", reset);\n function reset(e) {\n if (altCursor) {\n editor.renderer.setMouseCursor(\"\");\n altCursor = false;\n }\n }\n}\n\nexports.MultiSelect = MultiSelect;\n\n\nacequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n enableMultiselect: {\n set: function(val) {\n MultiSelect(this);\n if (val) {\n this.on(\"changeSession\", this.$multiselectOnSessionChange);\n this.on(\"mousedown\", onMouseDown);\n } else {\n this.off(\"changeSession\", this.$multiselectOnSessionChange);\n this.off(\"mousedown\", onMouseDown);\n }\n },\n value: true\n },\n enableBlockSelect: {\n set: function(val) {\n this.$blockSelectEnabled = val;\n },\n value: true\n }\n});\n\n\n\n});\n\nace.define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n this.foldingStartMarker = null;\n this.foldingStopMarker = null;\n this.getFoldWidget = function(session, foldStyle, row) {\n var line = session.getLine(row);\n if (this.foldingStartMarker.test(line))\n return \"start\";\n if (foldStyle == \"markbeginend\"\n && this.foldingStopMarker\n && this.foldingStopMarker.test(line))\n return \"end\";\n return \"\";\n };\n\n this.getFoldWidgetRange = function(session, foldStyle, row) {\n return null;\n };\n\n this.indentationBlock = function(session, row, column) {\n var re = /\\S/;\n var line = session.getLine(row);\n var startLevel = line.search(re);\n if (startLevel == -1)\n return;\n\n var startColumn = column || line.length;\n var maxRow = session.getLength();\n var startRow = row;\n var endRow = row;\n\n while (++row < maxRow) {\n var level = session.getLine(row).search(re);\n\n if (level == -1)\n continue;\n\n if (level <= startLevel)\n break;\n\n endRow = row;\n }\n\n if (endRow > startRow) {\n var endColumn = session.getLine(endRow).length;\n return new Range(startRow, startColumn, endRow, endColumn);\n }\n };\n\n this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n var start = {row: row, column: column + 1};\n var end = session.$findClosingBracket(bracket, start, typeRe);\n if (!end)\n return;\n\n var fw = session.foldWidgets[end.row];\n if (fw == null)\n fw = session.getFoldWidget(end.row);\n\n if (fw == \"start\" && end.row > start.row) {\n end.row --;\n end.column = session.getLine(end.row).length;\n }\n return Range.fromPoints(start, end);\n };\n\n this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n var end = {row: row, column: column};\n var start = session.$findOpeningBracket(bracket, end);\n\n if (!start)\n return;\n\n start.column++;\n end.column--;\n\n return Range.fromPoints(start, end);\n };\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = acequire(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n\nace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar Range = acequire(\"./range\").Range;\n\n\nfunction LineWidgets(session) {\n this.session = session;\n this.session.widgetManager = this;\n this.session.getRowLength = this.getRowLength;\n this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n this.updateOnChange = this.updateOnChange.bind(this);\n this.renderWidgets = this.renderWidgets.bind(this);\n this.measureWidgets = this.measureWidgets.bind(this);\n this.session._changedWidgets = [];\n this.$onChangeEditor = this.$onChangeEditor.bind(this);\n \n this.session.on(\"change\", this.updateOnChange);\n this.session.on(\"changeFold\", this.updateOnFold);\n this.session.on(\"changeEditor\", this.$onChangeEditor);\n}\n\n(function() {\n this.getRowLength = function(row) {\n var h;\n if (this.lineWidgets)\n h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n else \n h = 0;\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1 + h;\n } else {\n return this.$wrapData[row].length + 1 + h;\n }\n };\n\n this.$getWidgetScreenLength = function() {\n var screenRows = 0;\n this.lineWidgets.forEach(function(w){\n if (w && w.rowCount && !w.hidden)\n screenRows += w.rowCount;\n });\n return screenRows;\n }; \n \n this.$onChangeEditor = function(e) {\n this.attach(e.editor);\n };\n \n this.attach = function(editor) {\n if (editor && editor.widgetManager && editor.widgetManager != this)\n editor.widgetManager.detach();\n\n if (this.editor == editor)\n return;\n\n this.detach();\n this.editor = editor;\n \n if (editor) {\n editor.widgetManager = this;\n editor.renderer.on(\"beforeRender\", this.measureWidgets);\n editor.renderer.on(\"afterRender\", this.renderWidgets);\n }\n };\n this.detach = function(e) {\n var editor = this.editor;\n if (!editor)\n return;\n \n this.editor = null;\n editor.widgetManager = null;\n \n editor.renderer.off(\"beforeRender\", this.measureWidgets);\n editor.renderer.off(\"afterRender\", this.renderWidgets);\n var lineWidgets = this.session.lineWidgets;\n lineWidgets && lineWidgets.forEach(function(w) {\n if (w && w.el && w.el.parentNode) {\n w._inDocument = false;\n w.el.parentNode.removeChild(w.el);\n }\n });\n };\n\n this.updateOnFold = function(e, session) {\n var lineWidgets = session.lineWidgets;\n if (!lineWidgets || !e.action)\n return;\n var fold = e.data;\n var start = fold.start.row;\n var end = fold.end.row;\n var hide = e.action == \"add\";\n for (var i = start + 1; i < end; i++) {\n if (lineWidgets[i])\n lineWidgets[i].hidden = hide;\n }\n if (lineWidgets[end]) {\n if (hide) {\n if (!lineWidgets[start])\n lineWidgets[start] = lineWidgets[end];\n else\n lineWidgets[end].hidden = hide;\n } else {\n if (lineWidgets[start] == lineWidgets[end])\n lineWidgets[start] = undefined;\n lineWidgets[end].hidden = hide;\n }\n }\n };\n \n this.updateOnChange = function(delta) {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n \n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n } else if (delta.action == 'remove') {\n var removed = lineWidgets.splice(startRow + 1, len);\n removed.forEach(function(w) {\n w && this.removeLineWidget(w);\n }, this);\n this.$updateRows();\n } else {\n var args = new Array(len);\n args.unshift(startRow, 0);\n lineWidgets.splice.apply(lineWidgets, args);\n this.$updateRows();\n }\n };\n \n this.$updateRows = function() {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n var noWidgets = true;\n lineWidgets.forEach(function(w, i) {\n if (w) {\n noWidgets = false;\n w.row = i;\n while (w.$oldWidget) {\n w.$oldWidget.row = i;\n w = w.$oldWidget;\n }\n }\n });\n if (noWidgets)\n this.session.lineWidgets = null;\n };\n\n this.addLineWidget = function(w) {\n if (!this.session.lineWidgets)\n this.session.lineWidgets = new Array(this.session.getLength());\n \n var old = this.session.lineWidgets[w.row];\n if (old) {\n w.$oldWidget = old;\n if (old.el && old.el.parentNode) {\n old.el.parentNode.removeChild(old.el);\n old._inDocument = false;\n }\n }\n \n this.session.lineWidgets[w.row] = w;\n \n w.session = this.session;\n \n var renderer = this.editor.renderer;\n if (w.html && !w.el) {\n w.el = dom.createElement(\"div\");\n w.el.innerHTML = w.html;\n }\n if (w.el) {\n dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n w.el.style.position = \"absolute\";\n w.el.style.zIndex = 5;\n renderer.container.appendChild(w.el);\n w._inDocument = true;\n }\n \n if (!w.coverGutter) {\n w.el.style.zIndex = 3;\n }\n if (w.pixelHeight == null) {\n w.pixelHeight = w.el.offsetHeight;\n }\n if (w.rowCount == null) {\n w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n }\n \n var fold = this.session.getFoldAt(w.row, 0);\n w.$fold = fold;\n if (fold) {\n var lineWidgets = this.session.lineWidgets;\n if (w.row == fold.end.row && !lineWidgets[fold.start.row])\n lineWidgets[fold.start.row] = w;\n else\n w.hidden = true;\n }\n \n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n \n this.$updateRows();\n this.renderWidgets(null, renderer);\n this.onWidgetChanged(w);\n return w;\n };\n \n this.removeLineWidget = function(w) {\n w._inDocument = false;\n w.session = null;\n if (w.el && w.el.parentNode)\n w.el.parentNode.removeChild(w.el);\n if (w.editor && w.editor.destroy) try {\n w.editor.destroy();\n } catch(e){}\n if (this.session.lineWidgets) {\n var w1 = this.session.lineWidgets[w.row];\n if (w1 == w) {\n this.session.lineWidgets[w.row] = w.$oldWidget;\n if (w.$oldWidget)\n this.onWidgetChanged(w.$oldWidget);\n } else {\n while (w1) {\n if (w1.$oldWidget == w) {\n w1.$oldWidget = w.$oldWidget;\n break;\n }\n w1 = w1.$oldWidget;\n }\n }\n }\n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n this.$updateRows();\n };\n \n this.getWidgetsAtRow = function(row) {\n var lineWidgets = this.session.lineWidgets;\n var w = lineWidgets && lineWidgets[row];\n var list = [];\n while (w) {\n list.push(w);\n w = w.$oldWidget;\n }\n return list;\n };\n \n this.onWidgetChanged = function(w) {\n this.session._changedWidgets.push(w);\n this.editor && this.editor.renderer.updateFull();\n };\n \n this.measureWidgets = function(e, renderer) {\n var changedWidgets = this.session._changedWidgets;\n var config = renderer.layerConfig;\n \n if (!changedWidgets || !changedWidgets.length) return;\n var min = Infinity;\n for (var i = 0; i < changedWidgets.length; i++) {\n var w = changedWidgets[i];\n if (!w || !w.el) continue;\n if (w.session != this.session) continue;\n if (!w._inDocument) {\n if (this.session.lineWidgets[w.row] != w)\n continue;\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n \n w.h = w.el.offsetHeight;\n \n if (!w.fixedWidth) {\n w.w = w.el.offsetWidth;\n w.screenWidth = Math.ceil(w.w / config.characterWidth);\n }\n \n var rowCount = w.h / config.lineHeight;\n if (w.coverLine) {\n rowCount -= this.session.getRowLineCount(w.row);\n if (rowCount < 0)\n rowCount = 0;\n }\n if (w.rowCount != rowCount) {\n w.rowCount = rowCount;\n if (w.row < min)\n min = w.row;\n }\n }\n if (min != Infinity) {\n this.session._emit(\"changeFold\", {data:{start:{row: min}}});\n this.session.lineWidgetWidth = null;\n }\n this.session._changedWidgets = [];\n };\n \n this.renderWidgets = function(e, renderer) {\n var config = renderer.layerConfig;\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets)\n return;\n var first = Math.min(this.firstRow, config.firstRow);\n var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);\n \n while (first > 0 && !lineWidgets[first])\n first--;\n \n this.firstRow = config.firstRow;\n this.lastRow = config.lastRow;\n\n renderer.$cursorLayer.config = config;\n for (var i = first; i <= last; i++) {\n var w = lineWidgets[i];\n if (!w || !w.el) continue;\n if (w.hidden) {\n w.el.style.top = -100 - (w.pixelHeight || 0) + \"px\";\n continue;\n }\n if (!w._inDocument) {\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;\n if (!w.coverLine)\n top += config.lineHeight * this.session.getRowLineCount(w.row);\n w.el.style.top = top - config.offset + \"px\";\n \n var left = w.coverGutter ? 0 : renderer.gutterWidth;\n if (!w.fixedWidth)\n left -= renderer.scrollLeft;\n w.el.style.left = left + \"px\";\n \n if (w.fullWidth && w.screenWidth) {\n w.el.style.minWidth = config.width + 2 * config.padding + \"px\";\n }\n \n if (w.fixedWidth) {\n w.el.style.right = renderer.scrollBar.getWidth() + \"px\";\n } else {\n w.el.style.right = \"\";\n }\n }\n };\n \n}).call(LineWidgets.prototype);\n\n\nexports.LineWidgets = LineWidgets;\n\n});\n\nace.define(\"ace/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\nvar LineWidgets = acequire(\"../line_widgets\").LineWidgets;\nvar dom = acequire(\"../lib/dom\");\nvar Range = acequire(\"../range\").Range;\n\nfunction binarySearch(array, needle, comparator) {\n var first = 0;\n var last = array.length - 1;\n\n while (first <= last) {\n var mid = (first + last) >> 1;\n var c = comparator(needle, array[mid]);\n if (c > 0)\n first = mid + 1;\n else if (c < 0)\n last = mid - 1;\n else\n return mid;\n }\n return -(first + 1);\n}\n\nfunction findAnnotations(session, row, dir) {\n var annotations = session.getAnnotations().sort(Range.comparePoints);\n if (!annotations.length)\n return;\n \n var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);\n if (i < 0)\n i = -i - 1;\n \n if (i >= annotations.length)\n i = dir > 0 ? 0 : annotations.length - 1;\n else if (i === 0 && dir < 0)\n i = annotations.length - 1;\n \n var annotation = annotations[i];\n if (!annotation || !dir)\n return;\n\n if (annotation.row === row) {\n do {\n annotation = annotations[i += dir];\n } while (annotation && annotation.row === row);\n if (!annotation)\n return annotations.slice();\n }\n \n \n var matched = [];\n row = annotation.row;\n do {\n matched[dir < 0 ? \"unshift\" : \"push\"](annotation);\n annotation = annotations[i += dir];\n } while (annotation && annotation.row == row);\n return matched.length && matched;\n}\n\nexports.showErrorMarker = function(editor, dir) {\n var session = editor.session;\n if (!session.widgetManager) {\n session.widgetManager = new LineWidgets(session);\n session.widgetManager.attach(editor);\n }\n \n var pos = editor.getCursorPosition();\n var row = pos.row;\n var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) {\n return w.type == \"errorMarker\";\n })[0];\n if (oldWidget) {\n oldWidget.destroy();\n } else {\n row -= dir;\n }\n var annotations = findAnnotations(session, row, dir);\n var gutterAnno;\n if (annotations) {\n var annotation = annotations[0];\n pos.column = (annotation.pos && typeof annotation.column != \"number\"\n ? annotation.pos.sc\n : annotation.column) || 0;\n pos.row = annotation.row;\n gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];\n } else if (oldWidget) {\n return;\n } else {\n gutterAnno = {\n text: [\"Looks good!\"],\n className: \"ace_ok\"\n };\n }\n editor.session.unfold(pos.row);\n editor.selection.moveToPosition(pos);\n \n var w = {\n row: pos.row, \n fixedWidth: true,\n coverGutter: true,\n el: dom.createElement(\"div\"),\n type: \"errorMarker\"\n };\n var el = w.el.appendChild(dom.createElement(\"div\"));\n var arrow = w.el.appendChild(dom.createElement(\"div\"));\n arrow.className = \"error_widget_arrow \" + gutterAnno.className;\n \n var left = editor.renderer.$cursorLayer\n .getPixelPosition(pos).left;\n arrow.style.left = left + editor.renderer.gutterWidth - 5 + \"px\";\n \n w.el.className = \"error_widget_wrapper\";\n el.className = \"error_widget \" + gutterAnno.className;\n el.innerHTML = gutterAnno.text.join(\"
\");\n \n el.appendChild(dom.createElement(\"div\"));\n \n var kb = function(_, hashId, keyString) {\n if (hashId === 0 && (keyString === \"esc\" || keyString === \"return\")) {\n w.destroy();\n return {command: \"null\"};\n }\n };\n \n w.destroy = function() {\n if (editor.$mouseHandler.isMousePressed)\n return;\n editor.keyBinding.removeKeyboardHandler(kb);\n session.widgetManager.removeLineWidget(w);\n editor.off(\"changeSelection\", w.destroy);\n editor.off(\"changeSession\", w.destroy);\n editor.off(\"mouseup\", w.destroy);\n editor.off(\"change\", w.destroy);\n };\n \n editor.keyBinding.addKeyboardHandler(kb);\n editor.on(\"changeSelection\", w.destroy);\n editor.on(\"changeSession\", w.destroy);\n editor.on(\"mouseup\", w.destroy);\n editor.on(\"change\", w.destroy);\n \n editor.session.widgetManager.addLineWidget(w);\n \n w.el.onmousedown = editor.focus.bind(editor);\n \n editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});\n};\n\n\ndom.importCssString(\"\\\n .error_widget_wrapper {\\\n background: inherit;\\\n color: inherit;\\\n border:none\\\n }\\\n .error_widget {\\\n border-top: solid 2px;\\\n border-bottom: solid 2px;\\\n margin: 5px 0;\\\n padding: 10px 40px;\\\n white-space: pre-wrap;\\\n }\\\n .error_widget.ace_error, .error_widget_arrow.ace_error{\\\n border-color: #ff5a5a\\\n }\\\n .error_widget.ace_warning, .error_widget_arrow.ace_warning{\\\n border-color: #F1D817\\\n }\\\n .error_widget.ace_info, .error_widget_arrow.ace_info{\\\n border-color: #5a5a5a\\\n }\\\n .error_widget.ace_ok, .error_widget_arrow.ace_ok{\\\n border-color: #5aaa5a\\\n }\\\n .error_widget_arrow {\\\n position: absolute;\\\n border: solid 5px;\\\n border-top-color: transparent!important;\\\n border-right-color: transparent!important;\\\n border-left-color: transparent!important;\\\n top: -5px;\\\n }\\\n\", \"\");\n\n});\n\nace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/multi_select\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./lib/fixoldbrowsers\");\n\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\n\nvar Editor = acequire(\"./editor\").Editor;\nvar EditSession = acequire(\"./edit_session\").EditSession;\nvar UndoManager = acequire(\"./undomanager\").UndoManager;\nvar Renderer = acequire(\"./virtual_renderer\").VirtualRenderer;\nacequire(\"./worker/worker_client\");\nacequire(\"./keyboard/hash_handler\");\nacequire(\"./placeholder\");\nacequire(\"./multi_select\");\nacequire(\"./mode/folding/fold_mode\");\nacequire(\"./theme/textmate\");\nacequire(\"./ext/error_marker\");\n\nexports.config = acequire(\"./config\");\nexports.acequire = acequire;\n\nif (typeof define === \"function\")\n exports.define = define;\nexports.edit = function(el) {\n if (typeof el == \"string\") {\n var _id = el;\n el = document.getElementById(_id);\n if (!el)\n throw new Error(\"ace.edit can't find div #\" + _id);\n }\n\n if (el && el.env && el.env.editor instanceof Editor)\n return el.env.editor;\n\n var value = \"\";\n if (el && /input|textarea/i.test(el.tagName)) {\n var oldNode = el;\n value = oldNode.value;\n el = dom.createElement(\"pre\");\n oldNode.parentNode.replaceChild(el, oldNode);\n } else if (el) {\n value = dom.getInnerText(el);\n el.innerHTML = \"\";\n }\n\n var doc = exports.createEditSession(value);\n\n var editor = new Editor(new Renderer(el));\n editor.setSession(doc);\n\n var env = {\n document: doc,\n editor: editor,\n onResize: editor.resize.bind(editor, null)\n };\n if (oldNode) env.textarea = oldNode;\n event.addListener(window, \"resize\", env.onResize);\n editor.on(\"destroy\", function() {\n event.removeListener(window, \"resize\", env.onResize);\n env.editor.container.env = null; // prevent memory leak on old ie\n });\n editor.container.env = editor.env = env;\n return editor;\n};\nexports.createEditSession = function(text, mode) {\n var doc = new EditSession(text, mode);\n doc.setUndoManager(new UndoManager());\n return doc;\n};\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\nexports.version = \"1.2.9\";\n});\n (function() {\n ace.acequire([\"ace/ace\"], function(a) {\n if (a) {\n a.config.init(true);\n a.define = ace.define;\n }\n if (!window.ace)\n window.ace = a;\n for (var key in a) if (a.hasOwnProperty(key))\n window.ace[key] = a[key];\n });\n })();\n \nmodule.exports = window.ace.acequire(\"ace/ace\");","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"ores\"},[_c('h3',[_vm._v(\"Selected Ores:\")]),_vm._l((_vm.ore_names),function(ore){return _c('div',{key:ore},[_c('vui-button',{class:{'selected': _vm.selected_ores.includes(ore)},attrs:{\"params\":{'chosen_ore': ore}}},[_vm._v(_vm._s(ore))])],1)})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./oredetector.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./oredetector.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./oredetector.vue?vue&type=template&id=5716889f&scoped=true&\"\nimport script from \"./oredetector.vue?vue&type=script&lang=js&\"\nexport * from \"./oredetector.vue?vue&type=script&lang=js&\"\nimport style0 from \"./oredetector.vue?vue&type=style&index=0&id=5716889f&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5716889f\",\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ghostspawner.vue?vue&type=style&index=0&id=70766bea&lang=scss&scoped=true&\"","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('i',[_vm._v(\"Welcome to the NanoTrasen™ computer configuration utility. Please consult your system administrator if you have any questions about your device.\")]),_c('hr'),_c('h2',[_vm._v(\"Power Supply\")]),_c('vui-item',{attrs:{\"label\":\"Battery Status:\"}},[(_vm.battery)?_c('span',[_vm._v(\"Active\")]):_c('span',[_vm._v(\"Not Available\")])]),(_vm.battery)?_c('vui-item',{attrs:{\"label\":\"Battery Rating:\"}},[_vm._v(_vm._s(_vm.battery.rating)+\" Wh\")]):_vm._e(),(_vm.battery)?_c('vui-item',{attrs:{\"label\":\"Battery Charge:\"}},[_c('vui-progress',{attrs:{\"value\":_vm.battery.percent}},[_vm._v(_vm._s(_vm.battery.percent)+\"%\")])],1):_vm._e(),_c('vui-item',{attrs:{\"label\":\"Power Usage:\"}},[_vm._v(_vm._s(_vm.power_usage)+\" W\")]),_c('h2',[_vm._v(\"File System\")]),(_vm.battery)?_c('vui-item',{attrs:{\"label\":\"Used Capacity:\"}},[_c('vui-progress',{attrs:{\"value\":_vm.disk_used,\"min\":\"0\",\"max\":_vm.disk_size}},[_vm._v(_vm._s(_vm.disk_used)+\" GQ / \"+_vm._s(_vm.disk_size)+\" GQ\")])],1):_vm._e(),_c('h2',[_vm._v(\"Misc. Settings\")]),_c('vui-item',{attrs:{\"label\":\"Registered ID:\"}},[_c('vui-button',{attrs:{\"params\":{ PC_register: 1},\"disabled\":!_vm.card_slot}},[_vm._v(_vm._s(_vm.registered ? _vm.registered : \"Unregistered\"))])],1),(_vm.brightness !== null)?_c('vui-item',{attrs:{\"label\":\"Brightness:\"}},[_c('vui-input-slider',{attrs:{\"min\":0,\"max\":10},model:{value:(_vm.brightness),callback:function ($$v) {_vm.brightness=$$v},expression:\"brightness\"}})],1):_vm._e(),_c('vui-item',{attrs:{\"label\":\"Audible Message Output Range:\"}},[_c('vui-input-slider',{attrs:{\"min\":0,\"max\":_vm.max_message_range},model:{value:(_vm.message_range),callback:function ($$v) {_vm.message_range=$$v},expression:\"message_range\"}})],1),_c('h2',[_vm._v(\"Computer Components\")]),_vm._l((_vm.hardware),function(h,name){return _c('div',{key:name},[_c('h3',[_vm._v(_vm._s(name))]),_c('vui-item',{attrs:{\"label\":\"State:\"}},[(h.enabled)?_c('span',[_vm._v(\"Enabled\")]):_c('span',[_vm._v(\"Disabled\")])]),(h.power_usage > 0)?_c('vui-item',{attrs:{\"label\":\"Power Usage:\"}},[_vm._v(_vm._s(h.power_usage)+\" W\")]):_vm._e(),(!h.critical)?_c('vui-item',{attrs:{\"label\":\"Toggle Component:\"}},[_c('vui-button',{attrs:{\"params\":{ PC_enable_component: name},\"disabled\":!!h.enabled}},[_vm._v(\"ON\")]),_c('vui-button',{attrs:{\"params\":{ PC_disable_component: name},\"disabled\":!h.enabled}},[_vm._v(\"OFF\")])],1):_vm._e()],1)}),_c('i',[_vm._v(\"ntOS v2.1.0 -- © NanoTrasen 2457 - 2462\")])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./config.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./config.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./config.vue?vue&type=template&id=79f0ed75&\"\nimport script from \"./config.vue?vue&type=script&lang=js&\"\nexport * from \"./config.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","module.exports = function() {\n\tthrow new Error(\"define cannot be used indirect\");\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h2',[_vm._v(\"Engine Status:\")]),(_vm.is_on)?_c('div',[_vm._v(\" The engine is currently running. \"),_c('vui-button',{attrs:{\"params\":{ toggle_engine: 1}}},[_vm._v(\"Stop\")])],1):_c('div',[_vm._v(\" The engine is off. \"),_c('vui-button',{attrs:{\"disabled\":!_vm.has_key || !_vm.has_cell,\"params\":{ toggle_engine: 1}}},[_vm._v(\"Start\")])],1),(_vm.has_key)?_c('div',[_vm._v(\" There is a key inserted into the ignition. \"),_c('vui-button',{attrs:{\"params\":{ key: 1}}},[_vm._v(\"Remove Key\")])],1):_c('div',[_vm._v(\" There is no key in the ignition. \")]),(_vm.has_cell)?_c('div',[_vm._v(\" Cell Charge: \"),_c('vui-progress',{class:{ good: _vm.cell_charge >= _vm.cell_max_charge * 0.8, bad: _vm.cell_charge <= _vm.cell_max_charge * 0.4, average: _vm.cell_charge < _vm.cell_max_charge * 0.8 && _vm.cell_charge > _vm.cell_max_charge * 0.4 },attrs:{\"value\":_vm.cell_charge,\"max\":_vm.cell_max_charge,\"min\":0}},[_vm._v(_vm._s(_vm.cell_charge)+\"J\")]),_vm._v(\" \"),_c('vui-tooltip',{attrs:{\"label\":\"?\"}},[_vm._v(\"The cell can be removed by using a screwdriver to open the maintenance panel, then using a crowbar to shimmy it out.\")])],1):_c('div',[_vm._v(\" There is no cell installed. \"),_c('vui-tooltip',{attrs:{\"label\":\"?\"}},[_vm._v(\"The cell can be installed by using a screwdriver to open the maintenance panel, then clicking on the engine with a compatible power cell.\")])],1),(_vm.is_towing)?_c('div',[_vm._v(\" This engine is currently towing the \"+_vm._s(_vm.tow)+\". \"),_c('vui-button',{attrs:{\"params\":{ unlatch: 1}}},[_vm._v(\"Unlatch\")])],1):_c('div',[_vm._v(\" This engine isn't towing anything currently. \"),_c('vui-tooltip',{attrs:{\"label\":\"?\"}},[_vm._v(\"You can latch vehicles together by dragging from the vehicle you want to be the anchor point, to the trolley you wish to latch.\")])],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./trainengine.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./trainengine.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./trainengine.vue?vue&type=template&id=04b89496&\"\nimport script from \"./trainengine.vue?vue&type=script&lang=js&\"\nexport * from \"./trainengine.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./numeric.vue?vue&type=style&index=0&id=8b39c97e&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tooltip.vue?vue&type=style&index=0&id=4ea2a2b3&lang=scss&scoped=true&\"","var $ = require('../internals/export');\nvar expm1 = require('../internals/math-expm1');\n\n// `Math.expm1` method\n// https://tc39.github.io/ecma262/#sec-math.expm1\n$({ target: 'Math', stat: true, forced: expm1 != Math.expm1 }, { expm1: expm1 });\n","var toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\n\n// `ToIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-toindex\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length or index');\n return length;\n};\n","var global = require('../internals/global');\nvar setToStringTag = require('../internals/set-to-string-tag');\n\n// JSON[@@toStringTag] property\n// https://tc39.github.io/ecma262/#sec-json-@@tostringtag\nsetToStringTag(global.JSON, 'JSON', true);\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('../internals/to-length');\nvar repeat = require('../internals/string-repeat');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar ceil = Math.ceil;\n\n// `String.prototype.{ padStart, padEnd }` methods implementation\nvar createMethod = function (IS_END) {\n return function ($this, maxLength, fillString) {\n var S = String(requireObjectCoercible($this));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n var fillLen, stringFiller;\n if (intMaxLength <= stringLength || fillStr == '') return S;\n fillLen = intMaxLength - stringLength;\n stringFiller = repeat.call(fillStr, ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return IS_END ? S + stringFiller : stringFiller + S;\n };\n};\n\nmodule.exports = {\n // `String.prototype.padStart` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.padstart\n start: createMethod(false),\n // `String.prototype.padEnd` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.padend\n end: createMethod(true)\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h3',[_vm._v(\"Patient Vitals:\")]),(_vm.has_occupant)?[_c('vui-group',[_c('vui-group-item',{attrs:{\"label\":\"Status:\"}},[_c('span',{style:({color:_vm.consciousnessLabel(_vm.stat)})},[_vm._v(_vm._s(_vm.consciousnessText(_vm.stat)))])]),_c('vui-group-item',{attrs:{\"label\":\"Brain Activity:\"}},[_c('vui-progress',{class:_vm.progressClass(_vm.brain_activity),attrs:{\"value\":_vm.brain_activity}},[_vm._v(_vm._s(_vm.brain_activity)+\"%\")])],1),_c('vui-group-item',{style:({color:_vm.getPressureClass(_vm.blood_pressure_level)}),attrs:{\"label\":\"BP:\"}},[_vm._v(_vm._s(_vm.blood_pressure))]),_c('vui-group-item',{attrs:{\"label\":\"Blood Oxygenation:\"}},[_c('vui-progress',{class:_vm.progressClass(_vm.brain_activity),attrs:{\"value\":Math.round(_vm.blood_o2)}},[_vm._v(_vm._s(Math.round(_vm.blood_o2))+\"%\")])],1)],1)]:[_c('span',{staticClass:\"bad\"},[_vm._v(\"No patient detected.\")])]],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./vitalsmonitor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./vitalsmonitor.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./vitalsmonitor.vue?vue&type=template&id=f3cbd690&\"\nimport script from \"./vitalsmonitor.vue?vue&type=script&lang=js&\"\nexport * from \"./vitalsmonitor.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var redefine = require('../internals/redefine');\n\nvar DatePrototype = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar nativeDateToString = DatePrototype[TO_STRING];\nvar getTime = DatePrototype.getTime;\n\n// `Date.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-date.prototype.tostring\nif (new Date(NaN) + '' != INVALID_DATE) {\n redefine(DatePrototype, TO_STRING, function toString() {\n var value = getTime.call(this);\n // eslint-disable-next-line no-self-compare\n return value === value ? nativeDateToString.call(this) : INVALID_DATE;\n });\n}\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.passcode),expression:\"passcode\"}],attrs:{\"placeholder\":\"Enter passcode...\",\"autofocus\":\"\"},domProps:{\"value\":(_vm.passcode)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.passcode=$event.target.value}}}),_c('vui-button',{attrs:{\"params\":{ set_passcode: _vm.passcode }}},[_vm._v(\"Set\")]),_c('vui-button',{attrs:{\"params\":{ lock: 1 }}},[_vm._v(\"Lock\")])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./maglock-config.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./maglock-config.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./maglock-config.vue?vue&type=template&id=081a5cf1&\"\nimport script from \"./maglock-config.vue?vue&type=script&lang=js&\"\nexport * from \"./maglock-config.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"tooltip label\"},[_vm._t(\"label\",[_vm._v(_vm._s(_vm.label))]),_c('div',{staticClass:\"tooltip content\"},[_vm._t(\"default\")],2)],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tooltip.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tooltip.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./tooltip.vue?vue&type=template&id=4ea2a2b3&scoped=true&\"\nimport script from \"./tooltip.vue?vue&type=script&lang=js&\"\nexport * from \"./tooltip.vue?vue&type=script&lang=js&\"\nimport style0 from \"./tooltip.vue?vue&type=style&index=0&id=4ea2a2b3&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4ea2a2b3\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('input',{ref:\"input\",style:({width: _vm.width}),attrs:{\"type\":\"range\",\"min\":_vm.min,\"max\":_vm.max},domProps:{\"value\":_vm.val},on:{\"change\":function($event){return _vm.onFieldUpdate($event.target)}}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./slider.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./slider.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./slider.vue?vue&type=template&id=1c07adff&scoped=true&\"\nimport script from \"./slider.vue?vue&type=script&lang=js&\"\nexport * from \"./slider.vue?vue&type=script&lang=js&\"\nimport style0 from \"./slider.vue?vue&type=style&index=0&id=1c07adff&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1c07adff\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.invalid)?_c('div',{staticClass:\"center\"},[(_vm.nocons)?_c('span',{staticClass:\"red\"},[_vm._v(\"Error: No scanner bed detected!\")]):(!_vm.occupied)?_c('span',{staticClass:\"red\"},[_vm._v(\"No occupant detected.\")]):(_vm.ipc)?_c('span',{staticClass:\"red\"},[_vm._v(\"Error: Object in scanner bed interfering with sensor array.\")]):(_vm.noscan)?_c('span',{staticClass:\"red\"},[_vm._v(\"Error: No diagnostics profile installed for this species.\")]):_c('span',{staticClass:\"red\"},[_vm._v(\"Error: Unknown error.\")])]):_c('table',{staticClass:\"bodyscanner\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"column\"},[_c('h3',[_vm._v(\"Patient Status\")]),_c('hr'),_c('vui-group',[_c('vui-group-item',{attrs:{\"label\":\"Name:\"}},[_vm._v(_vm._s(_vm.name))]),_c('vui-group-item',{attrs:{\"label\":\"Status:\"}},[_c('span',{style:({color:_vm.consciousnessLabel(_vm.stat)})},[_vm._v(_vm._s(_vm.consciousnessText(_vm.stat)))])]),_c('vui-group-item',{attrs:{\"label\":\"Species:\"}},[_vm._v(_vm._s(_vm.species))]),_c('vui-group-item',{attrs:{\"label\":\"Brain Activity:\"}},[_c('vui-progress',{class:_vm.progressClass(_vm.brain_activity),attrs:{\"value\":_vm.brain_activity}},[_vm._v(_vm._s(_vm.brain_activity)+\"%\")])],1),(_vm.stat < 2)?[_c('vui-group-item',{attrs:{\"label\":\"Physical Trauma:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.bruteLoss)})},[_vm._v(_vm._s(_vm.bruteLoss))])]),_c('vui-group-item',{attrs:{\"label\":\"Oxygen Deprivation:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.oxyLoss)})},[_vm._v(_vm._s(_vm.oxyLoss))])]),_c('vui-group-item',{attrs:{\"label\":\"Organ Failure:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.toxLoss)})},[_vm._v(_vm._s(_vm.toxLoss))])]),_c('vui-group-item',{attrs:{\"label\":\"Burn Severity:\"}},[_c('span',{style:({color:_vm.damageLabel(_vm.fireLoss)})},[_vm._v(_vm._s(_vm.fireLoss))])])]:_vm._e()],2),_c('hr'),_c('vui-group',[_c('vui-group-item',{attrs:{\"label\":\"Radiation Level:\"}},[_vm._v(_vm._s(Math.round(_vm.rads)))]),_c('vui-group-item',{attrs:{\"label\":\"Genetic Damage:\"}},[_vm._v(_vm._s(_vm.cloneLoss))]),_c('vui-group-item',{attrs:{\"label\":\"Est. Paralysis Level:\"}},[_vm._v(_vm._s(_vm.paralysis)),(_vm.paralysis)?_c('span',[_vm._v(\" (~\"+_vm._s(Math.round(_vm.paralysis/4))+\" Seconds Left)\")]):_vm._e()]),_c('vui-group-item',{attrs:{\"label\":\"Body Temperature:\"}},[_vm._v(_vm._s(_vm.bodytemp)+\" K (~ \"+_vm._s(Math.round(_vm.bodytemp - 273.15))+\" C)\")])],1),_c('hr'),_c('h3',[_vm._v(\"Blood Status\")]),_c('hr'),_c('vui-group',[_c('vui-group-item',{style:({color:_vm.getPressureClass(_vm.blood_pressure_level)}),attrs:{\"label\":\"BP:\"}},[_vm._v(\" \"+_vm._s(_vm.blood_pressure)+\" \")]),_c('vui-group-item',{attrs:{\"label\":\"Blood Oxygenation:\"}},[_c('vui-progress',{class:_vm.progressClass(_vm.brain_activity),attrs:{\"value\":Math.round(_vm.blood_o2)}},[_vm._v(_vm._s(Math.round(_vm.blood_o2))+\"%\")])],1),(Math.round(_vm.norepiAmt))?_c('vui-group-item',{attrs:{\"label\":\"Inaprovaline:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.norepiAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.soporAmt))?_c('vui-group-item',{attrs:{\"label\":\"Soporific:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.soporAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.bicardAmt))?_c('vui-group-item',{attrs:{\"label\":\"Bicaridine:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.bicardAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.dermAmt))?_c('vui-group-item',{attrs:{\"label\":\"Dermaline:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.dermAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.dexAmt))?_c('vui-group-item',{attrs:{\"label\":\"Dexalin:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.dexAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.thetaAmt))?_c('vui-group-item',{attrs:{\"label\":\"Thetamycin:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.thetaAmt))+\" unit(s)\")]):_vm._e(),(Math.round(_vm.otherAmt))?_c('vui-group-item',{attrs:{\"label\":\"Other:\"}},[_vm._v(\" \"+_vm._s(Math.round(_vm.otherAmt))+\" unit(s)\")]):_vm._e()],1)],1),_c('div',{staticClass:\"column\"},[(_vm.hasmissing)?_vm._l((_vm.missingparts),function(organ){return _c('div',{key:organ.name},[_c('vui-group-item',[_vm._v(\" \"+_vm._s(organ)+\" \")])],1)}):_vm._e(),_c('h3',[_vm._v(\"Internal Organ Status\")]),_c('hr'),_c('table',{staticClass:\"injury\"},[(_vm.hasinternalinjury)?[_vm._m(0)]:[_vm._m(1)],_vm._l((_vm.organs),function(organ){return _c('tr',{key:organ.name},[(organ.damage != 'None' || organ.hasWounds)?[_c('td',[_vm._v(\" \"+_vm._s(organ.name)+\" \")]),_c('td',[_c('span',{style:({color:_vm.damageLabel(organ.damage)})},[_vm._v(\" \"+_vm._s(organ.damage))])]),_c('td',_vm._l((organ.wounds),function(wound){return _c('div',{key:wound.name,staticStyle:{\"color\":\"Tomato\"}},[_vm._v(\" \"+_vm._s(wound)+\" \")])}),0),_c('td',[_vm._v(\" \"+_vm._s(organ.location)+\" \")])]:_vm._e()],2)})],2),_c('hr'),_c('h3',[_vm._v(\"External Bodypart Status\")]),_c('hr'),_c('table',{staticClass:\"injury\"},[(_vm.hasexternalinjury)?[_vm._m(2)]:[_vm._m(3)],_vm._l((_vm.bodyparts),function(organ){return _c('tr',{key:organ.name},[(organ.bruteDmg != 'None' || organ.burnDmg != 'None' || organ.hasWounds)?[_c('td',[_vm._v(\" \"+_vm._s(organ.name)+\" \")]),_c('td',[_c('span',{style:({color:_vm.damageLabel(organ.bruteDmg)})},[_vm._v(\" \"+_vm._s(organ.bruteDmg)+\" \")]),_vm._v(\" / \"),_c('span',{style:({color:_vm.damageLabel(organ.burnDmg)})},[_vm._v(\" \"+_vm._s(organ.burnDmg)+\" \")])]),_c('td',_vm._l((organ.wounds),function(wound){return _c('div',{key:wound.name,staticStyle:{\"color\":\"Tomato\"}},[_vm._v(\" \"+_vm._s(wound)+\" \")])}),0)]:_vm._e()],2)})],2)],2),_c('h3',[_vm._v(\"Actions\")]),_c('vui-button',{staticClass:\"center\",attrs:{\"params\":{print: 1}}},[_vm._v(\"Print Report\")]),_c('vui-button',{staticClass:\"center\",attrs:{\"params\":{eject: 1}}},[_vm._v(\"Eject Occupant\")])],1)])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"Organ\")]),_c('th',[_vm._v(\"Trauma\")]),_c('th',[_vm._v(\"Wounds\")]),_c('th',[_vm._v(\"Location\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_c('span',{staticStyle:{\"color\":\"LimeGreen\"}},[_vm._v(\"The occupant has no internal injuries.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"Organ\")]),_c('th',[_vm._v(\"Physical / Burn Trauma\")]),_c('th',[_vm._v(\"Wounds\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_c('span',{staticStyle:{\"color\":\"LimeGreen\"}},[_vm._v(\"The occupant has no external injuries.\")])])])}]\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./bodyscanner.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./bodyscanner.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./bodyscanner.vue?vue&type=template&id=130b946b&scoped=true&\"\nimport script from \"./bodyscanner.vue?vue&type=script&lang=js&\"\nexport * from \"./bodyscanner.vue?vue&type=script&lang=js&\"\nimport style0 from \"./bodyscanner.vue?vue&type=style&index=0&id=130b946b&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"130b946b\",\n null\n \n)\n\nexport default component.exports","'use strict';\nvar global = require('../internals/global');\nvar redefineAll = require('../internals/redefine-all');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceIternalState = require('../internals/internal-state').enforce;\nvar NATIVE_WEAK_MAP = require('../internals/native-weak-map');\n\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar isExtensible = Object.isExtensible;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.github.io/ecma262/#sec-weakmap-constructor\nvar $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n InternalMetadataModule.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('vui-item',{attrs:{\"label\":\"Turret Status:\",\"balance\":0.4}},[_c('vui-button',{class:{'red': _vm.settings.enabled},attrs:{\"params\":{'command' : 'enable', 'value' : 1, 'turret_ref': _vm.tref}}},[_vm._v(\"Enabled\")]),_c('vui-button',{class:{'selected': !_vm.settings.enabled},attrs:{\"params\":{'command' : 'enable', 'value' : 0, 'turret_ref': _vm.tref}}},[_vm._v(\"Disabled\")])],1),(_vm.settings.is_lethal)?_c('vui-item',{attrs:{\"label\":\"Lethal Mode:\",\"balance\":0.4}},[_c('vui-button',{class:{'red': _vm.settings.lethal && _vm.settings.can_switch},attrs:{\"disabled\":!_vm.settings.can_switch,\"params\":{'command' : 'lethal', 'value' : 1, 'turret_ref': _vm.tref}}},[_vm._v(\"On\")]),_c('vui-button',{class:{'selected': !_vm.settings.lethal && _vm.settings.can_switch},attrs:{\"disabled\":!_vm.settings.can_switch,\"params\":{'command' : 'lethal', 'value' : 0, 'turret_ref': _vm.tref}}},[_vm._v(\"Off\")])],1):_vm._e(),_vm._l((_vm.settings.settings),function(setting,id){return _c('vui-item',{key:setting.id,attrs:{\"label\":setting.category,\"balance\":0.4}},[_c('vui-button',{class:{'selected': setting.value},attrs:{\"params\":{'command' : id, 'value' : 1, 'turret_ref': _vm.tref}}},[_vm._v(\"On\")]),_c('vui-button',{class:{'selected': !setting.value},attrs:{\"params\":{'command' : id, 'value' : 0, 'turret_ref': _vm.tref}}},[_vm._v(\"Off\")])],1)})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./control-part.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./control-part.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./control-part.vue?vue&type=template&id=47762730&\"\nimport script from \"./control-part.vue?vue&type=script&lang=js&\"\nexport * from \"./control-part.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./progress.vue?vue&type=style&index=0&id=041d7f1a&lang=scss&scoped=true&\"","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./late-choices.vue?vue&type=style&index=0&id=36f58934&lang=scss&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"displayBar\"},[_c('div',{staticClass:\"displayBarFill\",style:({ width: _vm.percentage + '%'})},[_c('span',[_vm._t(\"default\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./progress.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./progress.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./progress.vue?vue&type=template&id=041d7f1a&scoped=true&\"\nimport script from \"./progress.vue?vue&type=script&lang=js&\"\nexport * from \"./progress.vue?vue&type=script&lang=js&\"\nimport style0 from \"./progress.vue?vue&type=style&index=0&id=041d7f1a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"041d7f1a\",\n null\n \n)\n\nexport default component.exports","var asciiToArray = require('./_asciiToArray'),\n hasUnicode = require('./_hasUnicode'),\n unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'.split(/(b)*/)[1] == 'c' ||\n 'test'.split(/(?:)/, -1).length != 4 ||\n 'ab'.split(/(?:ab)*/).length != 2 ||\n '.'.split(/(.?)(.?)/).length != 4 ||\n '.'.split(/()()/).length > 1 ||\n ''.split(/.?/).length\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n }\n if (lastLastIndex === string.length) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output.length > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar FORCED = require('../internals/object-prototype-accessors-forced');\nvar toObject = require('../internals/to-object');\nvar aFunction = require('../internals/a-function');\nvar definePropertyModule = require('../internals/object-define-property');\n\n// `Object.prototype.__defineGetter__` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.__defineGetter__\nif (DESCRIPTORS) {\n $({ target: 'Object', proto: true, forced: FORCED }, {\n __defineGetter__: function __defineGetter__(P, getter) {\n definePropertyModule.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true });\n }\n });\n}\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./handles.vue?vue&type=style&index=0&id=9bc3ecba&lang=scss&scoped=true&\"","var $ = require('../internals/export');\nvar global = require('../internals/global');\nvar task = require('../internals/task');\n\nvar FORCED = !global.setImmediate || !global.clearImmediate;\n\n// http://w3c.github.io/setImmediate/\n$({ global: true, bind: true, enumerable: true, forced: FORCED }, {\n // `setImmediate` method\n // http://w3c.github.io/setImmediate/#si-setImmediate\n setImmediate: task.set,\n // `clearImmediate` method\n // http://w3c.github.io/setImmediate/#si-clearImmediate\n clearImmediate: task.clear\n});\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var $ = require('../internals/export');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n$({ target: 'Object', stat: true }, {\n setPrototypeOf: setPrototypeOf\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar createHTML = require('../internals/create-html');\nvar forcedStringHTMLMethod = require('../internals/string-html-forced');\n\n// `String.prototype.big` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.big\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('big') }, {\n big: function big() {\n return createHTML(this, 'big', '', '');\n }\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.services.length)?_c('h2',[_vm._v(\"Programs\")]):_vm._e(),_c('i',[_vm._v(\"No program loaded. Please select program from list below.\")]),_vm._l((_vm.displayed_programs),function(p){return _c('div',{key:p.filename},[_c('vui-button',{attrs:{\"params\":{ PC_runprogram: p.filename}}},[_vm._v(_vm._s(p.desc))]),(p.running)?_c('vui-button',{staticClass:\"danger\",attrs:{\"icon\":\"window-close\",\"icon-only\":\"\",\"params\":{ PC_killprogram: p.filename}}}):_vm._e()],1)}),(_vm.services.length)?_c('h2',[_vm._v(\"Services\")]):_vm._e(),_vm._l((_vm.services),function(p){return _c('div',{key:p.filename},[_c('vui-button',{class:{ on: p.service.enabled },attrs:{\"params\":{ PC_toggleservice: p.filename}}},[_vm._v(_vm._s(p.desc))]),(p.service.enabled)?_c('vui-button',{staticClass:\"danger\",attrs:{\"icon\":\"window-close\",\"icon-only\":\"\",\"params\":{ PC_toggleservice: p.filename}}}):_vm._e()],1)})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./main.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./main.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./main.vue?vue&type=template&id=285da89e&\"\nimport script from \"./main.vue?vue&type=script&lang=js&\"\nexport * from \"./main.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\nvar CHROME_VERSION = require('../internals/engine-v8-version');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Int32Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Int32', function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\n\nvar min = Math.min;\n\n// `Array.prototype.copyWithin` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","ace.define(\"ace/theme/monokai\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-monokai\";\nexports.cssText = \".ace-monokai .ace_gutter {\\\nbackground: #2F3129;\\\ncolor: #8F908A\\\n}\\\n.ace-monokai .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #555651\\\n}\\\n.ace-monokai {\\\nbackground-color: #272822;\\\ncolor: #F8F8F2\\\n}\\\n.ace-monokai .ace_cursor {\\\ncolor: #F8F8F0\\\n}\\\n.ace-monokai .ace_marker-layer .ace_selection {\\\nbackground: #49483E\\\n}\\\n.ace-monokai.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #272822;\\\n}\\\n.ace-monokai .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-monokai .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #49483E\\\n}\\\n.ace-monokai .ace_marker-layer .ace_active-line {\\\nbackground: #202020\\\n}\\\n.ace-monokai .ace_gutter-active-line {\\\nbackground-color: #272727\\\n}\\\n.ace-monokai .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #49483E\\\n}\\\n.ace-monokai .ace_invisible {\\\ncolor: #52524d\\\n}\\\n.ace-monokai .ace_entity.ace_name.ace_tag,\\\n.ace-monokai .ace_keyword,\\\n.ace-monokai .ace_meta.ace_tag,\\\n.ace-monokai .ace_storage {\\\ncolor: #F92672\\\n}\\\n.ace-monokai .ace_punctuation,\\\n.ace-monokai .ace_punctuation.ace_tag {\\\ncolor: #fff\\\n}\\\n.ace-monokai .ace_constant.ace_character,\\\n.ace-monokai .ace_constant.ace_language,\\\n.ace-monokai .ace_constant.ace_numeric,\\\n.ace-monokai .ace_constant.ace_other {\\\ncolor: #AE81FF\\\n}\\\n.ace-monokai .ace_invalid {\\\ncolor: #F8F8F0;\\\nbackground-color: #F92672\\\n}\\\n.ace-monokai .ace_invalid.ace_deprecated {\\\ncolor: #F8F8F0;\\\nbackground-color: #AE81FF\\\n}\\\n.ace-monokai .ace_support.ace_constant,\\\n.ace-monokai .ace_support.ace_function {\\\ncolor: #66D9EF\\\n}\\\n.ace-monokai .ace_fold {\\\nbackground-color: #A6E22E;\\\nborder-color: #F8F8F2\\\n}\\\n.ace-monokai .ace_storage.ace_type,\\\n.ace-monokai .ace_support.ace_class,\\\n.ace-monokai .ace_support.ace_type {\\\nfont-style: italic;\\\ncolor: #66D9EF\\\n}\\\n.ace-monokai .ace_entity.ace_name.ace_function,\\\n.ace-monokai .ace_entity.ace_other,\\\n.ace-monokai .ace_entity.ace_other.ace_attribute-name,\\\n.ace-monokai .ace_variable {\\\ncolor: #A6E22E\\\n}\\\n.ace-monokai .ace_variable.ace_parameter {\\\nfont-style: italic;\\\ncolor: #FD971F\\\n}\\\n.ace-monokai .ace_string {\\\ncolor: #E6DB74\\\n}\\\n.ace-monokai .ace_comment {\\\ncolor: #75715E\\\n}\\\n.ace-monokai .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = acequire(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.spawnpoint),expression:\"!spawnpoint\"}],staticClass:\"tagselector\"},_vm._l((_vm.tags),function(amount,tag){return _c('vui-button',{key:tag,class:{ selected: _vm.current_tag == tag},on:{\"click\":function($event){_vm.current_tag = tag}}},[_vm._v(_vm._s(tag)+\" (\"+_vm._s(amount)+\")\")])}),1),_c('hr',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.spawnpoint),expression:\"!spawnpoint\"}]}),_c('table',[_vm._m(0),_vm._l((_vm.spawners),function(data,index){return _c('tr',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showEntry(data)),expression:\"showEntry(data)\"}],key:index},[_c('td',[_vm._v(_vm._s(data.name))]),_c('td',[_vm._v(_vm._s(data.desc))]),(data.max_count > 0)?_c('td',[_vm._v(_vm._s(data.max_count - data.count)+\" / \"+_vm._s(data.max_count))]):(data.spawnatoms > 0)?_c('td',[_vm._v(_vm._s(data.spawnatoms))]):_c('td',[_vm._v(\"∞\")]),_c('td',{staticClass:\"action\"},[_c('vui-button',{attrs:{\"disabled\":(data.cant_spawn !== 0),\"params\":{spawn: index, spawnpoint: _vm.spawnpoint},\"icon\":\"star\"}},[_vm._v(\"Spawn\")]),(data.can_edit == 1)?_c('vui-button',{attrs:{\"disabled\":(data.enabled == 1),\"params\":{enable: index}}},[_vm._v(\"Enable\")]):_vm._e(),(data.can_edit == 1)?_c('vui-button',{attrs:{\"disabled\":(data.enabled == 0),\"params\":{disable: index}}},[_vm._v(\"Disable\")]):_vm._e()],1)])})],2)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tr',[_c('th',[_vm._v(\"Name\")]),_c('th',[_vm._v(\"Description\")]),_c('th',[_vm._v(\"Available Slots\")]),_c('th',{staticClass:\"action\"},[_vm._v(\"Actions\")])])}]\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ghostspawner.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ghostspawner.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ghostspawner.vue?vue&type=template&id=70766bea&scoped=true&\"\nimport script from \"./ghostspawner.vue?vue&type=script&lang=js&\"\nexport * from \"./ghostspawner.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ghostspawner.vue?vue&type=style&index=0&id=70766bea&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"70766bea\",\n null\n \n)\n\nexport default component.exports","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.subarray` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.subarray\nexportTypedArrayMethod('subarray', function subarray(begin, end) {\n var O = aTypedArray(this);\n var length = O.length;\n var beginIndex = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O.constructor))(\n O.buffer,\n O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)\n );\n});\n","require('../modules/web.dom-collections.for-each');\nrequire('../modules/web.dom-collections.iterator');\nrequire('../modules/web.immediate');\nrequire('../modules/web.queue-microtask');\nrequire('../modules/web.timers');\nrequire('../modules/web.url');\nrequire('../modules/web.url.to-json');\nrequire('../modules/web.url-search-params');\nvar path = require('../internals/path');\n\nmodule.exports = path;\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","var toPositiveInteger = require('../internals/to-positive-integer');\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw RangeError('Wrong offset');\n return offset;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createHTML = require('../internals/create-html');\nvar forcedStringHTMLMethod = require('../internals/string-html-forced');\n\n// `String.prototype.anchor` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.anchor\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('anchor') }, {\n anchor: function anchor(name) {\n return createHTML(this, 'a', 'name', name);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar createHTML = require('../internals/create-html');\nvar forcedStringHTMLMethod = require('../internals/string-html-forced');\n\n// `String.prototype.fontsize` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.fontsize\n$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontsize') }, {\n fontsize: function fontsize(size) {\n return createHTML(this, 'font', 'size', size);\n }\n});\n","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.species` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.species\ndefineWellKnownSymbol('species');\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',[_c('vui-button',{staticClass:\"fixedLeft\",attrs:{\"icon\":\"cog\",\"params\":{ close: 1 }}},[_vm._v(\"Close\")])],1),_c('div',[_c('h2',[_vm._v(\"Storage\")]),(_vm.secure)?_c('span',{staticClass:\"notice\"},[_vm._v(\" \"+_vm._s(_vm.locked == -1 ? \"Sec.re ACC_** //):securi_nt.diag=>##'or 1=1'%($...\" : \"Secure Access: Please have your identification ready.\")+\" \")]):_vm._e()]),(_vm.contents)?_vm._l((_vm.contents),function(vend_item){return _c('div',{key:vend_item.vend},[_c('div',[_c('span',{staticClass:\"highlight\"},[_vm._v(_vm._s(vend_item.display_name)+\" (\"+_vm._s(vend_item.quantity)+\" available)\")])]),_c('div',{staticStyle:{\"float\":\"left\"}},[_vm._v(\"Vend: \")]),_c('vui-button',{staticClass:\"statusValue\",attrs:{\"params\":{ vendItem: vend_item.vend, amount: 1 },\"icon\":\"arrow-alt-circle-down\"}},[_vm._v(\"x1\")]),(vend_item.quantity >= 5)?_c('vui-button',{staticClass:\"statusValue\",attrs:{\"params\":{ vendItem: vend_item.vend, amount: 5 },\"icon\":\"arrow-alt-circle-down\"}},[_vm._v(\"x5\")]):_vm._e(),(vend_item.quantity >= 10)?_c('vui-button',{staticClass:\"statusValue\",attrs:{\"params\":{ vendItem: vend_item.vend, amount: 10 },\"icon\":\"arrow-alt-circle-down\"}},[_vm._v(\"x10\")]):_vm._e(),(vend_item.quantity >= 25)?_c('vui-button',{staticClass:\"statusValue\",attrs:{\"params\":{ vendItem: vend_item.vend, amount: 25 },\"icon\":\"arrow-alt-circle-down\"}},[_vm._v(\"x25\")]):_vm._e(),(vend_item.quantity > 1)?_c('vui-button',{staticClass:\"statusValue\",attrs:{\"params\":{ vendItem: vend_item.vend, amount: vend_item.quantity },\"icon\":\"arrow-alt-circle-down\"}},[_vm._v(\"All\")]):_vm._e()],1)}):_c('div',{staticClass:\"average\"},[_vm._v(\" No products loaded. \")])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./smartfridge.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./smartfridge.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./smartfridge.vue?vue&type=template&id=0bfa4fc7&\"\nimport script from \"./smartfridge.vue?vue&type=script&lang=js&\"\nexport * from \"./smartfridge.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var $ = require('../internals/export');\nvar ownKeys = require('../internals/own-keys');\n\n// `Reflect.ownKeys` method\n// https://tc39.github.io/ecma262/#sec-reflect.ownkeys\n$({ target: 'Reflect', stat: true }, {\n ownKeys: ownKeys\n});\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h3',[_vm._v(\" Selected Products:\")]),_vm._l((_vm.items),function(price,name){return _c('div',{key:name},[(_vm.buying[name] && _vm.buying[name] >= 0)?_c('span',[_vm._v(\" \"+_vm._s(_vm.buying[name])+\"x \"+_vm._s(name)+\": at \"+_vm._s(price * _vm.buying[name])+\" Credits \")]):_vm._e()])}),_c('h3',[_vm._v(\" Total: \"+_vm._s(_vm.sum))]),_c('h3',[_vm._v(\"Please swipe your ID to pay.\")]),_c('vui-button',{attrs:{\"params\":{ return: 1 },\"width\":\"3em\"}},[_vm._v(\"Return to order menu\")])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./orderconfirmation.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./orderconfirmation.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./orderconfirmation.vue?vue&type=template&id=731df9ab&\"\nimport script from \"./orderconfirmation.vue?vue&type=script&lang=js&\"\nexport * from \"./orderconfirmation.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);\n","var $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar defineProperties = require('../internals/object-define-properties');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\n$({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, {\n defineProperties: defineProperties\n});\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.password == null)?_c('vui-button',{on:{\"click\":_vm.join}},[_vm._v(_vm._s(_vm.ch.title))]):[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.password),expression:\"password\"}],attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.password)},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.join_with($event)},\"input\":function($event){if($event.target.composing){ return; }_vm.password=$event.target.value}}}),_c('vui-button',{attrs:{\"params\":{join: {target: _vm.re, password: _vm.password}}}},[_vm._v(\"Join \"+_vm._s(_vm.ch.title))])]],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./channel-btn.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./channel-btn.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./channel-btn.vue?vue&type=template&id=294097ad&\"\nimport script from \"./channel-btn.vue?vue&type=script&lang=js&\"\nexport * from \"./channel-btn.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trimEnd = require('../internals/string-trim').end;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\nvar FORCED = forcedStringTrimMethod('trimEnd');\n\nvar trimEnd = FORCED ? function trimEnd() {\n return $trimEnd(this);\n} : ''.trimEnd;\n\n// `String.prototype.{ trimEnd, trimRight }` methods\n// https://github.com/tc39/ecmascript-string-left-right-trim\n$({ target: 'String', proto: true, forced: FORCED }, {\n trimEnd: trimEnd,\n trimRight: trimEnd\n});\n","var log = Math.log;\n\n// `Math.log1p` method implementation\n// https://tc39.github.io/ecma262/#sec-math.log1p\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : log(1 + x);\n};\n","export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./teleporter.vue?vue&type=style&index=0&id=c971b6ac&lang=scss&scoped=true&\"","'use strict';\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\n\n// `WeakSet` constructor\n// https://tc39.github.io/ecma262/#sec-weakset-constructor\ncollection('WeakSet', function (init) {\n return function WeakSet() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionWeak);\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.active)?_c('div',[_c('view-records-general',{attrs:{\"hide-advanced\":\"\"}},[_c('vui-group-item',{attrs:{\"label\":\"Blood type:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.blood_type\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.multiple ? $$selectedVal : $$selectedVal[0])}}},_vm._l((_vm.choices.medical.blood_type),function(i){return _c('option',{key:i,domProps:{\"value\":i}},[_vm._v(_vm._s(i))])}),0)])],1),_c('vui-group-item',{attrs:{\"label\":\"DNA:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.blood_dna\"}})],1),_c('vui-group-item',{attrs:{\"label\":\"Disabilities:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.disabilities\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1),_c('vui-group-item',{attrs:{\"label\":\"Allergies:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.allergies\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1),_c('vui-group-item',{attrs:{\"label\":\"Diseases:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.diseases\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1),_c('vui-group-item',{attrs:{\"label\":\"Comments:\"}},[_vm._l((_vm.active.medical.comments),function(comment){return _c('div',{key:comment},[_vm._v(_vm._s(comment)+\" \"),((_vm.editable & 2) > 0)?_c('vui-button',{staticClass:\"danger\",attrs:{\"params\":{ removefromrecord: { value: comment, key: ['active', 'medical', 'comments'] }},\"icon\":\"trash-alt\"}}):_vm._e()],1)}),(_vm.active.medical.comments.length == 0)?_c('div',[_vm._v(\"There are no comments.\")]):_vm._e(),((_vm.editable & 2) > 0)?_c('view-records-field',{attrs:{\"edit-button\":\"Add\"},on:{\"save\":function($event){return _vm.add('active.medical.comments', $event)}}}):_vm._e()],2),_c('vui-group-item',{attrs:{\"label\":\"Notes:\"}},[_c('view-records-field',{attrs:{\"editable\":(_vm.editable & 2) > 0,\"path\":\"active.medical.notes\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.$root.$data.state.editingvalue),expression:\"$root.$data.state.editingvalue\"}],domProps:{\"value\":(_vm.$root.$data.state.editingvalue)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.$root.$data.state, \"editingvalue\", $event.target.value)}}})])],1)],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","