diff --git a/SQL/Aurora_SQL_Schema.sql b/SQL/Aurora_SQL_Schema.sql index 715bb11cae6..65664dd8ad4 100644 --- a/SQL/Aurora_SQL_Schema.sql +++ b/SQL/Aurora_SQL_Schema.sql @@ -108,6 +108,7 @@ CREATE TABLE `ss13_characters` ( `organs_data` text, `organs_robotic` text, `gear` text, + `deleted_at` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `ss13_characters_ckey` (`ckey`), KEY `ss13_characteres_name` (`name`), @@ -120,6 +121,7 @@ CREATE TABLE `ss13_characters_flavour` ( `records_medical` text, `records_security` text, `records_exploit` text, + `records_ccia` text, `flavour_general` text, `flavour_head` text, `flavour_face` text, @@ -276,6 +278,8 @@ CREATE TABLE `ss13_player_preferences` ( `UI_style_alpha` int(11) NOT NULL, `be_special` int(11) NOT NULL, `asfx_togs` int(11) NOT NULL, + `lastmotd` text NOT NULL, + `lastmemo` text NOT NULL, PRIMARY KEY (`ckey`), CONSTRAINT `player_preferences_fk_ckey` FOREIGN KEY (`ckey`) REFERENCES `ss13_player` (`ckey`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/baystation12.dme b/baystation12.dme index 99e846cd3ba..be280731912 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -134,6 +134,7 @@ #include "code\datums\modules.dm" #include "code\datums\organs.dm" #include "code\datums\recipe.dm" +#include "code\datums\server_greeting.dm" #include "code\datums\sun.dm" #include "code\datums\supplypacks.dm" #include "code\datums\diseases\appendicitis.dm" @@ -587,6 +588,7 @@ #include "code\game\objects\items\devices\paicard.dm" #include "code\game\objects\items\devices\pipe_painter.dm" #include "code\game\objects\items\devices\powersink.dm" +#include "code\game\objects\items\devices\radio_jammer.dm" #include "code\game\objects\items\devices\scanners.dm" #include "code\game\objects\items\devices\spy_bug.dm" #include "code\game\objects\items\devices\suit_cooling.dm" @@ -810,8 +812,8 @@ #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_attack_log.dm" #include "code\modules\admin\admin_investigate.dm" -#include "code\modules\admin\admin_memo.dm" #include "code\modules\admin\admin_ranks.dm" +#include "code\modules\admin\admin_server_greeting.dm" #include "code\modules\admin\admin_verbs.dm" #include "code\modules\admin\banjob.dm" #include "code\modules\admin\create_mob.dm" @@ -895,6 +897,7 @@ #include "code\modules\client\preferences_ambience.dm" #include "code\modules\client\preferences_factions.dm" #include "code\modules\client\preferences_gear.dm" +#include "code\modules\client\preferences_notification.dm" #include "code\modules\client\preferences_save_migration.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_spawnpoints.dm" @@ -976,6 +979,7 @@ #include "code\modules\clothing\under\jobs\engineering.dm" #include "code\modules\clothing\under\jobs\medsci.dm" #include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\customitems\item_defines.dm" #include "code\modules\customitems\item_spawning.dm" #include "code\modules\detectivework\footprints.dm" #include "code\modules\detectivework\forensics.dm" @@ -1223,6 +1227,7 @@ #include "code\modules\mob\living\carbon\human\human_organs.dm" #include "code\modules\mob\living\carbon\human\human_powers.dm" #include "code\modules\mob\living\carbon\human\human_species.dm" +#include "code\modules\mob\living\carbon\human\intoxication.dm" #include "code\modules\mob\living\carbon\human\inventory.dm" #include "code\modules\mob\living\carbon\human\life.dm" #include "code\modules\mob\living\carbon\human\login.dm" @@ -1330,6 +1335,7 @@ #include "code\modules\mob\living\simple_animal\friendly\corgi.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" #include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" +#include "code\modules\mob\living\simple_animal\friendly\fox.dm" #include "code\modules\mob\living\simple_animal\friendly\lizard.dm" #include "code\modules\mob\living\simple_animal\friendly\mouse.dm" #include "code\modules\mob\living\simple_animal\friendly\mushroom.dm" diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm index 2d02e569b3a..77d3288deeb 100644 --- a/code/__HELPERS/logging.dm +++ b/code/__HELPERS/logging.dm @@ -20,14 +20,17 @@ /proc/testing(msg) world.log << "## TESTING: [msg][log_end]" +/proc/game_log(category, text) + diary << "\[[time_stamp()]] [game_id] [category]: [text][log_end]" + /proc/log_admin(text) admin_log.Add(text) if (config.log_admin) - diary << "\[[time_stamp()]]ADMIN: [text][log_end]" + game_log("ADMIN", text) /proc/log_debug(text) if (config.log_debug) - diary << "\[[time_stamp()]]DEBUG: [text][log_end]" + game_log("DEBUG", text) for(var/client/C in admins) if(!C.prefs) //This is to avoid null.toggles runtime error while still initialyzing players preferences @@ -37,55 +40,55 @@ /proc/log_game(text) if (config.log_game) - diary << "\[[time_stamp()]]GAME: [text][log_end]" + game_log("GAME", text) /proc/log_vote(text) if (config.log_vote) - diary << "\[[time_stamp()]]VOTE: [text][log_end]" + game_log("VOTE", text) /proc/log_access(text) if (config.log_access) - diary << "\[[time_stamp()]]ACCESS: [text][log_end]" + game_log("ACCESS", text) /proc/log_say(text) if (config.log_say) - diary << "\[[time_stamp()]]SAY: [text][log_end]" + game_log("SAY", text) /proc/log_ooc(text) if (config.log_ooc) - diary << "\[[time_stamp()]]OOC: [text][log_end]" + game_log("OOC", text) /proc/log_whisper(text) if (config.log_whisper) - diary << "\[[time_stamp()]]WHISPER: [text][log_end]" + game_log("WHISPER", text) /proc/log_emote(text) if (config.log_emote) - diary << "\[[time_stamp()]]EMOTE: [text][log_end]" + game_log("EMOTE", text) /proc/log_attack(text) if (config.log_attack) - diary << "\[[time_stamp()]]ATTACK: [text][log_end]" //Seperate attack logs? Why? FOR THE GLORY OF SATAN! + game_log("ATTACK", text) /proc/log_adminsay(text) if (config.log_adminchat) - diary << "\[[time_stamp()]]ADMINSAY: [text][log_end]" + game_log("ADMINSAY", text) /proc/log_adminwarn(text) if (config.log_adminwarn) - diary << "\[[time_stamp()]]ADMINWARN: [text][log_end]" + game_log("ADMINWARN", text) /proc/log_pda(text) if (config.log_pda) - diary << "\[[time_stamp()]]PDA: [text][log_end]" + game_log("PDA", text) /proc/log_to_dd(text) world.log << text //this comes before the config check because it can't possibly runtime if(config.log_world_output) - diary << "\[[time_stamp()]]DD_OUTPUT: [text][log_end]" + game_log("DD_OUTPUT", text) /proc/log_misc(text) - diary << "\[[time_stamp()]]MISC: [text][log_end]" + game_log("MISC", text) //pretty print a direction bitflag, can be useful for debugging. /proc/print_dir(var/dir) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index cc77f20c337..9e501827e49 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -134,3 +134,10 @@ Proc for attack log creation, because really why not return 0 var/mob/living/silicon/robot/R = thing.loc return (thing in R.module.modules) + +/proc/get_exposed_defense_zone(var/atom/movable/target) + var/obj/item/weapon/grab/G = locate() in target + if (G && G.state >= GRAB_NECK) + return pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg") + else + return pick("chest", "groin") diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 0b26e51ac45..f06071b0045 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -46,6 +46,10 @@ var/religion_name = null /proc/system_name() return "Nyx" +/proc/commstation_name() + if (commstation_name) + return commstation_name + /proc/station_name() if (station_name) return station_name diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 9204ace71b6..907a2bfdc49 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -324,10 +324,26 @@ proc/TextPreview(var/string,var/len=40) if (!message) return "" + // ---Begin URL caching. + var/list/urls = list() + var/regex/url_find = new("(https?:\\/\\/\[^\\s\]*)", "g") + while (url_find.Find(message)) + urls += url_find.match + + + if (urls.len) + var/i = 1 + for (var/url in urls) + var/ref = "\ref[urls]-[i]" + urls[url] = ref + message = replacetextEx(message, url, ref) + i++ + // ---End URL caching + var/list/tags = list("*" = list("", ""), - "_" = list("", ""), - "~" = list("", ""), - "-" = list("", "")) + "/" = list("", ""), + "~" = list("", ""), + "_" = list("", "")) if (ignore_tags && ignore_tags.len) tags -= ignore_tags @@ -339,4 +355,13 @@ proc/TextPreview(var/string,var/len=40) var/regex/markup = new("(\\[tag])(\[^\\[tag]\]*)(\\[tag])", "g") message = markup.Replace(message, "[marker_begin]$2[marker_end]") + // ---Unload URL cache + if (urls.len) + for (var/url in urls) + message = replacetextEx(message, urls[url], url) + return message + +//Converts New Lines to html
+/proc/nl2br(var/text) + return replacetextEx(text,"\n","
") diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 3d7622a7133..c7108ebe079 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -318,23 +318,14 @@ return /mob/living/LaserEyes(atom/A) - next_move = world.time + 6 var/turf/T = get_turf(src) - var/turf/U = get_turf(A) - var/obj/item/projectile/beam/LE = new /obj/item/projectile/beam( loc ) - LE.icon = 'icons/effects/genetics.dmi' - LE.icon_state = "eyelasers" - playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) - - LE.firer = src - LE.def_zone = get_organ_target() - LE.original = A - LE.current = T - LE.yo = U.y - T.y - LE.xo = U.x - T.x - spawn( 1 ) - LE.process() + var/obj/item/projectile/beam/LE = new (T) + LE.muzzle_type = /obj/effect/projectile/eyelaser/muzzle + LE.tracer_type = /obj/effect/projectile/eyelaser/tracer + LE.impact_type = /obj/effect/projectile/eyelaser/impact + playsound(usr.loc, 'sound/weapons/wave.ogg', 75, 1) + LE.launch(A) /mob/living/carbon/human/LaserEyes() if(nutrition>0) @@ -342,7 +333,7 @@ nutrition = max(nutrition - rand(1,5),0) handle_regular_hud_updates() else - src << "\red You're out of energy! You need food!" + src << "You're out of energy! You need food!" // Simple helper to face what you clicked on, in case it should be needed in more than one place /mob/proc/face_atom(var/atom/A) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 1910a7e8cfa..d652ef40233 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -156,6 +156,7 @@ var/list/gamemode_cache = list() var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database + var/sql_stats = 0 //Do we record round statistics on the database (deaths, round reports, population, etcetera) or not? var/sql_whitelists = 0 //Defined whether the server uses an SQL based whitelist system, or the legacy one with two .txts. Config option in config.txt var/sql_saves = 0 //Defines whether the server uses an SQL based character and preference saving system. Config option in config.txt @@ -718,6 +719,9 @@ var/list/gamemode_cache = list() if("allow_chat_markup") config.allow_chat_markup = 1 + if("sql_stats") + config.sql_stats = 1 + else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index d55662620ba..b6dcbdf782b 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -69,6 +69,8 @@ G.fields["religion"] = H.religion G.fields["photo_front"] = front G.fields["photo_side"] = side + G.fields["ccia_record"] = H.ccia_record + G.fields["ccia_actions"] = H.ccia_actions if(H.gen_record && !jobban_isbanned(H, "Records")) G.fields["notes"] = H.gen_record else diff --git a/code/datums/server_greeting.dm b/code/datums/server_greeting.dm new file mode 100644 index 00000000000..b395e402d6e --- /dev/null +++ b/code/datums/server_greeting.dm @@ -0,0 +1,211 @@ +/* + * Server greeting datum. + * Contains the following information: + * - hashes for the message of the day and staff memos + * - the current message of the day and staff memos + * - the fully parsed welcome screen HTML data + * + * #TODO_LATER: Update this to be reliant on the game, and not an HTML template, whenever we update to TGui. Less hacks involved, then. + */ + +#define MEMOFILE "data/greeting.sav" + +#define OUTDATED_MOTD 1 +#define OUTDATED_MEMO 2 +#define OUTDATED_NOTE 4 + +/datum/server_greeting + // Hashes to figure out if we need to display the greeting message. + // These correspond to motd_hash and memo_hash on /datum/preferences for each client. + var/motd_hash = "" + var/memo_hash = "" + + // The stored strings of general subcomponents. + var/motd = "" + var/memo_list[] = list() + var/memo = "" + + var/raw_data_user = "" + var/raw_data_staff = "" + // The near-final string to be displayed. + // Only one placeholder remains: . + var/user_data = "" + var/staff_data = "" + +/datum/server_greeting/New() + ..() + + load_from_file() + + prepare_data() + +/* + * Populates variables from save file, and loads the raw HTML data. + * Needs to be called at least once for successful initialization. + */ +/datum/server_greeting/proc/load_from_file() + var/savefile/F = new(MEMOFILE) + if (F) + if (F["motd"]) + F["motd"] >> motd + + if (F["memo"]) + F["memo"] >> memo_list + + raw_data_staff = file2text('html/templates/welcome_screen.html') + + // This is a lazy way, but it disables the user from being able to see the memo button. + var/staff_button = "
  • Staff Memos
  • " + raw_data_user = replacetextEx(raw_data_staff, staff_button, "") + +/* + * Generates hashes, placeholders, and reparses var/memo. + * Then updates staff_data and user_data with the new contents. + * To be called after load_from_file or update_value. + */ +/datum/server_greeting/proc/prepare_data() + if (!motd) + motd = "
    No new announcements to showcase.
    " + motd_hash = "" + else + motd_hash = md5(motd) + + memo = "" + + if (memo_list.len) + for (var/ckey in memo_list) + var/data = {" +

    [ckey] wrote on [memo_list[ckey]["date"]]:
    + [memo_list[ckey]["content"]]

    + "} + + memo += data + + memo_hash = md5(memo) + else + memo = "
    No memos have been posted.
    " + memo_hash = "" + + var/html_one = raw_data_staff + html_one = replacetextEx(html_one, "", motd) + html_one = replacetextEx(html_one, "", memo) + staff_data = html_one + + var/html_two = raw_data_user + html_two = replacetextEx(html_two, "", motd) + user_data = html_two + + return + +/* + * Helper to update the MoTD or memo contents. + * Args: + * - var/change string + * - var/new_value mixed + * Returns: + * - 1 upon success + * - 0 upon failure + */ +/datum/server_greeting/proc/update_value(var/change, var/new_value) + if (!change || !new_value) + return 0 + + switch (change) + if ("motd") + motd = new_value + motd_hash = md5(new_value) + + if ("memo_write") + memo_list[new_value[1]] = list("date" = time2text(world.realtime, "DD-MMM-YYYY"), "content" = new_value[2]) + + if ("memo_delete") + if (memo_list[new_value]) + memo_list -= new_value + else + return 0 + + else + return 0 + + var/savefile/F = new(MEMOFILE) + F["motd"] << motd + F["memo"] << memo_list + + prepare_data() + + return 1 + +/* + * Helper proc to determine whether or not we need to show the greeting window to a user. + * Args: + * - var/user client + * Returns: + * - int + */ +/datum/server_greeting/proc/find_outdated_info(var/client/user) + if (!user || !user.prefs) + return 0 + + var/outdated_info = 0 + + if (motd_hash && user.prefs.motd_hash != motd_hash) + outdated_info |= OUTDATED_MOTD + + if (user.holder && memo_hash && user.prefs.memo_hash != memo_hash) + outdated_info |= OUTDATED_MEMO + + if (user.prefs.notifications.len) + outdated_info |= OUTDATED_NOTE + + return outdated_info + +/* + * Composes the final message and displays it to the user. + * Also clears the user's notifications, should he have any. + */ +/datum/server_greeting/proc/display_to_client(var/client/user, var/outdated_info = 0) + if (!user) + return + + var/notifications = "
    You do not have any notifications to show.
    " + var/list/outdated_tabs = list() + var/save_prefs = 0 + + if (outdated_info & OUTDATED_NOTE) + outdated_tabs += "#note-tab" + + notifications = "" + for (var/datum/client_notification/a in user.prefs.notifications) + notifications += a.get_html() + + if (outdated_info & OUTDATED_MEMO) + outdated_tabs += "#memo-tab" + user.prefs.memo_hash = memo_hash + save_prefs = 1 + + if (outdated_info & OUTDATED_MOTD) + outdated_tabs += "#motd-tab" + user.prefs.motd_hash = motd_hash + save_prefs = 1 + + var/data = user_data + + if (user.holder) + data = staff_data + + data = replacetextEx(data, "", notifications) + + if (outdated_tabs.len) + var/tab_string = json_encode(outdated_tabs) + data = replacetextEx(data, "var updated_tabs = \[\]", "var updated_tabs = [tab_string]") + + user << browse(data, "window=welcome_screen;size=640x500") + + if (save_prefs) + user.prefs.handle_preferences_save(user) + +#undef OUTDATED_NOTE +#undef OUTDATED_MEMO +#undef OUTDATED_MOTD + +#undef MEMOFILE diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 018b3d0538f..a85f48971e8 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1552,3 +1552,11 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/device/kit/paint/gygax/recitence ) name = "Random Gygax exosuit modkit" + +/datum/supply_packs/jukebox + name = "Jukebox" + contains = list(/obj/machinery/media/jukebox/) + cost = 200 + containertype = /obj/structure/largecrate + containername = "jukebox Crate" + group = "Hospitality" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 501ecbe44fb..e92a003a190 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -186,6 +186,20 @@ throw_range = 5 w_class = 2.0 attack_verb = list("warned", "cautioned", "smashed") +/obj/item/weapon/caution/attack_self(mob/user as mob) + if(src.icon_state == "caution") + src.icon_state = "caution_blinking" + user << "You turn the sign on." + else + src.icon_state = "caution" + user << "You turn the sign off." +/obj/item/weapon/caution/AltClick() + if(src.icon_state == "caution") + src.icon_state = "caution_blinking" + usr << "You turn the sign on." + else + src.icon_state = "caution" + usr << "You turn the sign off." /obj/item/weapon/caution/cone desc = "This cone is trying to warn you of something!" diff --git a/code/defines/procs/radio.dm b/code/defines/procs/radio.dm index 0ee38f3b120..a18d2074152 100644 --- a/code/defines/procs/radio.dm +++ b/code/defines/procs/radio.dm @@ -1,7 +1,7 @@ -#define TELECOMMS_RECEPTION_NONE 0 -#define TELECOMMS_RECEPTION_SENDER 1 -#define TELECOMMS_RECEPTION_RECEIVER 2 -#define TELECOMMS_RECEPTION_BOTH 3 +#define TELECOMMS_RECEPTION_NONE 1 +#define TELECOMMS_RECEPTION_SENDER 2 +#define TELECOMMS_RECEPTION_RECEIVER 4 +#define TELECOMMS_RECEPTION_BOTH 8 /proc/register_radio(source, old_frequency, new_frequency, radio_filter) if(old_frequency) @@ -44,7 +44,7 @@ /proc/get_message_server() if(message_servers) for (var/obj/machinery/message_server/MS in message_servers) - if(MS.active) + if(MS.active && !within_jamming_range(MS)) return MS return null @@ -52,10 +52,12 @@ return signal && signal.data["done"] /proc/get_sender_reception(var/atom/sender, var/datum/signal/signal) - return check_signal(signal) ? TELECOMMS_RECEPTION_SENDER : TELECOMMS_RECEPTION_NONE + if (check_signal(signal) && !within_jamming_range(sender)) + return TELECOMMS_RECEPTION_SENDER + return TELECOMMS_RECEPTION_NONE /proc/get_receiver_reception(var/receiver, var/datum/signal/signal) - if(receiver && check_signal(signal)) + if(receiver && check_signal(signal) && !within_jamming_range(receiver)) var/turf/pos = get_turf(receiver) if(pos && (pos.z in signal.data["level"])) return TELECOMMS_RECEPTION_RECEIVER diff --git a/code/defines/procs/statistics.dm b/code/defines/procs/statistics.dm index e807e4cbbce..3f9b6954a09 100644 --- a/code/defines/procs/statistics.dm +++ b/code/defines/procs/statistics.dm @@ -1,5 +1,5 @@ proc/sql_poll_population() - if(!config.sql_enabled) + if(!config.sql_enabled || !config.sql_stats) return var/admincount = admins.len var/playercount = 0 @@ -26,7 +26,7 @@ proc/sql_report_round_end() return proc/sql_report_death(var/mob/living/carbon/human/H) - if(!config.sql_enabled) + if(!config.sql_enabled || !config.sql_stats) return if(!H) return @@ -60,7 +60,7 @@ proc/sql_report_death(var/mob/living/carbon/human/H) proc/sql_report_cyborg_death(var/mob/living/silicon/robot/H) - if(!config.sql_enabled) + if(!config.sql_enabled || !config.sql_stats) return if(!H) return @@ -94,7 +94,7 @@ proc/sql_report_cyborg_death(var/mob/living/silicon/robot/H) proc/statistic_cycle() - if(!config.sql_enabled) + if(!config.sql_enabled || !config.sql_stats) return while(1) sql_poll_population() @@ -102,6 +102,9 @@ proc/statistic_cycle() //This proc is used for feedback. It is executed at round end. proc/sql_commit_feedback() + if(!config.sql_enabled || !config.sql_stats) + return + if(!blackbox) log_game("Round ended without a blackbox recorder. No feedback was sent to the database.") return diff --git a/code/game/antagonist/antagonist_add.dm b/code/game/antagonist/antagonist_add.dm index 5ca66731c47..39e7a834aba 100644 --- a/code/game/antagonist/antagonist_add.dm +++ b/code/game/antagonist/antagonist_add.dm @@ -30,6 +30,8 @@ if(faction_verb && player.current) player.current.verbs |= faction_verb + player.current.client.verbs += /client/proc/aooc + // Handle only adding a mind and not bothering with gear etc. if(nonstandard_role_type) faction_members |= player @@ -41,8 +43,12 @@ return 1 /datum/antagonist/proc/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) + if(!istype(player)) + return 0 + if(player.current && faction_verb) player.current.verbs -= faction_verb + if(player in current_antagonists) player.current << "You are no longer a [role_text]!" current_antagonists -= player @@ -50,5 +56,10 @@ player.special_role = null update_icons_removed(player) BITSET(player.current.hud_updateflag, SPECIALROLE_HUD) + + if (!is_special_character(player)) + player.current.client.verbs -= /client/proc/aooc + return 1 - return 0 \ No newline at end of file + + return 0 diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index a17c030b111..66f7866011f 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -6,6 +6,8 @@ w_class = 4 force = 30 throwforce = 10 + edge = 1 + sharp = 1 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") /obj/item/weapon/melee/cultblade/cultify() diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index ee20601afec..a6128889bb3 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -78,6 +78,7 @@ var/global/list/additional_antag_types = list() new/datum/uplink_item(/obj/item/weapon/storage/toolbox/syndicate, 1, "Fully Loaded Toolbox", "ST"), new/datum/uplink_item(/obj/item/weapon/plastique, 2, "C-4 (Destroys walls)", "C4"), new/datum/uplink_item(/obj/item/device/encryptionkey/syndicate, 2, "Encrypted Radio Channel Key", "ER"), + new/datum/uplink_item(/obj/item/device/radiojammer, 2, "Small Radio Jammer", "RJ"), new/datum/uplink_item(/obj/item/device/encryptionkey/binary, 3, "Binary Translator Key", "BT"), new/datum/uplink_item(/obj/item/weapon/card/emag, 3, "Cryptographic Sequencer", "EC"), new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/clerical, 3, "Morphic Clerical Kit", "CK"), diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 9d18216aa53..9b207f8ae61 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -5,6 +5,9 @@ /var/const/meteors_in_small_wave = 10 /proc/meteor_wave(var/number = meteors_in_wave) + if (number == 0) + return + if(!ticker || wavesecret) return @@ -34,23 +37,23 @@ do switch(pick(1,2,3,4)) if(1) //NORTH - starty = world.maxy-(TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) + starty = world.maxy-(TRANSITIONEDGE+2) + startx = rand((TRANSITIONEDGE+2), world.maxx-(TRANSITIONEDGE+2)) endy = TRANSITIONEDGE endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) if(2) //EAST - starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) - startx = world.maxx-(TRANSITIONEDGE+1) + starty = rand((TRANSITIONEDGE+2),world.maxy-(TRANSITIONEDGE+1)) + startx = world.maxx-(TRANSITIONEDGE+2) endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE) endx = TRANSITIONEDGE if(3) //SOUTH - starty = (TRANSITIONEDGE+1) - startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) + starty = (TRANSITIONEDGE+2) + startx = rand((TRANSITIONEDGE+2), world.maxx-(TRANSITIONEDGE+2)) endy = world.maxy-TRANSITIONEDGE endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) if(4) //WEST - starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1)) - startx = (TRANSITIONEDGE+1) + starty = rand((TRANSITIONEDGE+2), world.maxy-(TRANSITIONEDGE+2)) + startx = (TRANSITIONEDGE+2) endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE) endx = world.maxx-TRANSITIONEDGE @@ -73,7 +76,7 @@ M = new /obj/effect/meteor/small( pickedstart ) M.dest = pickedgoal - spawn(0) + spawn(1) walk_towards(M, M.dest, 1) return @@ -84,39 +87,69 @@ icon_state = "flaming" density = 1 anchored = 1.0 - var/hits = 1 - var/detonation_chance = 15 - var/power = 4 - var/power_step = 1 + var/hits = 3 + var/detonation_chance = 50 + var/power = 2 + var/power_step = 0.75 var/dest + var/shieldsoundrange = 220 // The maximum number of tiles away the sound can be heard, falls off over distance, so it will be quiet near the limit pass_flags = PASSTABLE + var/done = 0//This is set to 1 when the meteor is done colliding, and is used to ignore additional bumps while waiting for deletion + /obj/effect/meteor/small name = "small meteor" icon_state = "smallf" pass_flags = PASSTABLE | PASSGRILLE - power = 2 + power = 1 + power_step = 0.5 + hits = 2 + detonation_chance = 30 + shieldsoundrange = 120 + /obj/effect/meteor/Destroy() walk(src,0) //this cancels the walk_towards() proc ..() /obj/effect/meteor/Bump(atom/A) - spawn(0) + if (!done) + spawn(0) + + if (A) + A.meteorhit(src) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) + + if (istype(A, /obj/effect/energy_field))//If a normal/small meteor impacts an energy field, then it makes a widely audible impact sound and qdels + done = 1 + hits = 0 + power *= 0.5 + power_step *= 0.5 + var/turf/T = src.loc + if (!T) + T = A.loc + + if (T)//We have a double safety check on T to prevent runtime errors + meteor_shield_impact_sound(T, shieldsoundrange) + msg_admin_attack("Meteor impacted energy field at coords (JMP)") + spawn()//Delaying the Qdel a frame provides a little more safety + qdel(src) + + if (--src.hits == 0 && !done) + //Prevent meteors from blowing up the singularity's containment. + //Changing emitter and generator ex_act would result in them being bomb and C4 proof. + done = 1 + if(!istype(A,/obj/machinery/power/emitter) && \ + !istype(A,/obj/machinery/field_generator) && \ + prob(detonation_chance)) + explosion(loc, power, power + power_step, power + power_step * 2, power + power_step * 3, 0) + msg_admin_attack("Meteor exploded at coords (JMP)") + else + msg_admin_attack("Meteor dissipated without exploding at coords (JMP)") + spawn() + qdel(src) - if (A) - A.meteorhit(src) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) - if (--src.hits <= 0) - //Prevent meteors from blowing up the singularity's containment. - //Changing emitter and generator ex_act would result in them being bomb and C4 proof. - if(!istype(A,/obj/machinery/power/emitter) && \ - !istype(A,/obj/machinery/field_generator) && \ - prob(detonation_chance)) - explosion(loc, power, power + power_step, power + power_step * 2, power + power_step * 3, 0) - qdel(src) - return /obj/effect/meteor/ex_act(severity) @@ -128,37 +161,83 @@ /obj/effect/meteor/big name = "big meteor" hits = 5 - power = 1 + power = 4 + power_step = 1 + detonation_chance = 60 + shieldsoundrange = 310//This can be set larger than the dimensions of the map, to allow it to remain louder at extreme distance ex_act(severity) return Bump(atom/A) - spawn(0) - //Prevent meteors from blowing up the singularity's containment. - //Changing emitter and generator ex_act would result in them being bomb and C4 proof - if(!istype(A,/obj/machinery/power/emitter) && \ - !istype(A,/obj/machinery/field_generator)) - if(--src.hits <= 0) - qdel(src) //Dont blow up singularity containment if we get stuck there. + if (!done) + spawn(0) + //Prevent meteors from blowing up the singularity's containment. + //Changing emitter and generator ex_act would result in them being bomb and C4 proof + if(!istype(A,/obj/machinery/power/emitter) && \ + !istype(A,/obj/machinery/field_generator)) + if(--src.hits <= 0) + qdel(src) //Dont blow up singularity containment if we get stuck there. - if (A) - for(var/mob/M in player_list) - var/turf/T = get_turf(M) - if(!T || T.z != src.z) - continue - shake_camera(M, 3, get_dist(M.loc, src.loc) > 20 ? 1 : 3) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) - explosion(src.loc, 0, 1, 2, 3, 0) + if (istype(A, /obj/effect/energy_field))//If a big meteor impacts an energy field, then it detonates immediately with reduced power + done = 1 + hits = 0 + power *= 0.5 + power_step *= 0.5 + for(var/mob/M in player_list) + var/turf/T = get_turf(M) + if(!T || T.z != src.z) + continue + shake_camera(M, 3, get_dist(M.loc, src.loc) > 20 ? 1 : 3) + var/turf/T = src.loc + if (!T) + T = A.loc - if (--src.hits <= 0) - if(prob(detonation_chance) && !istype(A, /obj/structure/grille)) + if (T) + meteor_shield_impact_sound(T, shieldsoundrange) explosion(loc, power, power + power_step, power + power_step * 2, power + power_step * 3, 0) - qdel(src) - return + msg_admin_attack("Large Meteor impacted energy field and then exploded at coords (JMP)") + spawn()//Have to delay the qdel a little, or the playsound will throw a runtime + qdel(src) + + else if (A) + for(var/mob/M in player_list) + var/turf/T = get_turf(M) + if(!T || T.z != src.z) + continue + shake_camera(M, 3, get_dist(M.loc, src.loc) > 20 ? 1 : 3) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) + explosion(src.loc, 0, 1, 2, 3, 0) + + if (--src.hits == 0 && !done) + done = 1 + if(prob(detonation_chance) && !istype(A, /obj/structure/grille)) + explosion(loc, power, power + power_step, power + power_step * 2, power + power_step * 3, 0) + msg_admin_attack("Large Meteor exploded at coords (JMP)") + else + msg_admin_attack("Large Meteor dissipated without a final explosion at coords (JMP)") + spawn() + qdel(src) + /obj/effect/meteor/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/pickaxe)) qdel(src) return ..() + +//This function takes a turf to prevent race conditions, as the object calling it will probably be deleted in the same frame +/proc/meteor_shield_impact_sound(var/turf/T, var/range) + //The supplied volume is reduced by an amount = distance - viewrange * 2, viewrange is 7 i think + + //Calculate the supplied volume so it will be heard with slightly > 0 volume at the maximum range. + //The +1 gives it that tiny amount + range = ((range - world.view) * 2)+1 + + + for(var/mob/M in world) + if(M.client && M.z == T.z) + if(M.ear_deaf <= 0 || !M.ear_deaf) + M.playsound_local(T, 'sound/effects/meteorimpact.ogg', range, 1, usepressure = 0) + + diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 2a96edcea94..1eaefc57ec6 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -5,9 +5,7 @@ /datum/game_mode/nuclear name = "Mercenary" round_description = "A mercenary strike force is approaching the station!" - extended_round_description = "NanoTrasen's wealth and success created several enemies over the years,\ - and many seek to undermine them using illegal ways. Their crown jewel research stations are not safe from those\ - malicious activities." + extended_round_description = "NanoTrasen's wealth and success created several enemies over the years and many seek to undermine them using illegal ways. Their crown jewel research stations are not safe from those malicious activities." config_tag = "mercenary" required_players = 15 required_enemies = 1 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index e2393b117bc..81fbcfa080b 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -9,6 +9,6 @@ uplink_welcome = "AntagCorp Uplink Console:" uplink_uses = 10 end_on_antag_death = 0 - shuttle_delay = 3 +// shuttle_delay = 3 antag_tags = list(MODE_REVOLUTIONARY, MODE_LOYALIST) require_all_templates = 1 diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index b59c603bc84..dc90cb0b929 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -90,6 +90,7 @@ /datum/job/qm title = "Quartermaster" flag = QUARTERMASTER + head_position = 1 department = "Cargo" department_flag = CIVILIAN faction = "Station" diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 8de924339dc..1a045628be3 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -44,8 +44,8 @@ spawn_positions = 3 supervisors = "the chief medical officer" selection_color = "#ffeef0" - access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) - minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology) + access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_eva) + minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_eva) alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist") equip(var/mob/living/carbon/human/H) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b4e75b046ff..4347085e3a3 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -137,6 +137,7 @@ H.dna.UpdateUI() H.set_cloned_appearance() + H.regenerate_icons() update_icon() for(var/datum/language/L in R.languages) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 90879901373..89cf42acf89 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -90,21 +90,31 @@ var/icon/side = active1.fields["photo_side"] user << browse_rsc(front, "front.png") user << browse_rsc(side, "side.png") - dat += text(" \ -
    \ - Name: [active1.fields["name"]]
    \ - ID: [active1.fields["id"]]
    \n \ - Sex: [active1.fields["sex"]]
    \n \ - Age: [active1.fields["age"]]
    \n \ - Rank: [active1.fields["rank"]]
    \n \ - Citizenship: [active1.fields["citizenship"]]
    \n \ - Home System: [active1.fields["home_system"]]
    \n \ - Religion: [active1.fields["religion"]]
    \n \ - Fingerprint: [active1.fields["fingerprint"]]
    \n \ - Physical Status: [active1.fields["p_stat"]]
    \n \ - Mental Status: [active1.fields["m_stat"]]

    \n \ - Employment/skills summary:
    [decode(active1.fields["notes"])]
    Photo:
    \ -
    ") + dat += text({" +
    \ +Name: [active1.fields["name"]]
    +ID: [active1.fields["id"]]
    +Sex: [active1.fields["sex"]]
    +Age: [active1.fields["age"]]
    +Rank: [active1.fields["rank"]]
    +Citizenship: [active1.fields["citizenship"]]
    +Home System: [active1.fields["home_system"]]
    +Religion: [active1.fields["religion"]]
    +Fingerprint: [active1.fields["fingerprint"]]
    +Physical Status: [active1.fields["p_stat"]]
    +Mental Status: [active1.fields["m_stat"]]

    Photo:
    +
    +

    Employment/skills summary:

    [decode(active1.fields["notes"])]

    +

    CCIA Notes:

    [nl2br(decode(active1.fields["ccia_record"]))]

    "}) + + //Add the CCIA Actions + dat+= text({"

    CCIA Actions:

    "}) + for (var/list/action in active1.fields["ccia_actions"]) + dat+= text("") + dat+= text("") + dat+= text("
    TitleTypeCCIA Thread
    [action[1]][action[2]]Open
    [nl2br(action[4])]


    ") + + else dat += "General Record Lost!
    " dat += text("\nDelete Record (ALL)

    \nPrint Record
    \nBack
    ", src, src, src) @@ -159,6 +169,9 @@ What a mess.*/ if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) switch(href_list["choice"]) +// Open Action URL + if("openActionUrl") + usr << link(href_list["url"]) // SORTING! if("Sorting") // Reverse the order if clicked twice @@ -277,7 +290,7 @@ What a mess.*/ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc ) P.info = "
    Employment Record

    " if ((istype(active1, /datum/data/record) && data_core.general.Find(active1))) - P.info += text("Name: [] ID: []
    \nSex: []
    \nAge: []
    \nFingerprint: []
    \nPhysical Status: []
    \nMental Status: []
    \nEmployment/Skills Summary:
    \n[]
    ", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"], decode(active1.fields["notes"])) + P.info += text("Name: [] ID: []
    \nSex: []
    \nAge: []
    \nFingerprint: []
    \nPhysical Status: []
    \nMental Status: []
    \nEmployment/Skills Summary:
    \n[]

    CCIA Actions / Records:
    This terminal is not authorized to print CCIA records and/or notes", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"], decode(active1.fields["notes"])) else P.info += "General Record Lost!
    " P.info += "" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index efe0f2f6e80..6124abb4ebe 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -3,6 +3,7 @@ icon = 'icons/obj/doors/Doorint.dmi' icon_state = "door_closed" power_channel = ENVIRON + hatch_colour = "#7d7d7d" explosion_resistance = 10 var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. @@ -33,6 +34,7 @@ var/obj/item/device/magnetic_lock/bracer = null var/open_sound_powered = 'sound/machines/airlock.ogg' var/open_sound_unpowered = 'sound/machines/airlock_creaking.ogg' + hashatch = 1 /obj/machinery/door/airlock/attack_generic(var/mob/user, var/damage) if(stat & (BROKEN|NOPOWER)) @@ -57,6 +59,7 @@ name = "Airlock" icon = 'icons/obj/doors/Doorcom.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_com + hatch_colour = "#446892" /obj/machinery/door/airlock/sac name = "Airlock" @@ -71,26 +74,45 @@ name = "Airlock" icon = 'icons/obj/doors/Doorsec.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_sec + hatch_colour = "#c82b2b" /obj/machinery/door/airlock/engineering name = "Airlock" icon = 'icons/obj/doors/Dooreng.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_eng + hatch_colour = "#caa638" /obj/machinery/door/airlock/medical name = "Airlock" icon = 'icons/obj/doors/Doormed.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_med + hatch_colour = "#d2d2d2" /obj/machinery/door/airlock/maintenance name = "Maintenance Access" icon = 'icons/obj/doors/Doormaint.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_mai + hatch_colour = "#7d7d7d" /obj/machinery/door/airlock/external name = "External Airlock" icon = 'icons/obj/doors/Doorext.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_ext + hashatch = 0 + +/obj/machinery/door/airlock/science + name = "Airlock" + icon = 'icons/obj/doors/Doorsci.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_science + hatch_colour = "#d2d2d2" + +/obj/machinery/door/airlock/glass_science + name = "Glass Airlocks" + icon = 'icons/obj/doors/Doorsciglass.dmi' + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_science + glass = 1 + hatch_colour = "#d2d2d2" /obj/machinery/door/airlock/glass name = "Glass Airlock" @@ -101,11 +123,13 @@ explosion_resistance = 5 opacity = 0 glass = 1 + hatch_colour = "#eaeaea" /obj/machinery/door/airlock/centcom name = "Airlock" icon = 'icons/obj/doors/Doorele.dmi' opacity = 0 + hatch_colour = "#606061" /obj/machinery/door/airlock/vault name = "Vault" @@ -114,6 +138,7 @@ opacity = 1 secured_wires = 1 assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. + hashatch = 0 /obj/machinery/door/airlock/vault/bolted icon_state = "door_locked" @@ -124,6 +149,7 @@ icon = 'icons/obj/doors/Doorfreezer.dmi' opacity = 1 assembly_type = /obj/structure/door_assembly/door_assembly_fre + hatch_colour = "#ffffff" /obj/machinery/door/airlock/hatch name = "Airtight Hatch" @@ -131,6 +157,15 @@ explosion_resistance = 20 opacity = 1 assembly_type = /obj/structure/door_assembly/door_assembly_hatch + hatch_colour = "#5b5b5b" + var/hatch_colour_bolted = "#695a5a" + + update_icon()//Special hatch colour setting for this one snowflakey door that changes color when bolted + if(density && locked && lights && src.arePowerSystemsOn()) + hatch_image.color = hatch_colour_bolted + else + hatch_image.color = hatch_colour + ..() /obj/machinery/door/airlock/maintenance_hatch name = "Maintenance Hatch" @@ -138,6 +173,7 @@ explosion_resistance = 20 opacity = 1 assembly_type = /obj/structure/door_assembly/door_assembly_mhatch + hatch_colour = "#7d7d7d" /obj/machinery/door/airlock/glass_command name = "Maintenance Hatch" @@ -148,6 +184,7 @@ opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_com glass = 1 + hatch_colour = "#345882" /obj/machinery/door/airlock/glass_engineering name = "Maintenance Hatch" @@ -158,6 +195,7 @@ opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_eng glass = 1 + hatch_colour = "#caa638" /obj/machinery/door/airlock/glass_security name = "Maintenance Hatch" @@ -168,6 +206,7 @@ opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_sec glass = 1 + hatch_colour = "#b81b1b" /obj/machinery/door/airlock/glass_medical name = "Maintenance Hatch" @@ -178,21 +217,25 @@ opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_med glass = 1 + hatch_colour = "#d2d2d2" /obj/machinery/door/airlock/mining name = "Mining Airlock" icon = 'icons/obj/doors/Doormining.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_min + hatch_colour = "#c29142" /obj/machinery/door/airlock/atmos name = "Atmospherics Airlock" icon = 'icons/obj/doors/Dooratmo.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_atmo + hatch_colour = "#caa638" /obj/machinery/door/airlock/research name = "Airlock" icon = 'icons/obj/doors/Doorresearch.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_research + hatch_colour = "#d2d2d2" /obj/machinery/door/airlock/glass_research name = "Maintenance Hatch" @@ -204,6 +247,7 @@ assembly_type = /obj/structure/door_assembly/door_assembly_research glass = 1 heat_proof = 1 + hatch_colour = "#d2d2d2" /obj/machinery/door/airlock/glass_mining name = "Maintenance Hatch" @@ -214,6 +258,7 @@ opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_min glass = 1 + hatch_colour = "#c29142" /obj/machinery/door/airlock/glass_atmos name = "Maintenance Hatch" @@ -224,41 +269,45 @@ opacity = 0 assembly_type = /obj/structure/door_assembly/door_assembly_atmo glass = 1 + hatch_colour = "#caa638" + + /obj/machinery/door/airlock/gold name = "Gold Airlock" icon = 'icons/obj/doors/Doorgold.dmi' mineral = "gold" + hatch_colour = "#dbbb2b" /obj/machinery/door/airlock/silver name = "Silver Airlock" icon = 'icons/obj/doors/Doorsilver.dmi' mineral = "silver" + hatch_colour = "#ffffff" /obj/machinery/door/airlock/diamond name = "Diamond Airlock" icon = 'icons/obj/doors/Doordiamond.dmi' mineral = "diamond" + hatch_colour = "#66eeee" -/obj/machinery/door/airlock/uranium - name = "Uranium Airlock" - desc = "And they said I was crazy." - icon = 'icons/obj/doors/Dooruranium.dmi' - mineral = "uranium" - var/last_event = 0 -/obj/machinery/door/airlock/process() - // Deliberate no call to parent. - if(main_power_lost_until > 0 && world.time >= main_power_lost_until) - regainMainPower() - if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) - regainBackupPower() +/obj/machinery/door/airlock/sandstone + name = "Sandstone Airlock" + icon = 'icons/obj/doors/Doorsand.dmi' + mineral = "sandstone" + hatch_colour = "#efc8a8" + +/obj/machinery/door/airlock/highsecurity + name = "Secure Airlock" + icon = 'icons/obj/doors/hightechsecurity.dmi' + explosion_resistance = 20 + secured_wires = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity + hatch_colour = "#5a5a66" - else if(electrified_until > 0 && world.time >= electrified_until) - electrify(0) - ..() /obj/machinery/door/airlock/uranium/process() if(world.time > last_event+20) @@ -267,16 +316,28 @@ last_event = world.time ..() +//---Uranium doors +/obj/machinery/door/airlock/uranium + name = "Uranium Airlock" + desc = "And they said I was crazy." + icon = 'icons/obj/doors/Dooruranium.dmi' + mineral = "uranium" + var/last_event = 0 + hatch_colour = "#004400" + /obj/machinery/door/airlock/uranium/proc/radiate() for(var/mob/living/L in range (3,src)) L.apply_effect(15,IRRADIATE,0) return + +//---Phoron door /obj/machinery/door/airlock/phoron name = "Phoron Airlock" desc = "No way this can end badly." icon = 'icons/obj/doors/Doorphoron.dmi' mineral = "phoron" + hatch_colour = "#891199" /obj/machinery/door/airlock/phoron/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300) @@ -297,29 +358,22 @@ new/obj/structure/door_assembly( src.loc ) qdel(src) -/obj/machinery/door/airlock/sandstone - name = "Sandstone Airlock" - icon = 'icons/obj/doors/Doorsand.dmi' - mineral = "sandstone" +//------------------------- -/obj/machinery/door/airlock/science - name = "Airlock" - icon = 'icons/obj/doors/Doorsci.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_science +/obj/machinery/door/airlock/process() + // Deliberate no call to parent. + if(main_power_lost_until > 0 && world.time >= main_power_lost_until) + regainMainPower() + + if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) + regainBackupPower() + + else if(electrified_until > 0 && world.time >= electrified_until) + electrify(0) + + ..() -/obj/machinery/door/airlock/glass_science - name = "Glass Airlocks" - icon = 'icons/obj/doors/Doorsciglass.dmi' - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_science - glass = 1 -/obj/machinery/door/airlock/highsecurity - name = "Secure Airlock" - icon = 'icons/obj/doors/hightechsecurity.dmi' - explosion_resistance = 20 - secured_wires = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity /* About the new airlock wires panel: @@ -510,6 +564,13 @@ About the new airlock wires panel: overlays += image(icon, "welded") else if (health < maxhealth * 3/4 && !(stat & NOPOWER)) overlays += image(icon, "sparks_damaged") + + if (hashatch) + if (hatchstate) + hatch_image.icon_state = "[hatchstyle]_open" + else + hatch_image.icon_state = hatchstyle + overlays += hatch_image else icon_state = "door_open" if((stat & BROKEN) && !(stat & NOPOWER)) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 00101893e94..b24cedc257f 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -19,7 +19,7 @@ var/icon_state_closed = null var/icon_state_closing = null - closed_layer = 3.3 // Above airlocks when closed + closed_layer = 3.4 // Above airlocks when closed var/id = 1.0 dir = 1 explosion_resistance = 25 @@ -144,7 +144,7 @@ if(stat & BROKEN) stat &= ~BROKEN - + /obj/machinery/door/blast/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(air_group) return 1 return ..() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 21d64016037..668bc53a553 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -30,6 +30,19 @@ var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened. var/close_door_at = 0 //When to automatically close the door, if possible + var/hashatch = 0//If 1, this door has hatches, and certain small creatures can move through them without opening the door + var/hatchstate = 0//0: closed, 1: open + var/hatchstyle = "1x1" + var/hatch_offset_x = 0 + var/hatch_offset_y = 0 + var/hatch_colour = "#FFFFFF" + var/hatch_open_sound = 'sound/machines/hatch_open.ogg' + var/hatch_close_sound = 'sound/machines/hatch_close.ogg' + + var/hatchclosetime //A world.time value to tell us when the hatch should close + + var/image/hatch_image + //Multi-tile doors dir = EAST var/width = 1 @@ -67,8 +80,41 @@ health = maxhealth update_nearby_tiles(need_rebuild=1) + if (hashatch) + setup_hatch() return +/obj/machinery/door/proc/setup_hatch() + + if (overlays != null) + hatch_image = image('icons/obj/doors/hatches.dmi', src, hatchstyle, closed_layer+0.1) + hatch_image.color = hatch_colour + hatch_image.pixel_x = hatch_offset_x + hatch_image.pixel_y = hatch_offset_y + + overlays += hatch_image + update_icon() + else + spawn(10) + setup_hatch() + +/obj/machinery/door/proc/open_hatch(var/atom/mover = null) + if (!hatchstate) + hatchstate = 1 + update_icon() + playsound(src.loc, hatch_open_sound, 40, 1, -1) + hatchclosetime = world.time + 29 + + if (istype(mover, /mob/living/silicon)) + var/mob/living/silicon/S = mover + S.under_door() + + +/obj/machinery/door/proc/close_hatch() + hatchstate = 0//hatch stays open for 3 seconds + update_icon() + playsound(src.loc, hatch_close_sound, 30, 1, -1) + /obj/machinery/door/Destroy() density = 0 update_nearby_tiles() @@ -82,6 +128,8 @@ close() else close_door_at = 0 + if (hatchstate && world.time > hatchclosetime) + close_hatch() /obj/machinery/door/proc/can_open() if(!density || operating || !ticker) @@ -138,8 +186,12 @@ /obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(air_group) return !block_air_zones - if(istype(mover) && mover.checkpass(PASSGLASS)) - return !opacity + if (istype(mover)) + if(mover.checkpass(PASSGLASS)) + return !opacity + if(density && hashatch && mover.checkpass(PASSDOORHATCH)) + open_hatch(mover) + return 1//If this door is closed, but it has hatches, and this creature can go through hatches. Then we let it through without opening return !density diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 10020ec0dee..d93ba6e3bad 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -20,11 +20,13 @@ density = 0 layer = DOOR_OPEN_LAYER - 0.01 open_layer = DOOR_OPEN_LAYER - 0.01 // Just below doors when open - closed_layer = DOOR_CLOSED_LAYER + 0.01 // Just above doors when closed + closed_layer = DOOR_CLOSED_LAYER + 0.2 // Just above doors when closed //These are frequenly used with windows, so make sure zones can pass. //Generally if a firedoor is at a place where there should be a zone boundery then there will be a regular door underneath it. block_air_zones = 0 + hashatch = 1 + hatch_colour = "#f7d003" var/blocked = 0 var/lockdown = 0 // When the door has detected a problem, it locks. @@ -207,14 +209,14 @@ if(density && istype(C, /obj/item/weapon/screwdriver)) hatch_open = !hatch_open - user.visible_message("[user] has [hatch_open ? "opened" : "closed"] \the [src] maintenance hatch.", - "You have [hatch_open ? "opened" : "closed"] the [src] maintenance hatch.") + user.visible_message("[user] has [hatch_open ? "opened" : "closed"] \the [src] maintenance panel.", + "You have [hatch_open ? "opened" : "closed"] the [src] maintenance panel.") update_icon() return if(blocked && istype(C, /obj/item/weapon/crowbar) && !repairing) if(!hatch_open) - user << "You must open the maintenance hatch first!" + user << "You must open the maintenance panel first!" else user.visible_message("[user] is removing the electronics from \the [src].", "You start to remove the electronics from [src].") @@ -338,13 +340,15 @@ return /obj/machinery/door/firedoor/close() + overlays.Cut() latetoggle() return ..() /obj/machinery/door/firedoor/open(var/forced = 0) + overlays.Cut() if(hatch_open) hatch_open = 0 - visible_message("The maintenance hatch of \the [src] closes.") + visible_message("The maintenance panel of \the [src] closes.") update_icon() if(!forced) @@ -383,6 +387,13 @@ for(var/i=1;i<=ALERT_STATES.len;i++) if(dir_alerts[d] & (1<<(i-1))) overlays += new/icon(icon,"alert_[ALERT_STATES[i]]", dir=cdir) + if (hashatch) + hatch_image.color = hatch_colour//This line is unnecessary, but is here for configuring colours ingame. Should be removed when finished + if (hatchstate) + hatch_image.icon_state = "[hatchstyle]_open" + else + hatch_image.icon_state = hatchstyle + overlays += hatch_image else icon_state = "door_open" if(blocked) diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index a2d599fa007..a9896e8b310 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -1,6 +1,8 @@ //Terribly sorry for the code doubling, but things go derpy otherwise. /obj/machinery/door/airlock/multi_tile width = 2 + hatch_offset_x = 16 + hatch_colour = "#d2d2d2" /obj/machinery/door/airlock/multi_tile/New() ..() @@ -17,4 +19,23 @@ icon = 'icons/obj/doors/Door2x1glass.dmi' opacity = 0 glass = 1 - assembly_type = /obj/structure/door_assembly/multi_tile \ No newline at end of file + assembly_type = /obj/structure/door_assembly/multi_tile + +/obj/machinery/door/airlock/multi_tile/setup_hatch() + + if (overlays != null) + hatch_image = image('icons/obj/doors/hatches.dmi', src, hatchstyle, closed_layer+0.1) + hatch_image.color = hatch_colour + switch(dir) + if(EAST, WEST) + hatch_image.pixel_x = hatch_offset_x + hatch_image.pixel_y = hatch_offset_y + else + hatch_image.pixel_x = hatch_offset_y + hatch_image.pixel_y = hatch_offset_x + hatch_image.transform = turn(hatch_image.transform, 90) + + overlays += hatch_image + else + spawn(10)//If overlays aren't initialised, wait a second and try again + setup_hatch() \ No newline at end of file diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 692662e6d2f..99bdb423679 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -72,12 +72,11 @@ sleep(50) close() return - var/mob/M = AM // we've returned by here if M is not a mob if (!( ticker )) return if (src.operating) return - if (src.density && !M.small && src.allowed(AM)) + if (src.density && src.allowed(AM)) open() if(src.check_access(null)) sleep(50) diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 90305a7a786..363edf64f53 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -13,7 +13,7 @@ datum/track/New(var/title_name, var/audio) icon = 'icons/obj/jukebox.dmi' icon_state = "jukebox2-nopower" var/state_base = "jukebox2" - anchored = 1 + anchored = 0 density = 1 power_channel = EQUIP use_power = 1 @@ -33,6 +33,9 @@ datum/track/New(var/title_name, var/audio) new/datum/track("Part A", 'sound/misc/TestLoop1.ogg'), new/datum/track("Scratch", 'sound/music/title1.ogg'), new/datum/track("Trai`Tor", 'sound/music/traitor.ogg'), + new/datum/track("Thunderdome", 'sound/music/THUNDERDOME.ogg'), + new/datum/track("Space Oddity", 'sound/music/space_oddity.ogg'), + new/datum/track("Space Asshole", 'sound/music/space_asshole.ogg'), ) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 307b504b074..d517091a1f0 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -618,7 +618,6 @@ var/list/turret_icons else A = new projectile(loc) playsound(loc, shot_sound, 75, 1) - A.original = target // Lethal/emagged turrets use twice the power due to higher energy beams // Emagged turrets again use twice as much power due to higher firing rates @@ -626,19 +625,9 @@ var/list/turret_icons //Turrets aim for the center of mass by default. //If the target is grabbing someone then the turret smartly aims for extremities - var/obj/item/weapon/grab/G = locate() in target - if(G && G.state >= GRAB_NECK) //works because mobs are currently not allowed to upgrade to NECK if they are grabbing two people. - A.def_zone = pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg") - else - A.def_zone = pick("chest", "groin") + var/def_zone = get_exposed_defense_zone(target) - //Shooting Code: - A.current = T - A.starting = T - A.yo = U.y - T.y - A.xo = U.x - T.x - spawn(1) - A.process() + A.launch(target, def_zone) /datum/turret_checks var/enabled diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 87edc01204c..d4a327f054c 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -261,26 +261,17 @@ A = new /obj/item/projectile/beam/lastertag/blue( loc ) if(6) A = new /obj/item/projectile/beam/lastertag/red( loc ) - A.original = target use_power(500) else A = new /obj/item/projectile/energy/electrode( loc ) use_power(200) - + //Turrets aim for the center of mass by default. //If the target is grabbing someone then the turret smartly aims for extremities - var/obj/item/weapon/grab/G = locate() in target - if(G && G.state >= GRAB_NECK) //works because mobs are currently not allowed to upgrade to NECK if they are grabbing two people. - A.def_zone = pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg") - else - A.def_zone = pick("chest", "groin") - - A.current = T - A.starting = T - A.yo = U.y - T.y - A.xo = U.x - T.x - spawn( 0 ) - A.process() + var/def_zone = get_exposed_defense_zone(target) + + A.launch(target, def_zone) + return @@ -507,25 +498,16 @@ cur_target = null return src.set_dir(get_dir(src,target)) - var/turf/targloc = get_turf(target) - var/target_x = targloc.x - var/target_y = targloc.y - var/target_z = targloc.z - targloc = null spawn for(var/i=1 to min(projectiles, projectiles_per_shot)) if(!src) break var/turf/curloc = get_turf(src) - targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z) - if (!targloc || !curloc) - continue - if (targloc == curloc) - continue + playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1) var/obj/item/projectile/A = new /obj/item/projectile(curloc) src.projectiles-- - A.current = curloc - A.yo = targloc.y - curloc.y - A.xo = targloc.x - curloc.x - A.process() + + var/def_zone = get_exposed_defense_zone(target) + + A.launch(target, def_zone) sleep(2) return diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 01873e28c1e..67f76f83d50 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -202,7 +202,7 @@ return else if(handled) nanomanager.update_uis(src) - return // don't smack that machine with your 2 thalers + return // don't smack that machine with your 2 credits if (I || istype(W, /obj/item/weapon/spacecash)) attack_hand(user) @@ -530,12 +530,20 @@ if(coin.string_attached) if(prob(50)) user << "\blue You successfully pull the coin out before \the [src] could swallow it." + src.visible_message("\blue The [src] putters to life, coughing out its 'premium' item after a moment.") + playsound(src.loc, 'sound/items/poster_being_created.ogg', 50, 1) else - user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all." + user << "\red You weren't able to pull the coin out fast enough, the machine ate it, string and all." + src.visible_message("\blue The [src] putters to life, coughing out its 'premium' item after a moment.") + playsound(src.loc, 'sound/items/poster_being_created.ogg', 50, 1) qdel(coin) + coin = null categories &= ~CAT_COIN else + src.visible_message("\blue The [src] putters to life, coughing out its 'premium' item after a moment.") + playsound(src.loc, 'sound/items/poster_being_created.ogg', 50, 1) qdel(coin) + coin = null categories &= ~CAT_COIN R.amount-- @@ -694,7 +702,10 @@ /obj/item/weapon/reagent_containers/food/drinks/flask/barflask = 2, /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask = 2, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30,/obj/item/weapon/reagent_containers/food/drinks/ice = 9, /obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 2,/obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 2, - /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 2,/obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 5) + /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 2,/obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 5, + /obj/item/weapon/reagent_containers/food/drinks/bottle/chartreusegreen = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/chartreuseyellow =5, + /obj/item/weapon/reagent_containers/food/drinks/bottle/cremewhite = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/brandy = 4, + /obj/item/weapon/reagent_containers/food/drinks/bottle/guinnes = 4, /obj/item/weapon/reagent_containers/food/drinks/bottle/drambuie = 4) contraband = list(/obj/item/weapon/reagent_containers/food/drinks/tea = 10) vend_delay = 15 idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 61eaa214da9..de4c60d1a3b 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -48,14 +48,11 @@ /obj/item/mecha_parts/mecha_equipment/weapon/proc/Fire(atom/A, atom/target, turf/aimloc) var/obj/item/projectile/P = A - P.shot_from = src - P.original = target - P.starting = P.loc - P.current = P.loc - P.firer = chassis.occupant - P.yo = aimloc.y - P.loc.y - P.xo = aimloc.x - P.loc.x - P.process() + var/def_zone + if (chassis && istype(chassis.occupant, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = chassis.occupant + def_zone = H.zone_sel.selecting + P.launch(target, def_zone) /obj/item/mecha_parts/mecha_equipment/weapon/energy name = "general energy weapon" @@ -280,4 +277,4 @@ return "* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""]\[[src.projectiles]\]" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/rearm() - return//Extra bit of security \ No newline at end of file + return//Extra bit of security diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 1fc5b6f9f61..cec76e16dc3 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -132,6 +132,7 @@ ), + "Hardsuit Modules" = list(), diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4ae15667f74..73377d7a517 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -41,7 +41,8 @@ var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers. var/zoomdevicename = null //name used for message when binoculars/scope is used var/zoom = 0 //1 if item is actively being used to zoom. For scoped guns and binoculars. - + var/contained_sprite = 0 //1 if item_state, lefthand, righthand, and worn sprite are all in one dmi + var/item_state = null // Used to specify the item state for the on-mob overlays. var/item_state_slots = null //overrides the default item_state for particular slots. diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index e01237c2270..46450071afb 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -973,7 +973,7 @@ var/global/list/obj/item/device/pda/PDAs = list() t = reception.message if(reception.message_server && (reception.telecomms_reception & TELECOMMS_RECEPTION_SENDER)) // only send the message if it's stable - if(reception.telecomms_reception & TELECOMMS_RECEPTION_RECEIVER == 0) // Does our recipient have a broadcaster on their level? + if(!(reception.telecomms_reception & TELECOMMS_RECEPTION_RECEIVER)) // Does our recipient have a broadcaster on their level? U << "ERROR: Cannot reach recipient." return var/send_result = reception.message_server.send_pda_message("[P.owner]","[owner]","[t]") @@ -1198,6 +1198,7 @@ var/global/list/obj/item/device/pda/PDAs = list() user.drop_item() C.loc = src pai = C + pai.update_location()//This notifies the pAI that they've been slotted into a PDA user << "You slot \the [C] into [src]." nanomanager.update_uis(src) // update all UIs attached to src else if(istype(C, /obj/item/weapon/pen)) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 7edf72e9a50..3e3910ef0b0 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -323,4 +323,24 @@ if(pai && pai.client && !pai.canmove) var/rendered = "[text]" pai.show_message(rendered, 2) - ..() \ No newline at end of file + ..() + +/obj/item/device/paicard/dropped(mob/user) + + ///When an object is put into a container, drop fires twice. + //once with it on the floor, and then once in the container + //We only care about the second one + if (istype(loc, /obj/item/weapon/storage)) //The second drop reads the container its placed into as the location + update_location() + + +/obj/item/device/paicard/equipped(var/mob/user, var/slot) + ..() + update_location(slot) + +/obj/item/device/paicard/proc/update_location(var/slotnumber = null) + if (!slotnumber) + if (istype(loc, /mob)) + slotnumber = get_equip_slot() + + report_onmob_location(1, slotnumber, pai) \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 6e1677d3ab0..62253e31101 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -292,6 +292,9 @@ /* ###### Radio headsets can only broadcast through subspace ###### */ if(subspace_transmission) + // Check for jamming. + if (within_jamming_range(src)) + return // First, we want to generate a new radio signal var/datum/signal/signal = new signal.transmission_method = 2 // 2 would be a subspace transmission. @@ -434,6 +437,8 @@ return -1 if(!listening) return -1 + if (within_jamming_range(src)) + return -1 if(!(0 in level)) var/turf/position = get_turf(src) if(!position || !(position.z in level)) @@ -652,4 +657,4 @@ return /obj/item/device/radio/off - listening = 0 \ No newline at end of file + listening = 0 diff --git a/code/game/objects/items/devices/radio_jammer.dm b/code/game/objects/items/devices/radio_jammer.dm new file mode 100644 index 00000000000..ba6828d24a6 --- /dev/null +++ b/code/game/objects/items/devices/radio_jammer.dm @@ -0,0 +1,130 @@ +//Global list for housing active radiojammers: +var/list/active_radio_jammers = list() + +proc/within_jamming_range(var/atom/test) // tests if an object is near a radio jammer + if (active_radio_jammers && active_radio_jammers.len) + for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) + if (get_dist(test, Jammer) <= Jammer.radius) + return 1 + + return 0 + +/obj/item/device/radiojammer + name = "radio jammer" + desc = "A small, inconspicious looking item with an 'ON/OFF' toggle." + icon = 'icons/obj/device.dmi' + icon_state = "shield0" + w_class = 2 + + var/active = 0 + var/radius = 7 + var/icon_state_active = "shield1" + var/icon_state_inactive = "shield0" + +/obj/item/device/radiojammer/New() + ..() + update() + +/obj/item/device/radiojammer/Destroy() + if (active) + active_radio_jammers -= src + ..() + + +/obj/item/device/radiojammer/attack_self() + toggle() + + +/obj/item/device/radiojammer/emp_act() + toggle() + + +/obj/item/device/radiojammer/proc/toggle() + if (active) + usr << "You deactivate \the [src]." + else + usr << "You activate \the [src]." + set_active(!active) + + +/obj/item/device/radiojammer/proc/set_active(var/new_value) + active = new_value + update() + + +/obj/item/device/radiojammer/proc/update() + if (active) + active_radio_jammers += src + icon_state = icon_state_active + else + active_radio_jammers -= src + icon_state = icon_state_inactive + + +/obj/item/device/radiojammer/improvised + name = "improvised radio jammer" + desc = "An awkward bundle of wires, batteries, and radio transmitters." + var/obj/item/weapon/cell/cell + var/obj/item/device/assembly_holder/assembly_holder + // 10 seconds of operation on a standard cell. 200 (roughly 3 minutes) on a super cap. + var/power_drain_per_second = 100 + var/last_updated = null + radius = 5 + icon = 'icons/obj/assemblies/new_assemblies.dmi' + icon_state_active = "improvised_jammer_active" + icon_state_inactive = "improvised_jammer_inactive" + + +/obj/item/device/radiojammer/improvised/New(var/obj/item/device/assembly_holder/incoming_holder, var/obj/item/weapon/cell/incoming_cell, var/mob/user) + ..() + cell = incoming_cell + assembly_holder = incoming_holder + + // Spawn() required to properly move the assembly. Why? No clue! + // This does not make any sense, but sure. + spawn(0) + incoming_holder.forceMove(src, 1) + incoming_cell.forceMove(src, 1) + + user.put_in_active_hand(src) + +/obj/item/device/radiojammer/improvised/Destroy() + if (active) + processing_objects.Remove(src) + ..() + + +/obj/item/device/radiojammer/improvised/process() + var/current = world.time // current tick + var/delta = (current - last_updated) / 10.0 // delta in seconds + last_updated = current + if (!cell.use(delta * power_drain_per_second)) + set_active(0) + cell.charge = 0 // drain the last of the battery + + +/obj/item/device/radiojammer/improvised/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/screwdriver)) + user << "You disassemble the improvised signal jammer." + user.put_in_hands(assembly_holder) + user.put_in_hands(cell) + qdel(src) + +/obj/item/device/radiojammer/improvised/set_active(var/new_value) + if (new_value == 1) + if (!cell || !cell.charge) + return + + ..() + +/obj/item/device/radiojammer/improvised/update() + if (active) + active_radio_jammers += src + icon_state = icon_state_active + processing_objects.Add(src) + + last_updated = world.time + else + active_radio_jammers -= src + icon_state = icon_state_inactive + processing_objects.Remove(src) diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm index 54062ff8530..96f4e03407b 100644 --- a/code/game/objects/items/glassjar.dm +++ b/code/game/objects/items/glassjar.dm @@ -71,7 +71,7 @@ if(contains != 1) return var/obj/item/weapon/spacecash/S = W - user.visible_message("[user] puts [S.worth] [S.worth > 1 ? "thalers" : "thaler"] into \the [src].") + user.visible_message("[user] puts [S.worth] [S.worth > 1 ? "credits" : "credit"] into \the [src].") user.drop_from_inventory(S) S.loc = src update_icon() diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index f85bc336be9..a71c2bc5455 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -6,6 +6,9 @@ icon_state = "tube" origin_tech = "materials=4;engineering=3" amount = 10 + + var/list/construction_cost = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000) + var/construction_time = 5 /obj/item/stack/nanopaste/attack(mob/living/M as mob, mob/user as mob) diff --git a/code/game/objects/items/weapons/material/swords.dm b/code/game/objects/items/weapons/material/swords.dm index 69c805dcef4..8d2339af756 100644 --- a/code/game/objects/items/weapons/material/swords.dm +++ b/code/game/objects/items/weapons/material/swords.dm @@ -4,6 +4,7 @@ icon_state = "claymore" item_state = "claymore" slot_flags = SLOT_BELT|SLOT_BACK + w_class = 4 force_divisor = 0.7 // 42 when wielded with hardnes 60 (steel) thrown_force_divisor = 0.5 // 10 when thrown with weight 20 (steel) sharp = 1 @@ -28,3 +29,35 @@ /obj/item/weapon/material/sword/katana/suicide_act(mob/user) viewers(user) << "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku." return(BRUTELOSS) + +/obj/item/weapon/material/sword/rapier + name = "rapier" + desc = "A slender, fancy and sharply pointed sword." + icon_state = "rapier" + item_state = "claymore" + slot_flags = SLOT_BELT + attack_verb = list("attacked", "stabbed", "prodded", "poked", "lunged") + +/obj/item/weapon/material/sword/longsword + name = "longsword" + desc = "A double-edged large blade." + icon_state = "longsword" + item_state = "claymore" + slot_flags = SLOT_BELT | SLOT_BACK + +/obj/item/weapon/material/sword/trench + name = "trench knife" + desc = "A military knife used to slash and stab enemies in close quarters." + force_divisor = 0.4 + icon_state = "trench" + item_state = "knife" + w_class = 3 + flags = NOSHIELD + slot_flags = SLOT_BELT + +/obj/item/weapon/material/sword/sabre + name = "sabre" + desc = "A sharp curved backsword." + icon_state = "sabre" + item_state = "katana" + slot_flags = SLOT_BELT diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 2bba23c6c13..4ac80d56471 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -60,7 +60,7 @@ name = "energy glaive" desc = "An energized glaive." icon_state = "eglaive0" - active_force = 60 + active_force = 40 active_throwforce = 60 active_w_class = 5 force = 20 diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index c5efdae1fb1..250133a98d6 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -14,3 +14,40 @@ suicide_act(mob/user) viewers(user) << "\red [user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide." return (OXYLOSS) + +/obj/item/weapon/melee/chainsword + name = "chainsword" + desc = "A deadly chainsaw in the shape of a sword." + icon = 'icons/obj/weapons.dmi' + icon_state = "chainswordoff" + flags = CONDUCT + slot_flags = SLOT_BELT + force = 15 + throwforce = 7 + w_class = 4 + sharp = 1 + edge = 1 + origin_tech = "combat=5" + attack_verb = list("chopped", "sliced", "shredded", "slashed", "cut", "ripped") + hitsound = 'sound/weapons/bladeslice.ogg' + var/active = 0 + +/obj/item/weapon/melee/chainsword/attack_self(mob/user) + active= !active + if(active) + playsound(user, 'sound/weapons/circsawhit.ogg', 50, 1) + user << "\blue \The [src] rumbles to life." + force = 35 + hitsound = 'sound/weapons/circsawhit.ogg' + icon_state = "chainswordon" + slot_flags = null + else + user << "\blue \The [src] slowly powers down." + force = initial(force) + hitsound = initial(hitsound) + icon_state = initial(icon_state) + slot_flags = initial(slot_flags) + +/obj/item/weapon/melee/chainsword/suicide_act(mob/user) + viewers(user) << "\red [user] is slicing \himself apart with the [src.name]! It looks like \he's trying to commit suicide." + return (BRUTELOSS|OXYLOSS) diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index fe1247cc899..ab91ad3eca3 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -18,13 +18,19 @@ var/global/list/cached_icons = list() flags = OPENCONTAINER var/paint_type = "red" + attack(mob/M as mob, mob/user as mob, def_zone) + if(istype(M, /mob/living/)) + user.visible_message("\The [M] has been splashed with something by [user] to no effect!") + reagents.trans_to_turf(M.loc, 5) + return + afterattack(turf/simulated/target, mob/user, proximity) - if(!proximity) return + if(!proximity) + return if(istype(target) && reagents.total_volume > 5) user.visible_message("\The [target] has been splashed with something by [user]!") reagents.trans_to_turf(target, 5) - else - return ..() + return New() if(paint_type && lentext(paint_type) > 0) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 6b42af95405..78b7d9ad024 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -215,7 +215,7 @@ if(prob(5)) remove_fuel(1) - if(get_fuel() == 0) + if(get_fuel() < 1) setWelding(0) //I'm not sure what this does. I assume it has to do with starting fires... @@ -324,14 +324,13 @@ src.w_class = 4 welding = 1 update_icon() - processing_objects |= src + set_processing(1) else if(M) M << "You need more welding fuel to complete this task." return //Otherwise else if(!set_welding && welding) - processing_objects -= src if(M) M << "You switch \the [src] off." else if(T) @@ -340,8 +339,18 @@ src.damtype = "brute" src.w_class = initial(src.w_class) src.welding = 0 + set_processing(0) update_icon() + +//A wrapper function for the experimental tool to override +/obj/item/weapon/weldingtool/proc/set_processing(var/state = 0) + if (state == 1) + processing_objects.Add(src) + else + processing_objects.Remove(src) + + //Decides whether or not to damage a player's eyes based on what they're wearing as protection //Note: This should probably be moved to mob /obj/item/weapon/weldingtool/proc/eyecheck(mob/user as mob) @@ -396,25 +405,62 @@ /obj/item/weapon/weldingtool/hugetank name = "upgraded welding tool" max_fuel = 80 - w_class = 3.0 + w_class = 2.0 matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120) origin_tech = "engineering=3" + + + +//The Experimental Welding Tool! /obj/item/weapon/weldingtool/experimental name = "experimental welding tool" + desc = "A scientifically-enhanced welding tool that uses fuel-producing microbes to gradually replenish its fuel supply" max_fuel = 40 - w_class = 3.0 + w_class = 2.0 matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120) - origin_tech = "engineering=4;phorontech=3" + origin_tech = "engineering=4;biotech=4" var/last_gen = 0 + var/fuelgen_delay = 800//The time, in deciseconds, required to regenerate one unit of fuel + //800 = 1 unit per 1 minute and 20 seconds, + //This is roughly half the rate that fuel is lost if the welder is left idle, so it you carelessly leave it on it will still run out +/obj/item/weapon/weldingtool/Destroy() + processing_objects.Remove(src)//Stop processing when destroyed regardless of conditions + ..() + + +//Make sure the experimental tool only stops processing when its turned off AND full +/obj/item/weapon/weldingtool/experimental/set_processing(var/state = 0) + if (state == 1) + processing_objects.Add(src) + last_gen = world.time + else if (welding == 0 && get_fuel() >= max_fuel) + processing_objects.Remove(src) + + +/obj/item/weapon/weldingtool/experimental/process() + ..() + fuel_gen() /obj/item/weapon/weldingtool/experimental/proc/fuel_gen()//Proc to make the experimental welder generate fuel, optimized as fuck -Sieve - var/gen_amount = ((world.time-last_gen)/25) - reagents += (gen_amount) - if(reagents > max_fuel) - reagents = max_fuel + + if (get_fuel() < max_fuel) + var/gen_amount = ((world.time-last_gen)/fuelgen_delay) + var/remainder = max_fuel - get_fuel() + gen_amount = min(gen_amount, remainder) + reagents.add_reagent("fuel", gen_amount) + //reagents += (gen_amount) + + if(get_fuel() >= max_fuel) + //reagents = max_fuel + set_processing(0) + else + set_processing(0) + last_gen = world.time + + /* * Crowbar diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 38a988012c3..d9579719291 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -32,11 +32,6 @@ /obj/item/weapon/nullrod/attack(mob/M as mob, mob/living/user as mob) //Paste from old-code to decult with a null rod. - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - - msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") - if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") user << "You don't have the dexterity to do this!" return @@ -47,7 +42,7 @@ user.Paralyse(20) return - if (M.stat !=2 && ishuman(M)) + if (M.stat !=2 && ishuman(M) && user.a_intent != I_HURT) var/mob/living/K = M if(cult && (K.mind in cult.current_antagonists) && prob(33)) if(do_after(user, 15)) @@ -55,7 +50,7 @@ var/choice = alert(K,"Do you want to give up your goal?","Become cleansed","Resist","Give in") switch(choice) if("Resist") - K.visible_message("\red The gaze in [K]'s eyes remains determined.", "\blue You turn away from the light, remaining true to your dark lord. The light burns you due to rejection!") + K.visible_message("\red The gaze in [K]'s eyes remains determined.", "\blue You turn away from the light, remaining true to your dark lord. Anathema!") K.say("*scream") K.take_overall_damage(5, 15) if("Give in") @@ -72,6 +67,13 @@ user << "The rod appears to do nothing." M.visible_message("\The [user] waves \the [src] over \the [M]'s head.") return + M.attack_log += text("\[[time_stamp()]\] Is being deconverted with the [src.name] by [user.name] ([user.ckey])") + user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attempt to deconvert [M.name] ([M.ckey])") + + msg_admin_attack("[key_name(user)] attempted to deconvert [key_name(M)] with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") + + else + return ..() /obj/item/weapon/nullrod/afterattack(atom/A, mob/user as mob, proximity) if(!proximity) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 0c4703fe9ae..af720a7736a 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -73,6 +73,13 @@ return if(W.loc != user) // This should stop mounted modules ending up outside the module. return + if(W.abstract) //Prevents 'abstract' items (such as grabs) from creeping into the material realm. + if(istype(W, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = W + user << "[G.affecting] just doesn't fit!" + else + user << "[W] does not belong there!" + return user.drop_item() if(W) W.forceMove(src.loc) diff --git a/code/game/sound.dm b/code/game/sound.dm index 310ad7e8030..58d8a7ce4e9 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -47,7 +47,7 @@ var/list/footstepfx = list("defaultstep","concretestep","grassstep","dirtstep"," var/const/FALLOFF_SOUNDS = 0.5 -/mob/proc/playsound_local(var/turf/turf_source, soundin, vol as num, vary, frequency, falloff, is_global) +/mob/proc/playsound_local(var/turf/turf_source, soundin, vol as num, vary, frequency, falloff, is_global, var/usepressure = 1) if(!src.client || ear_deaf > 0) return if(soundin in footstepfx) @@ -59,7 +59,7 @@ var/const/FALLOFF_SOUNDS = 0.5 var/sound/S = sound(soundin) S.wait = 0 //No queue S.channel = 0 //Any channel - S.volume = vol + S.environment = -1 if (vary) if(frequency) @@ -74,30 +74,36 @@ var/const/FALLOFF_SOUNDS = 0.5 //sound volume falloff with distance var/distance = get_dist(T, turf_source) - S.volume -= max(distance - world.view, 0) * 2 //multiplicative falloff to add on top of natural audio falloff. + vol -= max(distance - world.view, 0) * 2 //multiplicative falloff to add on top of natural audio falloff. + //Not sure if author understood what they were doing, but this is not multiplicative, its linear, and its implementation breaks longdistance sounds. + //This extra falloff should probably be rewritten or removed, but for now ive implemented a quick fix by only setting S.volume to vol after calculations are done + //This fix allows feeding in high volume values (>100) to make longrange sounds audible + // -Nanako - //sound volume falloff with pressure - var/pressure_factor = 1.0 + if (usepressure) + //sound volume falloff with pressure. Pass usepressure = 0 to disable these calculations + var/pressure_factor = 1.0 - var/datum/gas_mixture/hearer_env = T.return_air() - var/datum/gas_mixture/source_env = turf_source.return_air() + var/datum/gas_mixture/hearer_env = T.return_air() + var/datum/gas_mixture/source_env = turf_source.return_air() - if (hearer_env && source_env) - var/pressure = min(hearer_env.return_pressure(), source_env.return_pressure()) + if (hearer_env && source_env) + var/pressure = min(hearer_env.return_pressure(), source_env.return_pressure()) - if (pressure < ONE_ATMOSPHERE) - pressure_factor = max((pressure - SOUND_MINIMUM_PRESSURE)/(ONE_ATMOSPHERE - SOUND_MINIMUM_PRESSURE), 0) - else //in space - pressure_factor = 0 + if (pressure < ONE_ATMOSPHERE) + pressure_factor = max((pressure - SOUND_MINIMUM_PRESSURE)/(ONE_ATMOSPHERE - SOUND_MINIMUM_PRESSURE), 0) + else //in space + pressure_factor = 0 - if (distance <= 1) - pressure_factor = max(pressure_factor, 0.15) //hearing through contact + if (distance <= 1) + pressure_factor = max(pressure_factor, 0.15) //hearing through contact - S.volume *= pressure_factor + vol *= pressure_factor - if (S.volume <= 0) + if (vol <= 0) return //no volume means no sound + S.volume = vol var/dx = turf_source.x - T.x // Hearing from the right/left S.x = dx var/dz = turf_source.y - T.y // Hearing from infront/behind @@ -112,6 +118,8 @@ var/const/FALLOFF_SOUNDS = 0.5 src << S + + /client/proc/playtitlemusic() if(!ticker || !ticker.login_music) return if(prefs.toggles & SOUND_LOBBY) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index b39063e3fc9..2fa4d08ce5e 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -420,9 +420,12 @@ if(istype(src, /turf/simulated)) var/turf/simulated/T = src T.dirt = 0 + T.color = null for(var/obj/effect/O in src) - if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) + if(istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) qdel(O) + if(istype(O,/obj/effect/rune)) + user << "\red No matter how well you wash, the bloody symbols remain!" else user << "\The [source] is too dry to wash that." source.reagents.trans_to_turf(src, 1, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. diff --git a/code/global.dm b/code/global.dm index a2948510017..2dbd6d65b9e 100644 --- a/code/global.dm +++ b/code/global.dm @@ -94,9 +94,10 @@ var/blobevent = 0 var/diary = null var/href_logfile = null var/station_name = "NSS Exodus" +var/commstation_name = "NMSS Odin" var/game_version = "Baystation12" var/changelog_hash = "" -var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 544) +var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 442) var/going = 1.0 var/master_mode = "extended" // "extended" @@ -178,7 +179,7 @@ var/datum/moduletypes/mods = new() var/wavesecret = 0 var/gravity_is_on = 1 -var/join_motd = null +var/datum/server_greeting/server_greeting = null var/forceblob = 0 var/datum/nanomanager/nanomanager = new() // NanoManager, the manager for Nano UIs. diff --git a/code/modules/admin/DB ban/ban_mirroring.dm b/code/modules/admin/DB ban/ban_mirroring.dm index 0ecc78a62dc..56e9a26efc2 100644 --- a/code/modules/admin/DB ban/ban_mirroring.dm +++ b/code/modules/admin/DB ban/ban_mirroring.dm @@ -113,8 +113,6 @@ var/DBQuery/query = dbcon.NewQuery("SELECT ban_mirror_id, player_ckey, ban_mirror_ip, ban_mirror_computerid, date(ban_mirror_datetime) as datetime FROM ss13_ban_mirrors WHERE ban_id = :ban_id") query.Execute(list(":ban_id" = ban_id)) - testing("Ban ID: [ban_id]") - var/mirrors[] = list() while (query.NextRow()) var/items[] = list() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index ee9d318c3a2..681c773b6e9 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -77,7 +77,8 @@ proc/admin_notice(var/message, var/rights) OOC | PRAY | ADMINHELP | - DEADCHAT\] + DEADCHAT | + AOOC\] (toggle all) "} diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm deleted file mode 100644 index 4bcaf10d9c7..00000000000 --- a/code/modules/admin/admin_memo.dm +++ /dev/null @@ -1,54 +0,0 @@ -#define MEMOFILE "data/memo.sav" //where the memos are saved -#define ENABLE_MEMOS 1 //using a define because screw making a config variable for it. This is more efficient and purty. - -//switch verb so we don't spam up the verb lists with like, 3 verbs for this feature. -/client/proc/admin_memo(task in list("write","show","delete")) - set name = "Memo" - set category = "Server" - if(!ENABLE_MEMOS) return - if(!check_rights(0)) return - switch(task) - if("write") admin_memo_write() - if("show") admin_memo_show() - if("delete") admin_memo_delete() - -//write a message -/client/proc/admin_memo_write() - var/savefile/F = new(MEMOFILE) - if(F) - var/memo = sanitize(input(src,"Type your memo\n(Leaving it blank will delete your current memo):","Write Memo",null) as null|message, extra = 0) - switch(memo) - if(null) - return - if("") - F.dir.Remove(ckey) - src << "Memo removed" - return - if( findtext(memo,"[memo]" - message_admins("[key] set an admin memo:
    [memo]") - -//show all memos -/client/proc/admin_memo_show() - if(ENABLE_MEMOS) - var/savefile/F = new(MEMOFILE) - if(F) - for(var/ckey in F.dir) - src << "
    Admin Memo by [F[ckey]]
    " - -//delete your own or somebody else's memo -/client/proc/admin_memo_delete() - var/savefile/F = new(MEMOFILE) - if(F) - var/ckey - if(check_rights(R_SERVER,0)) //high ranking admins can delete other admin's memos - ckey = input(src,"Whose memo shall we remove?","Remove Memo",null) as null|anything in F.dir - else - ckey = src.ckey - if(ckey) - F.dir.Remove(ckey) - src << "Removed Memo created by [ckey]." - -#undef MEMOFILE -#undef ENABLE_MEMOS \ No newline at end of file diff --git a/code/modules/admin/admin_server_greeting.dm b/code/modules/admin/admin_server_greeting.dm new file mode 100644 index 00000000000..5f49aab6240 --- /dev/null +++ b/code/modules/admin/admin_server_greeting.dm @@ -0,0 +1,80 @@ +/* + * A file containing the admin commands for interfacing with the server_greeting datum. + */ +/client/proc/admin_edit_motd() + set name = "Edit MotD" + set category = "Server" + + if (!check_rights(R_SERVER)) + return + + var/new_message = input(usr, "Please edit the Message of the Day as necessary.", "Message of the Day", server_greeting.motd) as message + + if (!new_message) + new_message = "
    This is a palceholder. Pester your staff to change it!
    " + + server_greeting.update_value("motd", new_message) + message_admins("[ckey] has edited the message of the day:
    [html_encode(new_message)]") + +/client/proc/admin_memo_control(task in list("write", "delete")) + set name = "Edit Memos" + set category = "Server" + + if (!check_rights(R_ADMIN)) + return + + switch (task) + if ("write") + admin_memo_write() + if ("delete") + admin_memo_delete() + +/client/proc/admin_memo_write() + var/current_memo = "" + if (server_greeting.memo_list.len && server_greeting.memo_list[ckey]) + current_memo = server_greeting.memo_list[ckey] + + var/new_memo = input(usr, "Please write your memo.", "Memo", current_memo) as message + + if (server_greeting.update_value("memo_write", list(ckey, new_memo))) + src << "Operation carried out successfully." + message_admins("[ckey] wrote a new memo:
    [html_encode(new_memo)]") + else + src << "Error carrying out desired operation." + + return + +/client/proc/admin_memo_delete() + if (!server_greeting.memo_list.len) + src << "No memos are currently saved." + return + + if (!check_rights(R_SERVER)) + if (!server_greeting.memo_list[ckey]) + src << "You do not have a memo saved. Cancelling." + + else if (alert("Do you wish to delete your own memo, written on [server_greeting.memo_list[ckey]["date"]]?", "Choices", "Yes", "No") == "Yes") + if (server_greeting.update_value("memo_delete", ckey)) + src << "Operation carried out successfully." + message_admins("[ckey] has deleted their own memo.") + else + src << "Error carrying out desired operation." + + else + src << "Cancelled." + + return + else + var/input = input(usr, "Whose memo shall we delete?", "Remove Memo", null) as null|anything in server_greeting.memo_list + + if (!input) + src << "Cancelled." + return + + if (server_greeting.update_value("memo_delete", input)) + src << "Operation carried out successfully." + message_admins("[ckey] has deleted the memo of [input].") + else + src << "Error carrying out desired operation." + + return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 597b0a14329..9ace60e9af4 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -50,7 +50,7 @@ var/list/admin_verbs_admin = list( /client/proc/rename_silicon, /*properly renames silicons*/ /client/proc/manage_silicon_laws, /* Allows viewing and editing silicon laws. */ /client/proc/check_antagonists, - /client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/ + /client/proc/admin_memo_control, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/ /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ /client/proc/toggleprayers, /*toggles prayers on/off*/ // /client/proc/toggle_hear_deadcast, /*toggles whether we hear deadchat*/ @@ -155,7 +155,8 @@ var/list/admin_verbs_server = list( /datum/admins/proc/toggle_space_ninja, /client/proc/toggle_random_events, /client/proc/check_customitem_activity, - /client/proc/nanomapgen_DumpImage + /client/proc/nanomapgen_DumpImage, + /client/proc/admin_edit_motd ) var/list/admin_verbs_debug = list( /client/proc/getruntimelog, /*allows us to access runtime logs to somebody*/ @@ -296,7 +297,8 @@ var/list/admin_verbs_mod = list( /client/proc/toggleattacklogs, /client/proc/cmd_admin_check_contents, /client/proc/check_words, /*displays cult-words*/ - /client/proc/check_ai_laws /*shows AI and borg laws*/ + /client/proc/check_ai_laws, /*shows AI and borg laws*/ + /client/proc/aooc ) var/list/admin_verbs_dev = list( //will need to be altered - Ryan784 diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm index 9260baf3dd7..02a47ea56e5 100644 --- a/code/modules/admin/verbs/antag-ooc.dm +++ b/code/modules/admin/verbs/antag-ooc.dm @@ -3,17 +3,28 @@ set name = "AOOC" set desc = "Antagonist OOC" - if(!check_rights(R_ADMIN)) return + if (istype(src.mob, /mob/dead/observer) && !check_rights(R_ADMIN|R_MOD, 0)) + src << "You cannot use AOOC while ghosting/observing!" + return + + if (src.prefs.muted & MUTE_AOOC) + src << "You are muted from speaking on AOOC!" + return msg = sanitize(msg) - if(!msg) return + if(!msg) + return var/display_name = src.key - if(holder && holder.fakekey) - display_name = holder.fakekey + if (holder) + display_name = "[display_name]([holder.rank])" + if (holder.fakekey) + display_name = holder.fakekey for(var/mob/M in mob_list) - if((M.mind && M.mind.special_role && M.client) || check_rights(R_ADMIN, 0, M)) + if (check_rights(R_ADMIN|R_MOD, 0, M)) + M << "" + create_text_tag("aooc", "Antag-OOC:", M.client) + " [get_options_bar(src, 0, 1, 1)](JMP): [msg]" + else if (M.mind && M.mind.special_role && M.client) M << "" + create_text_tag("aooc", "Antag-OOC:", M.client) + " [display_name]: [msg]" - log_ooc("(ANTAG) [key] : [msg]") \ No newline at end of file + log_ooc("(ANTAG) [key] : [msg]") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 7f7304569ff..41c202dfcaa 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -181,6 +181,7 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) if(MUTE_PRAY) mute_string = "pray" if(MUTE_ADMINHELP) mute_string = "adminhelp, admin PM and ASAY" if(MUTE_DEADCHAT) mute_string = "deadchat and DSAY" + if(MUTE_AOOC) mute_string = "AOOC" if(MUTE_ALL) mute_string = "everything" else return @@ -510,30 +511,63 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!holder) src << "Only administrators may use this command." return - var/input = sanitize(input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null, extra = 0) - var/customname = sanitizeSafe(input(usr, "Pick a title for the report.", "Title") as text|null) - if(!input) - return - if(!customname) - customname = "NanoTrasen Update" + var/reporttitle + var/reportbody + var/reporter + var/reporttype = input(usr, "Choose whether to use a template or custom report.", "Create Command Report") in list("Template", "Custom", "Cancel") + switch(reporttype) + if("Template") + establish_db_connection(dbcon) + if (!dbcon.IsConnected()) + src << "Unable to connect to the database." + return + var/DBQuery/query = dbcon.NewQuery("SELECT title, message FROM ss13_ccia_general_notice_list WHERE deleted_at IS NULL") + query.Execute() + + var/list/template_names = list() + var/list/templates = list() + + while (query.NextRow()) + template_names += query.item[1] + templates[query.item[1]] = query.item[2] + + // Catch empty list + if (!templates.len) + src << "There are no templates in the database." + return + + reporttitle = input(usr, "Please select a command report template.", "Create Command Report") in template_names + reportbody = templates[reporttitle] + + if("Custom") + reporttitle = sanitizeSafe(input(usr, "Pick a title for the report.", "Title") as text|null) + if(!reporttitle) + reporttitle = "NanoTrasen Update" + reportbody = sanitize(input(usr, "Please enter anything you want. Anything. Serious.", "Body", "") as message|null, extra = 0) + if(!reportbody) + return + else + return for (var/obj/machinery/computer/communications/C in machines) if(! (C.stat & (BROKEN|NOPOWER) ) ) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) - P.name = "'[command_name()] Update.'" - P.info = replacetext(input, "\n", "
    ") + P.name = "[command_name()] Update" + P.info = replacetext(reportbody, "\n", "
    ") P.update_space(P.info) P.update_icon() C.messagetitle.Add("[command_name()] Update") C.messagetext.Add(P.info) + reporter = sanitizeSafe(input(usr, "Please enter your name.", "Name") as text|null) + switch(alert("Should this be announced to the general population?",,"Yes","No")) if("Yes") - command_announcement.Announce(input, customname, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1); + command_announcement.Announce("[reportbody]\n\n- [reporter], Central Command Internal Affairs Agent, [commstation_name()]", reporttitle, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1); if("No") world << "\red New NanoTrasen Update available at all communication consoles." world << sound('sound/AI/commandreport.ogg') - log_admin("[key_name(src)] has created a command report: [input]") + log_admin("[key_name(src)] has created a command report: [reportbody]") message_admins("[key_name_admin(src)] has created a command report", 1) feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/warning.dm b/code/modules/admin/verbs/warning.dm index 3ad7a81bfff..2af51b06a0d 100644 --- a/code/modules/admin/verbs/warning.dm +++ b/code/modules/admin/verbs/warning.dm @@ -183,11 +183,10 @@ warnings_check() /* - * A proc to alert you if you have unacknowledged warnings. - * Called in /client/New (client procs.dm) + * A proc to gather notifications regarding your warnings. + * Called by /datum/preferences/proc/gather_notifications() in preferences.dm */ - -/client/proc/warnings_alert() +/client/proc/warnings_gather() var/count = 0 var/count_expire = 0 @@ -210,12 +209,13 @@ while (query.NextRow()) count++ + var/list/data = list("unread" = "", "expired" = "") if (count) - src << "
    " - src << "You have [count] unread [count > 1 ? "warnings" : "warning"]! Click here to review and acknowledge them!" + data["unread"] = "You have [count] unread [count > 1 ? "warnings" : "warning"]! Click here to review and acknowledge them!" if (count_expire) - src << "
    " - src << "[count_expire] of your warnings expired." + data["expired"] = "[count_expire] of your warnings have expired." + + return data /* * A proc for an admin/moderator to look up a member's warnings. diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 24e527d17b2..fe1464a5933 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -100,7 +100,11 @@ proc/signal() - if(!radio_connection) return + if(!radio_connection) + return + + if(within_jamming_range(src)) + return var/datum/signal/signal = new signal.source = src @@ -129,9 +133,18 @@ receive_signal(datum/signal/signal) - if(!signal) return 0 - if(signal.encryption != code) return 0 - if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0 + if(!signal) + return 0 + + if(within_jamming_range(src)) + return 0 + + if(signal.encryption != code) + return 0 + + if(!(src.wires & WIRE_RADIO_RECEIVE)) + return 0 + pulse(1) if(!holder) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index e8b61049289..742169994b1 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -135,6 +135,36 @@ return + // JSlink switch. + if (href_list["JSlink"]) + switch (href_list["JSlink"]) + if ("warnings") + src.warnings_check() + + if ("linking") + src.check_linking_requests() + + if ("dismiss") + if (href_list["notification"]) + var/datum/client_notification/a = locate(href_list["notification"]) + if (a && isnull(a.gcDestroyed)) + a.dismiss() + + if ("github") + if (!config.githuburl) + src << "Github URL not set in the config. Unable to open the site." + else if (alert("This will open the issue tracker in your browser. Are you sure?",, "Yes", "No") == "Yes") + src << link(config.githuburl) + + if ("forums") + src.forum() + + if ("wiki") + src.wiki() + + if ("webint") + src.open_webint() + ..() //redirect to hsrc.() /client/proc/handle_spam_prevention(var/message, var/mute_type) @@ -207,6 +237,8 @@ if(!prefs) prefs = new /datum/preferences(src) preferences_datums[ckey] = prefs + + prefs.gather_notifications(src) prefs.last_ip = address //these are gonna be used for banning prefs.last_id = computer_id //these are gonna be used for banning @@ -223,18 +255,6 @@ else del(src) return 0 - else if (byond_version < config.client_warn_version) - src << "Your version of BYOND may be out of date!" - src << config.client_warn_message - src << "Your version: [byond_version]." - src << "Required version to remove this message: [config.client_warn_version] or later." - src << "Visit http://www.byond.com/download/ to get the latest version of BYOND." - - if(custom_event_msg && custom_event_msg != "") - src << "

    Custom Event

    " - src << "

    A custom event is taking place. OOC Info:

    " - src << "[custom_event_msg]" - src << "
    " if( (world.address == address || !address) && !host ) host = key @@ -242,7 +262,6 @@ if(holder) add_admin_verbs() - admin_memo_show() // Forcibly enable hardware-accelerated graphics, as we need them for the lighting overlays. // (but turn them off first, since sometimes BYOND doesn't turn them on properly otherwise) @@ -252,20 +271,13 @@ sleep(2) // wait a bit more, possibly fixes hardware mode not re-activating right winset(src, null, "command=\".configure graphics-hwmode on\"") - warnings_alert() - - check_linking_requests() - send_resources() nanomanager.send_resources(src) - if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates. - src << "You have unread updates in the changelog." - winset(src, "rpane.changelog", "background-color=#eaeaea;font-style=bold") - if(config.aggressive_changelog) - src.changes() - + var/outdated_greeting_info = server_greeting.find_outdated_info(src) + if (outdated_greeting_info) + server_greeting.display_to_client(src, outdated_greeting_info) ////////////// //DISCONNECT// @@ -384,6 +396,11 @@ 'html/images/loading.gif', 'html/images/ntlogo.png', 'html/images/talisman.png', + 'html/bootstrap/css/bootstrap.min.css', + 'html/bootstrap/js/bootstrap.min.js', + 'html/bootstrap/js/html5shiv.min.js', + 'html/bootstrap/js/respond.min.js', + 'html/jquery/jquery-2.0.0.min.js', 'icons/pda_icons/pda_atmos.png', 'icons/pda_icons/pda_back.png', 'icons/pda_icons/pda_bell.png', @@ -424,7 +441,6 @@ 'icons/spideros_icons/sos_14.png' ) - /mob/proc/MayRespawn() return 0 @@ -481,6 +497,23 @@ src << browse(dat, "window=LinkingRequests") return +/client/proc/gather_linking_requests() + if (!config.webint_url || !config.sql_enabled) + return + + establish_db_connection(dbcon) + if (!dbcon.IsConnected()) + return + + var/DBQuery/select_query = dbcon.NewQuery("SELECT COUNT(*) AS request_count FROM ss13_player_linking WHERE status = 'new' AND player_ckey = :ckey AND deleted_at IS NULL") + select_query.Execute(list(":ckey" = ckey)) + + if (select_query.NextRow()) + if (text2num(select_query.item[1]) > 0) + return "You have [select_query.item[1]] account linking requests pending review. Click here to see them!" + + return null + /client/proc/process_webint_link(var/route, var/attributes) if (!route) return @@ -523,3 +556,9 @@ src << link(linkURL) return + +/client/verb/show_greeting() + set name = "Open Greeting" + set category = "OOC" + + server_greeting.display_to_client(src, server_greeting.find_outdated_info(src)) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 67ae29219d6..f6c3ad33b06 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -40,6 +40,7 @@ datum/preferences var/muted = 0 var/last_ip var/last_id + var/list/notifications = list() //A list of datums, for the dynamic server greeting window. //game-preferences var/lastchangelog = "" //Saved changlog filesize to detect if there was a change @@ -50,6 +51,8 @@ datum/preferences var/asfx_togs = ASFX_DEFAULT var/UI_style_color = "#ffffff" var/UI_style_alpha = 255 + var/motd_hash = "" //Hashes for the new server greeting window. + var/memo_hash = "" //character preferences var/real_name //our character's name @@ -125,6 +128,8 @@ datum/preferences var/sec_record = "" var/gen_record = "" var/exploit_record = "" + var/ccia_record = "" + var/list/ccia_actions = list() var/disabilities = 0 var/nanotrasen_relation = "Neutral" @@ -1729,6 +1734,8 @@ datum/preferences character.med_record = med_record character.sec_record = sec_record character.gen_record = gen_record + character.ccia_record = ccia_record + character.ccia_actions = ccia_actions character.exploit_record = exploit_record character.gender = gender @@ -1818,7 +1825,7 @@ datum/preferences if(!dbcon.IsConnected()) return open_load_dialog_file(user) - var/DBQuery/query = dbcon.NewQuery("SELECT id, name FROM ss13_characters WHERE ckey = :ckey ORDER BY id ASC") + var/DBQuery/query = dbcon.NewQuery("SELECT id, name FROM ss13_characters WHERE ckey = :ckey AND deleted_at IS NULL ORDER BY id ASC") query.Execute(list(":ckey" = user.client.ckey)) dat += "Select a character slot to load
    " diff --git a/code/modules/client/preferences_factions.dm b/code/modules/client/preferences_factions.dm index 5d56b921367..4ddd6d22de9 100644 --- a/code/modules/client/preferences_factions.dm +++ b/code/modules/client/preferences_factions.dm @@ -45,7 +45,7 @@ var/global/list/faction_choices = list( "Grayson Manufactories Ltd.", "Aether Atmospherics", "Zeng-Hu Pharmaceuticals", - "Hesphaistos Industries" + "Hephaestus Industries" ) var/global/list/religion_choices = list( diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 7fa789d9d93..215827c98cc 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -556,6 +556,32 @@ var/global/list/gear_datums = list() slot = slot_w_uniform allowed_roles = list("Security Officer","Head of Security","Warden") +//medical scrubs + +/datum/gear/bluescrub + display_name = "medical scrubs, blue" + path = /obj/item/clothing/under/rank/medical/blue + slot = slot_w_uniform + cost = 1 + +/datum/gear/greenscrub + display_name = "medical scrubs, green" + path = /obj/item/clothing/under/rank/medical/green + slot = slot_w_uniform + cost = 1 + +/datum/gear/purplescrub + display_name = "medical scrubs, purple" + path = /obj/item/clothing/under/rank/medical/purple + slot = slot_w_uniform + cost = 1 + +/datum/gear/blackscrub + display_name = "medical scrubs, black" + path = /obj/item/clothing/under/rank/medical/black + slot = slot_w_uniform + cost = 1 + // Attachments /datum/gear/armband_cargo @@ -600,7 +626,7 @@ var/global/list/gear_datums = list() slot = slot_tie cost = 1 -/datum/gear/armband_science +/datum/gear/armband_movement display_name = "armband, synthetic intelligence movement" path = /obj/item/clothing/accessory/armband/movement slot = slot_tie diff --git a/code/modules/client/preferences_notification.dm b/code/modules/client/preferences_notification.dm new file mode 100644 index 00000000000..0e347defd0e --- /dev/null +++ b/code/modules/client/preferences_notification.dm @@ -0,0 +1,198 @@ +/* + * A simple datum for storing notifications for dispaly. + */ +/datum/client_notification + var/datum/preferences/owner = null + + var/list/note_wrapper = list() + var/note_text = "" + + var/proc_src = null + var/proc_name = "" + var/proc_args = null + + var/persistent = 0 + +/datum/client_notification/New(var/datum/preferences/prefs, var/list/new_wrapper, var/new_text, var/new_persistence) + if (!prefs) + qdel(src) + return + + if (!new_wrapper || new_wrapper.len != 2) + qdel(src) + return + + if (!new_text) + qdel(src) + return + + owner = prefs + + note_wrapper = new_wrapper + note_text = new_text + + note_text = replacetextEx(note_text, ":src_ref", "\ref[src]") + note_wrapper[1] = replacetextEx(note_wrapper[1], ":src_ref", "\ref[src]") + + if (new_persistence) + persistent = new_persistence + +/datum/client_notification/Destroy() + if (owner) + owner.notifications -= src + owner = null + + ..() + +/* + * Associates a callback to be executed whenever a notification is dismissed. + */ +/datum/client_notification/proc/tie_callback(var/dismiss_proc_src, var/dismiss_proc, var/dismiss_proc_args) + if (!dismiss_proc_src || !dismiss_proc) + return + + proc_src = dismiss_proc_src + proc_name = dismiss_proc + + if (dismiss_proc_args) + proc_args = dismiss_proc_args + +/* + * Returns the HTML required to display this alert. + */ +/datum/client_notification/proc/get_html() + var/html = "
    [note_wrapper[1]]\n" + + if (!persistent) + html += "×\n" + + html += note_text + html += "\n[note_wrapper[2]]
    " + + return html + +/* + * Dismisses the notification, executing the proc that was set up as necessary. + */ +/datum/client_notification/proc/dismiss() + if (proc_src && proc_name) + call(proc_src, proc_name)(proc_args) + + if (!persistent) + qdel(src) + +/* + * Adds a new notification datum for later processing. + */ +/datum/preferences/proc/new_notification(var/type, var/text, var/persistent, var/callback_src, var/callback_proc, var/callback_args) + if (!text) + return + + var/list/wrapper + switch (type) + if ("success") + wrapper = list("
    ", "
    ") + if ("info") + wrapper = list("
    ", "
    ") + if ("warning") + wrapper = list("
    ", "
    ") + if ("danger") + wrapper = list("
    ", "
    ") + else + wrapper = list("
    ", "
    ") + + var/datum/client_notification/note = new(src, wrapper, text, persistent) + + if (callback_src && callback_proc) + note.tie_callback(callback_src, callback_proc, callback_args) + + notifications += note + +/* + * Gathers all notifications relevant to the client. + */ +/datum/preferences/proc/gather_notifications(var/client/user) + if (!user) + return + + if (user.byond_version < config.client_warn_version) + var/version_warn = "" + version_warn += "Your version of BYOND may be out of date!
    " + version_warn += config.client_warn_message + version_warn += "Your version: [user.byond_version].
    " + version_warn += "Required version to remove this message: [config.client_warn_version] or later.
    " + version_warn += "Visit http://www.byond.com/download/ to get the latest version of BYOND." + + new_notification("danger", version_warn) + + if (custom_event_msg && custom_event_msg != "") + var/custom_event_warn = "
    A custom event is taking place!

    " + custom_event_warn += "OOC Info:
    [custom_event_msg]" + + new_notification("danger", custom_event_warn) + + if (lastchangelog != changelog_hash) + winset(user, "rpane.changelog", "background-color=#eaeaea;font-style=bold") + if (config.aggressive_changelog) + new_notification("info", "You have unread updates in the changelog.", callback_src = user, callback_proc = "changes") + else + new_notification("info", "You have unread updates in the changelog.") + + if (config.sql_enabled) + + var/list/warnings = user.warnings_gather() + if (warnings["unread"]) + new_notification("danger", warnings["unread"], 1) + if (warnings["expired"]) + new_notification("info", warnings["expired"]) + + var/linking = user.gather_linking_requests() + if (linking) + new_notification("info", linking, callback_src = user, callback_proc = "check_linking_requests") + + var/cciaa_actions = count_ccia_actions(user) + if (cciaa_actions) + new_notification("info", cciaa_actions) + +/* + * Helper proc for getting a count of active CCIA actions against the player's character. + */ +/datum/preferences/proc/count_ccia_actions(var/client/user) + if (!user) + return null + + if (!establish_db_connection(dbcon)) + error("Error initiatlizing database connection while counting CCIA actions.") + return null + + var/DBQuery/prep_query = dbcon.NewQuery("SELECT id FROM ss13_characters WHERE ckey = :ckey") + prep_query.Execute(list(":ckey" = user.ckey)) + var/list/chars = list() + + while (prep_query.NextRow()) + chars += text2num(prep_query.item[1]) + + if (!chars.len) + return null + + var/DBQuery/query = dbcon.NewQuery({"SELECT + COUNT(act_chr.action_id) AS action_count + FROM ss13_ccia_action_char act_chr + JOIN ss13_characters chr ON act_chr.char_id = chr.id + JOIN ss13_ccia_actions act ON act_chr.action_id = act.id + WHERE + act_chr.char_id IN :char_id AND + (act.expires_at IS NULL OR act.expires_at >= CURRENT_DATE()) AND + act.deleted_at IS NULL;"}) + query.Execute(list(":char_id" = chars)) + + if (query.NextRow()) + var/action_count = text2num(query.item[1]) + + if (action_count == 0) + return null + + var/string = "There are [action_count] active CCIA actions currently active against your character(s)." + return string + + return null diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index fa067bd9818..70408104e93 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -57,10 +57,14 @@ S["UI_style_color"] >> UI_style_color S["UI_style_alpha"] >> UI_style_alpha S["asfx_togs"] >> asfx_togs + S["motd_hash"] >> motd_hash + S["memo_hash"] >> memo_hash //Sanitize ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) + motd_hash = sanitize_text(motd_hash, initial(motd_hash)) + memo_hash = sanitize_text(memo_hash, initial(memo_hash)) UI_style = sanitize_inlist(UI_style, list("White", "Midnight","Orange","old"), initial(UI_style)) be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) default_slot = sanitize_integer(default_slot, 1, config.character_slots, initial(default_slot)) @@ -87,6 +91,8 @@ S["default_slot"] << default_slot S["toggles"] << toggles S["asfx_togs"] << asfx_togs + S["motd_hash"] << motd_hash + S["memo_hash"] << memo_hash return 1 diff --git a/code/modules/client/preferences_sql.dm b/code/modules/client/preferences_sql.dm index 9e265ad3ec3..1cbd946b3f1 100644 --- a/code/modules/client/preferences_sql.dm +++ b/code/modules/client/preferences_sql.dm @@ -11,7 +11,9 @@ UI_style_color, UI_style_alpha, be_special, - asfx_togs + asfx_togs, + motd_hash, + memo_hash FROM ss13_player_preferences WHERE ckey = :ckey"}) query.Execute(list(":ckey" = C.ckey)) @@ -28,10 +30,14 @@ UI_style_alpha = text2num(query.item[7]) be_special = text2num(query.item[8]) asfx_togs = text2num(query.item[9]) + motd_hash = query.item[10] + memo_hash = query.item[11] //Sanitize ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) + motd_hash = sanitize_text(motd_hash, initial(motd_hash)) + memo_hash = sanitize_text(memo_hash, initial(memo_hash)) UI_style = sanitize_inlist(UI_style, list("White", "Midnight","Orange","old"), initial(UI_style)) be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) default_slot = sanitize_integer(default_slot, 1, config.character_slots, initial(default_slot)) @@ -61,7 +67,9 @@ UI_style_color = :ui_color, UI_style_alpha = :ui_alpha, be_special = :be_special, - asfx_togs = :asfx_togs + asfx_togs = :asfx_togs, + motd_hash = :motd_hash, + memo_hash = :memo_hash WHERE ckey = :ckey"}) update_query.Execute(get_prefs_update_insert_params(C)) @@ -71,8 +79,8 @@ if (!C) return 0 - var/DBQuery/query = dbcon.NewQuery({"INSERT INTO ss13_player_preferences (ckey, ooccolor, lastchangelog, UI_style, current_character, toggles, UI_style_color, UI_style_alpha, be_special, asfx_togs) - VALUES (:ckey, :ooccolor, :lastchangelog, :ui_style, :current_character, :toggles, :ui_color, :ui_alpha, :be_special, :asfx_togs);"}) + var/DBQuery/query = dbcon.NewQuery({"INSERT INTO ss13_player_preferences (ckey, ooccolor, lastchangelog, UI_style, current_character, toggles, UI_style_color, UI_style_alpha, be_special, asfx_togs, motd_hash, memo_hash) + VALUES (:ckey, :ooccolor, :lastchangelog, :ui_style, :current_character, :toggles, :ui_color, :ui_alpha, :be_special, :asfx_togs, :motd_hash, :memo_hash);"}) query.Execute(get_prefs_update_insert_params(C)) return 1 @@ -92,6 +100,8 @@ params[":ui_alpha"] = UI_style_alpha params[":be_special"] = be_special params[":asfx_togs"] = asfx_togs + params[":motd_hash"] = motd_hash + params[":memo_hash"] = memo_hash return params @@ -177,7 +187,8 @@ dat.uplink_location, dat.organs_data, dat.organs_robotic, - dat.gear + dat.gear, + flv.records_ccia FROM ss13_characters dat JOIN ss13_characters_flavour flv ON dat.id = flv.char_id WHERE dat.id = :char_id"}) @@ -191,6 +202,35 @@ new_character_sql(C) return 0 + var/DBQuery/ccia_action_query = dbcon.NewQuery({"SELECT + act.title, + act.type, + act.issuedby, + act.details, + act.url, + act.expires_at + FROM ss13_ccia_action_char act_chr + JOIN ss13_characters chr ON act_chr.char_id = chr.id + JOIN ss13_ccia_actions act ON act_chr.action_id = act.id + WHERE + act_chr.char_id = ':char_id' AND + (act.expires_at IS NULL OR act.expires_at >= CURRENT_DATE()) AND + act.deleted_at IS NULL; + "}) + if (!ccia_action_query.Execute(list(":char_id" = current_character))) + error("Error CCIA Actions for character #[current_character]. SQL error message: '[character_query.ErrorMsg()]'.") + + while(ccia_action_query.NextRow()) + var/list/action = list( + ccia_action_query.item[1], + ccia_action_query.item[2], + ccia_action_query.item[3], + ccia_action_query.item[4], + ccia_action_query.item[5], + ccia_action_query.item[6] + ) + ccia_actions.Add(list(action)) + var/DBQuery/char_id_update = dbcon.NewQuery("UPDATE ss13_player_preferences SET current_character = :char_id WHERE ckey = :ckey") char_id_update.Execute(list(":char_id" = current_character, ":ckey" = C.ckey)) @@ -279,6 +319,7 @@ med_record = character_query.item[45] sec_record = character_query.item[46] exploit_record = character_query.item[47] + ccia_record = character_query.item[60] // Miscellaneous disabilities = text2num(character_query.item[48]) @@ -651,10 +692,10 @@ if (!query.NextRow()) return 0 - var/DBQuery/delete_query = dbcon.NewQuery("DELETE FROM ss13_characters WHERE id = :id") + var/DBQuery/delete_query = dbcon.NewQuery("UPDATE ss13_characters SET deleted_at = NOW() WHERE id = :id") delete_query.Execute(list(":id" = current_character)) - var/DBQuery/select_query = dbcon.NewQuery("SELECT id FROM ss13_characters WHERE ckey = :ckey ORDER BY id ASC LIMIT 1") + var/DBQuery/select_query = dbcon.NewQuery("SELECT id FROM ss13_characters WHERE ckey = :ckey AND deleted_at IS NULL ORDER BY id ASC LIMIT 1") select_query.Execute(list(":ckey" = C.ckey)) if (select_query.NextRow()) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 1ba580635be..5700a143e2d 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -113,20 +113,20 @@ /obj/item/clothing/glasses/regular/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/clothing/glasses/hud/health)) user.drop_item() - del(W) + qdel(W) user << "You attach a set of medical HUDs to your glasses." var/turf/T = get_turf(src) new /obj/item/clothing/glasses/hud/health/prescription(T) user.drop_from_inventory(src) - del(src) + qdel(src) if(istype(W, /obj/item/clothing/glasses/hud/security)) user.drop_item() - del(W) + qdel(W) user << "You attach a set of security HUDs to your glasses." var/turf/T = get_turf(src) new /obj/item/clothing/glasses/hud/security/prescription(T) user.drop_from_inventory(src) - del(src) + qdel(src) /obj/item/clothing/glasses/regular/scanners name = "Scanning Goggles" diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index f1e2644a225..de60ad65e37 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -123,7 +123,7 @@ /obj/item/clothing/gloves/red/tajara name = "red gloves" desc = "Red gloves made for Tajaran use." - species_restricted = list("Tajaran") + species_restricted = list("Tajara") /obj/item/clothing/gloves/blue/unathi name = "blue gloves" diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index ee9f16e1a24..dadf4e56290 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -118,6 +118,8 @@ name = "mounted energy gun" desc = "A forearm-mounted energy projector." icon_state = "egun" + construction_cost= list(DEFAULT_WALL_MATERIAL=7000,"glass"=2250,"uranium"=3250,"gold"=2500) + construction_time = 300 interface_name = "mounted energy gun" interface_desc = "A forearm-mounted suit-powered energy gun." @@ -129,6 +131,8 @@ name = "mounted taser" desc = "A palm-mounted nonlethal energy projector." icon_state = "taser" + construction_cost = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 5250) + construction_time = 300 usable = 0 diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index d39113480c9..3955f2c6611 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -36,6 +36,9 @@ activates_on_touch = 1 confined_use = 1 + construction_cost = list("glass" = 7500, DEFAULT_WALL_MATERIAL = 5000) + construction_time = 300 + engage_string = "Eject AI" activate_string = "Enable Dataspike" deactivate_string = "Disable Dataspike" @@ -359,6 +362,9 @@ activates_on_touch = 1 disruptive = 0 + construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"gold"=2000,"silver"=3000,"glass"=2000) + construction_time = 500 + activate_string = "Enable Power Sink" deactivate_string = "Disable Power Sink" diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index e009bc00309..11c9a713d42 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -15,6 +15,9 @@ icon_state = "module" matter = list(DEFAULT_WALL_MATERIAL = 20000, "plastic" = 30000, "glass" = 5000) + var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=7000,"glass"=7000) + var/construction_time = 100 + var/damage = 0 var/obj/item/weapon/rig/holder diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 1700541ae66..939e9b163d2 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -34,6 +34,8 @@ suit_overlay_active = "plasmacutter" suit_overlay_inactive = "plasmacutter" use_power_cost = 0.5 + construction_cost = list("glass" = 5250, DEFAULT_WALL_MATERIAL = 30000, "silver" = 5250, "phoron" = 7250) + construction_time = 300 device_type = /obj/item/weapon/pickaxe/plasmacutter @@ -43,6 +45,8 @@ icon_state = "scanner" interface_name = "health scanner" interface_desc = "Shows an informative health readout when used on a subject." + construction_cost = list("$glass" = 5250, DEFAULT_WALL_MATERIAL = 2500) + construction_time = 300 device_type = /obj/item/device/healthanalyzer @@ -55,6 +59,8 @@ suit_overlay_active = "mounted-drill" suit_overlay_inactive = "mounted-drill" use_power_cost = 0.1 + construction_cost = list("glass"=2250,DEFAULT_WALL_MATERIAL=55000,"silver"=5250,"diamond"=3750) + construction_time = 350 device_type = /obj/item/weapon/pickaxe/diamonddrill @@ -88,6 +94,8 @@ interface_desc = "A device for building or removing walls. Cell-powered." usable = 1 engage_string = "Configure RCD" + construction_cost = list(DEFAULT_WALL_MATERIAL=30000,"phoron"=12500,"silver"=10000,"gold"=10000) + construction_time = 1000 device_type = /obj/item/weapon/rcd/mounted @@ -128,6 +136,8 @@ toggleable = 0 disruptive = 0 confined_use = 1 + construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"glass"=9250,"gold"=2500,"silver"=4250,"phoron"=5500) + construction_time = 400 engage_string = "Inject" @@ -260,6 +270,8 @@ usable = 0 selectable = 1 disruptive = 1 + construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"glass"=9250,"gold"=2500,"silver"=4250,"phoron"=5500) + construction_time = 400 interface_name = "mounted chem injector" interface_desc = "Dispenses loaded chemicals via an arm-mounted injector." @@ -327,6 +339,8 @@ toggleable = 1 selectable = 0 disruptive = 0 + construction_cost = list("glass"= 4250,DEFAULT_WALL_MATERIAL=15000,"silver"=4250,"uranium"=5250) + construction_time = 300 suit_overlay_active = "maneuvering_active" suit_overlay_inactive = null //"maneuvering_inactive" diff --git a/code/modules/clothing/spacesuits/rig/modules/vision.dm b/code/modules/clothing/spacesuits/rig/modules/vision.dm index 90bd8adbd7e..53695df857f 100644 --- a/code/modules/clothing/spacesuits/rig/modules/vision.dm +++ b/code/modules/clothing/spacesuits/rig/modules/vision.dm @@ -89,6 +89,9 @@ usable = 0 + construction_cost = list("glass"=5000,DEFAULT_WALL_MATERIAL=1500) + construction_time = 300 + interface_name = "meson scanner" interface_desc = "An integrated meson scanner." @@ -115,6 +118,9 @@ usable = 0 + construction_cost = list("glass"=5000,DEFAULT_WALL_MATERIAL=1500,"uranium"=5000) + construction_time = 300 + interface_name = "night vision interface" interface_desc = "An integrated night vision system." @@ -128,6 +134,9 @@ usable = 0 + construction_cost = list("glass"=5000,DEFAULT_WALL_MATERIAL =1500) + construction_time = 300 + interface_name = "security HUD" interface_desc = "An integrated security heads up display." @@ -141,6 +150,9 @@ usable = 0 + construction_cost = list("glass"=5000,DEFAULT_WALL_MATERIAL=1500) + construction_time = 300 + interface_name = "medical HUD" interface_desc = "An integrated medical heads up display." diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index e3ac8906d3c..e152f9b6fdf 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -47,6 +47,10 @@ /obj/item/rig_module/device/rcd, /obj/item/rig_module/vision/meson ) + +/obj/item/weapon/rig/industrial/syndicate + + helm_type = /obj/item/clothing/head/helmet/space/rig /obj/item/weapon/rig/eva name = "EVA suit control module" @@ -197,4 +201,4 @@ /obj/item/rig_module/maneuvering_jets, /obj/item/rig_module/grenade_launcher, /obj/item/rig_module/mounted/taser - ) \ No newline at end of file + ) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm new file mode 100644 index 00000000000..dfa5e211749 --- /dev/null +++ b/code/modules/customitems/item_defines.dm @@ -0,0 +1,146 @@ +/// Aurora custom items /// +// Add custom items to this file, their sprites into their own dmi. in the icons/obj/custom_items +// Clothing items will probably require contained sprites + +/obj/item/clothing/accessory/fluff/antique_pocket_watch //Antique Pocket Watch - Eric Derringer - xelnagahunter - Done + name = "antique pocket watch" + icon = 'icons/obj/custom_items/pocket_watch.dmi' + icon_state = "pocket_watch_close" + item_state = "gold" + desc = "The design of this pocket watch signals its age, however it seems to retain its pristine quality. The cover is gold, and there appears to be an elegant crest on the outside of the lid." + w_class = 2 + +/obj/item/clothing/accessory/fluff/antique_pocket_watch/attack_self(mob/user as mob) + switch(icon_state) + if("pocket_watch_open") + icon_state = "pocket_watch_close" + usr << "You close the [src]." + desc = "The design of this pocket watch signals its age, however it seems to retain its pristine quality. The cover is gold, and there appears to be an elegant crest on the outside of the lid." + if("pocket_watch_close") + icon_state = "pocket_watch_open" + usr << "You open the [src]." + desc = "Inside the pocket watch, there is a collection of numbers, displaying '[worldtime2text()]'. On the inside of the lid, there is another sequence of numbers etched into the lid itself." + + +/obj/item/clothing/head/soft/sec/corp/fluff/mendoza_cap //Mendoza's cap - Chance Mendoza - loow - DONE + name = "Mendoza's corporate security cap" + desc = "A baseball hat in corporate colors.'C. Mendoza' is embroidered in fine print on the bill. On the underside of the cap, in dark ink, the phrase 'Gamble till you're Lucky!' is written in loopy cursive handwriting." + + +/obj/item/clothing/head/fluff/ziva_bandana //Ziva's Bandana - Ziva Ta'Kim - sierrakomodo - DONE + name = "old bandana" + desc = "An old orange-ish-yellow bandana. It has a few stains from engine grease, and the color has been dulled." + icon = 'icons/obj/custom_items/motaki_bandana.dmi' + icon_state = "motaki_bandana" + contained_sprite = 1 + + +/obj/item/clothing/suit/armor/vest/fluff/zubari_jacket //Fancy Jacket - Zubari Akenzua - filthyfrankster - DONE + name = "fancy jacket" + desc = "A well tailored unathi styled armored jacket, fitted for one too." + icon = 'icons/obj/custom_items/zubari_jacket.dmi' + icon_state = "zubari_jacket" + contained_sprite = 1 + + +/obj/item/clothing/suit/unathi/mantle/fluff/yinzr_mantle //Heirloom Unathi Mantle - Sslazhir Yinzr - alberyk - DONE + name = "heirloom unathi mantle" + desc = "A withered mantle sewn from threshbeast's hides, the pauldrons that holds it on the shoulders seems to be the remains of some kind of old armor." + icon = 'icons/obj/custom_items/yinzr_mantle.dmi' + icon_state = "yinzr_mantle" //special thanks to Araskael + species_restricted = list("Unathi") //forged for lizardmen + contained_sprite = 1 + + +/obj/item/clothing/glasses/fluff/nebula_glasses //chich eyewear - Roxy Wallace - nebulaflare - DONE + name = "chic eyewear" + desc = "A stylish pair of glasses. They look custom made." + icon = 'icons/obj/custom_items/nebula_glasses.dmi' + icon_state = "nebula_glasses" + contained_sprite = 1 + +/obj/item/clothing/glasses/fluff/nebula_glasses/var/chip + /obj/item/clothing/glasses/fluff/nebula_glasses/New() + chip = new /obj/item/weapon/disk/fluff/nebula_chip() + ..() + +/obj/item/clothing/glasses/fluff/nebula_glasses/attack_self(mob/user as mob) + if(chip) + user.put_in_hands(chip) + user << "\blue You eject a small, concealed data chip from a small slot in the frames of the [src]." + chip = null + +/obj/item/clothing/glasses/fluff/nebula_glasses/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/disk/fluff/nebula_chip) && !chip) + user.u_equip(W) + W.loc = src + chip = W + W.dropped(user) + W.add_fingerprint(user) + add_fingerprint(user) + user << "You slot the [W] back into its place in the frames of the [src]." + +/obj/item/weapon/disk/fluff/nebula_chip //data chip - Roxy Wallace - nebulaflare - DONE + name = "data chip" + desc = "A small green chip." + icon = 'icons/obj/custom_items/nebula_chip.dmi' + icon_state = "nebula_chip" + w_class = 1 + + +/obj/item/clothing/gloves/swat/fluff/hawk_gloves //Sharpshooter gloves - Hawk Silverstone - nebulaflare - DONE + name = "\improper sharpshooter gloves" + desc = "These tactical gloves are tailor made for a marksman." + icon = 'icons/obj/custom_items/hawk_gloves.dmi' + icon_state = "hawk_gloves" + item_state = "swat_gl" + + +/obj/item/clothing/accessory/fluff/karima_datadrive //Data Drive Pendant - Kyyir'ry'avii Mo'Taki - nebulaflare - DONE + name = "data drive" + desc = "A small necklace, the pendant flips open to reveal a data drive." + icon = 'icons/obj/custom_items/motaki_datadrive.dmi' + icon_state = "motaki_datadrive" + item_state = "holobadge-cord" + slot_flags = SLOT_MASK + + +/obj/item/clothing/ears/skrell/fluff/doompesh_cloth // Skrell Purple Head Cloth - Shkor-Dyet Dom'Pesh - mofo1995 - DONE + name = "male skrell purple head cloth" + desc = "A purple cloth band worn by male skrell around their head tails." + icon = 'icons/obj/custom_items/doompesh_cloth.dmi' + icon_state = "dompesh_cloth" + contained_sprite = 1 + + +/obj/item/weapons/fluff/kiara_altar // Pocket Altar - Kiara Branwen - nursiekitty - DONE + name = "pocket altar" + desc = "A black tin box with a symbol painted over it. It shimmers in the light." + icon = 'icons/obj/custom_items/kiara_altar.dmi' + icon_state = "kiara_altar1" + w_class = 2 + +/obj/item/weapons/fluff/kiara_altar/attack_self(mob/user as mob) + if(src.icon_state == "kiara_altar1") + src.icon_state = "kiara_altar2" + user << "You open the pocket altar, revealing its contents." + desc = "A black tin box, you can see inside; a vial of herbs, a little bag of salt, some epoxy clay runes, a candle with match, a permanent marker and a tiny besom." + else + src.icon_state = "kiara_altar1" + user << "You close the pocket altar." + desc = "A black tin box with a symbol painted over it. It shimmers in the light." + +/obj/item/clothing/head/det_hat/fluff/bell_hat //Brown Hat - Avery Bell - serveris6 - DONE + name = "brown hat" + desc = "A worn mid 20th century brown hat. It seems to have aged very well." + icon = 'icons/obj/custom_items/bell_hat.dmi' + icon_state = "bell_hat" + contained_sprite = 1 + + +/obj/item/clothing/suit/storage/det_suit/fluff/bell_coat //Pinned Brown Coat - Avery Bell - serveris6 - DONE + name = "pinned brown coat" + desc = "A worn mid 20th century brown trenchcoat. If you look closely at the breast, you can see an ID flap stitched into the leather - 'Avery Bell, Silhouette Co.'." + icon = 'icons/obj/custom_items/bell_coat.dmi' + icon_state = "bell_coat" + contained_sprite = 1 diff --git a/code/modules/detectivework/tools/storage.dm b/code/modules/detectivework/tools/storage.dm index 1555124cc9b..ff671a01b10 100644 --- a/code/modules/detectivework/tools/storage.dm +++ b/code/modules/detectivework/tools/storage.dm @@ -27,6 +27,7 @@ storage_slots = 6 /obj/item/weapon/storage/box/evidence/New() + ..() for(var/i=0;iYou add [src.worth] Thalers worth of money to the bundles.
    It holds [bundle.worth] Thalers now." + user << "You add [src.worth] credits worth of money to the bundles.
    It holds [bundle.worth] credits now.
    " qdel(src) /obj/item/weapon/spacecash/bundle - name = "pile of thalers" + name = "credit chips" icon_state = "" - desc = "They are worth 0 Thalers." + gender = PLURAL + desc = "They are worth 0 credits." worth = 0 /obj/item/weapon/spacecash/bundle/update_icon() @@ -59,17 +60,17 @@ M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45)) banknote.transform = M src.overlays += banknote - if(num == 0) // Less than one thaler, let's just make it look like 1 for ease + if(num == 0) // Less than one credit, let's just make it look like 1 for ease var/image/banknote = image('icons/obj/items.dmi', "spacecash1") var/matrix/M = matrix() M.Translate(rand(-6, 6), rand(-4, 8)) M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45)) banknote.transform = M src.overlays += banknote - src.desc = "They are worth [worth] Thalers." + src.desc = "They are worth [worth] credits." /obj/item/weapon/spacecash/bundle/attack_self() - var/amount = input(usr, "How many Thalers do you want to take? (0 to [src.worth])", "Take Money", 20) as num + var/amount = input(usr, "How many credits do you want to take? (0 to [src.worth])", "Take Money", 20) as num amount = round(Clamp(amount, 0, src.worth)) if(amount==0) return 0 @@ -90,51 +91,51 @@ qdel(src) /obj/item/weapon/spacecash/c1 - name = "1 Thaler" + name = "1 credit chip" icon_state = "spacecash1" desc = "It's worth 1 credit." worth = 1 /obj/item/weapon/spacecash/c10 - name = "10 Thaler" + name = "10 credit chip" icon_state = "spacecash10" - desc = "It's worth 10 Thalers." + desc = "It's worth 10 credits." worth = 10 /obj/item/weapon/spacecash/c20 - name = "20 Thaler" + name = "20 credit chip" icon_state = "spacecash20" - desc = "It's worth 20 Thalers." + desc = "It's worth 20 credits." worth = 20 /obj/item/weapon/spacecash/c50 - name = "50 Thaler" + name = "50 credit chip" icon_state = "spacecash50" - desc = "It's worth 50 Thalers." + desc = "It's worth 50 credits." worth = 50 /obj/item/weapon/spacecash/c100 - name = "100 Thaler" + name = "100 credit chip" icon_state = "spacecash100" - desc = "It's worth 100 Thalers." + desc = "It's worth 100 credits." worth = 100 /obj/item/weapon/spacecash/c200 - name = "200 Thaler" + name = "200 credit chip" icon_state = "spacecash200" - desc = "It's worth 200 Thalers." + desc = "It's worth 200 credits." worth = 200 /obj/item/weapon/spacecash/c500 - name = "500 Thaler" + name = "500 credit chip" icon_state = "spacecash500" - desc = "It's worth 500 Thalers." + desc = "It's worth 500 credits." worth = 500 /obj/item/weapon/spacecash/c1000 - name = "1000 Thaler" + name = "1000 credit chip" icon_state = "spacecash1000" - desc = "It's worth 1000 Thalers." + desc = "It's worth 1000 credits." worth = 1000 proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob) @@ -160,4 +161,4 @@ proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob) /obj/item/weapon/spacecash/ewallet/examine(mob/user) ..(user) if (!(user in view(2)) && user!=src.loc) return - user << "\blue Charge card's owner: [src.owner_name]. Thalers remaining: [src.worth]." + user << "\blue Charge card's owner: [src.owner_name]. Credit chips remaining: [src.worth]." diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm index dee0c00e3d6..6c2839c02d4 100644 --- a/code/modules/economy/economy_misc.dm +++ b/code/modules/economy/economy_misc.dm @@ -112,7 +112,7 @@ var/global/economy_init = 0 T.target_name = station_account.owner_name T.purpose = "Account creation" T.amount = 75000 - T.date = "2nd April, 2555" + T.date = "2nd April, 2454" T.time = "11:24" T.source_terminal = "Biesel GalaxyNet Terminal #277" @@ -134,7 +134,7 @@ var/global/economy_init = 0 T.target_name = department_account.owner_name T.purpose = "Account creation" T.amount = department_account.money - T.date = "2nd April, 2555" + T.date = "2nd April, 2454" T.time = "11:24" T.source_terminal = "Biesel GalaxyNet Terminal #277" diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index 45d59ca8cd0..ed20c7789fb 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -1,44 +1,96 @@ //meteor storms are much heavier /datum/event/meteor_wave - startWhen = 6 - endWhen = 33 + startWhen = 86 + endWhen = 9999//safety value, will be set during ticks + + var/wave_delay = 13//Note, wave delay is in procs. actual time is equal to wave_delay * 2.1 + var/min_waves = 11 + var/max_waves = 16 + var/min_meteors = 1 + var/max_meteors = 2 + var/duration = 420//Total duration in seconds that the storm will last after it starts + + + var/waves = 8 + var/next_wave = 86 /datum/event/meteor_wave/setup() - endWhen = rand(15,30) * 3 + startWhen += rand(-15,15)//slightly randomised start time + waves = rand(min_waves,max_waves) + next_wave = startWhen + wave_delay = round(((duration - 10)/waves)/2.1, 1) /datum/event/meteor_wave/announce() - command_announcement.Announce("Meteors have been detected on collision course with the station.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg') + command_announcement.Announce("A heavy meteor storm has been detected on collision course with the station. Estimated three minutes until impact, please activate station shields, and seek shelter in the central ring.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg') + +/datum/event/meteor_wave/start() + command_announcement.Announce("Contact with meteor wave imminent, all hands brace for impact.", "Meteor Alert") /datum/event/meteor_wave/tick() - if(IsMultiple(activeFor, 3)) - meteor_wave(rand(2,5)) + if(activeFor >= next_wave) + var/amount = rand(min_meteors,max_meteors) -/datum/event/meteor_wave/end() - command_announcement.Announce("The station has cleared the meteor storm.", "Meteor Alert") - -// -/datum/event/meteor_shower - startWhen = 5 - endWhen = 7 - var/next_meteor = 6 - var/waves = 1 - -/datum/event/meteor_shower/setup() - waves = rand(2,5) - -/datum/event/meteor_shower/announce() - command_announcement.Announce("The station is now in a meteor shower.", "Meteor Alert") - -//meteor showers are lighter and more common, -/datum/event/meteor_shower/tick() - if(activeFor >= next_meteor) - meteor_wave(rand(1,4)) - next_meteor += rand(20,100) + event_meteor_wave(amount) + next_wave += wave_delay waves-- if(waves <= 0) endWhen = activeFor + 1 else - endWhen = next_meteor + 1 + endWhen = next_wave + wave_delay + +/datum/event/meteor_wave/end() + spawn(100)//We give 10 seconds before announcing, for the last wave of meteors to hit the station + command_announcement.Announce("The station has survived the meteor storm, it is now safe to commence repairs.", "Meteor Alert") + +// +/datum/event/meteor_shower + startWhen = 86 + endWhen = 9999 + + var/wave_delay = 6 + var/min_waves = 7 + var/max_waves = 9 + var/min_meteors = 0 + var/max_meteors = 1 + var/duration = 180//Total duration in seconds that the storm will last after it starts + + var/waves = 4//this is randomised + var/next_wave = 86 + +/datum/event/meteor_shower/setup() + startWhen += rand(-15,15)//slightly randomised start time + waves = rand(min_waves,max_waves) + next_wave = startWhen + + wave_delay = round(((duration - 10)/waves)/2.1, 1) + +/datum/event/meteor_shower/announce() + command_announcement.Announce("A meteor shower is approaching the station, estimated contact in three minutes. Crew are recommended to stay away from the outer areas of the station.", "Meteor Alert") + +//meteor showers are lighter and more common, +/datum/event/meteor_shower/tick() + if(activeFor >= next_wave) + var/amount = rand(min_meteors,max_meteors) + + event_meteor_wave(amount) + next_wave += wave_delay + waves-- + if(waves <= 0) + endWhen = activeFor + 1 + else + endWhen = next_wave + wave_delay + +/datum/event/meteor_shower/start() + command_announcement.Announce("Meteors have reached the station. Please stay away from outer areas until the shower has passed.", "Meteor Alert") + /datum/event/meteor_shower/end() - command_announcement.Announce("The station has cleared the meteor shower", "Meteor Alert") + spawn(100) + command_announcement.Announce("The station has cleared the meteor shower, please return to your stations.", "Meteor Alert") + + +//An event specific version of the meteor wave proc, to bypass the delays +/proc/event_meteor_wave(var/number = meteors_in_wave) + for(var/i = 0 to number) + spawn(rand(10,80)) + spawn_meteor() \ No newline at end of file diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm index 1be8b5ce040..842766e59f2 100644 --- a/code/modules/events/money_lotto.dm +++ b/code/modules/events/money_lotto.dm @@ -28,6 +28,6 @@ var/body = "Nyx Daily wishes to congratulate [winner_name] for recieving the Nyx Stellar Slam Lottery, and receiving the out of this world sum of [winner_sum] credits!" if(!deposit_success) - body += "
    Unfortunately, we were unable to verify the account details provided, so we were unable to transfer the money. Send a cheque containing the sum of 5000 Thalers to ND 'Stellar Slam' office on the Nyx gateway containing updated details, and your winnings'll be re-sent within the month." + body += "
    Unfortunately, we were unable to verify the account details provided, so we were unable to transfer the money. Send a cheque containing the sum of 5000 credits to ND 'Stellar Slam' office on the Nyx gateway containing updated details, and your winnings'll be re-sent within the month." news_network.SubmitArticle(body, author, channel, null, 1) diff --git a/code/modules/intern/intern.dm b/code/modules/intern/intern.dm index a1bd823436e..ec0843456e0 100644 --- a/code/modules/intern/intern.dm +++ b/code/modules/intern/intern.dm @@ -20,10 +20,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/sec(H), slot_head) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 /datum/job/intern_med @@ -47,10 +43,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 /datum/job/intern_sci @@ -71,12 +63,11 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear) switch(H.backbag) - if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - + return 1 + /datum/job/intern_eng title = "Engineering Apprentice" flag = INTERN_ENG @@ -99,8 +90,4 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/eng(H), slot_head) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) return 1 diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 41ed12bcc6d..bde0c1db5c8 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -442,16 +442,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //find a viable mouse candidate var/mob/living/simple_animal/mouse/host - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/list/found_vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) - if(!v.welded && v.z == T.z) - found_vents.Add(v) - if(found_vents.len) - vent_found = pick(found_vents) - host = new /mob/living/simple_animal/mouse(vent_found.loc) + var/obj/machinery/atmospherics/unary/vent_pump/spawnpoint = find_mouse_spawnpoint(T.z) + + if (spawnpoint) + host = new /mob/living/simple_animal/mouse(spawnpoint.loc) else - src << "Unable to find any unwelded vents to spawn mice at." + src << "Unable to find any safe, unwelded vents to spawn mice at. The station must be quite a mess! Trying again might work, if you think there's still a safe place. " if(host) if(config.uneducated_mice) @@ -460,6 +456,100 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp host.ckey = src.ckey host << "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent." +/proc/find_mouse_spawnpoint(var/ZLevel) + //This function will attempt to find a good spawnpoint for mice, and prevent them from spawning in closed vent systems with no escape + //It does this by bruteforce: Picks a random vent, tests if it has enough connections, if not, repeat + //Continues either until a valid one is found (in which case we return it), or until we hit a limit on attempts.. + //If we hit the limit without finding a valid one, then the best one we found is selected + + var/list/found_vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) + if(!v.welded && v.z == ZLevel) + found_vents.Add(v) + + if (found_vents.len == 0) + return null//Every vent on the map is welded? Sucks to be a mouse + + var/attempts = 0 + var/max_attempts = min(20, found_vents.len) + var/target_connections = 30//Any vent with at least this many connections is good enough + + var/obj/machinery/atmospherics/unary/vent_pump/bestvent = null + var/best_connections = 0 + while (attempts < max_attempts) + attempts++ + var/obj/machinery/atmospherics/unary/vent_pump/testvent = pick(found_vents) + + if (!testvent.network)//this prevents runtime errors + continue + + var/turf/T = get_turf(testvent) + + + + //We test the environment of the tile, to see if its habitable for a mouse + //----------------------------------- + var/atmos_suitable = 1 + + var/maxtemp = 390 + var/mintemp = 210 + var/min_oxy = 5 + var/max_phoron = 1 + var/max_co2 = 5 + var/min_pressure = 80 + + var/datum/gas_mixture/Environment = T.return_air() + if(Environment) + + if(Environment.temperature > maxtemp) + atmos_suitable = 0 + else if (Environment.temperature < mintemp) + atmos_suitable = 0 + else if(Environment.gas["oxygen"] < min_oxy) + atmos_suitable = 0 + else if(Environment.gas["phoron"] > max_phoron) + atmos_suitable = 0 + else if(Environment.gas["carbon_dioxide"] > max_co2) + atmos_suitable = 0 + else if(Environment.return_pressure() < min_pressure) + atmos_suitable = 0 + else + atmos_suitable = 0 + + if (!atmos_suitable) + continue + //---------------------- + + + + + //Now we test the vent connections, and ensure the vent we spawn at is connected enough to give the mouse free movement + var/list/connections = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in testvent.network.normal_members) + if(temp_vent.welded) + continue + if(temp_vent == testvent)//Our testvent shouldn't count itself as a connection + continue + + connections += temp_vent + + if(connections.len > best_connections) + best_connections = connections.len + bestvent = testvent + + if (connections.len >= target_connections) + return testvent + //If we've found one that's good enough, then we stop looking + + + //IF we get here, then we hit the limit without finding a valid one. + //This would probably only be likely to happen if the station is full of holes and pipes are broken everywhere + if (bestvent == null) + //If bestvent is null, then every vent we checked was either welded or unsafe to spawn at. The user will be given a message reflecting this. + return null + else + return bestvent + /mob/dead/observer/verb/view_manfiest() set name = "View Crew Manifest" set category = "Ghost" diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index a4db72fa9cb..a4525bfb3d1 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -12,6 +12,10 @@ var/name_dead var/isalive + var/last_loc_general//This stores a general location of the object. Ie, a container or a mob + var/last_loc_specific//This stores specific extra information about the location, pocket, hand, worn on head, etc. Only relevant to mobs + var/checkverb + /obj/item/weapon/holder/New() if (!item_state) item_state = icon_state @@ -25,17 +29,18 @@ /obj/item/weapon/holder/process() - if(!get_holding_mob()) + if (!(istype(loc,/obj/item/weapon/storage)))//Mobs bug out if placed directly into a container + if(!get_holding_mob()) - for(var/mob/M in contents) + for(var/mob/M in contents) - var/atom/movable/mob_container - mob_container = M - mob_container.loc = src.loc//if the holder was placed into a disposal, this should place the animal in the disposal - //mob_container.forceMove(get_turf(src)) - M.reset_view() - - qdel(src) + var/atom/movable/mob_container + mob_container = M + mob_container.loc = src.loc//if the holder was placed into a disposal, this should place the animal in the disposal + M.reset_view() + M.verbs -= /mob/living/proc/get_holder_location + qdel(src) + return if (isalive && contained.stat == DEAD) held_death(1)//If we get here, it means the mob died sometime after we picked it up. We pass in 1 so that we can play its deathmessage @@ -43,22 +48,31 @@ for(var/mob/M in src.contents) M.attackby(W,user) -/obj/item/weapon/holder/proc/get_holding_mob() - //This function will return the mob which is holding this holder, or null if it's not held - //It recurses up the hierarchy out of containers until it reaches a mob, or aturf, or hits the limit - var/x = 0//As a safety, we'll crawl up a maximum of five layers - var/atom/a = src - while (x < 5) - x++ - a = a.loc - if (istype(a, /turf)) - return null//We must be on a table or a floor, or maybe in a wall. Either way we're not held. +/obj/item/weapon/holder/dropped(mob/user) + + ///When an object is put into a container, drop fires twice. + //once with it on the floor, and then once in the container + //This conditional allows us to ignore that first one. Handling of mobs dropped on the floor is done in process + if (istype(loc, /turf)) + return + + if (istype(loc, /obj/item/weapon/storage)) //The second drop reads the container its placed into as the location + update_location() + + +/obj/item/weapon/holder/equipped(var/mob/user, var/slot) + ..() + update_location(slot) + +/obj/item/weapon/holder/proc/update_location(var/slotnumber = null) + if (!slotnumber) + if (istype(loc, /mob)) + slotnumber = get_equip_slot() + + report_onmob_location(1, slotnumber, contained) + - if (istype(a, /mob)) - return a - //If none of the above are true, we must be inside a box or backpack or something. Keep recursing up. - return null//If we get here, the holder must be buried many layers deep in nested containers. Shouldn't happen /obj/item/weapon/holder/attack_self(mob/M as mob) @@ -115,22 +129,43 @@ grabber << "Your hand is full!" return + src.verbs += /mob/living/proc/get_holder_location//This has to be before we move the mob into the holder - var/obj/item/weapon/holder/H = new holder_type(loc) - src.loc = H - H.name = loc.name - H.attack_hand(grabber) - H.contained = src - if (src.stat == DEAD) - H.held_death()//We've scooped up an animal that's already dead. use the proper dead icons - else - H.isalive = 1//We note that the mob is alive when picked up. If it dies later, we can know that its death happened while held, and play its deathmessage for it + spawn(2) + var/obj/item/weapon/holder/H = new holder_type(loc) + src.loc = H + H.name = loc.name - grabber << "You scoop up [src]." - src << "[grabber] scoops you up." - grabber.status_flags |= PASSEMOTES - return + H.contained = src + + + + if (src.stat == DEAD) + H.held_death()//We've scooped up an animal that's already dead. use the proper dead icons + else + H.isalive = 1//We note that the mob is alive when picked up. If it dies later, we can know that its death happened while held, and play its deathmessage for it + + grabber << "You scoop up [src]." + src << "[grabber] scoops you up." + grabber.status_flags |= PASSEMOTES + + H.attack_hand(grabber)//We put this last to prevent some race conditions + return + + +/mob/living/proc/get_holder_location() + set category = "Abilities" + set name = "Check held location" + set desc = "Find out where on their person, someone is holding you." + + if (!usr.get_holding_mob()) + src << "Nobody is holding you!" + return + + if (istype(usr.loc, /obj/item/weapon/holder)) + var/obj/item/weapon/holder/H = usr.loc + H.report_onmob_location(0, H.get_equip_slot(), src) //Mob specific holders. //w_class mainly determines whether they can fit in trashbags. <=2 can, >=3 cannot @@ -227,7 +262,6 @@ origin_tech = "biotech=2" w_class = 1 - /obj/item/weapon/holder/mouse/white icon_state = "mouse_white" icon_state_dead = "mouse_white_dead" diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm index 99428a19408..4794aa0b448 100644 --- a/code/modules/mob/language/generic.dm +++ b/code/modules/mob/language/generic.dm @@ -20,7 +20,7 @@ // 'basic' language; spoken by default. /datum/language/common - name = "Galactic Common" + name = "Ceti Basic" desc = "The common galactic tongue." speech_verb = "says" whisper_verb = "whispers" @@ -72,3 +72,10 @@ colour = "i" key = "4" flags = NO_STUTTER|SIGNLANG + +// Helper +/proc/get_lang_name(var/datum/language/language) + if (!language || !istype(language)) + return "Unknown" + + return language.name diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index e65f4ab14a4..89c54114632 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -72,6 +72,7 @@ speech_verb = "broadcasts" colour = "vaurca" key = "9" + native = 1 flags = WHITELISTED | HIVEMIND syllables = list("vaur","uyek","uyit","avek","sc'theth","k'ztak","teth","wre'ge","lii","dra'","zo'","ra'","k'lax'","zz","vh","ik","ak", "uhk","zir","sc'orth","sc'er","thc'yek","th'zirk","th'esk","k'ayek","ka'mil","sc'","ik'yir","yol","kig","k'zit","'","'","zrk","krg","isk'yet","na'k", @@ -89,10 +90,18 @@ if(!speaker_mask) speaker_mask = speaker.name - var/msg = "[name], [speaker_mask] [format_message(message, get_spoken_verb(message))]" + + var/msg = "[name], [speaker_mask][format_message(message, get_spoken_verb(message))]" + + speaker.custom_emote(1, "[pick("twitches their antennae", "twitches their antennae rythmically")].") + + if (within_jamming_range(speaker)) + // The user thinks that the message got through. + speaker << msg + return for(var/mob/player in player_list) - if(istype(player,/mob/dead) || ((src in player.languages) || check_special_condition(player))) + if(istype(player,/mob/dead) || ((src in player.languages && !within_jamming_range(player)) || check_special_condition(player))) player << msg /datum/language/bug/check_special_condition(var/mob/other) @@ -102,6 +111,8 @@ return 0 if(istype(M, /mob/new_player)) return 0 + if(within_jamming_range(other)) + return 0 if(locate(/obj/item/organ/vaurca/neuralsocket) in M.internal_organs) return 1 diff --git a/code/modules/mob/language/synthetic.dm b/code/modules/mob/language/synthetic.dm index 3355a1e5c8b..20ad5595372 100644 --- a/code/modules/mob/language/synthetic.dm +++ b/code/modules/mob/language/synthetic.dm @@ -17,6 +17,8 @@ if (!message) return + log_say("[key_name(speaker)] : ([name]) [message]") + var/message_start = "[name], [speaker.name]" var/message_body = "[speaker.say_quote(message)], \"[message]\"" diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index 570e58ec2ee..ef81a4a0b2f 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -56,8 +56,6 @@ return last_shot = world.time - var/turf/T = get_turf(src) - var/turf/U = get_turf(A) var/projectile = /obj/item/projectile/beam/stun if(emagged) @@ -65,14 +63,9 @@ playsound(loc, emagged ? 'sound/weapons/Laser.ogg' : 'sound/weapons/Taser.ogg', 50, 1) var/obj/item/projectile/P = new projectile(loc) + var/def_zone = get_exposed_defense_zone(A) + P.launch(A, def_zone) - P.original = A - P.starting = T - P.current = T - P.yo = U.y - T.y - P.xo = U.x - T.x - spawn() - P.process() return // Assembly diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 1478108b2ad..9e6847cdb31 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -18,6 +18,7 @@ //Active emote/pose var/pose = null var/list/chem_effects = list() + var/intoxication = 0//Units of alcohol in their system var/datum/reagents/metabolism/bloodstr = null var/datum/reagents/metabolism/ingested = null var/datum/reagents/metabolism/touching = null diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 5c4be494ee5..46d9f695c6c 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -15,7 +15,7 @@ usr << "You don't have anything in your hands to give to \the [target]." return - if(alert(target,"[usr] wants to give you \a [I]. Will you accept it?",,"No","Yes") == "No") + if(alert(target,"[usr] wants to give you \a [I]. Will you accept it?",,"Yes","No") == "No") target.visible_message("\The [usr] tried to hand \the [I] to \the [target], \ but \the [target] didn't want it.") return diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 1eb0b53f04f..a196299fac8 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -34,7 +34,7 @@ handle_hud_list() //Handle species-specific deaths. - species.handle_death(src) + species.handle_death(src, gibbed) animate_tail_stop() //Handle brain slugs. diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 756bbe6e83a..89107fbea28 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -210,6 +210,8 @@ return ..() /mob/living/carbon/human/adjustToxLoss(var/amount) + if(species && species.tox_mod) + amount = amount*species.tox_mod if(species.flags & NO_POISON) toxloss = 0 else @@ -352,7 +354,7 @@ This function restores all organs. //visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]") if (src.invisibility == INVISIBILITY_LEVEL_TWO && back && (istype(back, /obj/item/weapon/rig))) if (damage > 0) - src << "You are now visible." + src << "You are now visible." src.invisibility = 0 //Handle other types of damage diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 241fb8cd03b..ff13a864225 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -286,12 +286,12 @@ if(istype(G.affecting,/mob/living/carbon/human)) var/mob/living/carbon/human/H = G.affecting - H.apply_damage(25,BRUTE) -// if(H.stat == 2) //no gibbing humans but i'll let you gib like a mouse or something that's cool -// H.gib() + H.apply_damage(25,BRUTE, sharp=1, edge=1) + msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(H)] (JMP)") else var/mob/living/M = G.affecting - if(!istype(M)) return //wut - M.apply_damage(25,BRUTE) - // if(M.stat == 2) - // M.gib() \ No newline at end of file + if(!istype(M)) + return + M.apply_damage(25,BRUTE, sharp=1, edge=1) + msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(M)] (JMP)") + playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/intoxication.dm b/code/modules/mob/living/carbon/human/intoxication.dm new file mode 100644 index 00000000000..524e9f85f5e --- /dev/null +++ b/code/modules/mob/living/carbon/human/intoxication.dm @@ -0,0 +1,72 @@ +#define AE_DIZZY 5 +#define AE_SLURRING 15 +#define AE_CONFUSION 18 +#define AE_CLUMSY 22 +#define AE_BLURRING 25 +#define AE_VOMIT 40 +#define AE_DROWSY 55 +#define AE_OVERDOSE 70 +#define AE_BLACKOUT 80 + +#define BASE_DIZZY 100 + +#define ALCOHOL_FILTRATION_RATE 0.02//The base rate at which intoxication decreases per proc. this is actually multiplied by 3 most of the time if the liver is healthy +#define BASE_VOMIT_CHANCE 2 +#define VOMIT_CHANCE_SCALE 0.2//An extra 1% for every 5 units over the vomiting threshold + +var/mob/living/carbon/human/alcohol_clumsy = 0 + +//This proc handles the effects of being intoxicated. Removal of intoxication is done elswhere: By the liver, in organ_internal.dm +/mob/living/carbon/human/proc/handle_intoxication() + var/SR = species.ethanol_resistance + if (SR == -1) + //This species can't get drunk, how did we even get here? + intoxication = 0 + return + + if(intoxication > AE_DIZZY*SR) // Early warning + if (dizziness == 0) + src << "The room starts spinning!" + var/target_dizziness = min(1000,(BASE_DIZZY + ((intoxication - AE_DIZZY*SR)*10)/SR)) + make_dizzy(target_dizziness - dizziness) // We will repeatedly set our target dizziness to a desired value based on intoxication level + + if(intoxication > AE_SLURRING*SR) // Slurring + slurring = max(slurring, 30) + + if(intoxication > AE_CONFUSION*SR) // Confusion - walking in random directions + if (confused == 0) + src << "You feel unsteady on your feet!" + confused = max(confused, 20) + + //Make the drinker temporarily clumsy if intoxication is high enough + //We use a var to track if alcohol caused it, we won't add nor remove it if the drinker was already clumsy from some other source + if(intoxication > AE_CLUMSY*SR) + if (!alcohol_clumsy && !(CLUMSY in mutations)) + src << "You feel a bit clumsy and uncoordinated." + mutations.Add(CLUMSY) + alcohol_clumsy = 1 + else //Remove it if intoxication drops too low. We'll also have another check to remove it in life.dm + if (alcohol_clumsy) + src << "You feel more sober and steady" + mutations.Remove(CLUMSY) + alcohol_clumsy = 0 + + if(intoxication > AE_BLURRING*SR) // Blurry vision + if (prob(10))//blurry vision effect is annoying, so nerfing it + eye_blurry = max(eye_blurry, 2) + + if(intoxication > AE_DROWSY*SR) // Drowsyness - periodically falling asleep + drowsyness = max(drowsyness, 20) + + if(intoxication > AE_VOMIT*SR)//Vomiting, the body's natural defense mechanism against poisoning. + if (life_tick % 4 == 1)//Only process vomit chance periodically + var/chance = BASE_VOMIT_CHANCE + ((intoxication - AE_VOMIT)*VOMIT_CHANCE_SCALE) + if (prob(chance)) + delayed_vomit() + + if(intoxication > AE_OVERDOSE*SR) // Toxic dose + add_chemical_effect(CE_ALCOHOL_TOXIC, 1) + + if(intoxication > AE_BLACKOUT*SR) // Pass out + paralysis = max(paralysis, 20) + sleeping = max(sleeping, 30) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 50244bcfdfe..32c9e9f5916 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -440,24 +440,31 @@ var/failed_inhale = 0 var/failed_exhale = 0 - if(species.has_organ["breathing apparatus"] && src.get_species() == "Vaurca") - var/obj/item/organ/vaurca/breathingapparatus/L = internal_organs_by_name["breathing apparatus"] - if(isnull(L)) - poison_type = null - else if(L.is_broken()) - poison_type = "oxygen" //if Vaurca breathing apparatus breaks, oxygen becomes poisonous. + if(species.has_organ["filtration bit"] && src.get_species() == "Vaurca") + var/obj/item/organ/vaurca/filtrationbit/F = internal_organs_by_name["filtration bit"] + if(isnull(F)) + poison_type = "oxygen" //if Vaurca does not have filter, oxygen becomes poisonous + + else if(F.is_broken()) + poison_type = "oxygen" //if Vaurca filter breaks, oxygen becomes poisonous. + + else + poison_type = "null" + + else + if(species.poison_type) + poison_type = species.poison_type + else + poison_type = "phoron" + + poison = breath.gas[poison_type] + if(species.breath_type) breath_type = species.breath_type else breath_type = "oxygen" inhaling = breath.gas[breath_type] - if(species.poison_type) - poison_type = species.poison_type - else - poison_type = "phoron" - poison = breath.gas[poison_type] - if(species.exhale_type) exhale_type = species.exhale_type exhaling = breath.gas[exhale_type] @@ -903,6 +910,12 @@ total_phoronloss += vsc.plc.CONTAMINATION_LOSS if(!(status_flags & GODMODE)) adjustToxLoss(total_phoronloss) + if (intoxication) + handle_intoxication() + else if (alcohol_clumsy)//This var is defined in intoxication.dm, its set true when alcohol has caused clumsiness + mutations.Remove(CLUMSY) + alcohol_clumsy = 0 + if(status_flags & GODMODE) return 0 //godmode var/obj/item/organ/diona/node/light_organ = locate() in internal_organs diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm index 2269c14a538..d6a90b8d34f 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -4,7 +4,7 @@ icobase = 'icons/mob/human_races/r_vox.dmi' deform = 'icons/mob/human_races/r_def_vox.dmi' default_language = "Vox-pidgin" - language = "Galactic Common" + language = "Ceti Basic" unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong) rarity_value = 4 blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index a4a86e028d9..d5daff4a226 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -31,8 +31,8 @@ var/show_ssd = "fast asleep" // Language/culture vars. - var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers. - var/language = "Galactic Common" // Default racial language, if any. + var/default_language = "Ceti Basic" // Default language is used when 'say' is used without modifiers. + var/language = "Ceti Basic" // Default racial language, if any. var/secondary_langs = list() // The names of secondary languages that are available to this species. var/list/speech_sounds // A list of sounds to potentially play when speaking. var/list/speech_chance // The likelihood of a speech sound playing. @@ -46,6 +46,7 @@ var/list/unarmed_attacks = null // For empty hand harm-intent attack var/brute_mod = 1 // Physical damage multiplier. var/burn_mod = 1 // Burn damage multiplier. + var/tox_mod = 1 // Toxin damage multiplier. var/vision_flags = SEE_SELF // Same flags as glasses. // Death vars. @@ -108,6 +109,8 @@ var/holder_type var/gluttonous // Can eat some mobs. 1 for mice, 2 for monkeys, 3 for people. var/rarity_value = 1 // Relative rarity/collector value for this species. + var/ethanol_resistance = 1 // How well the mob resists alcohol, lower values get drunk faster, higher values need to drink more + // Determines the organs that the species spawns with and var/list/has_organ = list( // which required-organ checks are conducted. "heart" = /obj/item/organ/heart, @@ -234,7 +237,7 @@ continue E.status |= ORGAN_ADV_ROBOT for(var/obj/item/organ/I in H.internal_organs) - I.robotize() + I.status |= ORGAN_ADV_ROBOT /datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target) @@ -266,7 +269,7 @@ H.mob_swap_flags = swap_flags H.mob_push_flags = push_flags -/datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns). +/datum/species/proc/handle_death(var/mob/living/carbon/human/H, var/gibbed = 0) //Handles any species-specific death events (such as dionaea nymph spawns). return // Only used for alien plasma weeds atm, but could be used for Dionaea later. diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index edcaca59065..dddf682abd9 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -24,6 +24,7 @@ primitive_form = "Stok" darksight = 3 gluttonous = 1 + ethanol_resistance = 1.5 blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \ Uuosa-Eso system, which roughly translates to 'burning mother'.

    Coming from a harsh, radioactive \ @@ -76,6 +77,7 @@ darksight = 8 slowdown = -1 brute_mod = 1.2 + ethanol_resistance = 0.8//Gets drunk a little faster blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \ S'randarr system. They have been brought up into the space age by the Humans and Skrell, and have been \ @@ -132,6 +134,7 @@ base_color = "#006666" reagent_tag = IS_SKRELL + ethanol_resistance = 0.5//gets drunk faster /datum/species/diona name = "Diona" @@ -147,6 +150,7 @@ siemens_coefficient = 0.3 eyes = "blank_eyes" show_ssd = "completely quiescent" + ethanol_resistance = -1//Can't get drunk blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \ @@ -220,8 +224,9 @@ H.gender = NEUTER return ..() -/datum/species/diona/handle_death(var/mob/living/carbon/human/H) - H.diona_split_into_nymphs(0) +/datum/species/diona/handle_death(var/mob/living/carbon/human/H, var/gibbed = 0) + if (!gibbed) + H.diona_split_into_nymphs(0) /datum/species/machine name = "Machine" @@ -232,6 +237,7 @@ language = "Tradeband" unarmed_types = list(/datum/unarmed_attack/punch) rarity_value = 2 + ethanol_resistance = -1//Can't get drunk eyes = "blank_eyes" brute_mod = 0.5 @@ -280,9 +286,11 @@ eyes = "vaurca_eyes" //makes it so that eye colour is not changed when skin colour is. brute_mod = 0.5 //note to self: remove is_synthetic checks for brmod and burnmod burn_mod = 1.5 //2x was a bit too much. we'll see how this goes. + tox_mod = 3 //they're not used to all our weird human bacteria. warning_low_pressure = 50 hazard_low_pressure = 0 - siemens_coefficient = 0 //attempting to mimic the old insulation feature. + ethanol_resistance = 2 + siemens_coefficient = 1 //setting it to 0 would be redundant due to LordLag's snowflake checks, plus batons/tasers use siemens now too. breath_type = "oxygen" poison_type = "null" //a species that breathes plasma shouldn't be poisoned by it. blurb = "Vaurca are a bipedal insectoid species from the first moon of Sedantis I. \ @@ -311,13 +319,15 @@ has_organ = list( "neural socket" = /obj/item/organ/vaurca/neuralsocket, - "breathing apparatus" = /obj/item/organ/vaurca/breathingapparatus, + "lungs" = /obj/item/organ/lungs, + "filtration bit" = /obj/item/organ/vaurca/filtrationbit, "heart" = /obj/item/organ/heart, "second heart" = /obj/item/organ/heart, "liver" = /obj/item/organ/liver, "kidneys" = /obj/item/organ/kidneys, "brain" = /obj/item/organ/brain, "eyes" = /obj/item/organ/eyes, + ) /datum/species/bug/equip_survival_gear(var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index a11bccf1639..bc72354c4af 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -171,29 +171,8 @@ visible_message("[src] spits neurotoxin at [target]!", "You spit neurotoxin at [target].") - //I'm not motivated enough to revise this. Prjectile code in general needs update. - // Maybe change this to use throw_at? ~ Z - var/turf/T = loc - var/turf/U = (istype(target, /atom/movable) ? target.loc : target) - - if(!U || !T) - return - while(U && !istype(U,/turf)) - U = U.loc - if(!istype(T, /turf)) - return - if (U == T) - usr.bullet_act(new /obj/item/projectile/energy/neurotoxin(usr.loc), get_organ_target()) - return - if(!istype(U, /turf)) - return - var/obj/item/projectile/energy/neurotoxin/A = new /obj/item/projectile/energy/neurotoxin(usr.loc) - A.current = U - A.yo = U.y - T.y - A.xo = U.x - T.x - A.process() - return + A.launch(target, get_organ_target()) /mob/living/carbon/human/proc/resin() // -- TLE set name = "Secrete Resin (75)" @@ -217,4 +196,4 @@ new /obj/effect/alien/resin/membrane(loc) if("resin nest") new /obj/structure/bed/nest(loc) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index d0d723a7925..d5b3c6b57d2 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -473,20 +473,24 @@ var/global/list/damage_icon_parts = list() under_icon = w_uniform.sprite_sheets[species.get_bodytype()] else if(w_uniform.item_icons && w_uniform.item_icons[slot_w_uniform_str]) under_icon = w_uniform.item_icons[slot_w_uniform_str] + else if(w_uniform.contained_sprite) + under_icon = w_uniform.icon else under_icon = INV_W_UNIFORM_DEF_ICON //determine state to use var/under_state if(w_uniform.item_state_slots && w_uniform.item_state_slots[slot_w_uniform_str]) - under_state = w_uniform.item_state_slots[slot_w_uniform_str] + under_state = w_uniform.item_state_slots[slot_w_uniform_str] + "_s" else if(w_uniform.item_state) - under_state = w_uniform.item_state + under_state = w_uniform.item_state + "_s" + else if (w_uniform.contained_sprite) + under_state = w_uniform.icon_state + "_w" else - under_state = w_uniform.icon_state + under_state = w_uniform.icon_state + "_s" //need to append _s to the icon state for legacy compatibility - var/image/standing = image(icon = under_icon, icon_state = "[under_state]_s") + var/image/standing = image(icon = under_icon, icon_state = under_state) //apply blood overlay if(w_uniform.blood_DNA) @@ -512,6 +516,8 @@ var/global/list/damage_icon_parts = list() wear_id.screen_loc = ui_id //TODO if(w_uniform && w_uniform:displays_id) overlays_standing[ID_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "id") + else if(wear_id.contained_sprite) + overlays_standing[ID_LAYER] = image("icon" = wear_id.icon, "icon_state" = "[wear_id.icon_state]_w") else overlays_standing[ID_LAYER] = null else @@ -532,6 +538,8 @@ var/global/list/damage_icon_parts = list() standing = image("icon" = gloves.icon_override, "icon_state" = "[t_state]") else if(gloves.sprite_sheets && gloves.sprite_sheets[species.get_bodytype()]) standing = image("icon" = gloves.sprite_sheets[species.get_bodytype()], "icon_state" = "[t_state]") + else if(gloves.contained_sprite) + standing = image("icon" = gloves.icon, "icon_state" = "[gloves.icon_state]_w") else standing = image("icon" = 'icons/mob/hands.dmi', "icon_state" = "[t_state]") @@ -558,6 +566,8 @@ var/global/list/damage_icon_parts = list() overlays_standing[GLASSES_LAYER] = image("icon" = glasses.icon_override, "icon_state" = "[glasses.icon_state]") else if(glasses.sprite_sheets && glasses.sprite_sheets[species.get_bodytype()]) overlays_standing[GLASSES_LAYER]= image("icon" = glasses.sprite_sheets[species.get_bodytype()], "icon_state" = "[glasses.icon_state]") + else if(glasses.contained_sprite) + overlays_standing[GLASSES_LAYER] = image("icon" = glasses.icon, "icon_state" = "[glasses.icon_state]_w") else overlays_standing[GLASSES_LAYER]= image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]") @@ -581,6 +591,8 @@ var/global/list/damage_icon_parts = list() else if(l_ear.sprite_sheets && l_ear.sprite_sheets[species.get_bodytype()]) t_type = "[t_type]_l" overlays_standing[EARS_LAYER] = image("icon" = l_ear.sprite_sheets[species.get_bodytype()], "icon_state" = "[t_type]") + else if(l_ear.contained_sprite) + overlays_standing[EARS_LAYER] = image("icon" = l_ear.icon, "icon_state" = "[l_ear.icon_state]_w") else overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]") @@ -593,6 +605,8 @@ var/global/list/damage_icon_parts = list() else if(r_ear.sprite_sheets && r_ear.sprite_sheets[species.get_bodytype()]) t_type = "[t_type]_r" overlays_standing[EARS_LAYER] = image("icon" = r_ear.sprite_sheets[species.get_bodytype()], "icon_state" = "[t_type]") + else if(r_ear.contained_sprite) + overlays_standing[EARS_LAYER] = image("icon" = r_ear.icon, "icon_state" = "[r_ear.icon_state]_w") else overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]") @@ -608,6 +622,8 @@ var/global/list/damage_icon_parts = list() standing = image("icon" = shoes.icon_override, "icon_state" = "[shoes.icon_state]") else if(shoes.sprite_sheets && shoes.sprite_sheets[species.get_bodytype()]) standing = image("icon" = shoes.sprite_sheets[species.get_bodytype()], "icon_state" = "[shoes.icon_state]") + else if(shoes.contained_sprite) + standing = image("icon" = shoes.icon, "icon_state" = "[shoes.icon_state]_w") else standing = image("icon" = 'icons/mob/feet.dmi', "icon_state" = "[shoes.icon_state]") @@ -668,6 +684,8 @@ var/global/list/damage_icon_parts = list() var/obj/item/clothing/head/hat = head if(hat.on && light_overlay_cache["[hat.light_overlay]"]) standing.overlays |= light_overlay_cache["[hat.light_overlay]"] + else if(head.contained_sprite) + standing = image("icon" = head.icon, "icon_state" = "[head.icon_state]_w") overlays_standing[HEAD_LAYER] = standing @@ -686,6 +704,8 @@ var/global/list/damage_icon_parts = list() standing.icon = belt.icon_override else if(belt.sprite_sheets && belt.sprite_sheets[species.get_bodytype()]) standing.icon = belt.sprite_sheets[species.get_bodytype()] + else if(belt.contained_sprite) + standing = image("icon" = belt.icon, "icon_state" = "[belt.icon_state]_w") else standing.icon = 'icons/mob/belt.dmi' @@ -712,6 +732,8 @@ var/global/list/damage_icon_parts = list() standing = image("icon" = wear_suit.icon_override, "icon_state" = "[wear_suit.icon_state]") else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.get_bodytype()]) standing = image("icon" = wear_suit.sprite_sheets[species.get_bodytype()], "icon_state" = "[wear_suit.icon_state]") + else if(wear_suit.contained_sprite) + standing = image("icon" = wear_suit.icon, "icon_state" = "[wear_suit.icon_state]_w") else standing = image("icon" = 'icons/mob/suit.dmi', "icon_state" = "[wear_suit.icon_state]") @@ -753,6 +775,8 @@ var/global/list/damage_icon_parts = list() standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state]") else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[species.get_bodytype()]) standing = image("icon" = wear_mask.sprite_sheets[species.get_bodytype()], "icon_state" = "[wear_mask.icon_state]") + else if(wear_mask.contained_sprite) + standing = image("icon" = wear_mask.icon, "icon_state" = "[wear_mask.icon_state]_w") else standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]") @@ -791,6 +815,8 @@ var/global/list/damage_icon_parts = list() overlay_state = back.item_state_slots[slot_back_str] else if(back.item_state) overlay_state = back.item_state + else if(back.contained_sprite) + overlay_icon = image("icon" = back.icon, "icon_state" = "[back.icon_state]_w") else overlay_state = back.icon_state @@ -853,6 +879,9 @@ var/global/list/damage_icon_parts = list() else if(r_hand.icon_override) t_state += "_r" t_icon = r_hand.icon_override + else if(r_hand.contained_sprite) + t_state = "[t_state]_r" + t_icon = image("icon" = r_hand.icon, "icon_state" = "[t_state]") else t_icon = INV_R_HAND_DEF_ICON @@ -885,6 +914,9 @@ var/global/list/damage_icon_parts = list() else if(l_hand.icon_override) t_state += "_l" t_icon = l_hand.icon_override + else if(l_hand.contained_sprite) + t_state = "[t_state]_l" + t_icon = image("icon" = l_hand.icon, "icon_state" = "[t_state]") else t_icon = INV_L_HAND_DEF_ICON diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 7336189e117..2f7279a6c2e 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -7,7 +7,6 @@ return message = sanitize(message) - log_whisper("[src.name]/[src.key] : [message]") if (src.client) if (src.client.prefs.muted & MUTE_IC) @@ -75,6 +74,8 @@ if(!message || message=="") return + log_whisper("[key_name(src)] : ([get_lang_name(speaking)]) [message]") + //looks like this only appears in whisper. Should it be elsewhere as well? Maybe handle_speech_problems? var/voice_sub if(istype(back,/obj/item/weapon/rig)) @@ -102,12 +103,12 @@ temp_message[H] = ninjaspeak(temp_message[H]) pick_list -= H message = list2text(temp_message, " ") - message = replacetext(message, "o", "¤") - message = replacetext(message, "p", "þ") - message = replacetext(message, "l", "£") - message = replacetext(message, "s", "§") - message = replacetext(message, "u", "µ") - message = replacetext(message, "b", "ß") + message = replacetext(message, "o", "¤") + message = replacetext(message, "p", "ž") + message = replacetext(message, "l", "£") + message = replacetext(message, "s", "§") + message = replacetext(message, "u", "µ") + message = replacetext(message, "b", "ß") var/list/listening = hearers(message_range, src) listening |= src diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 66f1536a950..65be0ce90ff 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -379,6 +379,10 @@ default behaviour is: /mob/living/proc/revive() + // Stop killing yourself. Please. + if(suiciding) + suiciding = 0 + rejuvenate() if(buckled) buckled.unbuckle_mob() @@ -773,4 +777,3 @@ default behaviour is: if(W in internal_organs) return ..() - diff --git a/code/modules/mob/living/parasite/meme.dm b/code/modules/mob/living/parasite/meme.dm index f37ed04a7bf..e48d12c6ef1 100644 --- a/code/modules/mob/living/parasite/meme.dm +++ b/code/modules/mob/living/parasite/meme.dm @@ -10,7 +10,6 @@ be able to influence the host through various commands. // The maximum amount of points a meme can gather. var/global/const/MAXIMUM_MEME_POINTS = 750 -var/global/const/MINIMUM_MEME_POINTS = 0 var/mob/living/parasite/host_brain var/controlling @@ -62,7 +61,6 @@ var/controlling // Memes use points for many actions /mob/living/parasite/meme/var/meme_points = 100 /mob/living/parasite/meme/var/dormant = 0 -/mob/living/parasite/meme/var/possessing = 0 // Memes have a list of indoctrinated hosts /mob/living/parasite/meme/var/list/indoctrinated = list() @@ -75,17 +73,12 @@ var/controlling else client.eye = host if(!host) return - if(possessing == 1 && meme_points == 0) - detatch() // recover meme points slowly var/gain = 3 if(dormant) gain = 9 // dormant recovers points faster - //if(possessing) meme_points = min(meme_points - loss, MAXIMUM_MEME_POINTS) meme_points = min(meme_points + gain, MAXIMUM_MEME_POINTS) - if(possessing == 1) meme_points = min(meme_points - gain, MINIMUM_MEME_POINTS) - if(possessing == 0) meme_points = min(meme_points + gain, MAXIMUM_MEME_POINTS) // if there are sleep toxins in the host's body, that's bad if(host.reagents.has_reagent("stoxin")) @@ -105,10 +98,6 @@ var/controlling if(host.blinded && host.stat != 1) src.blinded = 1 else src.blinded = 0 - if(possessing == 1 && meme_points == 0) - detatch() - - /mob/living/parasite/meme/death() // make sure the mob is on the actual map before gibbing if(host) src.loc = host.loc @@ -206,16 +195,20 @@ var/controlling // A meme can make people hear things with the thought ability -/mob/living/parasite/meme/verb/Thought() +/mob/living/parasite/meme/verb/Thought(mob/M as mob in oview()) set category = "Meme" set name = "Thought(150)" set desc = "Implants a thought into the target, making them think they heard someone talk." - if(meme_points < 150) - // just call use_points() to give the standard failure message - use_points(150) - return + if(!use_points(150)) return + var/message = sanitize(input("Message:", "Thought") as text|null) + if(message) + log_say("MemeThought: [key_name(src)]->[M.key] : [message]") + M << "[message]" + src << "You said: \"[message]\" to [M]" + return +/* var/list/candidates = indoctrinated.Copy() if(!(src.host in candidates)) candidates.Add(src.host) @@ -238,7 +231,7 @@ var/controlling target.show_message(rendered) usr << "You make [target] hear: [rendered]" - +*/ // Mutes the host /mob/living/parasite/meme/verb/Mute() set category = "Meme" @@ -350,7 +343,7 @@ var/controlling host << "\red You are feeling clear-headed again.." // Cause the target to hallucinate. -/mob/living/parasite/meme/verb/Hallucinate(mob/living/carbon/human/target as mob in world) +/mob/living/parasite/meme/verb/Hallucinate(mob/living/carbon/human/target as mob in oview()) set category = "Meme" set name = "Hallucinate(300)" set desc = "Makes your host hallucinate, has a short delay." @@ -373,7 +366,7 @@ var/controlling usr << "You make [target] hallucinate." // Jump to a closeby target through a whisper -/mob/living/parasite/meme/verb/SubtleJump(mob/living/carbon/human/target as mob in world) +/mob/living/parasite/meme/verb/SubtleJump(mob/living/carbon/human/target as mob in oview()) set category = "Meme" set name = "Subtle Jump(350)" set desc = "Move to a closeby human through a whisper." @@ -535,7 +528,7 @@ var/controlling return - src << "You begin assuming direct control..." + src << "You assume direct control..." spawn() @@ -580,29 +573,12 @@ var/controlling host.lastKnownIP = s2h_ip controlling = 1 - possessing = 1 - host.verbs += /mob/living/parasite/meme/proc/release_control + spawn(300) + detatch() return -/mob/living/parasite/meme/proc/release_control() - set category = "Meme" - set name = "Release Control" - set desc = "Release control of your host's body." - - //var/mob/living/parasite/meme/ME = has_brain_worms() god fucking dammit -/* - if(ME && host_brain) - src << "\red You retract, releasing control of [host_brain]" -*/ - detatch() - - verbs -= /mob/living/parasite/meme/proc/release_control - /* - else ALL THE FUCKING CODING SCAFFOLDING - src << "\red ERROR NO MEME DETECTED IN THIS MOB, THIS IS A BUG !" - */ /mob/living/parasite/meme/proc/detatch() if(!host || !controlling) return @@ -613,9 +589,6 @@ var/controlling head.implants -= src controlling = 0 - possessing = 0 - - host.verbs -= /mob/living/parasite/meme/proc/release_control if(host_brain) @@ -686,17 +659,4 @@ var/controlling stat(null, "([x], [y], [z])") if (client && client.statpanel == "Status") - stat(null, "Meme Points: [src.meme_points]") -/* -// Game mode helpers, used for theft objectives-NOT USED, NO OBJECTIVES -// -------------------------------------------- -/mob/living/parasite/check_contents_for(t) - if(!host) return 0 - - return host.check_contents_for(t) - -/mob/living/parasite/check_contents_for_reagent(t) - if(!host) return 0 - - return host.check_contents_for_reagent(t) - */ + stat(null, "Meme Points: [src.meme_points]") \ No newline at end of file diff --git a/code/modules/mob/living/parasite/meme_captive.dm b/code/modules/mob/living/parasite/meme_captive.dm index dd1c95a3601..a0ce61b761b 100644 --- a/code/modules/mob/living/parasite/meme_captive.dm +++ b/code/modules/mob/living/parasite/meme_captive.dm @@ -32,29 +32,4 @@ M << "The captive mind of [src] whispers, \"[message]\"" /mob/living/parasite/captive_brain/emote(var/message) - return -/* In the event we want to add the ability to resist, its here. -/mob/living/parasite/captive_brain/process_resist() - //Resisting control by an alien mind. - if(istype(src.loc,/mob/living/simple_animal/borer)) - var/mob/living/simple_animal/borer/B = src.loc - var/mob/living/captive_brain/H = src - - H << "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." - B.host << "You feel the captive mind of [src] begin to resist your control." - - spawn(rand(200,250)+B.host.brainloss) - if(!B || !B.controlling) return - - B.host.adjustBrainLoss(rand(5,10)) - H << "With an immense exertion of will, you regain control of your body!" - B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." - B.detatch() - verbs -= /mob/living/carbon/proc/release_control - verbs -= /mob/living/carbon/proc/punish_host - verbs -= /mob/living/carbon/proc/spawn_larvae - - return - - ..() -*/ \ No newline at end of file + return \ No newline at end of file diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index d9caeb891fc..c8229c85f31 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -144,7 +144,7 @@ proc/get_radio_key_from_channel(var/channel) var/message_mode = parse_message_mode(message, "headset") - message = process_chat_markup(message, list("~", "-")) + message = process_chat_markup(message, list("~", "_")) switch(copytext(message,1,2)) if("*") return emote(copytext(message,2)) @@ -281,10 +281,12 @@ proc/get_radio_key_from_channel(var/channel) if(O) //It's possible that it could be deleted in the meantime. O.hear_talk(src, message, verb, speaking) - log_say("[name]/[key] : [message]") + log_say("[key_name(src)] : ([get_lang_name(speaking)]) [message]") return 1 /mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language) + log_say("[key_name(src)] : ([get_lang_name(language)]) [message]") + for (var/mob/O in viewers(src, null)) O.hear_signlang(message, verb, language, src) return 1 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 4dd08ed212e..e2aee0bd913 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -137,7 +137,7 @@ var/list/ai_verbs_default = list( //Languages add_language("Robot Talk", 1) - add_language("Galactic Common", 1) + add_language("Ceti Basic", 1) add_language("Sol Common", 0) add_language("Sinta'unathi", 0) add_language("Siik'maas", 0) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index cb94fbf498f..1209d81cae8 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -72,7 +72,15 @@ var/current_pda_messaging = null -/mob/living/silicon/pai/New(var/obj/item/device/paicard) +/mob/living/silicon/pai/New(var/obj/item/device/paicard/newlocation) + var/obj/item/device/paicard/paicard + if (istype(newlocation, /obj/item/device/paicard)) + paicard = newlocation + else + //If we get here, then we must have been created by adminspawning. + //so lets assist with debugging by creating our own card and adding ourself to it + paicard = new/obj/item/device/paicard(newlocation) + paicard.pai = src canmove = 0 src.loc = paicard @@ -333,6 +341,17 @@ verbs -= /mob/living/silicon/pai/proc/choose_chassis verbs += /mob/living/proc/hide +/mob/living/silicon/pai/verb/get_onmob_location() + set category = "pAI Commands" + set name = "Check location" + set desc = "Find out where on their person, someone is holding you." + + if (!get_holding_mob()) + src << "Nobody is holding you!" + return + + card.report_onmob_location(0, card.get_equip_slot(), src) + /mob/living/silicon/pai/proc/choose_verbs() set category = "pAI Commands" set name = "Choose Speech Verbs" @@ -389,7 +408,8 @@ src.stop_pulling() src.client.perspective = EYE_PERSPECTIVE - src.client.eye = card + src.client.eye = src +//Changed the client eye to follow the mob itself instead of the card that contains it. This makes examining work, and the camera still follows wherever the card goes //stop resting resting = 0 @@ -417,3 +437,5 @@ // No binary for pAIs. /mob/living/silicon/pai/binarycheck() return 0 + + diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 472125cef9a..8cd80ab1390 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -126,6 +126,6 @@ var/global/list/default_pai_software = list() else if(href_list["image"]) var/img = text2num(href_list["image"]) - if(1 <= img && img <= 9) + if(1 <= img && img <= 15) card.setEmotion(img) return 1 diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 0c93f7eae90..bceb3be0920 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -9,7 +9,7 @@ universal_speak = 0 universal_understand = 1 gender = NEUTER - pass_flags = PASSTABLE + pass_flags = PASSTABLE | PASSDOORHATCH braintype = "Robot" lawupdate = 0 density = 0 @@ -19,7 +19,7 @@ mob_size = 2 small = 1 - //mob_bump_flag = SIMPLE_ANIMAL + mob_bump_flag = SIMPLE_ANIMAL //mob_swap_flags = SIMPLE_ANIMAL //mob_push_flags = SIMPLE_ANIMAL //mob_always_swap = 1 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 3ce635e0481..578498a3d9f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -925,9 +925,10 @@ if (istype(tile, /turf/simulated)) var/turf/simulated/S = tile S.dirt = 0 + S.color = null for(var/A in tile) if(istype(A, /obj/effect)) - if(istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay)) + if(istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay)) qdel(A) else if(istype(A, /obj/item)) var/obj/item/cleaned_item = A diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 48524304252..7e8a6c6f67f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -22,7 +22,7 @@ var/global/list/robot_modules = list( flags = CONDUCT var/channels = list() var/networks = list() - var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK_TAJR = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_VAURCESE = 0, LANGUAGE_ROOTSPEAK = 0) + var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK_MAAS = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_VAURCESE = 0, LANGUAGE_ROOTSPEAK = 0) var/sprites = list() var/can_be_pushed = 1 var/no_slip = 0 @@ -632,7 +632,7 @@ var/global/list/robot_modules = list( LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, - LANGUAGE_SIIK_TAJR = 0, + LANGUAGE_SIIK_MAAS = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 1 ) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b8c59186bf8..03ab0b83069 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -23,6 +23,7 @@ var/next_alarm_notice var/list/datum/alarm/queued_alarms = new() + var/underdoor #define SEC_HUD 1 //Security HUD mode #define MED_HUD 2 //Medical HUD mode @@ -30,7 +31,7 @@ /mob/living/silicon/New() silicon_mob_list |= src ..() - add_language("Galactic Common") + add_language("Ceti Basic") init_subsystems() /mob/living/silicon/Destroy() @@ -353,3 +354,25 @@ ..() if(cameraFollow) cameraFollow = null + +/mob/living/silicon/Move(newloc, direct) + ..(newloc,direct) + if (underdoor) + underdoor = 0 + if ((layer == UNDERDOOR))//if this is false, then we must have used hide, or had our layer changed by something else. We wont do anymore checks for this move proc + for (var/obj/machinery/door/D in loc) + if (D.hashatch) + underdoor = 1 + break + + if (!underdoor) + spawn(3)//A slight delay to let us finish walking out from under the door + layer = initial(layer) + +/mob/living/silicon/proc/under_door() + //This function puts a silicon on a layer that makes it draw under doors, then periodically checks if its still standing on a door + if (layer > UNDERDOOR)//Don't toggle it if we're hiding + layer = UNDERDOOR + underdoor = 1 + +/mob/living/silicon/proc/not_under_door() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm new file mode 100644 index 00000000000..f29b3eb869f --- /dev/null +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -0,0 +1,25 @@ +//Foxxy +/mob/living/simple_animal/corgi/fox + name = "fox" + desc = "It's a fox. I wonder what it says?" + icon_state = "fox" + icon_living = "fox" + icon_dead = "fox_dead" + speak = list("Ack-Ack","Ack-Ack-Ack-Ackawoooo","Geckers","Awoo","Tchoff") + speak_emote = list("geckers", "barks") + emote_hear = list("howls","barks") + emote_see = list("shakes its head", "shivers") + speak_chance = 1 + turns_per_move = 5 + see_in_dark = 6 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_amount = 3 + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "kicks" + mob_size = 8 +//Captain fox +/mob/living/simple_animal/corgi/fox/Chauncey + name = "Chauncey" + desc = "Chauncey, the Captain's trustworthy fox. I wonder what it says?" + diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index dd5b01dab05..f5cf4bbe850 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -44,8 +44,8 @@ /mob/living/simple_animal/spiderbot/New() ..() - add_language("Galactic Common") - default_language = all_languages["Galactic Common"] + add_language("Ceti Basic") + default_language = all_languages["Ceti Basic"] verbs |= /mob/living/proc/ventcrawl verbs |= /mob/living/proc/hide @@ -294,4 +294,4 @@ return /mob/living/simple_animal/spiderbot/binarycheck() - return positronic \ No newline at end of file + return positronic diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 405386a827b..2016ebd155b 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -155,22 +155,21 @@ var/target = target_mob visible_message("\red [src] fires at [target]!", 1) - var/tturf = get_turf(target) if(rapid) spawn(1) - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype(get_turf(src)) spawn(4) - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype(get_turf(src)) spawn(6) - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype(get_turf(src)) else - Shoot(tturf, src.loc, src) + Shoot(target, src.loc, src) if(casingtype) new casingtype @@ -187,16 +186,9 @@ playsound(user, projectilesound, 100, 1) if(!A) return - if (!istype(target, /turf)) - qdel(A) - return - A.current = target - A.starting = get_turf(src) - A.original = get_turf(target) - A.yo = target:y - start:y - A.xo = target:x - start:x - spawn( 0 ) - A.process() + var/def_zone = get_exposed_defense_zone(target) + A.launch(target, def_zone) + return /mob/living/simple_animal/hostile/proc/DestroySurroundings() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index aefc1f10c6b..edcdaafde79 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -94,6 +94,29 @@ else M.show_message(message, 1, blind_message, 2) + +// Designed for mobs contained inside things, where a normal visible message wont actually be visible +// Useful for visible actions by pAIs, and held mobs +// Broadcaster is the place the action will be seen/heard from, mobs in sight of THAT will see the message. This is generally the object or mob that src is contained in +// message is the message output to anyone who can see e.g. "[src] does something!" +// self_message (optional) is what the src mob sees e.g. "You do something!" +// blind_message (optional) is what blind people will hear e.g. "You hear something!" +/mob/proc/contained_visible_message(var/atom/broadcaster, var/message, var/self_message, var/blind_message) + var/self_served = 0 + for(var/mob/M in viewers(broadcaster)) + if(self_message && M==src) + M.show_message(self_message, 1, blind_message, 2) + self_served = 1 + else if(M.see_invisible < invisibility) // Cannot view the invisible, but you can hear it. + if(blind_message) + M.show_message(blind_message, 2) + else + M.show_message(message, 1, blind_message, 2) + + if (!self_served) + src.show_message(self_message, 1, blind_message, 2) + + // Show a message to all mobs in sight of this atom // Use for objects performing visible actions // message is output to anyone who can see, e.g. "The [src] does something!" @@ -639,6 +662,7 @@ if(.) if(statpanel("Status") && ticker && ticker.current_state != GAME_STATE_PREGAME) + stat("Game ID", game_id) stat("Station Time", worldtime2text()) stat("Round Duration", round_duration()) stat("Last Transfer Vote", vote.last_transfer_vote ? time2text(vote.last_transfer_vote, "hh:mm") : "Never") @@ -873,7 +897,7 @@ mob/proc/yank_out_object() usr.next_move = world.time + 20 if(usr.stat == 1) - usr << "You are unconcious and cannot do that!" + usr << "You are unconscious and cannot do that!" return if(usr.restrained()) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 85d8c78464b..6ce7679a752 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -71,6 +71,8 @@ var/med_record = "" var/sec_record = "" var/gen_record = "" + var/ccia_record = "" + var/list/ccia_actions = list() var/exploit_record = "" var/blinded = null var/bhunger = 0 //Carbon @@ -222,5 +224,3 @@ var/list/shouldnt_see = list() //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes var/list/active_genes=list() - - diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 997c78c5519..117809af028 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -711,10 +711,227 @@ proc/is_blind(A) location.add_vomit_floor(src, 1) nutrition -= 40 + if (intoxication)//The pain and system shock of vomiting, sobers you up a little + intoxication *= 0.8 + if (istype(src, /mob/living/carbon/human)) ingested.trans_to_turf(location,30)//Vomiting empties the stomach, transferring 30u reagents to the floor where you vomited else src.visible_message("[src] retches, attempting to vomit!","You gag and collapse as you feel the urge to vomit, but there's nothing in your stomach!") Weaken(4) +/obj/proc/get_equip_slot() + //This function is called by an object which is somewhere on a humanoid mob + //It will return the number of the equipment slot its in + + if (!istype(loc, /mob/living/carbon/human))//This function is for finding where we are on a human. not valid otherwise + return null + + var/mob/living/carbon/human/H = loc + + + //Now we check various slots on the mob, the order of these is optimised based on how likely we are to be in that slot + if (H.l_hand == src) + return slot_l_hand + else if (H.r_hand == src) + return slot_r_hand + else if (H.l_store == src) + return slot_l_store + else if (H.r_store == src) + return slot_r_store + else if (H.head == src) + return slot_head + else if (H.wear_suit == src) + return slot_wear_suit + else if (H.s_store == src) + return slot_s_store + else if (H.wear_mask == src) + return slot_wear_mask + else if (H.wear_id == src) + return slot_wear_id + else if (H.w_uniform == src) + return slot_w_uniform + else if (H.gloves == src) + return slot_gloves + else if (H.belt == src) + return slot_belt + else if (H.back == src) + return slot_back + else if (H.r_ear == src) + return slot_r_ear + else if (H.l_ear == src) + return slot_l_ear + else if (H.shoes == src) + return slot_shoes + else + return null//We failed to find the slot + + /* Variables to check + l_hand + r_hand + head + l_store //Left and right pockets + r_store + s_store //Suit storage? + + wear_mask, + wear_id + w_uniform //the uniform + wear_suit + gloves + belt + back + r_ear + l_ear + + shoes + + */ + +/obj/proc/report_onmob_location(var/justmoved, var/slot = null, var/mob/reportto) + var/mob/living/carbon/human/H//The person who the item is on + var/newlocation + var/preposition= "" + var/action = "" + var/action3 = "" + if (istype(loc, /mob/living/carbon/human))//This function is for finding where we are on a human. not valid otherwise + H = loc + + else + H = get_holding_mob() + + + if (slot != null) + + if (slot_l_hand == slot) + if (justmoved) + action += "now " + preposition = "in" + action += "being held" + action3 = "holds" + newlocation = "left hand" + else if (slot_r_hand == slot) + if (justmoved) + action += "now " + preposition = "in" + action += "being held" + action3 = "holds" + newlocation = "right hand" + else if (slot_l_store == slot) + if (justmoved) + preposition = "into" + action = "placed" + action3 = "places" + else + preposition = "inside" + newlocation = "left pocket" + else if (slot_r_store == slot) + if (justmoved) + preposition = "into" + action = "placed" + action3 = "places" + else + preposition = "inside" + newlocation = "right pocket" + else if (slot_s_store == slot) + if (justmoved) + preposition = "into" + action = "placed" + action3 = "places" + else + preposition = "inside" + newlocation = "suit storage" + else + if (justmoved) + action += "now " + action += "being worn" + + if (slot_head == slot) + preposition = "as" + action3 = "wears" + newlocation = "hat" + else if (slot_wear_suit == slot) + preposition = "over" + action3 = "wears" + newlocation = "uniform" + else if (slot_wear_mask == slot) + preposition = "on" + action3 = "wears" + newlocation = "face" + else if (slot_wear_id == slot) + preposition = "as" + action3 = "wears" + newlocation = "ID" + else if (slot_w_uniform == slot) + preposition = "on" + action3 = "wears" + newlocation = "body" + else if (slot_gloves == slot) + preposition = "on" + action3 = "wears" + newlocation = "hands" + else if (slot_belt == slot) + preposition = "around" + action3 = "wears" + newlocation = "waist" + else if (slot_back == slot) + preposition = "on" + action3 = "wears" + newlocation = "back" + else if (slot_r_ear == slot) + preposition = "on" + action3 = "wears" + newlocation = "right shoulder"//Ill use ear slots for wearing mobs on the shoulder in future + else if (slot_l_ear == slot) + preposition = "on" + action3 = "wears" + newlocation = "left shoulder" + else if (slot_shoes == slot) + preposition = "on" + action3 = "wears" + newlocation = "feet" + else if (istype(loc,/obj/item/device/pda)) + var/obj/item/device/pda/S = loc + newlocation = S.name + if (justmoved) + preposition = "into" + action = "slotted" + action3 = "slots" + else + action = "installed" + preposition = "in" + else if (istype(loc,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = loc + newlocation = S.name + if (justmoved) + preposition = "into" + action = "placed" + action3 = "places" + else + action = "tucked" + preposition = "inside" + + if (justmoved) + reportto.contained_visible_message(H, "[H] [action3] [reportto] [preposition] their [newlocation]", "You are [action] [preposition] [H]'s [newlocation]", "", 1) + else + reportto << "You are [action] [preposition] [H]'s [newlocation]" + +/atom/proc/get_holding_mob() + //This function will return the mob which is holding this holder, or null if it's not held + //It recurses up the hierarchy out of containers until it reaches a mob, or aturf, or hits the limit + var/x = 0//As a safety, we'll crawl up a maximum of five layers + var/atom/a = src + while (x < 5) + x++ + a = a.loc + if (istype(a, /turf)) + return null//We must be on a table or a floor, or maybe in a wall. Either way we're not held. + + if (istype(a, /mob)) + return a + //If none of the above are true, we must be inside a box or backpack or something. Keep recursing up. + + return null//If we get here, the holder must be buried many layers deep in nested containers. Shouldn't happen + + #undef SAFE_PERP diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index cd3745a6eb9..ffacc2629a7 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -277,7 +277,7 @@ //specific vehicle move delays are set in code\modules\vehicles\vehicle.dm move_delay = world.time + tickcomp //drunk driving - if(mob.confused) + if(mob.confused && prob(20)) direct = pick(cardinal) return mob.buckled.relaymove(mob,direct) @@ -298,7 +298,7 @@ if((!l_hand || l_hand.is_stump()) && (!r_hand || r_hand.is_stump())) return // No hands to drive your chair? Tough luck! //drunk wheelchair driving - if(mob.confused) + if(mob.confused && prob(20)) direct = pick(cardinal) move_delay += 2 return mob.buckled.relaymove(mob,direct) @@ -338,7 +338,7 @@ M.animate_movement = 2 return - else if(mob.confused) + else if(mob.confused && prob(20)) step(mob, pick(cardinal)) else . = mob.SelfMove(n, direct) diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 235c4ce7241..5c42ab1dccd 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -1,7 +1,7 @@ /mob/new_player/Login() update_Login_details() //handles setting lastKnownIP and computer_id for use by the ban systems as well as checking for multikeying - if(join_motd) - src << "
    [join_motd]
    " + + src << "
    Game ID:
    [game_id]
    " if(!mind) mind = new /datum/mind(key) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index ca7d753590c..cf102c40950 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -68,6 +68,8 @@ ..() if(statpanel("Lobby") && ticker) + stat("Game ID:", game_id) + if(ticker.hide_mode) stat("Game Mode:", "Secret") else diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index dd28543ef1e..7e56039f0fb 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -58,7 +58,7 @@ usr << "You have deadchat muted." return - message = process_chat_markup(message, list("~", "-")) + message = process_chat_markup(message, list("~", "_")) say_dead_direct("[pick("complains","moans","whines","laments","blubbers")], \"[message]\"", src) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 7758c12724e..512f2c35c0c 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -126,10 +126,16 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 for(var/obj/item/organ/external/temp in organs) if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT) continue - for(var/datum/wound/W in temp.wounds) if(W.bleeding()) - blood_max += W.damage / 40 - if (temp.open) - blood_max += 2 //Yer stomach is cut open + if(src.get_species() == "Vaurca") + for(var/datum/wound/W in temp.wounds) if(W.bleeding()) + blood_max += W.damage / 20 + if (temp.open) + blood_max += 4 //Yer stomach is cut open + else + for(var/datum/wound/W in temp.wounds) if(W.bleeding()) + blood_max += W.damage / 40 + if (temp.open) + blood_max += 2 //Yer stomach is cut open drip(blood_max) //Makes a blood drop, leaking amt units of blood from the mob diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index ecda3772830..791e7861554 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -141,6 +141,11 @@ if(is_broken()) filter_effect -= 2 + if (owner.intoxication) + //ALCOHOL_FILTRATION_RATE is defined in intoxication.dm + owner.intoxication -= ALCOHOL_FILTRATION_RATE*filter_effect*PROCESS_ACCURACY//A weakened liver filters out alcohol more slowly + owner.intoxication = max(owner.intoxication, 0) + // Do some reagent processing. if(owner.chem_effects[CE_ALCOHOL_TOXIC]) if(filter_effect < 3) @@ -208,10 +213,18 @@ obj/item/organ/vaurca/neuralsocket/process() parent_organ = "chest" icon = 'icons/mob/alien.dmi' icon_state = "breathing_app" - robotic = 2 + robotic = 0 obj/item/organ/vaurca/breathingapparatus/process() return /obj/item/organ/vaurca/breathingapparatus/removed() return + +/obj/item/organ/vaurca/filtrationbit + name = "filtration bit" + organ_tag = "filtration bit" + parent_organ = "head" + icon = 'icons/mob/alien.dmi' + icon_state = "filter" + robotic = 2 \ No newline at end of file diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 8d19d60b491..9feafea0267 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -22,7 +22,7 @@ var/global/datum/robolimb/basic_robolimb icon = 'icons/mob/human_races/cyberlimbs/bishop.dmi' /datum/robolimb/hesphaistos - company = "Hesphiastos Industries" + company = "Hephaestus Industries" desc = "This limb has a militaristic black and green casing with gold stripes." icon = 'icons/mob/human_races/cyberlimbs/hesphaistos.dmi' diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index b495bd94cbb..5ba097d6ad3 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -281,18 +281,33 @@ return t -/obj/item/weapon/paper/proc/burnpaper(obj/item/weapon/flame/P, mob/user) +/obj/item/weapon/paper/proc/burnpaper(obj/item/weapon/P, mob/user) var/class = "" - if(P.lit && !user.restrained()) + if (!user.restrained()) + if (istype(P, /obj/item/weapon/flame)) + var/obj/item/weapon/flame/F = P + if (!F.lit) + return + else if (istype(P, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/F = P + if (!F.welding)//welding tools are 0 when off + return + if (!F.remove_fuel(1, user))//This function removes the fuel and does the usual eyedamage checks, if it returns 0 then the welder is out of fuel and cant burn paper + return + else + //If we got here somehow, the item is incompatible and can't burn things + return + if(istype(P, /obj/item/weapon/flame/lighter/zippo)) class = "" user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like \he's trying to burn it!", \ "[class]You hold \the [P] up to \the [src], burning it slowly.") + //I was going to add do_after in here, but keeping the current method allows people to burn papers they're holding, while they move. That seems fine to keep -Nanako spawn(20) - if(get_dist(src, user) < 2 && user.get_active_hand() == P && P.lit) + if(get_dist(src, user) < 2 && user.get_active_hand() == P) user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") @@ -478,6 +493,8 @@ else if(istype(P, /obj/item/weapon/flame)) burnpaper(P, user) + else if(istype(P, /obj/item/weapon/weldingtool)) + burnpaper(P, user) add_fingerprint(user) return diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 3c58af0a84d..13634ce1701 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -103,7 +103,15 @@ message_admins("LOG: [user.name] ([user.ckey]) injected a power cell with phoron, rigging it to explode.") S.reagents.clear_reagents() + else if(istype(W, /obj/item/device/assembly_holder)) + var/obj/item/device/assembly_holder/assembly = W + if (istype(assembly.a_left, /obj/item/device/assembly/signaler) && istype(assembly.a_right, /obj/item/device/assembly/signaler)) + user.drop_item() + user.drop_from_inventory(src) + new /obj/item/device/radiojammer/improvised(assembly, src, user) + else + user << "You'd need both devices to be signallers for this to work." /obj/item/weapon/cell/proc/explode() var/turf/T = get_turf(src.loc) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 11606b3dc1c..a5b73bb4b0e 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -129,27 +129,16 @@ //need to calculate the power per shot as the emitter doesn't fire continuously. var/burst_time = (min_burst_delay + max_burst_delay)/2 + 2*(burst_shots-1) var/power_per_shot = active_power_usage * (burst_time/10) / burst_shots - var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc ) - A.damage = round(power_per_shot/EMITTER_DAMAGE_POWER_TRANSFER) - playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1) if(prob(35)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() - A.set_dir(src.dir) - A.starting = get_turf(src) - switch(dir) - if(NORTH) - A.original = locate(x, y+1, z) - if(EAST) - A.original = locate(x+1, y, z) - if(WEST) - A.original = locate(x-1, y, z) - else // Any other - A.original = locate(x, y-1, z) - A.process() + var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc ) + playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1) + A.damage = round(power_per_shot/EMITTER_DAMAGE_POWER_TRANSFER) + A.launch(get_step(src.loc, src.dir)) /obj/machinery/power/emitter/attackby(obj/item/W, mob/user) @@ -235,4 +224,4 @@ return ..() - return \ No newline at end of file + return diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 219ebff1410..08b3b574740 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -45,6 +45,8 @@ user << "\blue You inscribe \"[label_text]\" into \the [initial(BB.name)]." BB.name = "[initial(BB.name)] (\"[label_text]\")" + ..() + /obj/item/ammo_casing/update_icon() if(spent_icon && !BB) icon_state = spent_icon @@ -163,4 +165,3 @@ magazine_icondata_keys["[M.type]"] = icon_keys magazine_icondata_states["[M.type]"] = ammo_states - diff --git a/code/modules/projectiles/effects.dm b/code/modules/projectiles/effects.dm index 7874eeb383d..57f4c1f324d 100644 --- a/code/modules/projectiles/effects.dm +++ b/code/modules/projectiles/effects.dm @@ -119,6 +119,18 @@ /obj/effect/projectile/stun/impact icon_state = "impact_stun" +//---------------------------- +// Eye beam +//---------------------------- +/obj/effect/projectile/eyelaser/tracer + icon_state = "eye" + +/obj/effect/projectile/eyelaser/muzzle + icon_state = "muzzle_eye" + +/obj/effect/projectile/eyelaser/impact + icon_state = "impact_eye" + //---------------------------- // Bullet //---------------------------- diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 03932760663..8bc57137376 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -323,7 +323,7 @@ y_offset = rand(-1,1) x_offset = rand(-1,1) - return !P.launch(target, user, src, target_zone, x_offset, y_offset) + return !P.launch_from_gun(target, user, src, target_zone, x_offset, y_offset) //Suicide handling. /obj/item/weapon/gun/var/mouthshoot = 0 //To stop people from suiciding twice... >.> diff --git a/code/modules/projectiles/guns/energy/lawgiver.dm b/code/modules/projectiles/guns/energy/lawgiver.dm index 5596b5be826..91b918e65fa 100644 --- a/code/modules/projectiles/guns/energy/lawgiver.dm +++ b/code/modules/projectiles/guns/energy/lawgiver.dm @@ -173,7 +173,7 @@ usr << "\red [src.name] is already broadcasting a message." return usr << "\red [src.name]´s crowdcontrol activation sequence started" - message = "Citizens stay calm. Stand back from the crimescense. Interference with the crimescene carries an automatice brig sentence." + message = "Citizens stay calm. Stand back from the crime scene. Interference with the crime scene carries an automatic brig sentence." message_enabled = 1 message_disable = 0 play_message() diff --git a/code/modules/projectiles/guns/projectile/improvised.dm b/code/modules/projectiles/guns/projectile/improvised.dm index 2b1e10c5989..0caa8f14b03 100644 --- a/code/modules/projectiles/guns/projectile/improvised.dm +++ b/code/modules/projectiles/guns/projectile/improvised.dm @@ -17,6 +17,17 @@ origin_tech = "combat=2;materials=2" handle_casings = CYCLE_CASINGS load_method = SINGLE_CASING + +/obj/item/weapon/gun/projectile/shotgun/improvised/special_check(var/mob/living/carbon/human/M) + if(prob(60 - (loaded.len * 10))) + M.visible_message("[M]'s weapon blows up, shattering into pieces!","[src] blows up in your face!", "You hear a loud bang!") + M.take_organ_damage(0,30) + M.drop_item() + new /obj/item/weapon/material/shard/shrapnel(get_turf(src)) + qdel(src) + return 0 + return 1 + /obj/item/weapon/gun/projectile/shotgun/improvised/attackby(var/obj/item/A as obj, mob/user as mob) if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/melee/energy) || istype(A, /obj/item/weapon/pickaxe/plasmacutter)) diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 7e0fdc99a31..0867200494d 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -176,8 +176,6 @@ var/global/list/ammo_types = list( /obj/item/ammo_casing/a357 = ".357", - /obj/item/ammo_casing/c9mmf = "9mm", - /obj/item/ammo_casing/c45f = ".45", /obj/item/ammo_casing/a12mm = "12mm", /obj/item/ammo_casing/shotgun = "12 gauge", /obj/item/ammo_casing/shotgun = "12 gauge", @@ -185,8 +183,6 @@ /obj/item/ammo_casing/shotgun/pellet = "12 gauge", /obj/item/ammo_casing/shotgun/pellet = "12 gauge", /obj/item/ammo_casing/shotgun/beanbag = "12 gauge", - /obj/item/ammo_casing/shotgun/stunshell = "12 gauge", - /obj/item/ammo_casing/shotgun/flash = "12 gauge", /obj/item/ammo_casing/a762 = "7.62mm", /obj/item/ammo_casing/a556 = "5.56mm" ) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d51482c3edd..4d8759cc6aa 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -114,21 +114,13 @@ p_x = between(0, p_x + rand(-radius, radius), world.icon_size) p_y = between(0, p_y + rand(-radius, radius), world.icon_size) -//called to launch a projectile from a gun -/obj/item/projectile/proc/launch(atom/target, mob/user, obj/item/weapon/gun/launcher, var/target_zone, var/x_offset=0, var/y_offset=0) - var/turf/curloc = get_turf(user) +//called to launch a projectile +/obj/item/projectile/proc/launch(atom/target, var/target_zone, var/x_offset=0, var/y_offset=0, var/angle_offset=0) + var/turf/curloc = get_turf(src) var/turf/targloc = get_turf(target) if (!istype(targloc) || !istype(curloc)) return 1 - firer = user - def_zone = target_zone - - if(user == target) //Shooting yourself - user.bullet_act(src, target_zone) - on_impact(user) - qdel(src) - return 0 if(targloc == curloc) //Shooting something in the same turf target.bullet_act(src, target_zone) on_impact(target) @@ -136,31 +128,38 @@ return 0 original = target - loc = curloc - starting = curloc - current = curloc - yo = targloc.y - curloc.y + y_offset - xo = targloc.x - curloc.x + x_offset - - shot_from = launcher - silenced = launcher.silenced + def_zone = target_zone spawn() + setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory process() return 0 +//called to launch a projectile from a gun +/obj/item/projectile/proc/launch_from_gun(atom/target, mob/user, obj/item/weapon/gun/launcher, var/target_zone, var/x_offset=0, var/y_offset=0) + if(user == target) //Shooting yourself + user.bullet_act(src, target_zone) + qdel(src) + return 0 + + loc = get_turf(user) //move the projectile out into the world + + firer = user + shot_from = launcher.name + silenced = launcher.silenced + + return launch(target, target_zone, x_offset, y_offset) + //Used to change the direction of the projectile in flight. /obj/item/projectile/proc/redirect(var/new_x, var/new_y, var/atom/starting_loc, var/mob/new_firer=null) - original = locate(new_x, new_y, src.z) - starting = starting_loc - current = starting_loc + var/turf/new_target = locate(new_x, new_y, src.z) + + original = new_target if(new_firer) firer = src - yo = new_y - starting_loc.y - xo = new_x - starting_loc.x - setup_trajectory() + setup_trajectory(starting_loc, new_target) //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) @@ -177,14 +176,15 @@ result = target_mob.bullet_act(src, def_zone) if(result == PROJECTILE_FORCE_MISS && (can_miss == 0)) //if you're shooting at point blank you can't miss. - visible_message("\The [src] misses [target_mob] narrowly!") + if(!silenced) + target_mob.visible_message("\The [src] misses [target_mob] narrowly!") return 0 //hit messages if(silenced) target_mob << "You've been hit in the [parse_zone(def_zone)] by \the [src]!" else - visible_message("\The [target_mob] is hit by \the [src] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter + target_mob.visible_message("\The [target_mob] is hit by \the [src] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter //admin logs if(!no_attack_log) @@ -268,20 +268,15 @@ qdel(src) return 1 -/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group || (height==0)) return 1 +/obj/item/projectile/ex_act() + return //explosions probably shouldn't delete projectiles - if(istype(mover, /obj/item/projectile)) - return prob(95) //ha - else - return 1 +/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + return 1 /obj/item/projectile/process() var/first_step = 1 - //plot the initial trajectory - setup_trajectory() - spawn while(src && src.loc) if(kill_count-- < 1) on_impact(src.loc) //for any final impact behaviours @@ -319,9 +314,15 @@ sleep(step_delay) //add delay between movement iterations if it's not a hitscan weapon /obj/item/projectile/proc/before_move() - return + return 0 + +/obj/item/projectile/proc/setup_trajectory(turf/startloc, turf/targloc, var/x_offset = 0, var/y_offset = 0) + // setup projectile state + starting = startloc + current = startloc + yo = targloc.y - startloc.y + y_offset + xo = targloc.x - startloc.x + x_offset -/obj/item/projectile/proc/setup_trajectory() // trajectory dispersion var/offset = 0 if(dispersion) @@ -380,7 +381,6 @@ invisibility = 101 //Nope! Can't see me! yo = null xo = null - var/target = null var/result = 0 //To pass the message back to the gun. /obj/item/projectile/test/Bump(atom/A as mob|obj|turf|area) @@ -395,25 +395,24 @@ result = 1 return -/obj/item/projectile/test/process() +/obj/item/projectile/test/launch(atom/target) var/turf/curloc = get_turf(src) var/turf/targloc = get_turf(target) if(!curloc || !targloc) return 0 - yo = targloc.y - curloc.y - xo = targloc.x - curloc.x - target = targloc + original = target - starting = curloc //plot the initial trajectory - setup_trajectory() + setup_trajectory(curloc, targloc) + return process(targloc) +/obj/item/projectile/test/process(var/turf/targloc) while(src) //Loop on through! if(result) return (result - 1) - if((!( target ) || loc == target)) - target = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) //Finding the target turf at map edge + if((!( targloc ) || loc == targloc)) + targloc = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) //Finding the target turf at map edge trajectory.increment() // increment the current location location = trajectory.return_location(location) // update the locally stored location data @@ -424,18 +423,22 @@ if(istype(M)) //If there is someting living... return 1 //Return 1 else - M = locate() in get_step(src,target) + M = locate() in get_step(src,targloc) if(istype(M)) return 1 -/proc/check_trajectory(atom/target as mob|obj, atom/firer as mob|obj, var/pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null) //Checks if you can hit them or not. +//Helper proc to check if you can hit them or not. +/proc/check_trajectory(atom/target as mob|obj, atom/firer as mob|obj, var/pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null) if(!istype(target) || !istype(firer)) return 0 + var/obj/item/projectile/test/trace = new /obj/item/projectile/test(get_turf(firer)) //Making the test.... - trace.target = target + + //Set the flags and pass flags to that of the real projectile... if(!isnull(flags)) - trace.flags = flags //Set the flags... - trace.pass_flags = pass_flags //And the pass flags to that of the real projectile... - var/output = trace.process() //Test it! + trace.flags = flags + trace.pass_flags = pass_flags + + var/output = trace.launch(target) //Test it! qdel(trace) //No need for it anymore return output //Send it back to the gun! diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 2732c6a7628..3cd9b393ae3 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -110,7 +110,7 @@ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE kill_count = 100 embed = 0 - incinerate = 40 +// incinerate = 40 weaken = 5 stun = 5 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index 1f22c3418c2..6154c963cb2 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -57,9 +57,9 @@ description = "A well-known alcohol with a variety of applications." reagent_state = LIQUID color = "#404030" - var/nutriment_factor = 0 - var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity. - var/toxicity = 1 + ingest_met = 0.5 + var/nutriment_factor = 0.5 + var/strength = 100 // This is the Alcohol By Volume of the drink, value is in the range 0-100 unless you wanted to create some bizarre bluespace alcohol with <100 var/druggy = 0 var/adj_temp = 0 @@ -71,39 +71,26 @@ glass_desc = "A well-known alcohol with a variety of applications." /datum/reagent/ethanol/touch_mob(var/mob/living/L, var/amount) - if(istype(L)) - L.adjust_fire_stacks(amount / 15) + if(istype(L) && strength > 40) + L.adjust_fire_stacks((amount / 10) * (strength / 100)) /datum/reagent/ethanol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.adjustToxLoss(removed * 2 * toxicity) + M.adjustToxLoss(removed * 2) return /datum/reagent/ethanol/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) - M.nutrition += nutriment_factor * removed + if(M.get_species() == "Vaurca")//Vaurca are damaged instead of getting nutrients, but they can still get drunk + M.adjustToxLoss(1.5 * removed * (strength / 100)) + else + M.nutrition += nutriment_factor * removed - var/strength_mod = 1 - if(alien == IS_SKRELL) - strength_mod *= 5 if(alien == IS_DIONA) - strength_mod = 0 + return //Diona can gain nutrients, but don't get drunk or suffer other effects - M.add_chemical_effect(CE_ALCOHOL, 1) - if(dose * strength_mod >= strength) // Early warning - M.make_dizzy(6) // It is decreased at the speed of 3 per tick - if(dose * strength_mod >= strength * 2) // Slurring - M.slurring = max(M.slurring, 30) - if(dose * strength_mod >= strength * 3) // Confusion - walking in random directions - M.confused = max(M.confused, 20) - if(dose * strength_mod >= strength * 4) // Blurry vision - M.eye_blurry = max(M.eye_blurry, 10) - if(dose * strength_mod >= strength * 5) // Drowsyness - periodically falling asleep - M.drowsyness = max(M.drowsyness, 20) - if(dose * strength_mod >= strength * 6) // Toxic dose - M.add_chemical_effect(CE_ALCOHOL_TOXIC, toxicity) - if(dose * strength_mod >= strength * 7) // Pass out - M.paralysis = max(M.paralysis, 20) - M.sleeping = max(M.sleeping, 30) + var/quantity = (strength / 100) * removed + M.intoxication += quantity + if(druggy != 0) M.druggy = max(M.druggy, druggy) @@ -116,6 +103,7 @@ if(halluci) M.hallucination = max(M.hallucination, halluci) + /datum/reagent/ethanol/touch_obj(var/obj/O) if(istype(O, /obj/item/weapon/paper)) var/obj/item/weapon/paper/paperaffected = O 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 761d103f2a3..9a970f67900 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -599,6 +599,14 @@ if(adj_temp > 0) holder.remove_reagent("frostoil", 10 * removed) + M.dizziness = max(0, M.dizziness - 5) + M.drowsyness = max(0, M.drowsyness - 3) + M.sleeping = max(0, M.sleeping - 2) + M.intoxication = max(0, (M.intoxication - (removed*0.25))) + if(M.bodytemperature > 310) + M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) + + /datum/reagent/drink/coffee/overdose(var/mob/living/carbon/M, var/alien) if(alien == IS_DIONA) return @@ -938,7 +946,7 @@ id = "absinthe" description = "Watch out that the Green Fairy doesn't come for you!" color = "#33EE00" - strength = 12 + strength = 75 glass_icon_state = "absintheglass" glass_name = "glass of absinthe" @@ -950,7 +958,7 @@ id = "ale" description = "A dark alchoholic beverage made by malted barley and yeast." color = "#664300" - strength = 50 + strength = 6 glass_icon_state = "aleglass" glass_name = "glass of ale" @@ -962,7 +970,7 @@ id = "beer" description = "An alcoholic beverage made from malted grains, hops, yeast, and water." color = "#664300" - strength = 50 + strength = 5 nutriment_factor = 1 glass_icon_state = "beerglass" @@ -981,7 +989,7 @@ id = "bluecuracao" description = "Exotically blue, fruity drink, distilled from oranges." color = "#0000CD" - strength = 15 + strength = 25 glass_icon_state = "curacaoglass" glass_name = "glass of blue curacao" @@ -993,7 +1001,7 @@ id = "cognac" description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." color = "#AB3C05" - strength = 15 + strength = 40 glass_icon_state = "cognacglass" glass_name = "glass of cognac" @@ -1023,7 +1031,7 @@ id = "gin" description = "It's gin. In space. I say, good sir." color = "#664300" - strength = 50 + strength = 40 glass_icon_state = "ginvodkaglass" glass_name = "glass of gin" @@ -1035,7 +1043,7 @@ id = "kahlua" description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" color = "#664300" - strength = 15 + strength = 20 glass_icon_state = "kahluaglass" glass_name = "glass of RR coffee liquor" @@ -1058,7 +1066,7 @@ id = "melonliquor" description = "A relatively sweet and fruity 46 proof liquor." color = "#138808" // rgb: 19, 136, 8 - strength = 50 + strength = 23 glass_icon_state = "emeraldglass" glass_name = "glass of melon liquor" @@ -1070,7 +1078,7 @@ id = "rum" description = "Yohoho and all that." color = "#664300" - strength = 15 + strength = 40 glass_icon_state = "rumglass" glass_name = "glass of rum" @@ -1082,7 +1090,7 @@ id = "sake" description = "Anime's favorite drink." color = "#664300" - strength = 25 + strength = 20 glass_icon_state = "ginvodkaglass" glass_name = "glass of sake" @@ -1094,7 +1102,7 @@ id = "tequilla" description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" color = "#FFFF91" - strength = 25 + strength = 40 glass_icon_state = "tequillaglass" glass_name = "glass of Tequilla" @@ -1106,7 +1114,7 @@ id = "thirteenloko" description = "A potent mixture of caffeine and alcohol." color = "#102000" - strength = 25 + strength = 10 nutriment_factor = 1 glass_icon_state = "thirteen_loko_glass" @@ -1127,7 +1135,7 @@ id = "vermouth" description = "You suddenly feel a craving for a martini..." color = "#91FF91" // rgb: 145, 255, 145 - strength = 15 + strength = 17 glass_icon_state = "vermouthglass" glass_name = "glass of vermouth" @@ -1139,7 +1147,7 @@ id = "vodka" description = "Number one drink AND fueling choice for Russians worldwide." color = "#0064C8" // rgb: 0, 100, 200 - strength = 15 + strength = 50 glass_icon_state = "ginvodkaglass" glass_name = "glass of vodka" @@ -1155,7 +1163,7 @@ id = "whiskey" description = "A superb and well-aged single-malt whiskey. Damn." color = "#664300" - strength = 25 + strength = 40 glass_icon_state = "whiskeyglass" glass_name = "glass of whiskey" @@ -1182,7 +1190,7 @@ description = "A drink for the daring, can be deadly if incorrectly prepared!" reagent_state = LIQUID color = "#365000" - strength = 30 + strength = 10 glass_icon_state = "acidspitglass" glass_name = "glass of Acid Spit" @@ -1231,7 +1239,7 @@ id = "andalusia" description = "A nice, strangely named drink." color = "#664300" - strength = 15 + strength = 35 glass_icon_state = "andalusia" glass_name = "glass of Andalusia" @@ -1243,7 +1251,7 @@ id = "antifreeze" description = "Ultimate refreshment." color = "#664300" - strength = 12 + strength = 20 adj_temp = 20 targ_temp = 330 @@ -1258,7 +1266,7 @@ description = "Nuclear proliferation never tasted so good." reagent_state = LIQUID color = "#666300" - strength = 10 + strength = 50 druggy = 50 glass_icon_state = "atomicbombglass" @@ -1271,7 +1279,7 @@ id = "b52" description = "Coffee, Irish Cream, and cognac. You will get bombed." color = "#664300" - strength = 12 + strength = 35 glass_icon_state = "b52glass" glass_name = "glass of B-52" @@ -1282,7 +1290,7 @@ id = "bahama_mama" description = "Tropical cocktail." color = "#FF7F3B" - strength = 25 + strength = 15 glass_icon_state = "bahama_mama" glass_name = "glass of Bahama Mama" @@ -1295,7 +1303,7 @@ description = "A drink from Clown Heaven." nutriment_factor = 1 color = "#FFFF91" - strength = 12 + strength = 15 glass_icon_state = "bananahonkglass" glass_name = "glass of Banana Honk" @@ -1307,7 +1315,7 @@ id = "barefoot" description = "Barefoot and pregnant" color = "#664300" - strength = 30 + strength = 15 glass_icon_state = "b&p" glass_name = "glass of Barefoot" @@ -1320,7 +1328,7 @@ description = "Deny drinking this and prepare for THE LAW." reagent_state = LIQUID color = "#664300" - strength = 12 + strength = 35 glass_icon_state = "beepskysmashglass" glass_name = "Beepsky Smash" @@ -1336,7 +1344,7 @@ id = "bilk" description = "This appears to be beer mixed with milk. Disgusting." color = "#895C4C" - strength = 50 + strength = 4 nutriment_factor = 2 glass_icon_state = "glass_brown" @@ -1348,7 +1356,7 @@ id = "blackrussian" description = "For the lactose-intolerant. Still as classy as a White Russian." color = "#360000" - strength = 15 + strength = 20 glass_icon_state = "blackrussianglass" glass_name = "glass of Black Russian" @@ -1360,7 +1368,7 @@ id = "bloodymary" 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" - strength = 15 + strength = 20 glass_icon_state = "bloodymaryglass" glass_name = "glass of Bloody Mary" @@ -1371,7 +1379,7 @@ id = "booger" description = "Ewww..." color = "#8CFF8C" - strength = 30 + strength = 20 glass_icon_state = "booger" glass_name = "glass of Booger" @@ -1382,7 +1390,7 @@ id = "bravebull" description = "It's just as effective as Dutch-Courage!" color = "#664300" - strength = 15 + strength = 30 glass_icon_state = "bravebullglass" glass_name = "glass of Brave Bull" @@ -1394,7 +1402,7 @@ id = "changelingsting" description = "You take a tiny sip and feel a burning sensation..." color = "#2E6671" - strength = 10 + strength = 40 glass_icon_state = "changelingsting" glass_name = "glass of Changeling Sting" @@ -1417,7 +1425,7 @@ id = "cubalibre" description = "Rum, mixed with cola. Viva la revolucion." color = "#3E1B00" - strength = 30 + strength = 10 glass_icon_state = "cubalibreglass" glass_name = "glass of Cuba Libre" @@ -1454,7 +1462,7 @@ description = "Only for the experienced. You think you see sand floating in the glass." nutriment_factor = 1 color = "#2E6671" - strength = 12 + strength = 20 glass_icon_state = "driestmartiniglass" glass_name = "glass of Driest Martini" @@ -1466,7 +1474,7 @@ id = "ginfizz" description = "Refreshingly lemony, deliciously dry." color = "#664300" - strength = 30 + strength = 20 glass_icon_state = "ginfizzglass" glass_name = "glass of gin fizz" @@ -1479,7 +1487,7 @@ description = "Watered down rum, NanoTrasen approves!" reagent_state = LIQUID color = "#664300" - strength = 100 + strength = 10 glass_icon_state = "grogglass" glass_name = "glass of grog" @@ -1503,7 +1511,7 @@ description = "Whoah, this stuff looks volatile!" reagent_state = LIQUID color = "#664300" - strength = 10 + strength = 50 glass_icon_state = "gargleblasterglass" glass_name = "glass of Pan-Galactic Gargle Blaster" @@ -1515,7 +1523,7 @@ id = "gintonic" description = "An all time classic, mild cocktail." color = "#664300" - strength = 50 + strength = 12 glass_icon_state = "gintonicglass" glass_name = "glass of gin and tonic" @@ -1527,7 +1535,7 @@ id = "goldschlager" description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." color = "#664300" - strength = 15 + strength = 50 glass_icon_state = "ginvodkaglass" glass_name = "glass of Goldschlager" @@ -1553,8 +1561,7 @@ id = "hooch" description = "Either someone's failure at cocktail making or attempt in alchohol production. In any case, do you really want to drink that?" color = "#664300" - strength = 25 - toxicity = 2 + strength = 65 glass_icon_state = "glass_brown2" glass_name = "glass of Hooch" @@ -1565,7 +1572,7 @@ id = "iced_beer" description = "A beer which is so cold the air around it freezes." color = "#664300" - strength = 50 + strength = 5 adj_temp = -20 targ_temp = 270 @@ -1603,7 +1610,7 @@ id = "irishcream" description = "Whiskey-imbued cream, what else would you expect from the Irish." color = "#664300" - strength = 25 + strength = 15 glass_icon_state = "irishcreamglass" glass_name = "glass of Irish cream" @@ -1615,7 +1622,7 @@ id = "longislandicedtea" description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." color = "#664300" - strength = 12 + strength = 30 glass_icon_state = "longislandicedteaglass" glass_name = "glass of Long Island iced tea" @@ -1627,7 +1634,7 @@ id = "manhattan" description = "The Detective's undercover drink of choice. He never could stomach gin..." color = "#664300" - strength = 15 + strength = 20 glass_icon_state = "manhattanglass" glass_name = "glass of Manhattan" @@ -1639,7 +1646,7 @@ id = "manhattan_proj" description = "A scientist's drink of choice, for pondering ways to blow up the station." color = "#664300" - strength = 10 + strength = 30 druggy = 30 glass_icon_state = "proj_manhattanglass" @@ -1652,7 +1659,7 @@ id = "manlydorf" description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." color = "#664300" - strength = 25 + strength = 10 glass_icon_state = "manlydorfglass" glass_name = "glass of The Manly Dorf" @@ -1676,7 +1683,7 @@ description = "A Viking's drink, though a cheap one." reagent_state = LIQUID color = "#664300" - strength = 30 + strength = 20 nutriment_factor = 1 glass_icon_state = "meadglass" @@ -1689,7 +1696,7 @@ id = "moonshine" description = "You've really hit rock bottom now... your liver packed its bags and left last night." color = "#664300" - strength = 12 + strength = 65 glass_icon_state = "glass_clear" glass_name = "glass of moonshine" @@ -1701,7 +1708,7 @@ description = "A strong neurotoxin that puts the subject into a death-like state." reagent_state = LIQUID color = "#2E2E61" - strength = 10 + strength = 50 glass_icon_state = "neurotoxinglass" glass_name = "glass of Neurotoxin" @@ -1717,7 +1724,7 @@ id = "patron" description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." color = "#585840" - strength = 30 + strength = 20 glass_icon_state = "patronglass" glass_name = "glass of Patron" @@ -1729,7 +1736,7 @@ id = "pwine" description = "Is this even wine? Toxic! Hallucinogenic! Probably consumed in boatloads by your superiors!" color = "#000000" - strength = 10 + strength = 15 druggy = 50 halluci = 10 @@ -1756,7 +1763,7 @@ id = "red_mead" description = "The true Viking's drink! Even though it has a strange red color." color = "#C73C00" - strength = 30 + strength = 21 glass_icon_state = "red_meadglass" glass_name = "glass of red mead" @@ -1768,7 +1775,7 @@ id = "sbiten" description = "A spicy Vodka! Might be a little hot for the little guys!" color = "#664300" - strength = 15 + strength = 40 adj_temp = 50 targ_temp = 360 @@ -1795,7 +1802,7 @@ description = "A drink from Mime Heaven." nutriment_factor = 1 color = "#664300" - strength = 12 + strength = 18 glass_icon_state = "silencerglass" glass_name = "glass of Silencer" @@ -1807,7 +1814,7 @@ id = "singulo" description = "A blue-space beverage!" color = "#2E6671" - strength = 10 + strength = 20 glass_icon_state = "singulo" glass_name = "glass of Singulo" @@ -1819,7 +1826,7 @@ id = "snowwhite" description = "A cold refreshment" color = "#FFFFFF" - strength = 30 + strength = 7 glass_icon_state = "snowwhite" glass_name = "glass of Snow White" @@ -1831,7 +1838,7 @@ id = "suidream" description = "Comprised of: White soda, blue curacao, melon liquor." color = "#00A86B" - strength = 100 + strength = 5 glass_icon_state = "sdreamglass" glass_name = "glass of Sui Dream" @@ -1855,7 +1862,7 @@ id = "tequillasunrise" description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~" color = "#FFE48C" - strength = 25 + strength = 15 glass_icon_state = "tequillasunriseglass" glass_name = "glass of Tequilla Sunrise" @@ -1866,7 +1873,7 @@ id = "threemileisland" description = "Made for a woman, strong enough for a man." color = "#666340" - strength = 10 + strength = 60 druggy = 50 glass_icon_state = "threemileislandglass" @@ -1880,7 +1887,7 @@ description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!" reagent_state = LIQUID color = "#664300" - strength = 10 + strength = 40 adj_temp = 15 targ_temp = 330 @@ -1893,7 +1900,7 @@ id = "vodkamartini" description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." color = "#664300" - strength = 12 + strength = 32 glass_icon_state = "martiniglass" glass_name = "glass of vodka martini" @@ -1905,7 +1912,7 @@ id = "vodkatonic" description = "For when a gin and tonic isn't russian enough." color = "#0064C8" // rgb: 0, 100, 200 - strength = 15 + strength = 13 glass_icon_state = "vodkatonicglass" glass_name = "glass of vodka and tonic" @@ -1917,7 +1924,7 @@ id = "whiterussian" description = "That's just, like, your opinion, man..." color = "#A68340" - strength = 15 + strength = 24 glass_icon_state = "whiterussianglass" glass_name = "glass of White Russian" @@ -1929,7 +1936,7 @@ id = "whiskeycola" description = "Whiskey, mixed with cola. Surprisingly refreshing." color = "#3E1B00" - strength = 25 + strength = 15 glass_icon_state = "whiskeycolaglass" glass_name = "glass of whiskey cola" @@ -1953,7 +1960,7 @@ id = "specialwhiskey" description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." color = "#664300" - strength = 25 + strength = 45 glass_icon_state = "whiskeyglass" glass_name = "glass of special blend whiskey" @@ -2015,3 +2022,258 @@ /datum/reagent/drink/cafe_melange/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() M.reagents.add_reagent("kelotane", removed * 0.2) + +//aurora unique drinks + +/datum/reagent/ethanol/daiquiri + name = "Daiquiri" + id = "daiquiri" + description = "Exotically blue, fruity drink, distilled from oranges." + color = "#664300" + strength = 15 + + glass_icon_state = "daiquiri" + glass_name = "glass of Daiquiri" + glass_desc = "A splendid looking cocktail." + +/datum/reagent/ethanol/icepick + name = "Ice Pick" + id = "icepick" + description = "Big. And red. Hmm...." + color = "#664300" + strength = 10 + + glass_icon_state = "icepick" + glass_name = "glass of Ice Pick" + glass_desc = "Big. And red. Hmm..." + +/datum/reagent/ethanol/poussecafe + name = "Pousse-Cafe" + id = "poussecafe" + description = "Smells of French and liquore." + color = "#664300" + strength = 15 + + glass_icon_state = "pousseecafe" + glass_name = "glass of Pousse-Cafe" + glass_desc = "Smells of French and liquore." + +/datum/reagent/ethanol/mintjulep + name = "Mint Julep" + id = "mintjulep" + description = "As old as time itself, but how does it taste?" + color = "#664300" + strength = 25 + + glass_icon_state = "mintjulep" + glass_name = "glass of Mint Julep" + glass_desc = "As old as time itself, but how does it taste?" + +/datum/reagent/ethanol/johncollins + name = "John Collins" + id = "johncollins" + description = "Crystal clear, yellow, and smells of gin. How could this go wrong?" + color = "#664300" + strength = 25 + + glass_icon_state = "johnscollins" + glass_name = "glass of John Collins" + glass_desc = "Named after a man, perhaps?" + +/datum/reagent/ethanol/gimlet + name = "Gimlet" + id = "gimlet" + description = "Small, elegant, and kicks." + color = "#664300" + strength = 13 + + glass_icon_state = "gimlet" + glass_name = "glass of Gimlet" + glass_desc = "Small, elegant, and packs a punch." + +/datum/reagent/ethanol/starsandstripes + name = "Stars and Stripes" + id = "starsandstripes" + description = "Someone, somewhere, is saluting." + color = "#664300" + strength = 10 + + glass_icon_state = "starsandstripes" + glass_name = "glass of Stars and Stripes" + glass_desc = "Someone, somewhere, is saluting." + +/datum/reagent/ethanol/metropolitan + name = "Metropolitan" + id = "metropolitan" + description = "What more could you ask for?" + color = "#664300" + strength = 27 + + glass_icon_state = "metropolitan" + glass_name = "glass of Metropolitan" + glass_desc = "What more could you ask for?" + +/datum/reagent/ethanol/caruso + name = "Caruso" + id = "caruso" + description = "Green, almost alien." + color = "#664300" + strength = 25 + + glass_icon_state = "caruso" + glass_name = "glass of Caruso" + glass_desc = "Green, almost alien." + +/datum/reagent/ethanol/aprilshower + name = "April Shower" + id = "aprilshower" + description = "Smells of brandy." + color = "#664300" + strength = 25 + + glass_icon_state = "aprilshower" + glass_name = "glass of April Shower" + glass_desc = "Smells of brandy." + +/datum/reagent/ethanol/carthusiansazerac + name = "Carthusian Sazerac" + id = "carthusiansazerac" + description = "Whiskey and... Syrup?" + color = "#664300" + strength = 15 + + glass_icon_state = "carthusiansazerac" + glass_name = "glass of Carthusian Sazerac" + glass_desc = "Whiskey and... Syrup?" + +/datum/reagent/ethanol/deweycocktail + name = "Dewey Cocktail" + id = "deweycocktail" + description = "Colours, look at all the colours!" + color = "#664300" + strength = 25 + + glass_icon_state = "deweycocktail" + glass_name = "glass of Dewey Cocktail" + glass_desc = "Colours, look at all the colours!" + +/datum/reagent/ethanol/chartreusegreen + name = "Green Chartreuse" + id = "chartreusegreen" + description = "A green, strong liqueur." + color = "#664300" + strength = 40 + + glass_icon_state = "greenchartreuseglass" + glass_name = "glass of Green Chartreuse" + glass_desc = "A green, strong liqueur." + +/datum/reagent/ethanol/chartreuseyellow + name = "Yellow Chartreuse" + id = "chartreuseyellow" + description = "A yellow, strong liqueur." + color = "#664300" + strength = 40 + + glass_icon_state = "chartreuseyellowglass" + glass_name = "glass of Yellow Chartreuse" + glass_desc = "A yellow, strong liqueur." + +/datum/reagent/ethanol/cremewhite + name = "White Creme de Menthe" + id = "cremewhite" + description = "Mint-flavoured alcohol, in a bottle." + color = "#664300" + strength = 20 + + glass_icon_state = "whitecremeglass" + glass_name = "glass of White Creme de Menthe" + glass_desc = "Mint-flavoured alcohol." + +/datum/reagent/ethanol/cremeyvette + name = "Creme de Yvette" + id = "cremeyvette" + description = "Berry-flavoured alcohol, in a bottle." + color = "#664300" + strength = 20 + + glass_icon_state = "cremedeyvetteglass" + glass_name = "glass of Creme de Yvette" + glass_desc = "Berry-flavoured alcohol." + +/datum/reagent/ethanol/brandy + name = "Brandy" + id = "brandy" + description = "Cheap knock off for cognac." + color = "#664300" + strength = 40 + + glass_icon_state = "brandyglass" + glass_name = "glass of Brandy" + glass_desc = "Cheap knock off for cognac." + +/datum/reagent/ethanol/guinnes + name = "Guinness" + id = "guinnes" + description = "Special Guinnes drink." + color = "#2E6671" + strength = 8 + + glass_icon_state = "guinnes_glass" + glass_name = "glass of Guinness" + glass_desc = "A glass of Guinness." + +/datum/reagent/ethanol/drambuie + name = "Drambuie" + id = "drambuie" + description = "A drink that smells like whiskey but tastes different." + color = "#2E6671" + strength = 40 + + glass_icon_state = "drambuieglass" + glass_name = "glass of Drambuie" + glass_desc = "A drink that smells like whiskey but tastes different." + +/datum/reagent/ethanol/oldfashioned + name = "Old Fashioned" + id = "oldfashioned" + description = "That looks like from sixties." + color = "#2E6671" + strength = 20 + + glass_icon_state = "oldfashioned" + glass_name = "glass of Old Fashioned" + glass_desc = "That looks like from sixties." + +/datum/reagent/ethanol/blindrussian + name = "Blind Russian" + id = "blindrussian" + description = "You can't see?" + color = "#2E6671" + strength = 40 + + glass_icon_state = "blindrussian" + glass_name = "glass of Blind Russian" + glass_desc = "You can't see?" + +/datum/reagent/ethanol/rustynail + name = "Rusty Nail" + id = "rustynail" + description = "Smells like lemon." + color = "#2E6671" + strength = 25 + + glass_icon_state = "rustynail" + glass_name = "glass of Rusty Nail" + glass_desc = "Smells like lemon." + +/datum/reagent/ethanol/tallrussian + name = "Tall Black Russian" + id = "tallrussian" + description = "Just like black russian but taller." + color = "#2E6671" + strength = 25 + + glass_icon_state = "tallblackrussian" + glass_name = "glass of Tall Black Russian" + glass_desc = "Just like black russian but taller." diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index bf05039efeb..5d98a46426c 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -313,25 +313,61 @@ M.emote(pick("twitch", "blink_r", "shiver")) M.add_chemical_effect(CE_SPEEDBOOST, 1) + + +#define ETHYL_INTOX_COST 3 //The cost of power to remove one unit of intoxication from the patient +#define ETHYL_REAGENT_POWER 20 //The amount of power in one unit of ethyl + +//Ethylredoxrazine will remove a number of units of alcoholic substances from the patient's blood and stomach, equal to its pow +//Once all alcohol in the body is neutralised, it will then cure intoxication and sober the patient up /datum/reagent/ethylredoxrazine name = "Ethylredoxrazine" id = "ethylredoxrazine" description = "A powerful oxidizer that reacts with ethanol." reagent_state = SOLID color = "#605048" + metabolism = REM * 0.3 overdose = REAGENTS_OVERDOSE + scannable = 1 + /datum/reagent/ethylredoxrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return - M.dizziness = 0 - M.drowsyness = 0 - M.stuttering = 0 - M.confused = 0 + + var/P = removed * ETHYL_REAGENT_POWER + var/DP = dose * ETHYL_REAGENT_POWER//tiny optimisation + + //These status effects will now take a little while for the dose to build up and remove them + M.dizziness = max(0, M.dizziness - DP) + M.drowsyness = max(0, M.drowsyness - DP) + M.stuttering = max(0, M.stuttering - DP) + M.confused = max(0, M.confused - DP) + if(M.ingested) for(var/datum/reagent/R in M.ingested.reagent_list) if(istype(R, /datum/reagent/ethanol)) - R.dose = max(R.dose - removed * 5, 0) + var/amount = min(P, R.volume) + M.ingested.remove_reagent(R.id, amount) + P -= amount + if (P <= 0) + return + + //Even though alcohol is not supposed to be injected, ethyl removes it from the blood too, + //as a treatment option if someone was dumb enough to do this + if(M.bloodstr) + for(var/datum/reagent/R in M.bloodstr.reagent_list) + if(istype(R, /datum/reagent/ethanol)) + var/amount = min(P, R.volume) + M.bloodstr.remove_reagent(R.id, amount) + P -= amount + if (P <= 0) + return + + if (M.intoxication && P > 0) + var/amount = min(M.intoxication * ETHYL_INTOX_COST, P) + M.intoxication = max(0, (M.intoxication - (amount / ETHYL_INTOX_COST))) + P -= amount /datum/reagent/hyronalin name = "Hyronalin" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 201436a37c9..405ebf1d150 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -371,7 +371,9 @@ /datum/reagent/cryptobiolin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return + M.dizziness = max(150, M.dizziness)//Setting dizziness directly works as long as the make_dizzy proc is called after to spawn the process M.make_dizzy(4) + M.confused = max(M.confused, 20) /datum/reagent/impedrezene @@ -421,12 +423,14 @@ M.druggy = max(M.druggy, 30) if(dose < 1) M.stuttering = max(M.stuttering, 3) + M.dizziness = max(150, M.dizziness) M.make_dizzy(5) if(prob(5)) M.emote(pick("twitch", "giggle")) else if(dose < 2) M.stuttering = max(M.stuttering, 3) M.make_jittery(5) + M.dizziness = max(150, M.dizziness) M.make_dizzy(5) M.druggy = max(M.druggy, 35) if(prob(10)) @@ -434,6 +438,7 @@ else M.stuttering = max(M.stuttering, 3) M.make_jittery(10) + M.dizziness = max(150, M.dizziness) M.make_dizzy(10) M.druggy = max(M.druggy, 40) if(prob(15)) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 3f0e7fa7936..165a7eea497 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1973,8 +1973,122 @@ /////////////////////////////////////////Brightdawns super cool coffee drinks////////////////////////////////////////////// /datum/chemical_reaction/white_coffee - name = "Café Au Lait" + name = "Café Au Lait" id = "white_coffee" result = "white_coffee" required_reagents = list("milk" = 1, "blackcoffee" = 2) - result_amount = 2 \ No newline at end of file + result_amount = 2 + +//aurora's drinks + +/datum/chemical_reaction/daiquiri + name = "Daiquiri" + id = "daiquiri" + result = "daiquiri" + required_reagents = list("limejuice" = 1, "rum" = 1) + result_amount = 2 + +/datum/chemical_reaction/icepick + name = "Ice Pick" + id = "icepick" + result = "icepick" + required_reagents = list("icetea" = 1, "vodka" = 1) + result_amount = 2 + +/datum/chemical_reaction/poussecafe + name = "Pousse-Cafe" + id = "poussecafe" + result = "poussecafe" + required_reagents = list("brandy" = 1, "chartreusegreen" = 1, "chartreuseyellow" = 1, "cremewhite" = 1, "grenadine" = 1) + result_amount = 5 + +/datum/chemical_reaction/mintjulep + name = "Mint Julep" + id = "mintjulep" + result = "mintjulep" + required_reagents = list("water" = 1, "whiskey" = 1, "ice" = 1) + result_amount = 2 + +/datum/chemical_reaction/johncollins + name = "John Collins" + id = "johncollins" + result = "johncollins" + required_reagents = list("whiskeysoda" = 2, "lemonjuice" = 1, "grenadine" = 1, "ice" = 1) + result_amount = 5 + +/datum/chemical_reaction/gimlet + name = "Gimlet" + id = "gimlet" + result = "gimlet" + required_reagents = list("limejuice" = 1, "gin" = 1, "sodawater" = 1) + result_amount = 3 + +/datum/chemical_reaction/starsandstripes + name = "Stars and Stripes" + id = "starsandstripes" + result = "starsandstripes" + required_reagents = list("cream" = 1, "cremeyvette" = 1, "grenadine" = 1) + result_amount = 3 + +/* /datum/chemical_reaction/metropolitan //NO SPRITES + name = "Metropolitan" + id = "metropolitan" + result = "metropolitan" + required_reagents = list("brandy" = 1, "vermouth" = 1, "grenadine" = 1) + result_amount = 3 */ + +/datum/chemical_reaction/caruso + name = "Caruso" + id = "caruso" + result = "caruso" + required_reagents = list("martini" = 2, "cremewhite" = 1) + result_amount = 3 + +/datum/chemical_reaction/aprilshower + name = "April Shower" + id = "aprilshower" + result = "aprilshower" + required_reagents = list("brandy" = 1, "chartreuseyellow" = 1, "orangejuice" = 1) + result_amount = 3 + +/datum/chemical_reaction/carthusiansazerac + name = "Carthusian Sazerac" + id = "carthusiansazerac" + result = "carthusiansazerac" + required_reagents = list("whiskey" = 1, "chartreusegreen" = 1, "grenadine" = 1, "absinthe" = 1) + result_amount = 4 + +/datum/chemical_reaction/deweycocktail + name = "Dewey Cocktail" + id = "deweycocktail" + result = "deweycocktail" + required_reagents = list("cremeyvette" = 1, "gin" = 1, "grenadine" = 1) + result_amount = 3 + +/datum/chemical_reaction/rustynail + name = "Rusty Nail" + id = "rustynail" + result = "rustynail" + required_reagents = list("whiskey" = 1, "drambuie" = 1) + result_amount = 2 + +/datum/chemical_reaction/oldfashioned + name = "Old Fashioned" + id = "oldfashioned" + result = "oldfashioned" + required_reagents = list("bluecuracao" = 1, "gin" = 1, "ice" = 1) + result_amount = 3 + +/datum/chemical_reaction/blindrussian + name = "Blind Russian" + id = "blindrussian" + result = "blindrussian" + required_reagents = list("kahlua" = 1, "irishcream" = 1, "cream" = 1) + result_amount = 3 + +/datum/chemical_reaction/tallrussian + name = "Tall Black Russian" + id = "tallrussian" + result = "tallrussian" + required_reagents = list("blackrussian" = 1, "cola" = 1) + result_amount = 2 diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index e6e6f3ac29b..aeea6d4b558 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -65,7 +65,7 @@ return else - trans = reagents.splash(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs + trans = reagents.trans_to_obj(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs user << "You transfer [trans] units of the solution." else // Taking from something diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 8db599bf524..5d276386cd5 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -3,7 +3,7 @@ //Bottles now weaken and break when smashed on people's heads. - Giacom /obj/item/weapon/reagent_containers/food/drinks/bottle - amount_per_transfer_from_this = 10 + amount_per_transfer_from_this = 5//Smaller sip size for more BaRP and less guzzling a litre of vodka before you realise it volume = 120 item_state = "broken_beer" //Generic held-item sprite until unique ones are made. var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) @@ -318,3 +318,61 @@ New() ..() reagents.add_reagent("limejuice", 100) + +//aurora's drinks + +/obj/item/weapon/reagent_containers/food/drinks/bottle/chartreusegreen + name = "Green Chartreuse" + desc = "A green, strong liqueur." + icon_state = "chartreusegreenbottle" + New() + ..() + reagents.add_reagent("chartreusegreen", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/chartreuseyellow + name = "Yellow Chartreuse" + desc = "A yellow, strong liqueur." + icon_state = "chartreuseyellowbottle" + New() + ..() + reagents.add_reagent("chartreuseyellow", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/cremewhite + name = "White Creme de Menthe" + desc = "Mint-flavoured alcohol, in a bottle." + icon_state = "whitecremebottle" + New() + ..() + reagents.add_reagent("cremewhite", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/cremeyvette + name = "Creme de Yvette" + desc = "Berry-flavoured alcohol, in a bottle." + icon_state = "cremedeyvettebottle" + New() + ..() + reagents.add_reagent("cremeyvette", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/brandy + name = "Brandy" + desc = "Cheap knock off for cognac." + icon_state = "brandybottle" + New() + ..() + reagents.add_reagent("brandy", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/guinnes + name = "Guinness" + desc = "A bottle of good old Guinness." + icon_state = "guinnes_bottle" + New() + ..() + reagents.add_reagent("guinnes", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/drambuie + name = "Drambuie" + desc = "A bottle of Drambuie." + icon_state = "drambuie_bottle" + New() + ..() + reagents.add_reagent("drambuie", 100) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index c3f76f7fa41..a5cbe458e0a 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -16,11 +16,18 @@ var/spray_size = 3 var/list/spray_sizes = list(1,3) volume = 250 + var/safety = 0 /obj/item/weapon/reagent_containers/spray/New() ..() src.verbs -= /obj/item/weapon/reagent_containers/verb/set_APTFT +/obj/item/weapon/reagent_containers/spray/AltClick() + safety = !safety + playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + usr << "You twist the locking cap on the end of the nozzle, the spraybottle is now [safety ? "locked" : "unlocked"]." + + /obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user as mob, proximity) if(istype(A, /obj/item/weapon/storage) || istype(A, /obj/structure/table) || istype(A, /obj/structure/closet) || istype(A, /obj/item/weapon/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart)) return @@ -36,6 +43,11 @@ user << "\The [src] is empty!" return + if(safety) + playsound(src.loc, 'sound/weapons/empty.ogg', 25, 1) + user << "The safety is on!" + return + Spray_at(A, user, proximity) playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) @@ -121,7 +133,8 @@ item_state = "pepperspray" possible_transfer_amounts = null volume = 40 - var/safety = 1 + safety = 1 + /obj/item/weapon/reagent_containers/spray/pepper/New() ..() @@ -131,9 +144,13 @@ if(..(user, 1)) user << "The safety is [safety ? "on" : "off"]." +/obj/item/weapon/reagent_containers/spray/pepper/AltClick() + return //No altclick functionality for pepper spray + /obj/item/weapon/reagent_containers/spray/pepper/attack_self(var/mob/user) safety = !safety usr << "You switch the safety [safety ? "on" : "off"]." + playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) /obj/item/weapon/reagent_containers/spray/pepper/Spray_at(atom/A as mob|obj) if(safety) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 2682426be7b..01f642096f7 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -280,8 +280,8 @@ /obj/item/weapon/reagent_containers/syringe/ld50_syringe name = "Lethal Injection Syringe" desc = "A syringe used for lethal injections." - amount_per_transfer_from_this = 50 - volume = 50 + amount_per_transfer_from_this = 60 + volume = 60 visible_name = "a giant syringe" time = 300 @@ -338,6 +338,6 @@ /obj/item/weapon/reagent_containers/syringe/ld50_syringe/choral New() ..() - reagents.add_reagent("chloralhydrate", 50) + reagents.add_reagent("chloralhydrate", 60) mode = SYRINGE_INJECT update_icon() diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index f45199692cd..b4ae3d8f535 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -29,6 +29,19 @@ reliability_mod (starts at 0, gets improved through experimentation). Example: P other types of metals and chemistry for reagents). - Add the AUTOLATHE tag to +Research type IDs, for quick reference + +materials = Materials Research +engineering = Engineering Research +phorontech = Phoron Research +powerstorage = Power Manipulation Technology +bluespace = Blue-Space Research +biotech = Biological Technology +combat = Combat Systems Research +magnets = Electromagnetic Spectrum Research +programming = Data Theory Research +syndicate = Illegal Technologies Research + */ #define IMPRINTER 1 //For circuits. Uses glass/chemicals. @@ -1187,6 +1200,7 @@ datum/design/item/medical/nanopaste desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." id = "nanopaste" req_tech = list("materials" = 4, "engineering" = 3) + build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 7000, "$glass" = 7000) build_path = /obj/item/stack/nanopaste @@ -1253,14 +1267,14 @@ datum/design/item/implant/AssembleDesignName() ..() name = "Implantable biocircuit design ([item_name])" -/* // Removal of loyalty implants. Can't think of a way to add this to the config option. + // Removal of loyalty implants. Can't think of a way to add this to the config option. datum/design/item/implant/loyalty name = "loyalty" id = "implant_loyal" req_tech = list("materials" = 2, "biotech" = 3) materials = list("$metal" = 7000, "$glass" = 7000) - build_path = /obj/item/weapon/implantcase/loyalty" -*/ + build_path = /obj/item/weapon/implantcase/loyalty + datum/design/item/implant/chemical name = "chemical" @@ -1331,15 +1345,15 @@ datum/design/item/weapon/rapidsyringe req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2) materials = list("$metal" = 5000, "$glass" = 1000) build_path = /obj/item/weapon/gun/launcher/syringe/rapid -/* + datum/design/item/weapon/largecrossbow name = "Energy Crossbow" desc = "A weapon favoured by syndicate infiltration teams." id = "largecrossbow" req_tech = list("combat" = 4, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3) materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 1000, "$silver" = 1000) - build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow" -*/ + build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow + datum/design/item/weapon/temp_gun desc = "A gun that shoots high-powered glass-encased energy temperature bullets." id = "temp_gun" @@ -1374,6 +1388,14 @@ datum/design/item/weapon/ammo_9mm materials = list("$metal" = 3750, "$silver" = 100) build_path = /obj/item/ammo_magazine/c9mm +datum/design/item/weapon/trod + id = "trod" + name = "tungsten rod pack" + desc = "moderately expensive superdense tungsten rods." + req_tech = list("combat" = 2, "materials" = 4) + materials = list("$metal" = 10000, "$gold" = 3750) + build_path = /obj/item/ammo_magazine/trodpack + datum/design/item/weapon/stunshell desc = "A stunning shell for a shotgun." id = "stunshell" @@ -1387,13 +1409,44 @@ datum/design/item/weapon/phoronpistol materials = list("$metal" = 5000, "$glass" = 1000, "$phoron" = 3000) build_path = /obj/item/weapon/gun/energy/toxgun +datum/design/item/weapon/eglaive + id = "eglaive" + name = "energy glaive" + desc = "A Li'idra designed hardlight glaive reverse-engineered from schematics found amongst raider wreckages." + req_tech = list("combat" = 6, "phorontech" = 4, "materials" = 7, "syndicate" = 4,"powerstorage" = 4) + materials = list("$metal" = 10000, "$glass" = 18750, "$phoron" = 3000, "$silver" = 7500) + build_path = /obj/item/weapon/melee/energy/glaive + +datum/design/item/weapon/gatlinglaser + id = "gatlinglaser" + name = "gatling laser" + desc = "A higly sophisticated rapid-fire laser weapon." + req_tech = list("combat" = 6, "phorontech" = 6, "materials" = 4, "powerstorage" = 3) + materials = list("$metal" = 18750, "$glass" = 7500, "$phoron" = 7500, "$silver" = 7500, "$diamond" = 3000) + build_path = /obj/item/weapon/gun/energy/vaurca/gatlinglaser + +datum/design/item/weapon/railgun + id = "railgun" + name = "railgun" + desc = "An advanced rifle that magnetically propels hyperdense rods at breakneck speeds to devastating effect." + req_tech = list("combat" = 8, "phorontech" = 2, "materials" = 8, "magnets" = 4, "powerstorage" = 5, "syndicate" = 3) + materials = list("$metal" = 75000, "$glass" = 18750, "$phoron" = 11250, "$gold" = 7500, "$silver" = 7500) + build_path = /obj/item/weapon/gun/projectile/automatic/railgun + +datum/design/item/weapon/zorablaster + id = "zorablaster" + name = "zo'ra blaster" + desc = "A personal defense weapon reverse-engineered from schematics aboard Titan Prime." + req_tech = list("combat" = 2, "phorontech" = 4, "materials" = 2) + materials = list("$metal" = 8000, "$glass" = 2000, "$phoron" = 6000) + build_path = /obj/item/weapon/gun/energy/vaurca/blaster datum/design/item/weapon/lawgiver desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes." id = "lawgiver" - req_tech = list("combat" = 6, "plasmatech" = 4, "bluespace" = 5, "materials" = 7) + req_tech = list("combat" = 6, "phorontech" = 4, "bluespace" = 5, "materials" = 7) build_type = PROTOLATHE - materials = list("$metal" = 6000, "$glass" = 1000, "$uranium" = 1000, "$plasma" = 1000, "$diamond" = 3000) + materials = list("$metal" = 6000, "$glass" = 1000, "$uranium" = 1000, "$phoron" = 1000, "$diamond" = 3000) build_path = "/obj/item/weapon/gun/energy/lawgiver" /*This is all the station gets for producable force gloves. It's a high-risk item and thus considered contraband @@ -1621,3 +1674,124 @@ datum/design/item/chameleon req_tech = list("syndicate" = 2) materials = list("$metal" = 500) build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon + +datum/design/item/experimental_welder + name = "Experimental Welding Tool" + desc = "A scientifically-enhanced welding tool that uses fuel-producing microbes to gradually replenish its fuel supply" + id = "experimental_welder" + req_tech = list("materials" = 4, "engineering" = 4) + materials = list("$metal" = 500) + build_path =/obj/item/weapon/weldingtool/experimental + +//////exosuit modules - allow robotics to print some modules, maybe a generic rig, but more things for them to do --Alberyk + +datum/design/item/rigmodule + build_type = MECHFAB + req_tech = list("programming" = 2) + category = "Hardsuit Modules" + +datum/design/item/rigmodule/AssembleDesignName() + ..() + name = "Hardsuit modules design ([item_name])" + +datum/design/item/mecha/weapon/AssembleDesignDesc() + if(build_path) + desc = "Allows for the construction of \a '[item_name]' hardsuit module." + +datum/design/item/rigmodule/iss_module + desc = "Allows for the construction of an integrated intelligence system module suitable for most hardsuits." + id = "iss_module" + req_tech = list("programming" = 4, "materials" = 3) + materials = list("$glass" = 7500, "$metal" = 5000) + build_path = /obj/item/rig_module/ai_container + +datum/design/item/rigmodule/sink_module + desc = "Allows for the construction of a heavy-duty power sink." + id = "sink_module" + req_tech = list("engineering" = 4, "materials" = 3, "powerstorage" = 4, "syndicate" = 3) + materials = list("$metal" = 10000, "$gold"= 2000, "$silver"= 3000, "$glass"= 2000) + build_path = /obj/item/rig_module/power_sink + +datum/design/item/rigmodule/meson_module + desc = "Allows for the construction of an integrated meson scanner." + id = "meson_module" + req_tech = list("engineering" = 3, "materials" = 2, "magnets" = 3) + materials = list("$glass" = 5000, "$metal" = 1500) + build_path = /obj/item/rig_module/vision/meson + +datum/design/item/rigmodule/sechud_module + desc = "Allows for the construction of an integrated security hud." + id = "sechud_module" + req_tech = list("biotech" = 3, "materials" = 2, "magnets" = 3) + materials = list("$glass" = 5000, "$metal" = 1500) + build_path = /obj/item/rig_module/vision/sechud + +datum/design/item/rigmodule/medhud_module + desc = "Allows for the construction of an integrated medical hud." + id = "medhud_module" + req_tech = list("biotech" = 3, "materials" = 2, "magnets" = 3) + materials = list("$glass" = 5000, "$metal" = 1500) + build_path = /obj/item/rig_module/vision/medhud + +datum/design/item/rigmodule/nvg_module + desc = "Allows for the construction of an integrated night vision module." + id = "nvg_module" + req_tech = list("biotech" = 4, "materials" = 3, "magnets" = 4) + materials = list("$glass" = 5000, "$metal" = 1500, "$uranium" = 5000) + build_path = /obj/item/rig_module/vision/nvg + +datum/design/item/rigmodule/healthscanner_module + desc = "Allows for the construction of a hardsuit-mounted health scanner." + id = "healthscanner_module" + req_tech = list("biotech" = 3, "materials" = 3, "magnets" = 2) + materials = list("$glass" = 5250, "$metal" = 2500) + build_path = /obj/item/rig_module/device/healthscanner + +datum/design/item/rigmodule/chem_module + desc = "Allows for the construction of a hardsuit-mounted medicine dispenser." + id = "chem_module" + req_tech = list("biotech" = 5, "materials" = 4, "programming" = 3) + materials = list("$glass" = 9250, "$metal" = 10000, "$gold" = 2500, "$silver" = 4250, "$phoron" = 5500) + build_path = /obj/item/rig_module/chem_dispenser/injector + +datum/design/item/rigmodule/plasmacutter_module + desc = "Allows for the construction of a hardsuit-mounted plasma cutter." + id = "plasmacutter_module" + req_tech = list("engineering" = 4, "materials" = 3, "phorontech" = 4) + materials = list("$glass" = 5250, "$metal" = 30000, "$silver" = 5250, "$phoron" = 7250) + build_path = /obj/item/rig_module/device/plasmacutter + +datum/design/item/rigmodule/jet_module + desc = "Allows for the construction of a hardsuit-mounted jetpacks." + id = "jet_module" + req_tech = list("materials" = 3, "engineering" = 4, "powerstorage" = 2) + materials = list("$glass" = 4250, "$metal" = 15000, "$silver" = 4250, "$uranium" = 5250) + build_path = /obj/item/rig_module/maneuvering_jets + +datum/design/item/rigmodule/drill_module + desc = "Allows for the construction of a diamond-tipped hardsuit-mounted drill." + id = "drill_module" + req_tech = list("materials" = 5, "engineering" = 5, "powerstorage" = 4) + materials = list("$glass" = 2250, "$metal" = 55000, "$silver" = 5250, "$diamond" = 3750) + build_path = /obj/item/rig_module/device/drill + +datum/design/item/rigmodule/rcd_module + desc = "Allows for the construction of a hardsuit cell-powered rapid construction device." + id = "rcd_module" + req_tech = list("materials" = 5, "engineering" = 6, "powerstorage" = 5, "bluespace" = 4) + materials = list("$metal"=10000,"gold"=2000,"$silver"=3000,"$glass"=2000) + build_path = /obj/item/rig_module/device/rcd + +datum/design/item/rigmodule/taser_module + desc = "Allows for the construction of a hardsuit-mounted nonlethal energy projector." + id = "taser_module" + req_tech = list("materials" = 2, "powerstorage" = 3, "combat" = 3) + materials = list("$glass" = 5250, "$metal" = 7000) + build_path = /obj/item/rig_module/mounted/taser + +datum/design/item/rigmodule/egun_module + desc = "Allows for the construction of a hardsuit-mounted energy projector." + id = "egun_module" + req_tech = list("materials" = 3, "powerstorage" = 4, "combat" = 4) + materials = list("$glass" = 2250, "$metal" = 7000, "$uranium" = 3250, "$gold" = 2500) + build_path = /obj/item/rig_module/mounted/egun diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 9144cd11d98..859131529d1 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -294,7 +294,11 @@ var/obj/machinery/blackbox_recorder/blackbox //This proc is only to be called at round end. /obj/machinery/blackbox_recorder/proc/save_all_data_to_sql() - if(!feedback) return + if(!feedback) + return + + if (!config.sql_enabled || !config.sql_stats) + return round_end_data_gathering() //round_end time logging and some other data processing establish_db_connection(dbcon) @@ -377,4 +381,4 @@ proc/feedback_add_details(var/variable,var/details) if(!FV) return - FV.add_details(details) \ No newline at end of file + FV.add_details(details) diff --git a/code/modules/spells/targeted/projectile/projectile.dm b/code/modules/spells/targeted/projectile/projectile.dm index a0c403b51a6..185cdfece46 100644 --- a/code/modules/spells/targeted/projectile/projectile.dm +++ b/code/modules/spells/targeted/projectile/projectile.dm @@ -38,7 +38,7 @@ If the spell_projectile is seeking, it will update its target every process and if(istype(projectile, /obj/item/projectile/spell_projectile)) var/obj/item/projectile/spell_projectile/SP = projectile SP.carried = src //casting is magical - spawn projectile.process() + projectile.launch(target) return /spell/targeted/projectile/proc/choose_prox_targets(mob/user = usr, var/atom/movable/spell_holder) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 4e43816aec8..52858b63e4f 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -55,6 +55,7 @@ if(istype(target) && !(target.species.flags & NO_BLOOD)) affected.status |= ORGAN_BLEEDING + playsound(target.loc, 'sound/weapons/bladeslice.ogg', 50, 1) affected.createwound(CUT, 1) affected.clamp() diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index b20da362caf..741d82a250b 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -127,6 +127,7 @@ user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) target.custom_pain("The pain in your chest is living hell!",1) + playsound(target.loc, 'sound/effects/squelch1.ogg', 50, 1) ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -215,6 +216,7 @@ var/obj/item/weapon/implant/imp = obj imp.imp_in = null imp.implanted = 0 + playsound(target.loc, 'sound/effects/squelch1.ogg', 50, 1) else user.visible_message("\blue [user] removes \the [tool] from [target]'s [affected.name].", \ "\blue There's something inside [target]'s [affected.name], but you just missed it this time." ) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index a97184f35cb..90c77a4b790 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -228,7 +228,7 @@ var/list/attached_organs = list() for(var/organ in target.internal_organs_by_name) var/obj/item/organ/I = target.internal_organs_by_name[organ] - if(I && !I.status && I.parent_organ == target_zone) + if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) attached_organs |= organ var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs @@ -309,6 +309,7 @@ if(O && istype(O)) O.removed(user) target.op_stage.current_organ = null + playsound(target.loc, 'sound/effects/squelch1.ogg', 50, 1) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -383,6 +384,7 @@ if(istype(O)) user.remove_from_mob(O) O.replaced(target,affected) + playsound(target.loc, 'sound/effects/squelch1.ogg', 50, 1) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\red [user]'s hand slips, damaging \the [tool]!", \ diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 49445164501..7c79e508ddd 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -89,6 +89,7 @@ user.visible_message("\blue [user] has cut away necrotic tissue in [target]'s [affected.name] with \the [tool].", \ "\blue You have cut away necrotic tissue in [target]'s [affected.name] with \the [tool].") affected.open = 3 + playsound(target.loc, 'sound/effects/squelch1.ogg', 50, 1) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index c6ff8709881..62d14702ba5 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -55,7 +55,7 @@ if(is_train_head() && !on) return 0 - + //space check ~no flying space trains sorry if(on && istype(destination, /turf/space)) return 0 @@ -79,12 +79,13 @@ return ..() -//cargo trains are open topped, so there is a chance the projectile will hit the mob ridding the train instead +// Cargo trains are open topped, so you can shoot at the driver. +// Or you can shoot at the tug itself, if you're good. /obj/vehicle/train/cargo/bullet_act(var/obj/item/projectile/Proj) - if(buckled_mob && prob(70)) + if (buckled_mob && Proj.original == buckled_mob) buckled_mob.bullet_act(Proj) - return - ..() + else + ..() /obj/vehicle/train/cargo/update_icon() if(open) diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 556e82cd0c8..75b1328ef59 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -117,6 +117,10 @@ if (Proj.damage_type == BRUTE || Proj.damage_type == BURN) health -= Proj.damage ..() + + if (prob(20)) + PoolOrNew(/obj/effect/effect/sparks, loc) + healthcheck() /obj/vehicle/meteorhit() diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index ed6810980ca..ee2657b0a4e 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -128,12 +128,13 @@ nanomanager.update_uis(src) if(beaker) - if(foodsupply < 100 && beaker.reagents.remove_reagent("virusfood",5)) - if(foodsupply + 10 <= 100) - foodsupply += 10 - else - beaker.reagents.add_reagent("virusfood",(100 - foodsupply)/2) - foodsupply = 100 + if (foodsupply < 100 && beaker.reagents.has_reagent("virusfood")) + var/food_needed = min(10, 100 - foodsupply) / 2 + var/food_taken = min(food_needed, beaker.reagents.get_reagent_amount("virusfood")) + + beaker.reagents.remove_reagent("virusfood", food_taken) + foodsupply = min(100, foodsupply + (food_taken * 2)) + nanomanager.update_uis(src) if (locate(/datum/reagent/toxin) in beaker.reagents.reagent_list && toxins < 100) diff --git a/code/modules/web_interface/webint_procs.dm b/code/modules/web_interface/webint_procs.dm index 332dcf19a54..094073cf729 100644 --- a/code/modules/web_interface/webint_procs.dm +++ b/code/modules/web_interface/webint_procs.dm @@ -45,7 +45,7 @@ /* * /proc/webint_start_singlesignon() - * Used to insert a token into the web_sso database and to enable a user to navigate to a page on the website and be automatically logged in. Hashes the user's save file for a unique token. Additional security managed on the website's end. + * Used to insert a token into the web_sso database and to enable a user to navigate to a page on the website and be automatically logged in. Generates a hash algorithmically. Additional security managed on the website's end. * * Arguments: * - var/user - Must be a mob or a client. The player object that's going to be using the request. diff --git a/code/setup.dm b/code/setup.dm index d13084b74a2..1822607977d 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -221,10 +221,11 @@ #define BLOCKHAIR 8192 // Temporarily removes the user's hair, facial and otherwise. // Flags for pass_flags. -#define PASSTABLE 1 -#define PASSGLASS 2 -#define PASSGRILLE 4 -#define PASSBLOB 8 +#define PASSTABLE 1//Things that can walk on tables- most small creatures +#define PASSGLASS 2//Things that pass through glass, generally lasers +#define PASSGRILLE 4//Not sure what passes grilles. gases? +#define PASSBLOB 8//Used for parts of blob monster, probably shouldn't be a flag for this +#define PASSDOORHATCH 16//Ability to pass through door flaps. Drones and similar small things // Turf-only flags. #define NOJAUNT 1 // This is used in literally one place, turf.dm, to block ethereal jaunt. @@ -456,7 +457,8 @@ #define MUTE_PRAY 4 #define MUTE_ADMINHELP 8 #define MUTE_DEADCHAT 16 -#define MUTE_ALL 31 +#define MUTE_AOOC 32 +#define MUTE_ALL 63 // Number of identical messages required to get the spam-prevention auto-mute thing to trigger warnings and automutes. #define SPAM_TRIGGER_WARNING 5 @@ -901,6 +903,7 @@ var/list/be_special_flags = list( #define LIGHTING_LAYER 11 #define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put #define SCREEN_LAYER 22 //Mob HUD/effects layer +#define UNDERDOOR 3.09 //Just under a closed door ///////////////// diff --git a/code/world.dm b/code/world.dm index 1449cd599c6..af4ad387b2a 100644 --- a/code/world.dm +++ b/code/world.dm @@ -1,9 +1,21 @@ + +/* + The initialization of the game happens roughly like this: + + 1. All global variables are initialized (including the global_init instance). + 2. The map is initialized, and map objects are created. + 3. world/New() runs, creating the process scheduler (and the old master controller) and spawning their setup. + 4. processScheduler/setup() runs, creating all the processes. game_controller/setup() runs, calling initialize() on all movable atoms in the world. + 5. The gameticker is created. + +*/ var/global/datum/global_init/init = new () /* Pre-map initialization stuff should go here. */ /datum/global_init/New() + generate_gameid() makeDatumRefLists() load_configuration() @@ -11,6 +23,20 @@ var/global/datum/global_init/init = new () qdel(src) +/var/game_id = null +/proc/generate_gameid() + if(game_id != null) + return + game_id = "" + + var/list/c = list("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0") + var/l = c.len + + var/t = world.realtime + while(t != 0) + game_id += c[(t % l) + 1] + t = round(t / l) + /world mob = /mob/new_player turf = /turf/space @@ -18,15 +44,14 @@ var/global/datum/global_init/init = new () view = "15x15" cache_lifespan = 0 //stops player uploaded stuff from being kept in the rsc past the current session - - + #define RECOMMENDED_VERSION 510 /world/New() //logs var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day") href_logfile = file("data/logs/[date_string] hrefs.htm") diary = file("data/logs/[date_string].log") - diary << "[log_end]\n[log_end]\nStarting up. [time2text(world.timeofday, "hh:mm.ss")][log_end]\n---------------------[log_end]" + diary << "[log_end]\n[log_end]\nStarting up. (ID: [game_id]) [time2text(world.timeofday, "hh:mm.ss")][log_end]\n---------------------[log_end]" changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently if(byond_version < RECOMMENDED_VERSION) @@ -524,12 +549,12 @@ var/world_topic_spam_protect_time = world.timeofday F << the_mode -/hook/startup/proc/loadMOTD() - world.load_motd() +/hook/startup/proc/initialize_greeting() + world.initialize_greeting() return 1 -/world/proc/load_motd() - join_motd = file2text("config/motd.txt") +/world/proc/initialize_greeting() + server_greeting = new() /proc/load_configuration() diff --git a/config/example/config.txt b/config/example/config.txt index d10728b64f6..180d5a6763e 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -362,6 +362,9 @@ STARLIGHT 0 ## Uncomment to override default brain health. #DEFAULT_BRAIN_HEALTH 400 +## Uncomment this to upload round statistics to the SQL database. +# SQL_STATS + ## Uncomment this to house whitelists on the SQL database. # SQL_WHITELISTS diff --git a/html/Skull132_Age_Restrictions.yml b/html/Skull132_Age_Restrictions.yml deleted file mode 100644 index f33295eeedc..00000000000 --- a/html/Skull132_Age_Restrictions.yml +++ /dev/null @@ -1,13 +0,0 @@ -author: Skull132 - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Age restrictions for all jobs and antags are now implemented again with config options." - - tweak: "You are now prompted to confirm whether or not you want to delete a character." diff --git a/html/bootstrap/css/bootstrap-theme.min.css b/html/bootstrap/css/bootstrap-theme.min.css new file mode 100644 index 00000000000..dc95d8e4e4b --- /dev/null +++ b/html/bootstrap/css/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/html/bootstrap/css/bootstrap.min.css b/html/bootstrap/css/bootstrap.min.css new file mode 100644 index 00000000000..4cf729e4342 --- /dev/null +++ b/html/bootstrap/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/html/bootstrap/js/bootstrap.min.js b/html/bootstrap/js/bootstrap.min.js new file mode 100644 index 00000000000..e79c065134f --- /dev/null +++ b/html/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/html/bootstrap/js/html5shiv.min.js b/html/bootstrap/js/html5shiv.min.js new file mode 100644 index 00000000000..355afd10608 --- /dev/null +++ b/html/bootstrap/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/html/bootstrap/js/respond.min.js b/html/bootstrap/js/respond.min.js new file mode 100644 index 00000000000..80a7b69dcce --- /dev/null +++ b/html/bootstrap/js/respond.min.js @@ -0,0 +1,5 @@ +/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl + * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT + * */ + +!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b
    +

    20 July 2016

    +

    Skull132 updated:

    +
      +
    • You can now shoot at cargo trains, or their passangers specifically. If you click on the train, you will hit it, and thus can destroy it while the passanger is still onboard.
    • +
    • Gibbing or husking a Diona will no longer have them split off into nymphs. A gibbed or husked Diona is now permadead.
    • +
    + +

    18 July 2016

    +

    Alberyk updated:

    +
      +
    • Added the unique drinks from the old code.
    • +
    • Renamed Galatic Common back to Ceti Basic.
    • +
    • Ported the id sprites from old aurora code.
    • +
    • The improvised shotgun has now a chance to explode when being fired.
    • +
    • Added a jukebox crate to the supply console.
    • +
    • Added a chainsword.
    • +
    • Added new flavors of swords; rapiers, sabers, trench knives and etc.
    • +
    • You can't hide claymore and katanas inside bags anymore.
    • +
    • You can now print some hardsuit modules in the robotics fabricator, most of them will require high tech and even rare resources.
    • +
    • You can also print nanopaste from the robotics fabricator now.
    • +
    • Zipguns should not start with flash and stun rounds anymore.
    • +
    +

    Arrow768 updated:

    +
      +
    • Fix for lawgiver crowdcontrol spelling
    • +
    • Display CCIA Records of the char on the employment record console
    • +
    • Display Active CCIA Actions assigned to the char record console
    • +
    +

    Bedshaped updated:

    +
      +
    • Added the ability to pull template command reports from the WI
    • +
    • Added the ability to cancel sending a command report
    • +
    • Changed command reports to ask for a name separately
    • +
    • Adding a helper in commstation_name() which returns NMSS Odin currently
    • +
    • Changed the order of no/yes to yes/no in the give prompt
    • +
    +

    Fire and Glory updated:

    +
      +
    • Made Unique sprites for when the AMI and Industrial Hardsuit is being worn by Tajara, Unathi, and Skrell.
    • +
    • Added Unique sprites for all colors of the ERT Hardsuit when worn by Tajara, Unathi, and Skrell.
    • +
    • Made it possible to undo the top buttons of most suits via the roll-down-jumpsuit verb.
    • +
    • Gave the Janitor's wet floor signs lights that can be used by activating them in-hand or alt-clicking them on the ground.
    • +
    • Porting foxes and Chauncey from oldcode, not in any maps, currently.
    • +
    +

    Lord Lag updated:

    +
      +
    • Custom Synthetic sprites are returning from the old code base.
    • +
    • Memetic anomaly possession has been adjusted.
    • +
    • Memetic anomaly thought now functions.
    • +
    • Memetic anomaly code has been introduced
    • +
    +

    LordFowl updated:

    +
      +
    • Age limits are now based upon lore-standards for each race.
    • +
    • Home system, citizenship, and religion defaults have been tailored to the lore standards.
    • +
    • Numbers may be used in chargen for naming, strictly for the purpose of allowing numbers in IPC names.
    • +
    • Age, citizenship, and religion can now be viewed on an ID card.
    • +
    • Citizenship, religion, and home system can be viewed and modified via the employment records consoles.
    • +
    • Vaurca filtration bit organ added. When destroyed or removed, oxygen becomes poisonous to the Vaurca.
    • +
    • Vaurca lungs have been made organic.
    • +
    • Vaurca take 3x toxin damage, as a result of their rather alien biology.
    • +
    • Vaurca lose additional blood when an opportunity to lose blood presents itself, due to their open-circulatory system.
    • +
    • Vaurca organs are no longer all robotic, except for the neural socket and filtration bit.
    • +
    • Vaurca organ surgery is now possible.
    • +
    +

    Nanako updated:

    +
      +
    • Fixed dizziness effects on alcohol, psilocybin, and cryptobiolin taking a long to start up and sometimes never starting for low doses.
    • +
    • Reduced the strength of the confusion effect
    • +
    • Sip size from alcohol bottles is now the same as for glasses, which is half what it was.
    • +
    • Rebalanced all alcoholic drinks with more believable alcohol values, and adjusted alcohol metabolism. Generally drinks are stronger but metabolise more slowly, pace yourself!
    • +
    • Drinking now causes temporary clumsiness until you sober up. Please don't drink and operate heavy machinery.
    • +
    • Excessive drinking now has a chance to cause vomiting.
    • +
    • Different species now have varying susceptibility to alcohol. Tajarans get drunk slightly faster, skrell are twice as fast as humans, unathi can drink more, and vaurca get drunk very slowly, but alcohol poisons them.
    • +
    • Dousing people in alcohol and setting them on fire, now only works with spirits and liqeurs stronger than 40% ABV, and the heat of the resulting fire is based on the strength.
    • +
    • Ethylredoxrazine now removes alcohol from the patient's blood and stomach, and decreases their intoxication. A large enough dose will make them completely sober.
    • +
    • Ethylredoxrazine now metabolises and does its effects much more slowly.
    • +
    • Coffee now sobers up drunk people a little.
    • +
    • Fixed a bug where almost half of all meteors spawned would instantly delete without hitting anything
    • +
    • Meteors that impact energy shields will no longer bug out and spin forever in space
    • +
    • Meteor showers and storms now last a lot longer, and are far more punishing if the station isn't shielded
    • +
    • Meteors are now far more likely to make an audible explosion on impact. Explosion power reduced a bit though
    • +
    • Meteor events now give a three minute advance warning, allowing time to turn on station shield generators
    • +
    • All meteors that impact a shield now make a special sound effect.
    • +
    • Small and normal sized meteors are now vaporised harmlessly on contact with a shield. Large meteors will explode, but with reduced power
    • +
    • Fixed a bug where placing held mobs into containers would make them vanish
    • +
    • pAIs can now examine objects while in card form
    • +
    • Moving pAIs and held mobs around on your person is now a visible action, and the mob or pAI is notified of where its moved to
    • +
    • Added a verb for pAIs and held mobs, to check where on the holder they are.
    • +
    • Pepperspray will no longer make a spraying sound if used while the safety is on
    • +
    • Spray bottles can now be locked by alt-clicking
    • +
    • Added maintenance hatches to most airlocks and hazard shutters, for drones to pass through without opening the door. Hatches do not allow gases through or spread breaches
    • +
    • Welding tools can now be used to burn paper
    • +
    • The upgraded and experimental welding tools will now fit in a toolbelt. Upgraded renamed to advanced
    • +
    • Fixed and implemented the Experimental Welding Tool, which has a regenerating fuel supply. Can be produced in R&D, requires 4 research in engineering and materials
    • +
    +

    Skull132 updated:

    +
      +
    • All chats are now properly logged into the server log, to include the language they were spoken in.
    • +
    • Changeling revive after using the suicide verb will now work properly.
    • +
    • Evidence bag boxes now work like real boxes again. Note that in order to put an object into a bag, you drag that obejct onto the bag.
    • +
    • Borgs will now understand the Tajaran language again.
    • +
    • Alien species should no longer have oddly coloured fur/skin/scales/slime after being cloned.
    • +
    • Fixed the unlimited virus food exploit.
    • +
    • Markup is no longer awful and will not break links. Proper keys have changed: / = italics, _ = underline, ~ = strikethrough, * = bold.
    • +
    • Trash bags can now be used to pick up bullet casings.
    • +
    • Antag-OOC (AOOC) is now available to all antagonists. Moderators also have access to this. Intended usage: general round coordination (motives, backstories, gimmicks, etcetera). The rules regarding IC in OOC still apply, however. Do not use it for metagaming.
    • +
    • Ported the game ID system from Baystation12. When filing complaints, please fill out the appropriate field with it.
    • +
    • Added a new "Server Greeting" system to replace the massive garbled dump of info people get in the lower right panel. Coloured tabs indicated things that need attention. The window can be opened from the OOC tab as well, via the "Open Greeting" button.
    • +
    • Admins (with R_SERVER flag) can now edit the message of the day from within the game, with the "Edit MotD" button in the Server tab. Memos can be edited by any admin from the "Edit Memo" button in the same tab.
    • +
    • Radio jammers added (syndicate uplink for 2 TC, or improvised out of a signaller/signaller assembly, with a cell added to it). These will jam headsets, PDAs, messaging servers, and Vaurca hivenet.
    • +
    + +

    12 July 2016

    +

    LordFowl updated:

    +
      +
    • Fixed Vaurca being immune to tasers and stun batons.
    • +
    • Fixed Magic Missile and Fireball.
    • +
    + +

    10 July 2016

    +

    Alberyk updated:

    +
      +
    • Science armbands should be available again in the custom loadout.
    • +
    • Added medical scrubs to the custom loadout.
    • +
    • Workboots should have a better sprite.
    • +
    +

    LordFowl updated:

    +
      +
    • Various weapons added by the last patch are properly included in RnD research.
    • +
    • Game year is set properly to 2458.
    • +
    • Wizard laser eyes via mutate now work properly.
    • +
    • Brig exit door in security now functions appropriately.
    • +
    • Arrivals maintainence disposals now functions properly.
    • +
    • Doctors now have the appropriate access to EVA.
    • +
    • Abstract items such as grabs can no longer be placed into crates.
    • +
    • The chaplain's null rod can be used properly as a weapon if intent is set to harm.
    • +
    • Droppers now appropriately display transferred units.
    • +
    • All pAI faces can now be selected.
    • +
    • Soaps, janiborgs, and mops can no longer remove cultist runes.
    • +
    • Soaps, janiborgs, and mops can remove paint applicated via paint-can from turfs.
    • +
    • All instances of Thaler have been replaced with credit chip.
    • +
    • All instances of Hesphaistos have been replaced with Hesphaestus.
    • +
    • Mechanics of the coin slightly tweaked to prevent duping exploits.
    • +
    • Mobs can no longer be painted via paint-cans.
    • +
    • Quartermasters now start with the cargo account details in their memory notes.
    • +
    + +

    05 July 2016

    +

    Alberyk updated:

    +
      +
    • Removed the delay from the shuttle call in revolution, it should be 10 minutes now, instead of 20 minutes.
    • +
    • Cult blades are properly sharp now.
    • +
    • Removed the helmet camera from the heist industrial hardsuit.
    • +
    • Interns positions should not start with an extra internal box anymore.
    • +
    • The lethal injection syringe should have a proper sprite now.
    • +
    +

    Nanako updated:

    +
      +
    • Mice will no longer spawn in closed systems with nowhere to ventcrawl to
    • +
    • Mice can no longer spawn in breached areas and die immediately. A spawnpoint with a safe environment will always be chosen
    • +
    +

    29 June 2016

    Skull132 updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 25b8646bd5d..bd48f6317fd 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2128,3 +2128,193 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. also means that frenzy from low levels of blood is acheivable again. - bugfix: Dominate and presence no longer affect loyalty implanted personnel, unless the casting vampire has attained full power. +2016-07-05: + Alberyk: + - tweak: Removed the delay from the shuttle call in revolution, it should be 10 + minutes now, instead of 20 minutes. + - bugfix: Cult blades are properly sharp now. + - tweak: Removed the helmet camera from the heist industrial hardsuit. + - bugfix: Interns positions should not start with an extra internal box anymore. + - bugfix: The lethal injection syringe should have a proper sprite now. + Nanako: + - bugfix: Mice will no longer spawn in closed systems with nowhere to ventcrawl + to + - bugfix: Mice can no longer spawn in breached areas and die immediately. A spawnpoint + with a safe environment will always be chosen +2016-07-10: + Alberyk: + - bugfix: Science armbands should be available again in the custom loadout. + - rscadd: Added medical scrubs to the custom loadout. + - imageadd: Workboots should have a better sprite. + LordFowl: + - bugfix: Various weapons added by the last patch are properly included in RnD research. + - bugfix: Game year is set properly to 2458. + - bugfix: Wizard laser eyes via mutate now work properly. + - bugfix: Brig exit door in security now functions appropriately. + - bugfix: Arrivals maintainence disposals now functions properly. + - bugfix: Doctors now have the appropriate access to EVA. + - bugfix: Abstract items such as grabs can no longer be placed into crates. + - bugfix: The chaplain's null rod can be used properly as a weapon if intent is + set to harm. + - bugfix: Droppers now appropriately display transferred units. + - bugfix: All pAI faces can now be selected. + - bugfix: Soaps, janiborgs, and mops can no longer remove cultist runes. + - bugfix: Soaps, janiborgs, and mops can remove paint applicated via paint-can from + turfs. + - bugfix: All instances of Thaler have been replaced with credit chip. + - bugfix: All instances of Hesphaistos have been replaced with Hesphaestus. + - tweak: Mechanics of the coin slightly tweaked to prevent duping exploits. + - tweak: Mobs can no longer be painted via paint-cans. + - rscadd: Quartermasters now start with the cargo account details in their memory + notes. +2016-07-12: + LordFowl: + - bugfix: Fixed Vaurca being immune to tasers and stun batons. + - bugfix: Fixed Magic Missile and Fireball. +2016-07-18: + Alberyk: + - rscadd: Added the unique drinks from the old code. + - tweak: Renamed Galatic Common back to Ceti Basic. + - imageadd: Ported the id sprites from old aurora code. + - rscadd: The improvised shotgun has now a chance to explode when being fired. + - rscadd: Added a jukebox crate to the supply console. + - rscadd: Added a chainsword. + - rscadd: Added new flavors of swords; rapiers, sabers, trench knives and etc. + - tweak: You can't hide claymore and katanas inside bags anymore. + - rscadd: You can now print some hardsuit modules in the robotics fabricator, most + of them will require high tech and even rare resources. + - rscadd: You can also print nanopaste from the robotics fabricator now. + - tweak: Zipguns should not start with flash and stun rounds anymore. + Arrow768: + - bugfix: Fix for lawgiver crowdcontrol spelling + - rscadd: Display CCIA Records of the char on the employment record console + - rscadd: Display Active CCIA Actions assigned to the char record console + Bedshaped: + - rscadd: Added the ability to pull template command reports from the WI + - rscadd: Added the ability to cancel sending a command report + - tweak: Changed command reports to ask for a name separately + - rscadd: Adding a helper in commstation_name() which returns NMSS Odin currently + - tweak: Changed the order of no/yes to yes/no in the give prompt + Fire and Glory: + - imageadd: Made Unique sprites for when the AMI and Industrial Hardsuit is being + worn by Tajara, Unathi, and Skrell. + - imageadd: Added Unique sprites for all colors of the ERT Hardsuit when worn by + Tajara, Unathi, and Skrell. + - rscadd: Made it possible to undo the top buttons of most suits via the roll-down-jumpsuit + verb. + - rscadd: Gave the Janitor's wet floor signs lights that can be used by activating + them in-hand or alt-clicking them on the ground. + - rscadd: Porting foxes and Chauncey from oldcode, not in any maps, currently. + Lord Lag: + - rscadd: Custom Synthetic sprites are returning from the old code base. + - tweak: Memetic anomaly possession has been adjusted. + - bugfix: Memetic anomaly thought now functions. + - experiment: Memetic anomaly code has been introduced + LordFowl: + - tweak: Age limits are now based upon lore-standards for each race. + - tweak: Home system, citizenship, and religion defaults have been tailored to the + lore standards. + - tweak: Numbers may be used in chargen for naming, strictly for the purpose of + allowing numbers in IPC names. + - rscadd: Age, citizenship, and religion can now be viewed on an ID card. + - rscadd: Citizenship, religion, and home system can be viewed and modified via + the employment records consoles. + - rscadd: Vaurca filtration bit organ added. When destroyed or removed, oxygen becomes + poisonous to the Vaurca. + - tweak: Vaurca lungs have been made organic. + - tweak: Vaurca take 3x toxin damage, as a result of their rather alien biology. + - tweak: Vaurca lose additional blood when an opportunity to lose blood presents + itself, due to their open-circulatory system. + - bugfix: Vaurca organs are no longer all robotic, except for the neural socket + and filtration bit. + - bugfix: Vaurca organ surgery is now possible. + Nanako: + - bugfix: Fixed dizziness effects on alcohol, psilocybin, and cryptobiolin taking + a long to start up and sometimes never starting for low doses. + - tweak: Reduced the strength of the confusion effect + - tweak: Sip size from alcohol bottles is now the same as for glasses, which is + half what it was. + - tweak: Rebalanced all alcoholic drinks with more believable alcohol values, and + adjusted alcohol metabolism. Generally drinks are stronger but metabolise more + slowly, pace yourself! + - tweak: Drinking now causes temporary clumsiness until you sober up. Please don't + drink and operate heavy machinery. + - tweak: Excessive drinking now has a chance to cause vomiting. + - rscadd: Different species now have varying susceptibility to alcohol. Tajarans + get drunk slightly faster, skrell are twice as fast as humans, unathi can drink + more, and vaurca get drunk very slowly, but alcohol poisons them. + - bugfix: Dousing people in alcohol and setting them on fire, now only works with + spirits and liqeurs stronger than 40% ABV, and the heat of the resulting fire + is based on the strength. + - tweak: Ethylredoxrazine now removes alcohol from the patient's blood and stomach, + and decreases their intoxication. A large enough dose will make them completely + sober. + - tweak: Ethylredoxrazine now metabolises and does its effects much more slowly. + - tweak: Coffee now sobers up drunk people a little. + - bugfix: Fixed a bug where almost half of all meteors spawned would instantly delete + without hitting anything + - bugfix: Meteors that impact energy shields will no longer bug out and spin forever + in space + - rscadd: Meteor showers and storms now last a lot longer, and are far more punishing + if the station isn't shielded + - rscadd: Meteors are now far more likely to make an audible explosion on impact. + Explosion power reduced a bit though + - rscadd: Meteor events now give a three minute advance warning, allowing time to + turn on station shield generators + - rscadd: All meteors that impact a shield now make a special sound effect. + - tweak: Small and normal sized meteors are now vaporised harmlessly on contact + with a shield. Large meteors will explode, but with reduced power + - bugfix: Fixed a bug where placing held mobs into containers would make them vanish + - tweak: pAIs can now examine objects while in card form + - rscadd: Moving pAIs and held mobs around on your person is now a visible action, + and the mob or pAI is notified of where its moved to + - rscadd: Added a verb for pAIs and held mobs, to check where on the holder they + are. + - bugfix: Pepperspray will no longer make a spraying sound if used while the safety + is on + - rscadd: Spray bottles can now be locked by alt-clicking + - rscadd: Added maintenance hatches to most airlocks and hazard shutters, for drones + to pass through without opening the door. Hatches do not allow gases through + or spread breaches + - rscadd: Welding tools can now be used to burn paper + - tweak: The upgraded and experimental welding tools will now fit in a toolbelt. + Upgraded renamed to advanced + - rscadd: Fixed and implemented the Experimental Welding Tool, which has a regenerating + fuel supply. Can be produced in R&D, requires 4 research in engineering and + materials + Skull132: + - bugfix: All chats are now properly logged into the server log, to include the + language they were spoken in. + - bugfix: Changeling revive after using the suicide verb will now work properly. + - bugfix: Evidence bag boxes now work like real boxes again. Note that in order + to put an object into a bag, you drag that obejct onto the bag. + - bugfix: Borgs will now understand the Tajaran language again. + - bugfix: Alien species should no longer have oddly coloured fur/skin/scales/slime + after being cloned. + - bugfix: Fixed the unlimited virus food exploit. + - tweak: 'Markup is no longer awful and will not break links. Proper keys have changed: + / = italics, _ = underline, ~ = strikethrough, * = bold.' + - tweak: Trash bags can now be used to pick up bullet casings. + - tweak: 'Antag-OOC (AOOC) is now available to all antagonists. Moderators also + have access to this. Intended usage: general round coordination (motives, backstories, + gimmicks, etcetera). The rules regarding IC in OOC still apply, however. Do + not use it for metagaming.' + - rscadd: Ported the game ID system from Baystation12. When filing complaints, please + fill out the appropriate field with it. + - rscadd: Added a new "Server Greeting" system to replace the massive garbled dump + of info people get in the lower right panel. Coloured tabs indicated things + that need attention. The window can be opened from the OOC tab as well, via + the "Open Greeting" button. + - rscadd: Admins (with R_SERVER flag) can now edit the message of the day from within + the game, with the "Edit MotD" button in the Server tab. Memos can be edited + by any admin from the "Edit Memo" button in the same tab. + - rscadd: Radio jammers added (syndicate uplink for 2 TC, or improvised out of a + signaller/signaller assembly, with a cell added to it). These will jam headsets, + PDAs, messaging servers, and Vaurca hivenet. +2016-07-20: + Skull132: + - tweak: You can now shoot at cargo trains, or their passangers specifically. If + you click on the train, you will hit it, and thus can destroy it while the passanger + is still onboard. + - tweak: Gibbing or husking a Diona will no longer have them split off into nymphs. + A gibbed or husked Diona is now permadead. diff --git a/html/changelogs/Fire and Glory - FaG-Development.yml b/html/changelogs/Fire and Glory - FaG-Development.yml deleted file mode 100644 index e2fb10399c7..00000000000 --- a/html/changelogs/Fire and Glory - FaG-Development.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Fire and Glory - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - imageadd: "Made Unique sprites for when the AMI and Industrial Hardsuit is being worn by Tajara, Unathi, and Skrell." - - imageadd: "Added Unique sprites for all colors of the ERT Hardsuit when worn by Tajara, Unathi, and Skrell." diff --git a/html/changelogs/Fire and Glory-FaG Branch 2.yml b/html/changelogs/Fire and Glory-FaG Branch 2.yml deleted file mode 100644 index 09468300397..00000000000 --- a/html/changelogs/Fire and Glory-FaG Branch 2.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Fire and Glory - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Made it possible to undo the top buttons of most suits via the roll-down-jumpsuit verb." diff --git a/html/changelogs/LordFowl - Preferences1.yml b/html/changelogs/LordFowl - Preferences1.yml deleted file mode 100644 index 099a081fa69..00000000000 --- a/html/changelogs/LordFowl - Preferences1.yml +++ /dev/null @@ -1,41 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: LordFowl - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - tweak: "Age limits are now based upon lore-standards for each race." - - tweak: "Home system, citizenship, and religion defaults have been tailored to the lore standards." - - tweak: "Numbers may be used in chargen for naming, strictly for the purpose of allowing numbers in IPC names." - - rscadd: "Age, citizenship, and religion can now be viewed on an ID card." - - rscadd: "Citizenship, religion, and home system can be viewed and modified via the employment records consoles." - diff --git a/html/jquery/jquery-2.0.0.min.js b/html/jquery/jquery-2.0.0.min.js new file mode 100644 index 00000000000..b18e05a957c --- /dev/null +++ b/html/jquery/jquery-2.0.0.min.js @@ -0,0 +1,6 @@ +/*! jQuery v2.0.0 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/ +(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],f="2.0.0",p=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=f.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return p.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,f,p,h,d,g,m,y="sizzle"+-new Date,v=e.document,b={},w=0,T=0,C=ot(),k=ot(),N=ot(),E=!1,S=function(){return 0},j=typeof undefined,D=1<<31,A=[],L=A.pop,q=A.push,H=A.push,O=A.slice,F=A.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",R="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=M.replace("w","w#"),$="\\["+R+"*("+M+")"+R+"*(?:([*^$|!~]?=)"+R+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+R+"*\\]",B=":("+M+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",I=RegExp("^"+R+"+|((?:^|[^\\\\])(?:\\\\.)*)"+R+"+$","g"),z=RegExp("^"+R+"*,"+R+"*"),_=RegExp("^"+R+"*([>+~]|"+R+")"+R+"*"),X=RegExp(R+"*[+~]"),U=RegExp("="+R+"*([^\\]'\"]*)"+R+"*\\]","g"),Y=RegExp(B),V=RegExp("^"+W+"$"),G={ID:RegExp("^#("+M+")"),CLASS:RegExp("^\\.("+M+")"),TAG:RegExp("^("+M.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+B),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),"boolean":RegExp("^(?:"+P+")$","i"),needsContext:RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},J=/^[^{]+\{\s*\[native \w/,Q=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,et=/'|\\/g,tt=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,nt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{H.apply(A=O.call(v.childNodes),v.childNodes),A[v.childNodes.length].nodeType}catch(rt){H={apply:A.length?function(e,t){q.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function it(e){return J.test(e+"")}function ot(){var e,t=[];return e=function(n,i){return t.push(n+=" ")>r.cacheLength&&delete e[t.shift()],e[n]=i}}function st(e){return e[y]=!0,e}function at(e){var t=c.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ut(e,t,n,r){var i,o,s,a,u,f,d,g,x,w;if((t?t.ownerDocument||t:v)!==c&&l(t),t=t||c,n=n||[],!e||"string"!=typeof e)return n;if(1!==(a=t.nodeType)&&9!==a)return[];if(p&&!r){if(i=Q.exec(e))if(s=i[1]){if(9===a){if(o=t.getElementById(s),!o||!o.parentNode)return n;if(o.id===s)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(s))&&m(t,o)&&o.id===s)return n.push(o),n}else{if(i[2])return H.apply(n,t.getElementsByTagName(e)),n;if((s=i[3])&&b.getElementsByClassName&&t.getElementsByClassName)return H.apply(n,t.getElementsByClassName(s)),n}if(b.qsa&&(!h||!h.test(e))){if(g=d=y,x=t,w=9===a&&e,1===a&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(d=t.getAttribute("id"))?g=d.replace(et,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=f.length;while(u--)f[u]=g+mt(f[u]);x=X.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return H.apply(n,x.querySelectorAll(w)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(I,"$1"),t,n,r)}o=ut.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},l=ut.setDocument=function(e){var t=e?e.ownerDocument||e:v;return t!==c&&9===t.nodeType&&t.documentElement?(c=t,f=t.documentElement,p=!o(t),b.getElementsByTagName=at(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),b.attributes=at(function(e){return e.className="i",!e.getAttribute("className")}),b.getElementsByClassName=at(function(e){return e.innerHTML="
      ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),b.sortDetached=at(function(e){return 1&e.compareDocumentPosition(c.createElement("div"))}),b.getById=at(function(e){return f.appendChild(e).id=y,!t.getElementsByName||!t.getElementsByName(y).length}),b.getById?(r.find.ID=function(e,t){if(typeof t.getElementById!==j&&p){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},r.filter.ID=function(e){var t=e.replace(tt,nt);return function(e){return e.getAttribute("id")===t}}):(r.find.ID=function(e,t){if(typeof t.getElementById!==j&&p){var n=t.getElementById(e);return n?n.id===e||typeof n.getAttributeNode!==j&&n.getAttributeNode("id").value===e?[n]:undefined:[]}},r.filter.ID=function(e){var t=e.replace(tt,nt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),r.find.TAG=b.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=b.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&p?t.getElementsByClassName(e):undefined},d=[],h=[],(b.qsa=it(t.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+R+"*(?:value|"+P+")"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){var t=c.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&h.push("[*^$]="+R+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(b.matchesSelector=it(g=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){b.disconnectedMatch=g.call(e,"div"),g.call(e,"[s!='']:x"),d.push("!=",B)}),h=h.length&&RegExp(h.join("|")),d=d.length&&RegExp(d.join("|")),m=it(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,n){if(e===n)return E=!0,0;var r=n.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(n);return r?1&r||!b.sortDetached&&n.compareDocumentPosition(e)===r?e===t||m(v,e)?-1:n===t||m(v,n)?1:u?F.call(u,e)-F.call(u,n):0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],l=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:u?F.call(u,e)-F.call(u,n):0;if(o===s)return lt(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)l.unshift(r);while(a[i]===l[i])i++;return i?lt(a[i],l[i]):a[i]===v?-1:l[i]===v?1:0},c):c},ut.matches=function(e,t){return ut(e,null,null,t)},ut.matchesSelector=function(e,t){if((e.ownerDocument||e)!==c&&l(e),t=t.replace(U,"='$1']"),!(!b.matchesSelector||!p||d&&d.test(t)||h&&h.test(t)))try{var n=g.call(e,t);if(n||b.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return ut(t,c,null,[e]).length>0},ut.contains=function(e,t){return(e.ownerDocument||e)!==c&&l(e),m(e,t)},ut.attr=function(e,t){(e.ownerDocument||e)!==c&&l(e);var n=r.attrHandle[t.toLowerCase()],i=n&&n(e,t,!p);return i===undefined?b.attributes||!p?e.getAttribute(t):(i=e.getAttributeNode(t))&&i.specified?i.value:null:i},ut.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ut.uniqueSort=function(e){var t,n=[],r=0,i=0;if(E=!b.detectDuplicates,u=!b.sortStable&&e.slice(0),e.sort(S),E){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return e};function lt(e,t){var n=t&&e,r=n&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ct(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}function ft(e,t,n){var r;return n?undefined:r=e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ht(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function dt(e){return st(function(t){return t=+t,st(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}i=ut.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r];r++)n+=i(t);return n},r=ut.selectors={cacheLength:50,createPseudo:st,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(tt,nt),e[3]=(e[4]||e[5]||"").replace(tt,nt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ut.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ut.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return G.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&Y.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(tt,nt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+R+")"+e+"("+R+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ut.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){f=t;while(f=f[g])if(a?f.nodeName.toLowerCase()===v:1===f.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[y]||(m[y]={}),l=c[e]||[],h=l[0]===w&&l[1],p=l[0]===w&&l[2],f=h&&m.childNodes[h];while(f=++h&&f&&f[g]||(p=h=0)||d.pop())if(1===f.nodeType&&++p&&f===t){c[e]=[w,h,p];break}}else if(x&&(l=(t[y]||(t[y]={}))[e])&&l[0]===w)p=l[1];else while(f=++h&&f&&f[g]||(p=h=0)||d.pop())if((a?f.nodeName.toLowerCase()===v:1===f.nodeType)&&++p&&(x&&((f[y]||(f[y]={}))[e]=[w,p]),f===t))break;return p-=i,p===r||0===p%r&&p/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||ut.error("unsupported pseudo: "+e);return i[y]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?st(function(e,n){var r,o=i(e,t),s=o.length;while(s--)r=F.call(e,o[s]),e[r]=!(n[r]=o[s])}):function(e){return i(e,0,n)}):i}},pseudos:{not:st(function(e){var t=[],n=[],r=s(e.replace(I,"$1"));return r[y]?st(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:st(function(e){return function(t){return ut(e,t).length>0}}),contains:st(function(e){return function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:st(function(e){return V.test(e||"")||ut.error("unsupported lang: "+e),e=e.replace(tt,nt).toLowerCase(),function(t){var n;do if(n=p?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===c.activeElement&&(!c.hasFocus||c.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Z.test(e.nodeName)},input:function(e){return K.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:dt(function(){return[0]}),last:dt(function(e,t){return[t-1]}),eq:dt(function(e,t,n){return[0>n?n+t:n]}),even:dt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:dt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:dt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:dt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=ht(t);function gt(e,t){var n,i,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=r.preFilter;while(a){(!n||(i=z.exec(a)))&&(i&&(a=a.slice(i[0].length)||a),u.push(o=[])),n=!1,(i=_.exec(a))&&(n=i.shift(),o.push({value:n,type:i[0].replace(I," ")}),a=a.slice(n.length));for(s in r.filter)!(i=G[s].exec(a))||l[s]&&!(i=l[s](i))||(n=i.shift(),o.push({value:n,type:s,matches:i}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ut.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,r){var i=t.dir,o=r&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,r,a){var u,l,c,f=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,r,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[y]||(t[y]={}),(l=c[i])&&l[0]===f){if((u=l[1])===!0||u===n)return u===!0}else if(l=c[i]=[f],l[1]=e(t,r,a)||n,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[y]&&(r=bt(r)),i&&!i[y]&&(i=bt(i,o)),st(function(o,s,a,u){var l,c,f,p=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,p,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(f=l[c])&&(y[h[c]]=!(m[h[c]]=f))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(f=y[c])&&l.push(m[c]=f);i(null,y=[],l,u)}c=y.length;while(c--)(f=y[c])&&(l=i?F.call(o,f):p[c])>-1&&(o[l]=!(s[l]=f))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):H.apply(s,y)})}function wt(e){var t,n,i,o=e.length,s=r.relative[e[0].type],u=s||r.relative[" "],l=s?1:0,c=yt(function(e){return e===t},u,!0),f=yt(function(e){return F.call(t,e)>-1},u,!0),p=[function(e,n,r){return!s&&(r||n!==a)||((t=n).nodeType?c(e,n,r):f(e,n,r))}];for(;o>l;l++)if(n=r.relative[e[l].type])p=[yt(vt(p),n)];else{if(n=r.filter[e[l].type].apply(null,e[l].matches),n[y]){for(i=++l;o>i;i++)if(r.relative[e[i].type])break;return bt(l>1&&vt(p),l>1&&mt(e.slice(0,l-1)).replace(I,"$1"),n,i>l&&wt(e.slice(l,i)),o>i&&wt(e=e.slice(i)),o>i&&mt(e))}p.push(n)}return vt(p)}function Tt(e,t){var i=0,o=t.length>0,s=e.length>0,u=function(u,l,f,p,h){var d,g,m,y=[],v=0,x="0",b=u&&[],T=null!=h,C=a,k=u||s&&r.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(a=l!==c&&l,n=i);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,f)){p.push(d);break}T&&(w=N,n=++i)}o&&((d=!m&&d)&&v--,u&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,f);if(u){if(v>0)while(x--)b[x]||y[x]||(y[x]=L.call(p));y=xt(y)}H.apply(p,y),T&&!u&&y.length>0&&v+t.length>1&&ut.uniqueSort(p)}return T&&(w=N,a=C),b};return o?st(u):u}s=ut.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[y]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ut(e,t[r],n);return n}function kt(e,t,n,i){var o,a,u,l,c,f=gt(e);if(!i&&1===f.length){if(a=f[0]=f[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&p&&r.relative[a[1].type]){if(t=(r.find.ID(u.matches[0].replace(tt,nt),t)||[])[0],!t)return n;e=e.slice(a.shift().value.length)}o=G.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],r.relative[l=u.type])break;if((c=r.find[l])&&(i=c(u.matches[0].replace(tt,nt),X.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=i.length&&mt(a),!e)return H.apply(n,i),n;break}}}return s(e,f)(i,t,!p,n,X.test(e)),n}r.pseudos.nth=r.pseudos.eq;function Nt(){}Nt.prototype=r.filters=r.pseudos,r.setFilters=new Nt,b.sortStable=y.split("").sort(S).join("")===y,l(),[0,0].sort(S),b.detectDuplicates=E,at(function(e){if(e.innerHTML="","#"!==e.firstChild.getAttribute("href")){var t="type|href|height|width".split("|"),n=t.length;while(n--)r.attrHandle[t[n]]=ft}}),at(function(e){if(null!=e.getAttribute("disabled")){var t=P.split("|"),n=t.length;while(n--)r.attrHandle[t[n]]=ct}}),x.find=ut,x.expr=ut.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ut.uniqueSort,x.text=ut.getText,x.isXMLDoc=ut.isXML,x.contains=ut.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(f){for(t=e.memory&&f,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(f[0],f[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!a||n&&!u||(r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))this.cache[i]=t;else for(r in t)o[r]=t[r]},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){return t===undefined||t&&"string"==typeof t&&n===undefined?this.get(e,t):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i=this.key(e),o=this.cache[i];if(t===undefined)this.cache[i]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):t in o?r=[t]:(r=x.camelCase(t),r=r in o?[r]:r.match(w)||[]),n=r.length;while(n--)delete o[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){delete this.cache[this.key(e)]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.substring(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t); +x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,i="boolean"==typeof t;return x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,s=0,a=x(this),u=t,l=e.match(w)||[];while(o=l[s++])u=i?u:!a.hasClass(o),a[u?"addClass":"removeClass"](o)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i,o=x(this);1===this.nodeType&&(i=r?e.call(this,n,o.val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.boolean.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.boolean.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.boolean.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,f,p,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(p=x.event.special[d]||{},d=(o?p.delegateType:p.bindType)||d,p=x.event.special[d]||{},f=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,p.setup&&p.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),p.add&&(p.add.call(e,f),f.handler.guid||(f.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,f):h.push(f),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,f,p,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){f=x.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,f,p,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),p=x.event.special[d]||{},i||!p.trigger||p.trigger.apply(r,n)!==!1)){if(!i&&!p.noBubble&&!x.isWindow(r)){for(l=p.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:p.bindType||d,f=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),f&&f.apply(a,n),f=c&&a[c],f&&x.acceptData(a)&&f.apply&&f.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||p._default&&p._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return 3===e.target.nodeType&&(e.target=e.target.parentNode),s.filter?s.filter(e,o):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=x.expr.match.needsContext,Q={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return t=this,this.pushStack(x(e).filter(function(){for(r=0;i>r;r++)if(x.contains(t[r],this))return!0}));for(n=[],r=0;i>r;r++)x.find(e,this[r],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(Z(this,e||[],!0))},filter:function(e){return this.pushStack(Z(this,e||[],!1))},is:function(e){return!!e&&("string"==typeof e?J.test(e)?x(e,this.context).index(this[0])>=0:x.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],s=J.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function K(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return K(e,"nextSibling")},prev:function(e){return K(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(Q[e]||x.unique(i),"p"===e[0]&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function Z(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var et=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,tt=/<([\w:]+)/,nt=/<|&#?\w+;/,rt=/<(?:script|style|link)/i,it=/^(?:checkbox|radio)$/i,ot=/checked\s*(?:[^=]|=\s*.checked.)/i,st=/^$|\/(?:java|ecma)script/i,at=/^true\/(.*)/,ut=/^\s*\s*$/g,lt={option:[1,""],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};lt.optgroup=lt.option,lt.tbody=lt.tfoot=lt.colgroup=lt.caption=lt.col=lt.thead,lt.th=lt.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=ct(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=ct(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(gt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&ht(gt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(gt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!rt.test(e)&&!lt[(tt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(et,"<$1>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(gt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=p.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,f=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&ot.test(d))return this.each(function(r){var i=f.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(gt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,gt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,pt),l=0;s>l;l++)a=o[l],st.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(ut,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=gt(a),o=gt(e),r=0,i=o.length;i>r;r++)mt(o[r],s[r]);if(t)if(n)for(o=o||gt(e),s=s||gt(a),r=0,i=o.length;i>r;r++)dt(o[r],s[r]);else dt(e,a);return s=gt(a,"script"),s.length>0&&ht(s,!u&>(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,f=e.length,p=t.createDocumentFragment(),h=[];for(;f>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(nt.test(i)){o=o||p.appendChild(t.createElement("div")),s=(tt.exec(i)||["",""])[1].toLowerCase(),a=lt[s]||lt._default,o.innerHTML=a[1]+i.replace(et,"<$1>")+a[2],l=a[0];while(l--)o=o.firstChild;x.merge(h,o.childNodes),o=p.firstChild,o.textContent=""}else h.push(t.createTextNode(i));p.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=gt(p.appendChild(i),"script"),u&&ht(o),n)){l=0;while(i=o[l++])st.test(i.type||"")&&n.push(i)}return p},cleanData:function(e){var t,n,r,i=e.length,o=0,s=x.event.special;for(;i>o;o++){if(n=e[o],x.acceptData(n)&&(t=q.access(n)))for(r in t.events)s[r]?x.event.remove(n,r):x.removeEvent(n,r,t.handle);L.discard(n),q.discard(n)}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"text",async:!1,global:!1,success:x.globalEval})}});function ct(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function pt(e){var t=at.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function ht(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function dt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=x.extend({},o),l=o.events,q.set(t,s),l)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function gt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function mt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&it.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var yt,vt,xt=/^(none|table(?!-c[ea]).+)/,bt=/^margin/,wt=RegExp("^("+b+")(.*)$","i"),Tt=RegExp("^("+b+")(?!px)[a-z%]+$","i"),Ct=RegExp("^([+-])=("+b+")","i"),kt={BODY:"block"},Nt={position:"absolute",visibility:"hidden",display:"block"},Et={letterSpacing:0,fontWeight:400},St=["Top","Right","Bottom","Left"],jt=["Webkit","O","Moz","ms"];function Dt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=jt.length;while(i--)if(t=jt[i]+n,t in e)return t;return r}function At(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function Lt(t){return e.getComputedStyle(t,null)}function qt(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&At(r)&&(o[s]=q.access(r,"olddisplay",Pt(r.nodeName)))):o[s]||(i=At(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=Lt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return qt(this,!0)},hide:function(){return qt(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:At(this))?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=yt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=Dt(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=Ct.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=Dt(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=yt(e,t,r)),"normal"===i&&t in Et&&(i=Et[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),yt=function(e,t,n){var r,i,o,s=n||Lt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Tt.test(a)&&bt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ht(e,t,n){var r=wt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ot(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+St[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+St[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+St[o]+"Width",!0,i))):(s+=x.css(e,"padding"+St[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+St[o]+"Width",!0,i)));return s}function Ft(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Lt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=yt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Tt.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ot(e,t,n||(s?"border":"content"),r,o)+"px"}function Pt(e){var t=o,n=kt[e];return n||(n=Rt(e,t),"none"!==n&&n||(vt=(vt||x("