diff --git a/code/_onclick/autoclick.dm b/code/_onclick/autoclick.dm index 1ceeb182ed..7b6e2f108a 100644 --- a/code/_onclick/autoclick.dm +++ b/code/_onclick/autoclick.dm @@ -14,7 +14,7 @@ selected_target[1] = null /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) - if(selected_target[1] && over_object.IsAutoclickable()) + if(selected_target[1] && over_object && over_object.IsAutoclickable()) selected_target[1] = over_object selected_target[2] = params diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 4a4c441edc..eaff61e52f 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -114,7 +114,7 @@ W.attack_self(src) update_inv_hands() return - + //These are always reachable. //User itself, current loc, and user inventory if(DirectAccess(A)) @@ -125,7 +125,7 @@ changeNext_move(CLICK_CD_MELEE) UnarmedAttack(A) return - + //Can't reach anything else in lockers or other weirdness if(!loc.AllowClick()) return @@ -325,9 +325,11 @@ /mob/living/carbon/human/CtrlClick(mob/user) if(ishuman(user) && Adjacent(user)) + if(world.time < user.next_move) + return FALSE var/mob/living/carbon/human/H = user H.dna.species.grab(H, src, H.martial_art) - H.next_click = world.time + CLICK_CD_MELEE + H.changeNext_move(CLICK_CD_MELEE) else ..() /* diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index ca51e20cc6..bb4bf455dc 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -332,3 +332,4 @@ GLOBAL_LIST_INIT(gang_outfit_pool, list(/obj/item/clothing/suit/jacket/leather,/ SSticker.station_explosion_cinematic(1,"gang war", null) SSticker.mode.explosion_in_progress = 0 SSticker.force_ending = TRUE + diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index 075309b9d3..0ff9ef4f2d 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -28,6 +28,7 @@ var/static/list/boss_items = list( /datum/gang_item/function/gang_ping, /datum/gang_item/function/recall, + /datum/gang_item/clothing/under, /datum/gang_item/clothing/suit, /datum/gang_item/clothing/hat, @@ -36,21 +37,29 @@ /datum/gang_item/clothing/mask, /datum/gang_item/clothing/hands, /datum/gang_item/clothing/belt, + /datum/gang_item/weapon/shuriken, /datum/gang_item/weapon/switchblade, + /datum/gang_item/weapon/improvised, + /datum/gang_item/weapon/ammo/improvised_ammo, + /datum/gang_item/weapon/surplus, + /datum/gang_item/weapon/ammo/surplus_ammo, /datum/gang_item/weapon/pistol, /datum/gang_item/weapon/ammo/pistol_ammo, /datum/gang_item/weapon/sniper, /datum/gang_item/weapon/ammo/sniper_ammo, + /datum/gang_item/weapon/machinegun, /datum/gang_item/weapon/uzi, /datum/gang_item/weapon/ammo/uzi_ammo, /datum/gang_item/equipment/sharpener, /datum/gang_item/equipment/spraycan, - /datum/gang_item/equipment/c4, + /datum/gang_item/equipment/sharpener, /datum/gang_item/equipment/emp, + /datum/gang_item/equipment/c4, /datum/gang_item/equipment/frag, - /datum/gang_item/equipment/implant_breaker, /datum/gang_item/equipment/stimpack, + /datum/gang_item/equipment/implant_breaker, + /datum/gang_item/equipment/wetwork_boots, /datum/gang_item/equipment/pen, /datum/gang_item/equipment/dominator ) @@ -66,21 +75,29 @@ /datum/gang_item/clothing/mask, /datum/gang_item/clothing/hands, /datum/gang_item/clothing/belt, - /datum/gang_item/weapon/shuriken, + + /datum/gang_item/weapon/shuriken, /datum/gang_item/weapon/switchblade, + /datum/gang_item/weapon/improvised, + /datum/gang_item/weapon/ammo/improvised_ammo, + /datum/gang_item/weapon/surplus, + /datum/gang_item/weapon/ammo/surplus_ammo, /datum/gang_item/weapon/pistol, /datum/gang_item/weapon/ammo/pistol_ammo, /datum/gang_item/weapon/sniper, /datum/gang_item/weapon/ammo/sniper_ammo, + /datum/gang_item/weapon/machinegun, /datum/gang_item/weapon/uzi, /datum/gang_item/weapon/ammo/uzi_ammo, /datum/gang_item/equipment/sharpener, /datum/gang_item/equipment/spraycan, - /datum/gang_item/equipment/c4, + /datum/gang_item/equipment/sharpener, /datum/gang_item/equipment/emp, + /datum/gang_item/equipment/c4, /datum/gang_item/equipment/frag, - /datum/gang_item/equipment/implant_breaker, /datum/gang_item/equipment/stimpack, + /datum/gang_item/equipment/implant_breaker, + /datum/gang_item/equipment/wetwork_boots, ) /datum/gang/New(loc,gangname) @@ -165,7 +182,6 @@ var/diff = domination_timer - world.time return diff / 10 - //////////////////////////////////////////// MESSAGING @@ -283,4 +299,4 @@ ganghud = new() /datum/gang/multiverse/income() - return \ No newline at end of file + return diff --git a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm index b5237040f1..aec9b040cd 100644 --- a/code/game/gamemodes/gang/gang_items.dm +++ b/code/game/gamemodes/gang/gang_items.dm @@ -199,10 +199,34 @@ cost = 5 item_path = /obj/item/weapon/switchblade +/datum/gang_item/weapon/surplus + name = "Surplus Rifle" + id = "surplus" + cost = 8 + item_path = /obj/item/weapon/gun/ballistic/automatic/surplus + +/datum/gang_item/weapon/ammo/surplus_ammo + name = "Surplus Rifle Ammo" + id = "surplus_ammo" + cost = 5 + item_path = /obj/item/ammo_box/magazine/m10mm/rifle + +/datum/gang_item/weapon/improvised + name = "Sawn-Off Improvised Shotgun" + id = "sawn" + cost = 6 + item_path = /obj/item/weapon/gun/ballistic/revolver/doublebarrel/improvised/sawn + +/datum/gang_item/weapon/ammo/improvised_ammo + name = "Box of Buckshot" + id = "buckshot" + cost = 5 + item_path = /obj/item/weapon/storage/box/lethalshot + /datum/gang_item/weapon/pistol name = "10mm Pistol" id = "pistol" - cost = 25 + cost = 30 item_path = /obj/item/weapon/gun/ballistic/automatic/pistol /datum/gang_item/weapon/ammo/pistol_ammo @@ -223,12 +247,19 @@ cost = 15 item_path = /obj/item/ammo_box/magazine/sniper_rounds +/datum/gang_item/weapon/machinegun + name = "Mounted Machine Gun" + id = "MG" + cost = 50 + item_path = /obj/machinery/manned_turret + spawn_msg = "The mounted machine gun features enhanced responsiveness. Hold down on the trigger while firing to control where you're shooting." + /datum/gang_item/weapon/uzi name = "Uzi SMG" id = "uzi" cost = 60 item_path = /obj/item/weapon/gun/ballistic/automatic/mini_uzi - id = "uzi" + /datum/gang_item/weapon/ammo/uzi_ammo name = "Uzi Ammo" @@ -236,8 +267,6 @@ cost = 40 item_path = /obj/item/ammo_box/magazine/uzim9mm - - /////////////////// //EQUIPMENT /////////////////// @@ -274,13 +303,13 @@ /datum/gang_item/equipment/frag name = "Fragmentation Grenade" id = "frag nade" - cost = 10 + cost = 18 item_path = /obj/item/weapon/grenade/syndieminibomb/concussion/frag /datum/gang_item/equipment/stimpack name = "Black Market Stimulants" id = "stimpack" - cost = 15 + cost = 12 item_path = /obj/item/weapon/reagent_containers/syringe/stimulants /datum/gang_item/equipment/implant_breaker @@ -297,6 +326,18 @@ if(spawn_msg) to_chat(user, spawn_msg) +/datum/gang_item/equipment/wetwork_boots + name = "Wetwork boots" + id = "wetwork" + cost = 20 + item_path = /obj/item/clothing/shoes/combat/gang + +/obj/item/clothing/shoes/combat/gang + name = "Wetwork boots" + desc = "A gang's best hitmen are prepared for anything." + permeability_coefficient = 0.01 + flags = NOSLIP + /datum/gang_item/equipment/pen name = "Recruitment Pen" id = "pen" @@ -390,4 +431,4 @@ return ..() /datum/gang_item/equipment/dominator/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool) - new item_path(user.loc) \ No newline at end of file + new item_path(user.loc) diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm index 01b8504e82..d60a3cb57b 100644 --- a/code/game/gamemodes/gang/gang_pen.dm +++ b/code/game/gamemodes/gang/gang_pen.dm @@ -66,4 +66,4 @@ cooldown = 0 icon_state = "pen" var/mob/M = get(src, /mob) - to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") \ No newline at end of file + to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index c9fcf3c074..ad2da7b502 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -240,6 +240,7 @@ /obj/item/device/gangtool/spare/lt promotable = 1 + ///////////// Internal tool used by gang regulars /////////// /obj/item/device/gangtool/soldier diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 6bab77fd6f..ae9d485447 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -1,9 +1,9 @@ #define TURRET_STUN 0 #define TURRET_LETHAL 1 -#define POPUP_ANIM_TIME 5 -#define POPDOWN_ANIM_TIME 5 //Be sure to change the icon animation at the same time or it'll look bad - +#define POPUP_ANIM_TIME 5 +#define POPDOWN_ANIM_TIME 5 //Be sure to change the icon animation at the same time or it'll look bad + /obj/machinery/porta_turret name = "turret" icon = 'icons/obj/turrets.dmi' @@ -87,9 +87,9 @@ if(has_cover) cover = new /obj/machinery/porta_turret_cover(loc) cover.parent_turret = src - underlays += image('icons/obj/turrets.dmi',icon_state = "basedark") + underlays += image('icons/obj/turrets.dmi',icon_state = "basedark") if(!has_cover) - INVOKE_ASYNC(src, .proc/popUp) + INVOKE_ASYNC(src, .proc/popUp) /obj/machinery/porta_turret/update_icon() cut_overlays() @@ -368,10 +368,10 @@ var/list/targets = list() var/turretview = view(scan_range, base) for(var/A in turretview) - var/atom/AA = A - if(AA.invisibility>SEE_INVISIBLE_LIVING) - continue - + var/atom/AA = A + if(AA.invisibility>SEE_INVISIBLE_LIVING) + continue + if(check_anomalies)//if it's set to check for simple animals if(istype(A, /mob/living/simple_animal)) var/mob/living/simple_animal/SA = A @@ -426,7 +426,7 @@ raising = 1 if(cover) flick("popup", cover) - sleep(POPUP_ANIM_TIME) + sleep(POPUP_ANIM_TIME) raising = 0 if(cover) cover.icon_state = "openTurretCover" @@ -442,7 +442,7 @@ raising = 1 if(cover) flick("popdown", cover) - sleep(POPDOWN_ANIM_TIME) + sleep(POPDOWN_ANIM_TIME) raising = 0 if(cover) cover.icon_state = "turretCover" @@ -792,7 +792,7 @@ /obj/item/wallframe/turret_control name = "turret control frame" desc = "Used for building turret control panels" - icon_state = "apc" + icon_state = "apc" result_path = /obj/machinery/turretid materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT) @@ -921,3 +921,170 @@ on = 0 spawn(100) on = 1 + +/////// MANNED TURRET //////// + +/obj/machinery/manned_turret + name = "machine gun turret" + desc = "While the trigger is held down, this gun will redistribute recoil to allow its user to easily shift targets." + icon = 'icons/obj/turrets.dmi' + icon_state = "machinegun" + can_buckle = TRUE + density = TRUE + max_integrity = 100 + obj_integrity = 100 + buckle_lying = 0 + layer = ABOVE_MOB_LAYER + var/view_range = 10 + var/cooldown = 0 + var/projectile_type = /obj/item/projectile/bullet/weakbullet3 + var/rate_of_fire = 1 + var/number_of_shots = 40 + var/cooldown_duration = 90 + var/atom/target + var/turf/target_turf + var/warned = FALSE + +//BUCKLE HOOKS + +/obj/machinery/manned_turret/unbuckle_mob(mob/living/buckled_mob,force = 0) + playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) + for(var/obj/item/I in buckled_mob.held_items) + if(istype(I, /obj/item/gun_control)) + qdel(I) + if(istype(buckled_mob)) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 0 + if(buckled_mob.client) + buckled_mob.client.change_view(world.view) + anchored = FALSE + . = ..() + +/obj/machinery/manned_turret/user_buckle_mob(mob/living/M, mob/living/carbon/user) + if(user.incapacitated() || !istype(user)) + return + M.forceMove(get_turf(src)) + ..() + for(var/V in M.held_items) + var/obj/item/I = V + if(istype(I)) + if(M.dropItemToGround(I)) + var/obj/item/gun_control/TC = new /obj/item/gun_control(src) + M.put_in_hands(TC) + else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand + var/obj/item/gun_control/TC = new /obj/item/gun_control(src) + M.put_in_hands(TC) + M.pixel_y = 14 + layer = ABOVE_MOB_LAYER + setDir(SOUTH) + playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) + anchored = TRUE + if(user.client) + user.client.change_view(view_range) + +/obj/item/gun_control + name = "turret controls" + icon = 'icons/obj/weapons.dmi' + icon_state = "offhand" + w_class = WEIGHT_CLASS_HUGE + flags = ABSTRACT | NODROP + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON + var/obj/machinery/manned_turret/turret + +/obj/item/gun_control/New(obj/machinery/manned_turret/MT) + if(MT) + turret = MT + else + qdel(src) + +/obj/item/gun_control/CanItemAutoclick() + return 1 + +/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user) + ..() + var/obj/machinery/manned_turret/E = user.buckled + E.setDir(get_dir(E,targeted_atom)) + user.setDir(E.dir) + switch(E.dir) + if(NORTH) + E.layer = BELOW_MOB_LAYER + user.pixel_x = 0 + user.pixel_y = -14 + if(NORTHEAST) + E.layer = BELOW_MOB_LAYER + user.pixel_x = -8 + user.pixel_y = -4 + if(EAST) + E.layer = ABOVE_MOB_LAYER + user.pixel_x = -14 + user.pixel_y = 0 + if(SOUTHEAST) + E.layer = BELOW_MOB_LAYER + user.pixel_x = -8 + user.pixel_y = 4 + if(SOUTH) + E.layer = ABOVE_MOB_LAYER + user.pixel_x = 0 + user.pixel_y = 14 + if(SOUTHWEST) + E.layer = BELOW_MOB_LAYER + user.pixel_x = 8 + user.pixel_y = 4 + if(WEST) + E.layer = ABOVE_MOB_LAYER + user.pixel_x = 14 + user.pixel_y = 0 + if(NORTHWEST) + E.layer = BELOW_MOB_LAYER + user.pixel_x = 8 + user.pixel_y = -4 + E.checkfire(targeted_atom, user) + +/obj/machinery/manned_turret/proc/checkfire(atom/targeted_atom, mob/user) + target = targeted_atom + if(target == user || target == get_turf(src)) + return + if(world.time < cooldown) + if(!warned && world.time > (cooldown - cooldown_duration + rate_of_fire*number_of_shots)) // To capture the window where one is done firing + warned = TRUE + playsound(src, 'sound/weapons/sear.ogg', 100, 1) + return + else + cooldown = world.time + cooldown_duration + warned = FALSE + INVOKE_ASYNC(src, /obj/machinery/manned_turret/.proc/volley) + +/obj/machinery/manned_turret/proc/volley() + target_turf = get_turf(target) + for(var/i in 1 to number_of_shots) + addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper), i*rate_of_fire) + + +/obj/machinery/manned_turret/proc/fire_helper() + if(!src) + return + var/turf/targets_from = get_turf(src) + if(QDELETED(target)) + target = target_turf + var/obj/item/projectile/P = new projectile_type(targets_from) + P.current = targets_from + P.starting = targets_from + P.firer = src + P.original = target + playsound(src, 'sound/weapons/Gunshot_smg.ogg', 75, 1) + P.yo = target.y - targets_from.y + rand(-1,1) + P.xo = target.x - targets_from.x + rand(-1,1) + P.fire() + +/obj/machinery/manned_turret/ultimate // Admin-only proof of concept for autoclicker automatics + name = "Infinity Gun" + view_range = 12 + projectile_type = /obj/item/projectile/bullet/weakbullet3 + + +/obj/machinery/manned_turret/ultimate/checkfire(atom/targeted_atom, mob/user) + target = targeted_atom + if(target == user || target == get_turf(src)) + return + target_turf = get_turf(target) + fire_helper(target_turf) diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm index 8e1884ff2d..8733cd2e1e 100644 --- a/code/modules/projectiles/boxes_magazines/external_mag.dm +++ b/code/modules/projectiles/boxes_magazines/external_mag.dm @@ -13,6 +13,21 @@ max_ammo = 8 multiple_sprites = 2 +/obj/item/ammo_box/magazine/m10mm/rifle + name = "rifle magazine (10mm)" + desc = "A well-worn magazine fitted for the surplus rifle." + icon_state = "75-8" + origin_tech = "combat=2" + ammo_type = /obj/item/ammo_casing/c10mm + caliber = "10mm" + max_ammo = 10 + +/obj/item/ammo_box/magazine/m10mm/rifle/update_icon() + if(ammo_count()) + icon_state = "75-8" + else + icon_state = "75-0" + /obj/item/ammo_box/magazine/m10mm/fire name = "pistol magazine (10mm incendiary)" desc = "A gun magazine. Loaded with rounds which ignite the target." diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 1ffdaf0d29..0235bbe84d 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -375,8 +375,29 @@ pin = /obj/item/device/firing_pin/implant/pindicate origin_tech = "combat=7;syndicate=6" +// Old Semi-Auto Rifle // +/obj/item/weapon/gun/ballistic/automatic/surplus + name = "Surplus Rifle" + desc = "One of countless obsolete ballistic rifles that still sees use as a cheap deterrent. Uses 10mm ammo and its bulky frame prevents one-hand firing." + origin_tech = "combat=3;materials=2" + icon_state = "surplus" + item_state = "moistnugget" + weapon_weight = WEAPON_HEAVY + mag_type = /obj/item/ammo_box/magazine/m10mm/rifle + fire_delay = 30 + burst_size = 1 + can_unsuppress = 1 + can_suppress = 1 + w_class = WEIGHT_CLASS_HUGE + slot_flags = SLOT_BACK + actions_types = list() +/obj/item/weapon/gun/ballistic/automatic/surplus/update_icon() + if(magazine) + icon_state = "surplus" + else + icon_state = "surplus-e" // Laser rifle (rechargeable magazine) // diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 6ce52748ec..ac3c56b88a 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -344,6 +344,15 @@ slung = 0 update_icon() +/obj/item/weapon/gun/ballistic/revolver/doublebarrel/improvised/sawn + name = "sawn-off improvised shotgun" + desc = "A single-shot shotgun, better not miss" + icon_state = "ishotgun" + item_state = "gun" + w_class = WEIGHT_CLASS_NORMAL + sawn_state = SAWN_OFF + slot_flags = SLOT_BELT + /obj/item/weapon/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course. clumsy_check = 0 diff --git a/code/modules/projectiles/projectile/special.dm.rej b/code/modules/projectiles/projectile/special.dm.rej deleted file mode 100644 index 2af063669d..0000000000 --- a/code/modules/projectiles/projectile/special.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm (rejected hunks) -@@ -203,7 +203,7 @@ - range = 4 - dismemberment = 20 - impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser -- var/mine_range = 4 //mines this many additional tiles -+ var/mine_range = 3 //mines this many additional tiles - - /obj/item/projectile/plasma/Initialize() - . = ..() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 5a73c5dcf4..481704ac41 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -1,285 +1,183 @@ /obj/machinery/computer/pandemic name = "PanD.E.M.I.C 2200" desc = "Used to work with viruses." - density = 1 - anchored = 1 + density = TRUE + anchored = TRUE icon = 'icons/obj/chemical.dmi' icon_state = "mixer0" circuit = /obj/item/weapon/circuitboard/computer/pandemic - use_power = 1 + use_power = TRUE idle_power_usage = 20 resistance_flags = ACID_PROOF - var/temp_html = "" - var/wait = null - var/obj/item/weapon/reagent_containers/beaker = null + var/wait + var/obj/item/weapon/reagent_containers/beaker /obj/machinery/computer/pandemic/Initialize() . = ..() update_icon() -/obj/machinery/computer/pandemic/proc/GetVirusByIndex(index) - if(beaker && beaker.reagents) - if(beaker.reagents.reagent_list.len) - var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list - if(BL) - if(BL.data && BL.data["viruses"]) - var/list/viruses = BL.data["viruses"] - return viruses[index] - return null +/obj/machinery/computer/pandemic/Destroy() + QDEL_NULL(beaker) + return ..() -/obj/machinery/computer/pandemic/proc/GetResistancesByIndex(index) - if(beaker && beaker.reagents) - if(beaker.reagents.reagent_list.len) - var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list - if(BL) - if(BL.data && BL.data["resistances"]) - var/list/resistances = BL.data["resistances"] - return resistances[index] - return null +/obj/machinery/computer/pandemic/proc/get_by_index(thing, index) + if(!beaker || !beaker.reagents) + return + var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list + if(B && B.data[thing]) + return B.data[thing][index] -/obj/machinery/computer/pandemic/proc/GetVirusTypeByIndex(index) - var/datum/disease/D = GetVirusByIndex(index) +/obj/machinery/computer/pandemic/proc/get_virus_id_by_index(index) + var/datum/disease/D = get_by_index("viruses", index) if(D) return D.GetDiseaseID() - return null -/obj/machinery/computer/pandemic/proc/replicator_cooldown(waittime) - wait = 1 +/obj/machinery/computer/pandemic/proc/get_viruses_data(datum/reagent/blood/B) + . = list() + if(!islist(B.data["viruses"])) + return + var/list/V = B.data["viruses"] + var/index = 1 + for(var/virus in V) + var/datum/disease/D = virus + if(!istype(D) || D.visibility_flags & HIDDEN_PANDEMIC) + continue + + var/list/this = list() + this["name"] = D.name + if(istype(D, /datum/disease/advance)) + var/datum/disease/advance/A = SSdisease.archive_diseases[D.GetDiseaseID()] + if(A.name == "Unknown") + this["can_rename"] = TRUE + this["name"] = A.name + this["is_adv"] = TRUE + this["resistance"] = A.totalResistance() + this["stealth"] = A.totalStealth() + this["stage_speed"] = A.totalStageSpeed() + this["transmission"] = A.totalTransmittable() + this["symptoms"] = list() + for(var/symptom in A.symptoms) + var/datum/symptom/S = symptom + var/list/this_symptom = list() + this_symptom["name"] = S.name + this["symptoms"] += list(this_symptom) + this["index"] = index++ + this["agent"] = D.agent + this["description"] = D.desc || "none" + this["spread"] = D.spread_text || "none" + this["cure"] = D.cure_text || "none" + + . += list(this) + +/obj/machinery/computer/pandemic/proc/get_resistance_data(datum/reagent/blood/B) + . = list() + if(!islist(B.data["resistances"])) + return + var/list/resistances = B.data["resistances"] + for(var/id in resistances) + var/list/this = list() + var/datum/disease/D = SSdisease.archive_diseases[id] + if(D) + this["id"] = id + this["name"] = D.name + . += list(this) + +/obj/machinery/computer/pandemic/proc/reset_replicator_cooldown() + wait = FALSE update_icon() - spawn(waittime) - wait = null - update_icon() - playsound(src.loc, 'sound/machines/ping.ogg', 30, 1) + playsound(loc, 'sound/machines/ping.ogg', 30, 1) /obj/machinery/computer/pandemic/update_icon() if(stat & BROKEN) icon_state = (beaker ? "mixer1_b" : "mixer0_b") return - icon_state = "mixer[(beaker)?"1":"0"][(powered()) ? "" : "_nopower"]" - + icon_state = "mixer[(beaker) ? "1" : "0"][powered() ? "" : "_nopower"]" if(wait) cut_overlays() else add_overlay("waitlight") -/obj/machinery/computer/pandemic/Topic(href, href_list) +/obj/machinery/computer/pandemic/proc/eject_beaker() + beaker.forceMove(get_turf(src)) + beaker = null + update_icon() + +/obj/machinery/computer/pandemic/ui_interact(mob/user, ui_key = "main", datum/tgui/ui, force_open = FALSE, datum/tgui/master_ui, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "pandemic", name, 575, 500, master_ui, state) + ui.open() + +/obj/machinery/computer/pandemic/ui_data(mob/user) + var/list/data = list() + data["is_ready"] = !wait + if(beaker) + data["has_beaker"] = TRUE + if(!beaker.reagents.total_volume || !beaker.reagents.reagent_list) + data["beaker_empty"] = TRUE + var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list + if(B) + data["has_blood"] = TRUE + data["blood"] = list() + data["blood"]["dna"] = B.data["blood_DNA"] || "none" + data["blood"]["type"] = B.data["blood_type"] || "none" + data["viruses"] = get_viruses_data(B) + data["resistances"] = get_resistance_data(B) + + return data + +/obj/machinery/computer/pandemic/ui_act(action, params) if(..()) return - - usr.set_machine(src) - if(!beaker) return - - if (href_list["create_vaccine"]) - if(!src.wait) - var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) - if(B) - B.pixel_x = rand(-3, 3) - B.pixel_y = rand(-3, 3) - var/path = GetResistancesByIndex(text2num(href_list["create_vaccine"])) - var/vaccine_type = path - var/vaccine_name = "Unknown" - - if(!ispath(vaccine_type)) - if(SSdisease.archive_diseases[path]) - var/datum/disease/D = SSdisease.archive_diseases[path] - if(D) - vaccine_name = D.name - vaccine_type = path - else if(vaccine_type) - var/datum/disease/D = new vaccine_type(0, null) - if(D) - vaccine_name = D.name - - if(vaccine_type) - - B.name = "[vaccine_name] vaccine bottle" - B.reagents.add_reagent("vaccine", 15, list(vaccine_type)) - replicator_cooldown(200) - else - temp_html = "The replicator is not ready yet." - updateUsrDialog() - return - else if (href_list["create_virus_culture"]) - if(!wait) - var/type = GetVirusTypeByIndex(text2num(href_list["create_virus_culture"]))//the path is received as string - converting - var/datum/disease/D = null - if(!ispath(type)) - D = GetVirusByIndex(text2num(href_list["create_virus_culture"])) - var/datum/disease/advance/A = SSdisease.archive_diseases[D.GetDiseaseID()] - if(A) - D = new A.type(0, A) - else if(type) - if(type in SSdisease.diseases) // Make sure this is a disease - D = new type(0, null) - if(!D) - return - var/name = stripped_input(usr,"Name:","Name the culture",D.name,MAX_NAME_LEN) - if(name == null || wait) - return - var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc) - B.icon_state = "bottle3" - B.pixel_x = rand(-3, 3) - B.pixel_y = rand(-3, 3) - replicator_cooldown(50) - var/list/data = list("viruses"=list(D)) - B.name = "[name] culture bottle" - B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium." - B.reagents.add_reagent("blood",20,data) - updateUsrDialog() - else - temp_html = "The replicator is not ready yet." - updateUsrDialog() - return - else if (href_list["empty_beaker"]) - beaker.reagents.clear_reagents() - updateUsrDialog() - return - else if (href_list["eject"]) - beaker.forceMove(get_turf(loc)) - beaker = null - icon_state = "mixer0" - updateUsrDialog() - return - else if (href_list["emptyeject_beaker"]) - beaker.reagents.clear_reagents() - beaker.forceMove(get_turf(loc)) - beaker = null - icon_state = "mixer0" - updateUsrDialog() - return - else if(href_list["clear"]) - temp_html = "" - updateUsrDialog() - return - else if(href_list["name_disease"]) - var/new_name = stripped_input(usr, "Name the Disease", "New Name", "", MAX_NAME_LEN) - if(!new_name) - return - if(..()) - return - var/id = GetVirusTypeByIndex(text2num(href_list["name_disease"])) - if(SSdisease.archive_diseases[id]) + switch(action) + if("eject_beaker") + eject_beaker() + . = TRUE + if("empty_beaker") + beaker.reagents.clear_reagents() + . = TRUE + if("empty_eject_beaker") + beaker.reagents.clear_reagents() + eject_beaker() + . = TRUE + if("rename_disease") + var/id = get_virus_id_by_index(text2num(params["index"])) var/datum/disease/advance/A = SSdisease.archive_diseases[id] - A.AssignName(new_name) - for(var/datum/disease/advance/AD in SSdisease.processing) - AD.Refresh() - updateUsrDialog() - - - else - usr << browse(null, "window=pandemic") - updateUsrDialog() - return - - add_fingerprint(usr) - return - -/obj/machinery/computer/pandemic/attack_hand(mob/user) - if(..()) - return - user.set_machine(src) - var/dat = "" - if(temp_html) - dat = "[src.temp_html]

Main Menu" - else if(!beaker) - dat += "Please insert beaker.
" - dat += "Close" - else - var/datum/reagents/R = beaker.reagents - var/datum/reagent/blood/Blood = null - for(var/datum/reagent/blood/B in R.reagent_list) - if(B) - Blood = B - break - if(!R.total_volume||!R.reagent_list.len) - dat += "The beaker is empty
" - else if(!Blood) - dat += "No blood sample found in beaker." - else if(!Blood.data) - dat += "No blood data found in beaker." - else - dat += "

Blood sample data:

" - dat += "Blood DNA: [(Blood.data["blood_DNA"]||"none")]
" - dat += "Blood Type: [(Blood.data["blood_type"]||"none")]
" - - - if(Blood.data["viruses"]) - var/list/vir = Blood.data["viruses"] - if(vir.len) - var/i = 0 - for(var/datum/disease/D in Blood.data["viruses"]) - i++ - if(!(D.visibility_flags & HIDDEN_PANDEMIC)) - - if(istype(D, /datum/disease/advance)) - - var/datum/disease/advance/A = D - D = SSdisease.archive_diseases[A.GetDiseaseID()] - if(D && D.name == "Unknown") - dat += "Name Disease
" - - if(!D) - CRASH("We weren't able to get the advance disease from the archive.") - - dat += "Disease Agent: [D?"[D.agent] - Create virus culture bottle":"none"]
" - dat += "Common name: [(D.name||"none")]
" - dat += "Description: [(D.desc||"none")]
" - dat += "Spread: [(D.spread_text||"none")]
" - dat += "Possible cure: [(D.cure_text||"none")]

" - if(istype(D, /datum/disease/advance)) - var/datum/disease/advance/A = D - dat += "Stealth: [(A.totalStealth())]
" - dat += "Resistance: [(A.totalResistance())]
" - dat += "Stage Speed: [(A.totalStageSpeed())]
" - dat += "Transmission: [(A.totalTransmittable())]

" - dat += "Symptoms: " - var/english_symptoms = list() - for(var/datum/symptom/S in A.symptoms) - english_symptoms += S.name - dat += english_list(english_symptoms) - - else - dat += "No detectable virus in the sample." - else - dat += "No detectable virus in the sample." - - dat += "
Contains antibodies to: " - if(Blood.data["resistances"]) - var/list/res = Blood.data["resistances"] - if(res.len) - dat += "
" - else - dat += "nothing
" - else - dat += "nothing
" - dat += "
Eject beaker[((R.total_volume&&R.reagent_list.len) ? "-- Empty beaker":"")]" - dat += "[((R.total_volume&&R.reagent_list.len) ? "-- Empty and Eject beaker":"")]
" - dat += "Close" - - user << browse("[src.name]
[dat]", "window=pandemic;size=575x400") - onclose(user, "pandemic") - return - + if(A) + var/new_name = stripped_input(usr, "Name the disease", "New name", "", MAX_NAME_LEN) + if(!new_name || ..()) + return + A.AssignName(new_name) + for(var/datum/disease/advance/AD in SSdisease.processing) + AD.Refresh() + . = TRUE + if("create_culture_bottle") + var/id = get_virus_id_by_index(text2num(params["index"])) + var/datum/disease/advance/A = new(FALSE, SSdisease.archive_diseases[id]) + var/list/data = list("viruses" = list(A)) + var/obj/item/weapon/reagent_containers/glass/bottle/B = new(get_turf(src)) + B.name = "[A.name] culture bottle" + B.desc = "A small bottle. Contains [A.agent] culture in synthblood medium." + B.reagents.add_reagent("blood", 20, data) + wait = TRUE + update_icon() + addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 50) + . = TRUE + if("create_vaccine_bottle") + var/index = params["index"] + var/datum/disease/D = SSdisease.archive_diseases[index] + var/obj/item/weapon/reagent_containers/glass/bottle/B = new(get_turf(src)) + B.name = "[D.name] vaccine bottle" + B.reagents.add_reagent("vaccine", 15, list(index)) + wait = TRUE + update_icon() + addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 200) + . = TRUE /obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/reagent_containers) && (I.container_type & OPENCONTAINER)) - . = 1 //no afterattack + . = TRUE //no afterattack if(stat & (NOPOWER|BROKEN)) return if(beaker) @@ -288,15 +186,15 @@ if(!user.drop_item()) return - beaker = I - beaker.loc = src + beaker = I + beaker.forceMove(src) to_chat(user, "You add the beaker to the machine.") - updateUsrDialog() - icon_state = "mixer1" + update_icon() else return ..() /obj/machinery/computer/pandemic/on_deconstruction() if(beaker) - beaker.loc = get_turf(src) - ..() \ No newline at end of file + beaker.forceMove(get_turf(src)) + beaker = null + . = ..() \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1087.yml b/html/changelogs/AutoChangeLog-pr-1087.yml new file mode 100644 index 0000000000..c94c89bed0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1087.yml @@ -0,0 +1,4 @@ +author: "Lzimann" +delete-after: True +changes: + - rscadd: "Pandemic is now tgui!" diff --git a/html/changelogs/AutoChangeLog-pr-1130.yml b/html/changelogs/AutoChangeLog-pr-1130.yml new file mode 100644 index 0000000000..c7dacb5662 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1130.yml @@ -0,0 +1,10 @@ +author: "Robustin" +delete-after: True +changes: + - rscadd: "Gang influence is now decentralized, each gangster has their own influence that they can increase by spraying (and protecting) their tags and new influence-enhancing bling." + - rscadd: "Gang uniforms are now created based on your gang's color and can be purchased by any gang member. They will increase the wearer's influence and provide protection, but will make it fairly obvious which gang you belong to." + - rscadd: "Gangs have access to a new surplus rifle; it is a semi-automatic rifle that is very bulky and has a very low rate of fire. Gang members can buy this gun for just 8 influence." + - rscadd: "Gangs have access to the new machine gun turret; it unleashes a volley of bullets with an extended view range. It does not run out of ammo, but a significant delay between volleys and its stationary nature leaves the gunner vulnerable to flanking and return fire. Holding down the trigger will allow you to aim the gun while firing. It will cost gangs 50 influence." + - rscadd: "The sawn-off improvised shotgun is now available to gangs for 6 influence. With buckshot shells being easy to produce or purchase, this gun gives the most \"bang for your buck\" but its single-shell capacity will leave you vulnerable during a pitched gunfight." + - rscadd: "The Wetwork boots give gangs access to a lightly armored noslip variant." + - tweak: "The armored gang outfits are now slightly more resistant to ballistic and bomb damage" diff --git a/icons/obj/turrets.dmi b/icons/obj/turrets.dmi index c4077b6601..b186c3f224 100644 Binary files a/icons/obj/turrets.dmi and b/icons/obj/turrets.dmi differ diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index d7b7e7f257..c609f0d32b 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,16 +1,16 @@ -require=function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var p=Error("Cannot find module '"+o+"'");throw p.code="MODULE_NOT_FOUND",p}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?p[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var a=t(80),r=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,u=r(s>1?o[1]:void 0,n),p=s>2?o[2]:void 0,c=void 0===p?n:r(p,n);c>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=a(e),p=r(u.length),c=i(o,p);if(t&&n!=n){for(;p>c;)if(s=u[c++],s!=s)return!0}else for(;p>c;c++)if((t||c in u)&&u[c]===n)return t||c;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,p=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),x=o(b.length),_=0,w=e?s(f,x):n?s(f,0):void 0;x>_;_++)if((l||_ in b)&&(m=b[_],v=y(m,_,g),t))if(e)w[_]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return _;case 2:w.push(m)}else if(p)return!1;return c?-1:u||p?p:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var a=t(11),r=t(83)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),u=t(18),p=t(27),c=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,x=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";r(t,f,++y)}return"O"+t[f]},_=function(t,e){var n,a=x(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&p(i,n,t[r],t)});return i(c.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=_(e,t);if(n){var a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!_(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return u(this[b])}}),c},def:function(t,e,n){var a,r,i=_(t,e);return i?i.v=n:(t._l=i={i:r=x(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:_,setStrong:function(t,e,n){c(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var a=t(27),r=t(10);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),u=t(27),p=t(8),c=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=p(5),h=p(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&u(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),u=t(69),p=t(38),c=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},_=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!p(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,S=c(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(S||w)&&(_("delete"),_("has"),h&&_("get")),(w||E)&&_(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),x[t]=g,r(r.G+r.W+r.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),u="prototype",p=function(t,e,n){var c,l,f,d,h=t&p.F,m=t&p.G,v=t&p.S,g=t&p.P,b=t&p.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[u],x=m?r:r[e]||(r[e]={}),_=x[u]||(x[u]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),x[c]!=f&&i(x,c,d),g&&_[c]!=f&&(_[c]=f)};a.core=r,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,e.exports=p},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),p=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,u,p)),a(RegExp.prototype,u,2==e?function(t,e){return p.call(t,this,e)}:function(t){return p.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,p){var c,l,f,d=u(t),h=a(n,p,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{46:46,78:78}],29:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),u=t(45),p=t(41),c=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,x,_){p(n,e,b);var w,k,E=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",C=y==v,P=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||E(y);if(O){var R=l(T.call(new t));c(R,S,!0),!a&&s(A,h)&&o(R,f,g),C&&O.name!==v&&(P=!0,T=function(){return O.call(this)})}if(a&&!_||!d&&!P&&A[f]||o(A,f,T),u[e]=T,u[S]=g,y)if(w={values:C?T:E(v),keys:x?T:E(m),entries:C?E("entries"):T},_)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||P),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var a=t(83)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var a=t(46),r=t(78);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var a,r,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,p=o.process,c=o.Promise,l="process"==t(11)(p),f=function(){var t,e,n;for(l&&(t=p.domain)&&(p.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){p.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&p.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,u=1,p=a.getKeys,c=a.getSymbols,l=a.isEnum;s>u;)for(var f,d=i(o[u++]),h=c?p(d).concat(c(d)):p(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var a=t(22),r=t(16),i=t(24);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),u=s.length,p=0,c=[];u>p;)i.call(o,n=s[p++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var a,i=this,o=arguments,p=o.length,c=0,l=0;if(!u&&!p)return r(t,n,i);if(a=n.slice(),u)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;p>l;)a.push(o[l++]);return r(t,a,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var a=t(46).getDesc,r=t(38),i=t(4),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(17)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var a=t(77),r=t(18);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",u=a(n),p=s.length;return 0>u||u>=p?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===p||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,p=void 0===n?" ":n+"",c=a(e);if(u>=c)return s;""==p&&(p=" ");var l=c-u,f=r.call(p,Math.ceil(l/p.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var a=t(77),r=t(18);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var a=t(22),r=t(18),i=t(24),o=" \n\x0B\f\r  ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",p=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(p,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),u=t(32),p=t(20),c=t(29),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in p("script")?function(t){u.appendChild(p("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),u=t(32),p=t(20),c=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),x=t(76),_=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),C=Object.prototype,P=Array.prototype,A=P.slice,O=P.join,T=r.setDesc,R=r.getDesc,M=r.setDescs,j={};o||(a=!d(function(){return 7!=T(p("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return R(t,e)}catch(n){}return c(t,e)?s(!C.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=M=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:M});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),D=L.length,F=function(){var t,e=p("iframe"),n=D,a=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("