From 44d13818f061760a01cbcacaec16d1e0fffbbf93 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 16:52:58 +0100 Subject: [PATCH 01/18] Inital paralysis. (https://github.com/tgstation/tgstation/pull/41140) --- code/__DEFINES/mobs.dm | 4 + code/__DEFINES/traits.dm | 6 + code/datums/brain_damage/severe.dm | 59 ++++++++-- code/datums/traits/negative.dm | 34 ++++++ code/modules/mob/living/carbon/carbon.dm | 5 + code/modules/surgery/bodyparts/bodyparts.dm | 124 +++++++++++++++----- 6 files changed, 194 insertions(+), 38 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 4b42595b48..1d1dda6d99 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -54,6 +54,10 @@ #define BODYPART_ORGANIC 1 #define BODYPART_ROBOTIC 2 +#define BODYPART_NOT_DISABLED 0 +#define BODYPART_DISABLED_DAMAGE 1 +#define BODYPART_DISABLED_PARALYSIS 2 + #define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi' #define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi' diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index b2caf614b3..c0e3e141c7 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -50,7 +50,13 @@ #define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_MINDSHIELD "mindshield" +#define TRAIT_PARALYSIS_L_ARM "para-l-arm" //These are used for brain-based paralysis, where replacing the limb won't fix it +#define TRAIT_PARALYSIS_R_ARM "para-r-arm" +#define TRAIT_PARALYSIS_L_LEG "para-l-leg" +#define TRAIT_PARALYSIS_R_LEG "para-r-leg" + //non-mob traits +#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" #define TRAIT_AGEUSIA "ageusia" diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index a8adbfbce8..8e13522a02 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -60,18 +60,63 @@ /datum/brain_trauma/severe/paralysis name = "Paralysis" - desc = "Patient's brain can no longer control its motor functions." + desc = "Patient's brain can no longer control part of its motor functions." scan_desc = "cerebral paralysis" - gain_text = "You can't feel your body anymore!" - lose_text = "You can feel your limbs again!" + gain_text = "" + lose_text = "" + var/paralysis_type + var/list/paralysis_traits = list() + //for descriptions -/datum/brain_trauma/severe/paralysis/on_life() - owner.Knockdown(200, ignore_canknockdown = TRUE) +/datum/brain_trauma/severe/paralysis/New(specific_type) + paralysis_type = specific_type + if(!paralysis_type) + paralysis_type = pick("full","left","right","arms","legs","r_arm","l_arm","r_leg","l_leg") + var/subject + switch(paralysis_type) + if("full") + subject = "your body" + paralysis_traits = list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG) + if("left") + subject = "the left side of your body" + paralysis_traits = list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_L_LEG) + if("right") + subject = "the right side of your body" + paralysis_traits = list(TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_R_LEG) + if("arms") + subject = "your arms" + paralysis_traits = list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM) + if("legs") + subject = "your legs" + paralysis_traits = list(TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG) + if("r_arm") + subject = "your right arm" + paralysis_traits = list(TRAIT_PARALYSIS_R_ARM) + if("l_arm") + subject = "your left arm" + paralysis_traits = list(TRAIT_PARALYSIS_L_ARM) + if("r_leg") + subject = "your right leg" + paralysis_traits = list(TRAIT_PARALYSIS_R_LEG) + if("l_leg") + subject = "your left leg" + paralysis_traits = list(TRAIT_PARALYSIS_L_LEG) + + gain_text = "You can't feel [subject] anymore!" + lose_text = "You can feel [subject] again!" + +/datum/brain_trauma/severe/paralysis/on_gain() ..() + for(var/X in paralysis_traits) + owner.add_trait(X, "trauma_paralysis") + owner.update_disabled_bodyparts() /datum/brain_trauma/severe/paralysis/on_lose() - owner.SetKnockdown(0) ..() + for(var/X in paralysis_traits) + owner.remove_trait(X, "trauma_paralysis") + owner.update_disabled_bodyparts() + /datum/brain_trauma/severe/narcolepsy name = "Narcolepsy" @@ -203,4 +248,4 @@ /datum/brain_trauma/severe/pacifism/on_lose() owner.remove_trait(TRAIT_PACIFISM, TRAUMA_TRAIT) - ..() \ No newline at end of file + ..() diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 614cc65cbb..ed5ac0b49b 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -187,6 +187,40 @@ to_chat(quirk_holder, "Your antagonistic nature has caused you to renounce your pacifism.") qdel(src) +/datum/quirk/paraplegic + name = "Paraplegic" + desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!" + value = -3 + human_only = TRUE + gain_text = null // Handled by trauma. + lose_text = null + medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities." + + /datum/quirk/paraplegic/add() + var/datum/brain_trauma/severe/paralysis/paraplegic/T = new() + var/mob/living/carbon/human/H = quirk_holder + H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE) + + /datum/quirk/paraplegic/on_spawn() + if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. + quirk_holder.buckled.unbuckle_mob(quirk_holder) + + var/turf/T = get_turf(quirk_holder) + var/obj/structure/chair/spawn_chair = locate() in T + + var/obj/vehicle/ridden/wheelchair/wheels = new(T) + if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking + wheels.setDir(spawn_chair.dir) + + wheels.buckle_mob(quirk_holder) + + // During the spawning process, they may have dropped what they were holding, due to the paralysis + // So put the things back in their hands. + + for(var/obj/item/I in T) + if(I.fingerprintslast == quirk_holder.ckey) + quirk_holder.put_in_hands(I) + /datum/quirk/poor_aim name = "Poor Aim" desc = "You're terrible with guns and can't line up a straight shot to save your life. Dual-wielding is right out." diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index ea13255dfe..23267b88c6 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -895,6 +895,11 @@ var/obj/item/organ/I = X I.Insert(src) +/mob/living/carbon/proc/update_disabled_bodyparts() + for(var/B in bodyparts) + var/obj/item/bodypart/BP = B + BP.update_disabled() + /mob/living/carbon/vv_get_dropdown() . = ..() . += "---" diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 71b659b73f..db032aaa4a 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -21,7 +21,7 @@ var/held_index = 0 //are we a hand? if so, which one! var/is_pseudopart = FALSE //For limbs that don't really exist, eg chainsaws - var/disabled = FALSE //If TRUE, limb is as good as missing + var/disabled = BODYPART_NOT_DISABLED //If disabled, limb is as good as missing var/body_damage_coeff = 1 //Multiplier of the limb's damage that gets applied to the mob var/stam_damage_coeff = 0.5 var/brutestate = 0 @@ -189,7 +189,7 @@ if(stamina > DAMAGE_PRECISION) owner.update_stamina() consider_processing() - check_disabled() + update_disabled() return update_bodypart_damage_state() //Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all. @@ -209,7 +209,7 @@ if(owner && updating_health) owner.updatehealth() consider_processing() - check_disabled() + update_disabled() return update_bodypart_damage_state() //Returns total damage. @@ -220,15 +220,23 @@ return total //Checks disabled status thresholds -/obj/item/bodypart/proc/check_disabled() - if(!can_dismember() || owner.has_trait(TRAIT_NODISMEMBER)) - return - if(!disabled && (get_damage(TRUE) >= max_damage)) - set_disabled(TRUE) - else if(disabled && (get_damage(TRUE) <= (max_damage * 0.5))) - set_disabled(FALSE) +//Checks disabled status thresholds +/obj/item/bodypart/proc/update_disabled() + set_disabled(is_disabled()) -/obj/item/bodypart/proc/set_disabled(new_disabled = TRUE) +/obj/item/bodypart/proc/is_disabled() + if(has_trait(TRAIT_PARALYSIS)) + return BODYPART_DISABLED_PARALYSIS + if(can_dismember() && !owner.has_trait(TRAIT_NODISMEMBER)) + . = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled + if((get_damage(TRUE) >= max_damage)) + return BODYPART_DISABLED_DAMAGE + if(disabled && (get_damage(TRUE) <= (max_damage * 0.5))) + return BODYPART_NOT_DISABLED + else + return BODYPART_NOT_DISABLED + +/obj/item/bodypart/proc/set_disabled(new_disabled) if(disabled == new_disabled) return disabled = new_disabled @@ -598,13 +606,27 @@ px_y = 0 stam_heal_tick = 2 -/obj/item/bodypart/l_arm/set_disabled(new_disabled = TRUE) - ..() - if(disabled) - to_chat(owner, "Your [name] is too damaged to function!") - owner.emote("scream") +/obj/item/bodypart/l_arm/is_disabled() + if(owner.has_trait(TRAIT_PARALYSIS_L_ARM)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/l_arm/set_disabled(new_disabled) + . = ..() + if(disabled == new_disabled) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat > UNCONSCIOUS) + owner.emote("scream") + if(. && (owner.stat > DEAD)) + to_chat(owner, "Your [name] is too damaged to function!") if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(. && (owner.stat > DEAD)) + to_chat(owner, "You can't feel your [name]!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] if(L) @@ -649,18 +671,33 @@ stam_heal_tick = 2 max_stamina_damage = 50 -/obj/item/bodypart/r_arm/set_disabled(new_disabled = TRUE) - ..() - if(disabled) - to_chat(owner, "Your [name] is too damaged to function!") - owner.emote("scream") +/obj/item/bodypart/r_arm/is_disabled() + if(owner.has_trait(TRAIT_PARALYSIS_R_ARM)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/r_arm/set_disabled(new_disabled) + . = ..() + if(disabled == new_disabled) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat > UNCONSCIOUS) + owner.emote("scream") + if(. && (owner.stat > DEAD)) + to_chat(owner, "Your [name] is too damaged to function!") if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(. && (owner.stat > DEAD)) + to_chat(owner, "You can't feel your [name]!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] if(R) R.update_icon() + /obj/item/bodypart/r_arm/monkey icon = 'icons/mob/animal_parts.dmi' icon_state = "default_monkey_r_arm" @@ -697,11 +734,24 @@ stam_heal_tick = 2 max_stamina_damage = 50 -/obj/item/bodypart/l_leg/set_disabled(new_disabled = TRUE) - ..() - if(disabled) - to_chat(owner, "Your [name] is too damaged to function!") - owner.emote("scream") +/obj/item/bodypart/l_leg/is_disabled() + if(owner.has_trait(TRAIT_PARALYSIS_L_LEG)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/l_leg/set_disabled(new_disabled) + . = ..() + if(disabled == new_disabled) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat > UNCONSCIOUS) + owner.emote("scream") + if(. && (owner.stat > DEAD)) + to_chat(owner, "Your [name] is too damaged to function!") + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(. && (owner.stat > DEAD)) + to_chat(owner, "You can't feel your [name]!") + /obj/item/bodypart/l_leg/digitigrade name = "left digitigrade leg" @@ -744,11 +794,23 @@ max_stamina_damage = 50 stam_heal_tick = 2 -/obj/item/bodypart/r_leg/set_disabled(new_disabled = TRUE) - ..() - if(disabled) - to_chat(owner, "Your [name] is too damaged to function!") - owner.emote("scream") +/obj/item/bodypart/r_leg/is_disabled() + if(owner.has_trait(TRAIT_PARALYSIS_R_LEG)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/r_leg/set_disabled(new_disabled) + . = ..() + if(disabled == new_disabled) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat > UNCONSCIOUS) + owner.emote("scream") + if(. && (owner.stat > DEAD)) + to_chat(owner, "Your [name] is too damaged to function!") + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(. && (owner.stat > DEAD)) + to_chat(owner, "You can't feel your [name]!") /obj/item/bodypart/r_leg/digitigrade name = "right digitigrade leg" From 7fe18b5a373accc9e8369089976533f728367ba9 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 16:55:31 +0100 Subject: [PATCH 02/18] Parapalegic trait. --- code/datums/brain_damage/severe.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 8e13522a02..d13e6cce7a 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -69,7 +69,8 @@ //for descriptions /datum/brain_trauma/severe/paralysis/New(specific_type) - paralysis_type = specific_type + if(specific_type) + paralysis_type = specific_type if(!paralysis_type) paralysis_type = pick("full","left","right","arms","legs","r_arm","l_arm","r_leg","l_leg") var/subject @@ -117,6 +118,10 @@ owner.remove_trait(X, "trauma_paralysis") owner.update_disabled_bodyparts() +/datum/brain_trauma/severe/paralysis/paraplegic + random_gain = FALSE + paralysis_type = "legs" + resilience = TRAUMA_RESILIENCE_ABSOLUTE /datum/brain_trauma/severe/narcolepsy name = "Narcolepsy" From 7990a20ea6a2e0fe14c018ec1eaf1895dc52177b Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 17:20:04 +0100 Subject: [PATCH 03/18] We don't have wheelchairs? Heresy. Plus fixes to work on citcode. Csafe --- code/datums/brain_damage/severe.dm | 2 +- code/datums/traits/negative.dm | 14 +-- code/modules/surgery/bodyparts/bodyparts.dm | 2 +- code/modules/vehicles/ridden.dm | 2 +- code/modules/vehicles/wheelchair.dm | 110 ++++++++++++++++++++ tgstation.dme | 25 ++--- 6 files changed, 133 insertions(+), 22 deletions(-) create mode 100644 code/modules/vehicles/wheelchair.dm diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index d13e6cce7a..6ab1d1859e 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -119,7 +119,7 @@ owner.update_disabled_bodyparts() /datum/brain_trauma/severe/paralysis/paraplegic - random_gain = FALSE + can_gain = FALSE paralysis_type = "legs" resilience = TRAUMA_RESILIENCE_ABSOLUTE diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index ed5ac0b49b..b7307b10e4 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -196,28 +196,28 @@ lose_text = null medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities." - /datum/quirk/paraplegic/add() +/datum/quirk/paraplegic/add() var/datum/brain_trauma/severe/paralysis/paraplegic/T = new() var/mob/living/carbon/human/H = quirk_holder H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE) - /datum/quirk/paraplegic/on_spawn() +/datum/quirk/paraplegic/on_spawn() if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. quirk_holder.buckled.unbuckle_mob(quirk_holder) - var/turf/T = get_turf(quirk_holder) + var/turf/T = get_turf(quirk_holder) var/obj/structure/chair/spawn_chair = locate() in T - var/obj/vehicle/ridden/wheelchair/wheels = new(T) + var/obj/vehicle/ridden/wheelchair/wheels = new(T) if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking wheels.setDir(spawn_chair.dir) - wheels.buckle_mob(quirk_holder) + wheels.buckle_mob(quirk_holder) - // During the spawning process, they may have dropped what they were holding, due to the paralysis + // During the spawning process, they may have dropped what they were holding, due to the paralysis // So put the things back in their hands. - for(var/obj/item/I in T) + for(var/obj/item/I in T) if(I.fingerprintslast == quirk_holder.ckey) quirk_holder.put_in_hands(I) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index db032aaa4a..b8f4dbd4cc 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -225,7 +225,7 @@ set_disabled(is_disabled()) /obj/item/bodypart/proc/is_disabled() - if(has_trait(TRAIT_PARALYSIS)) + if(owner.has_trait(TRAIT_PARALYSIS)) return BODYPART_DISABLED_PARALYSIS if(can_dismember() && !owner.has_trait(TRAIT_NODISMEMBER)) . = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 25a337bc22..ba37f39bb3 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -5,7 +5,7 @@ buckle_lying = FALSE default_driver_move = FALSE var/legs_required = 2 - var/arms_requires = 0 //why not? + var/arms_required = 0 //why not? /obj/vehicle/ridden/Initialize() . = ..() diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm new file mode 100644 index 0000000000..a5ba06e6fb --- /dev/null +++ b/code/modules/vehicles/wheelchair.dm @@ -0,0 +1,110 @@ +/obj/vehicle/ridden/wheelchair //ported from Hippiestation (by Jujumatic) Then ported by Fermis from tg! + name = "wheelchair" + desc = "A chair with big wheels. It looks like you can move in this on your own." + icon = 'icons/obj/vehicles.dmi' + icon_state = "wheelchair" + layer = OBJ_LAYER + max_integrity = 100 + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 30) //Wheelchairs aren't super tough yo + legs_required = 0 //You'll probably be using this if you don't have legs + canmove = TRUE + density = FALSE //Thought I couldn't fix this one easily, phew + arms_required = 1 + +/obj/vehicle/ridden/wheelchair/Initialize() + . = ..() + var/datum/component/riding/D = LoadComponent(/datum/component/riding) + D.vehicle_move_delay = 0 + D.set_vehicle_dir_layer(SOUTH, OBJ_LAYER) + D.set_vehicle_dir_layer(NORTH, ABOVE_MOB_LAYER) + D.set_vehicle_dir_layer(EAST, OBJ_LAYER) + D.set_vehicle_dir_layer(WEST, OBJ_LAYER) + +/obj/vehicle/ridden/wheelchair/ComponentInitialize() //Since it's technically a chair I want it to have chair properties + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE, CALLBACK(src, .proc/can_user_rotate),CALLBACK(src, .proc/can_be_rotated),null) + +/obj/vehicle/ridden/wheelchair/obj_destruction(damage_flag) + new /obj/item/stack/rods(drop_location(), 1) + new /obj/item/stack/sheet/metal(drop_location(), 1) + ..() + +/obj/vehicle/ridden/wheelchair/Destroy() + if(has_buckled_mobs()) + var/mob/living/carbon/H = buckled_mobs[1] + unbuckle_mob(H) + return ..() + +/obj/vehicle/ridden/wheelchair/driver_move(mob/living/user, direction) + if(istype(user)) + if(canmove && (user.get_num_arms() < arms_required)) + to_chat(user, "You don't have enough arms to operate the wheels!") + canmove = FALSE + addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) + return FALSE + var/datum/component/riding/D = GetComponent(/datum/component/riding) + //1.5 (movespeed as of this change) multiplied by 6.7 gets ABOUT 10 (rounded), the old constant for the wheelchair that gets divided by how many arms they have + //if that made no sense this simply makes the wheelchair speed change along with movement speed delay + D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * 6.7) / min(user.get_num_arms(), 2) + return ..() + +/obj/vehicle/ridden/wheelchair/Moved() + . = ..() + cut_overlays() + playsound(src, 'sound/effects/roll.ogg', 75, 1) + if(has_buckled_mobs()) + handle_rotation_overlayed() + + +/obj/vehicle/ridden/wheelchair/post_buckle_mob(mob/living/user) + . = ..() + handle_rotation_overlayed() + +/obj/vehicle/ridden/wheelchair/post_unbuckle_mob() + . = ..() + cut_overlays() + +/obj/vehicle/ridden/wheelchair/setDir(newdir) + ..() + handle_rotation(newdir) + +/obj/vehicle/ridden/wheelchair/wrench_act(mob/living/user, obj/item/I) //Attackby should stop it attacking the wheelchair after moving away during decon + to_chat(user, "You begin to detach the wheels...") + if(I.use_tool(src, user, 40, volume=50)) + to_chat(user, "You detach the wheels and deconstruct the chair.") + new /obj/item/stack/rods(drop_location(), 6) + new /obj/item/stack/sheet/metal(drop_location(), 4) + qdel(src) + return TRUE + +/obj/vehicle/ridden/wheelchair/proc/handle_rotation(direction) + if(has_buckled_mobs()) + handle_rotation_overlayed() + for(var/m in buckled_mobs) + var/mob/living/buckled_mob = m + buckled_mob.setDir(direction) + +/obj/vehicle/ridden/wheelchair/proc/handle_rotation_overlayed() + cut_overlays() + var/image/V = image(icon = icon, icon_state = "wheelchair_overlay", layer = FLY_LAYER, dir = src.dir) + add_overlay(V) + + + +/obj/vehicle/ridden/wheelchair/proc/can_be_rotated(mob/living/user) + return TRUE + +/obj/vehicle/ridden/wheelchair/proc/can_user_rotate(mob/living/user) + var/mob/living/L = user + if(istype(L)) + if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return FALSE + if(isobserver(user) && CONFIG_GET(flag/ghost_interaction)) + return TRUE + return FALSE + +/obj/vehicle/ridden/wheelchair/the_whip/driver_move(mob/living/user, direction) + if(istype(user)) + var/datum/component/riding/D = GetComponent(/datum/component/riding) + D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * 6.7) / user.get_num_arms() + return ..() diff --git a/tgstation.dme b/tgstation.dme index f2cef76dd9..66d883433a 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2505,22 +2505,10 @@ #include "code\modules\research\designs\AI_module_designs.dm" #include "code\modules\research\designs\biogenerator_designs.dm" #include "code\modules\research\designs\bluespace_designs.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm" #include "code\modules\research\designs\computer_part_designs.dm" #include "code\modules\research\designs\electronics_designs.dm" #include "code\modules\research\designs\equipment_designs.dm" #include "code\modules\research\designs\limbgrower_designs.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_service.dm" #include "code\modules\research\designs\mecha_designs.dm" #include "code\modules\research\designs\mechfabricator_designs.dm" #include "code\modules\research\designs\medical_designs.dm" @@ -2538,6 +2526,18 @@ #include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" #include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm" #include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_service.dm" #include "code\modules\research\machinery\_production.dm" #include "code\modules\research\machinery\circuit_imprinter.dm" #include "code\modules\research\machinery\departmental_circuit_imprinter.dm" @@ -2766,6 +2766,7 @@ #include "code\modules\vehicles\speedbike.dm" #include "code\modules\vehicles\vehicle_actions.dm" #include "code\modules\vehicles\vehicle_key.dm" +#include "code\modules\vehicles\wheelchair.dm" #include "code\modules\vehicles\cars\car.dm" #include "code\modules\vehicles\cars\clowncar.dm" #include "code\modules\vending\_vending.dm" From bebaf8e7a8915e2ef40080adea89f6ff4a66a813 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 18:17:49 +0100 Subject: [PATCH 04/18] Wheelchairs are apparently banned, we now have HOVERCHAIRS! --- code/datums/brain_damage/severe.dm | 2 +- code/modules/crafting/recipes.dm | 8 ++++++++ code/modules/vehicles/_vehicle.dm | 13 +++++++++++++ icons/obj/vehicles.dmi | Bin 31897 -> 35401 bytes 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 6ab1d1859e..f2d96c9e4d 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -119,7 +119,7 @@ owner.update_disabled_bodyparts() /datum/brain_trauma/severe/paralysis/paraplegic - can_gain = FALSE + //can_gain = FALSE maybe breaks. paralysis_type = "legs" resilience = TRAUMA_RESILIENCE_ABSOLUTE diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index ca10d5092f..27d9cef4ca 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -623,6 +623,14 @@ /obj/item/assembly/igniter = 1) category = CAT_MISC +/datum/crafting_recipe/wheelchair + name = "Wheelchair" + result = /obj/vehicle/ridden/wheelchair + reqs = list(/obj/item/stack/sheet/plasteel = 2, + /obj/item/stack/rods = 8) + time = 100 + category = CAT_MISC + /datum/crafting_recipe/rcl name = "Makeshift Rapid Cable Layer" diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index be59a6df65..54bc03bcf3 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -31,6 +31,19 @@ occupant_actions = list() generate_actions() +/obj/vehicle/examine(mob/user) + ..() + if(resistance_flags & ON_FIRE) + to_chat(user, "It's on fire!") + var/healthpercent = obj_integrity/max_integrity * 100 + switch(healthpercent) + if(50 to 99) + to_chat(user, "It looks slightly damaged.") + if(25 to 50) + to_chat(user, "It appears heavily damaged.") + if(0 to 25) + to_chat(user, "It's falling apart!") + /obj/vehicle/proc/is_key(obj/item/I) return I? (key_type_exact? (I.type == key_type) : istype(I, key_type)) : FALSE diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi index 5e3757cedd21d848541530d0d216d47afc74ab87..fc8f0755cb9238b2439409c3e09be511db514458 100644 GIT binary patch delta 14666 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μ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 Date: Sat, 1 Jun 2019 18:24:17 +0100 Subject: [PATCH 05/18] Quick fix to prevent parapalegics driving with no legs. --- code/modules/vehicles/ridden.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index ba37f39bb3..8535bf2ba0 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -60,6 +60,11 @@ if(key_type && !is_key(inserted_key)) to_chat(user, "[src] has no key inserted!") return FALSE + if(canmove && (user.get_num_arms() < arms_required)) + to_chat(user, "You don't have enough legs to operate the pedals!") + canmove = FALSE + addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) + return FALSE var/datum/component/riding/R = GetComponent(/datum/component/riding) R.handle_ride(user, direction) return ..() From cd310b37fe0c858b2bfc9a278a24f0a374977733 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sat, 1 Jun 2019 18:33:42 +0100 Subject: [PATCH 06/18] One pixel missing. --- icons/obj/vehicles.dmi | Bin 35401 -> 35254 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi index fc8f0755cb9238b2439409c3e09be511db514458..67079de3e2fa6bc83ce63dfe4241e3d210c7367e 100644 GIT binary patch delta 14476 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 Date: Sun, 2 Jun 2019 18:26:00 +0100 Subject: [PATCH 07/18] Actually check legs. --- code/modules/vehicles/ridden.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 8535bf2ba0..73e08975ba 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -60,7 +60,7 @@ if(key_type && !is_key(inserted_key)) to_chat(user, "[src] has no key inserted!") return FALSE - if(canmove && (user.get_num_arms() < arms_required)) + if(canmove && (user.get_num_lehs() < legs_required)) to_chat(user, "You don't have enough legs to operate the pedals!") canmove = FALSE addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) From 59e5372abd11461fb9d796b8b470bf61ed92ac5c Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 2 Jun 2019 18:40:56 +0100 Subject: [PATCH 08/18] Made it so prosthetics can't replace legs. Compiled and tested. --- code/__DEFINES/traits.dm | 1 + code/datums/traits/negative.dm | 7 ++++++- code/modules/vehicles/ridden.dm | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index c0e3e141c7..ff45ac474f 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -78,6 +78,7 @@ #define TRAIT_CROCRIN_IMMUNE "crocin_immune" #define TRAIT_NYMPHO "nymphomania" #define TRAIT_MASO "masochism" +#define TRAIT_PARA "paraplegic" // common trait sources #define TRAIT_GENERIC "generic" diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index b7307b10e4..a1a7c16098 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -191,6 +191,7 @@ name = "Paraplegic" desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!" value = -3 + mob_trait = TRAIT_PARA human_only = TRUE gain_text = null // Handled by trauma. lose_text = null @@ -242,8 +243,12 @@ var/slot_string = "limb" /datum/quirk/prosthetic_limb/on_spawn() - var/limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) var/mob/living/carbon/human/H = quirk_holder + var/limb_slot + if(H.has_trait("TRAIT_PARA"))//Prevent paraplegic legs being replaced + limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) + else + limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) var/obj/item/bodypart/old_part = H.get_bodypart(limb_slot) var/obj/item/bodypart/prosthetic switch(limb_slot) diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 73e08975ba..72881e314f 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -60,7 +60,7 @@ if(key_type && !is_key(inserted_key)) to_chat(user, "[src] has no key inserted!") return FALSE - if(canmove && (user.get_num_lehs() < legs_required)) + if(canmove && (user.get_num_legs() < legs_required)) to_chat(user, "You don't have enough legs to operate the pedals!") canmove = FALSE addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) From e607cd3c7d4a32cce49ac892dd3274b03b964ff8 Mon Sep 17 00:00:00 2001 From: Fermi Date: Sun, 2 Jun 2019 19:11:34 +0100 Subject: [PATCH 09/18] Fixes para's abilities to use other vehicles. --- code/datums/traits/negative.dm | 2 +- code/modules/vehicles/ridden.dm | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index a1a7c16098..aba9404d9a 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -245,7 +245,7 @@ /datum/quirk/prosthetic_limb/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/limb_slot - if(H.has_trait("TRAIT_PARA"))//Prevent paraplegic legs being replaced + if(H.has_trait(TRAIT_PARA))//Prevent paraplegic legs being replaced limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) else limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 72881e314f..8fe7322579 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -4,7 +4,7 @@ max_buckled_mobs = 1 buckle_lying = FALSE default_driver_move = FALSE - var/legs_required = 2 + var/legs_required = 1 var/arms_required = 0 //why not? /obj/vehicle/ridden/Initialize() @@ -31,6 +31,9 @@ /obj/vehicle/ridden/post_buckle_mob(mob/living/M) add_occupant(M) + if(M.get_num_legs() < legs_required) + to_chat(M, "You don't have enough legs to operate the pedals!") + unbuckle_mob(M) return ..() /obj/vehicle/ridden/attackby(obj/item/I, mob/user, params) @@ -60,11 +63,6 @@ if(key_type && !is_key(inserted_key)) to_chat(user, "[src] has no key inserted!") return FALSE - if(canmove && (user.get_num_legs() < legs_required)) - to_chat(user, "You don't have enough legs to operate the pedals!") - canmove = FALSE - addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) - return FALSE var/datum/component/riding/R = GetComponent(/datum/component/riding) R.handle_ride(user, direction) return ..() From 2681a8f7a9ccf858e0acb1bea6fcf12068ad2994 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 17 Jun 2019 12:02:39 +0100 Subject: [PATCH 10/18] Updates has_trait to HAS_TRAIT --- code/modules/surgery/bodyparts/bodyparts.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index b8f4dbd4cc..2a49c37590 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -88,7 +88,7 @@ /obj/item/bodypart/attack(mob/living/carbon/C, mob/user) if(ishuman(C)) var/mob/living/carbon/human/H = C - if(C.has_trait(TRAIT_LIMBATTACHMENT)) + if(HAS_TRAIT(C, TRAIT_LIMBATTACHMENT)) if(!H.get_bodypart(body_zone) && !animal_origin) if(H == user) H.visible_message("[H] jams [src] into [H.p_their()] empty socket!",\ @@ -225,9 +225,9 @@ set_disabled(is_disabled()) /obj/item/bodypart/proc/is_disabled() - if(owner.has_trait(TRAIT_PARALYSIS)) + if(HAS_TRAIT(owner, TRAIT_PARALYSIS)) return BODYPART_DISABLED_PARALYSIS - if(can_dismember() && !owner.has_trait(TRAIT_NODISMEMBER)) + if(can_dismember() && !HAS_TRAIT(owner, TRAIT_NODISMEMBER)) . = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled if((get_damage(TRUE) >= max_damage)) return BODYPART_DISABLED_DAMAGE @@ -293,7 +293,7 @@ C = owner no_update = FALSE - if(C.has_trait(TRAIT_HUSK) && is_organic_limb()) + if(HAS_TRAIT(C, TRAIT_HUSK) && is_organic_limb()) species_id = "husk" //overrides species_id dmg_overlay_type = "" //no damage overlay shown when husked should_draw_gender = FALSE @@ -607,7 +607,7 @@ stam_heal_tick = 2 /obj/item/bodypart/l_arm/is_disabled() - if(owner.has_trait(TRAIT_PARALYSIS_L_ARM)) + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM)) return BODYPART_DISABLED_PARALYSIS return ..() @@ -672,7 +672,7 @@ max_stamina_damage = 50 /obj/item/bodypart/r_arm/is_disabled() - if(owner.has_trait(TRAIT_PARALYSIS_R_ARM)) + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_ARM)) return BODYPART_DISABLED_PARALYSIS return ..() @@ -735,7 +735,7 @@ max_stamina_damage = 50 /obj/item/bodypart/l_leg/is_disabled() - if(owner.has_trait(TRAIT_PARALYSIS_L_LEG)) + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG)) return BODYPART_DISABLED_PARALYSIS return ..() @@ -795,7 +795,7 @@ stam_heal_tick = 2 /obj/item/bodypart/r_leg/is_disabled() - if(owner.has_trait(TRAIT_PARALYSIS_R_LEG)) + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG)) return BODYPART_DISABLED_PARALYSIS return ..() From dd7421f130500a914913a8a53d612d9785072c5a Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 17 Jun 2019 12:05:21 +0100 Subject: [PATCH 11/18] Missed one. --- code/datums/traits/negative.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 7c13310af8..bbf38c822a 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -245,7 +245,7 @@ /datum/quirk/prosthetic_limb/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/limb_slot - if(H.has_trait(TRAIT_PARA))//Prevent paraplegic legs being replaced + if(HAS_TRAIT(H, TRAIT_PARA))//Prevent paraplegic legs being replaced limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) else limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) From 0457026c0fbd1264e30f57257096eb9dea5cb800 Mon Sep 17 00:00:00 2001 From: Fermi Date: Mon, 17 Jun 2019 12:15:54 +0100 Subject: [PATCH 12/18] Missed another. --- code/datums/brain_damage/severe.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 852b6b93c2..d094c162d7 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -109,13 +109,13 @@ /datum/brain_trauma/severe/paralysis/on_gain() ..() for(var/X in paralysis_traits) - owner.add_trait(X, "trauma_paralysis") + ADD_TRAIT(owner, X, "trauma_paralysis") owner.update_disabled_bodyparts() /datum/brain_trauma/severe/paralysis/on_lose() ..() for(var/X in paralysis_traits) - owner.remove_trait(X, "trauma_paralysis") + REMOVE_TRAIT(owner, X, "trauma_paralysis") owner.update_disabled_bodyparts() /datum/brain_trauma/severe/paralysis/paraplegic From d60a360e90518788671dc2acfece426f16e739e9 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Mon, 17 Jun 2019 20:17:38 +0200 Subject: [PATCH 13/18] Ports "Removes firebug from goonchat" (#8650) * Ports "Removes firebug from goonchat" * fucking acient goonchat pre-sync stuff. --- .../browserassets/js/browserOutput.js | 9 - goon/browserassets/css/browserOutput.css | 362 ------- goon/browserassets/css/font-awesome.css | 788 --------------- goon/browserassets/html/browserOutput.html | 44 - goon/browserassets/js/browserOutput.js | 908 ------------------ goon/browserassets/js/json2.min.js | 1 - goon/code/datums/browserOutput.dm | 289 ------ 7 files changed, 2401 deletions(-) delete mode 100644 goon/browserassets/css/browserOutput.css delete mode 100644 goon/browserassets/css/font-awesome.css delete mode 100644 goon/browserassets/html/browserOutput.html delete mode 100644 goon/browserassets/js/browserOutput.js delete mode 100644 goon/browserassets/js/json2.min.js delete mode 100644 goon/code/datums/browserOutput.dm diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index 64b41a5921..33553d765e 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -471,15 +471,6 @@ function ehjaxCallback(data) { handleClientData(data.clientData.ckey, data.clientData.ip, data.clientData.compid); } sendVolumeUpdate(); - } else if (data.firebug) { - if (data.trigger) { - internalOutput('Loading firebug console, triggered by '+data.trigger+'...', 'internal'); - } else { - internalOutput('Loading firebug console...', 'internal'); - } - var firebugEl = document.createElement('script'); - firebugEl.src = 'https://getfirebug.com/firebug-lite-debug.js'; - document.body.appendChild(firebugEl); } else if (data.adminMusic) { if (typeof data.adminMusic === 'string') { var adminMusic = byondDecode(data.adminMusic); diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css deleted file mode 100644 index 820537e32b..0000000000 --- a/goon/browserassets/css/browserOutput.css +++ /dev/null @@ -1,362 +0,0 @@ -/***************************************** -* -* GLOBAL STYLES -* -******************************************/ -html, body { - padding: 0; - margin: 0; - height: 100%; - color: #000000; -} -body { - background: #fff; - font-family: Verdana, sans-serif; - font-size: 9pt; - line-height: 1.4; - overflow-x: hidden; - overflow-y: scroll; - word-wrap: break-word; -} - -em { - font-style: normal; - font-weight: bold; -} - -img { - margin: 0; - padding: 0; - line-height: 1; -} -img.icon { - width: 16px; - height: 16px; -} - -a {color: #0000ff;} -a.visited {color: #ff00ff;} -a:visited {color: #ff00ff;} -a.popt {text-decoration: none;} - -/***************************************** -* -* OUTPUT NOT RELATED TO ACTUAL MESSAGES -* -******************************************/ -#loading { - position: fixed; - width: 300px; - height: 150px; - text-align: center; - left: 50%; - top: 50%; - margin: -75px 0 0 -150px; -} -#loading i {display: block; padding-bottom: 3px;} - -#messages { - font-size: 14px; - padding: 3px; - margin: 0; - word-wrap: break-word; -} -#newMessages { - position: fixed; - display: block; - bottom: 0; - right: 0; - padding: 8px; - background: #ddd; - text-decoration: none; - font-variant: small-caps; - font-size: 1.1em; - font-weight: bold; - color: #333; -} -#newMessages:hover {background: #ccc;} -#newMessages i {vertical-align: middle; padding-left: 3px;} -#ping { - position: fixed; - top: 0; - right: 40px; - width: 45px; - background: #ddd; - height: 30px; - padding: 8px 0 2px 0; -} -#ping i {display: block; text-align: center;} -#ping .ms { - display: block; - text-align: center; - font-size: 8pt; - padding-top: 2px; -} -#options { - position: fixed; - top: 0; - right: 0; -} -#options a { - background: #ddd; - height: 30px; - padding: 5px 0; - display: block; - color: #333; - text-decoration: none; - line-height: 28px; - border-top: 1px solid #b4b4b4; -} -#options a:hover {background: #ccc;} -#options .toggle { - width: 40px; - background: #ccc; - border-top: 0; - float: right; - text-align: center; -} -#options .sub {clear: both; display: none; width: 160px;} -#options .sub.scroll {overflow-y: scroll;} -#options .sub a {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;} -#options .sub span { - display: block; - line-height: 30px; - float: left; -} -#options .sub i { - display: block; - padding: 0 5px; - font-size: 1.1em; - width: 22px; - text-align: center; - line-height: 30px; - float: right; -} -#options .decreaseFont {border-top: 0;} - -/* POPUPS */ -.popup { - position: fixed; - top: 50%; - left: 50%; - background: #ddd; -} -.popup .close { - position: absolute; - background: #aaa; - top: 0; - right: 0; - color: #333; - text-decoration: none; - z-index: 2; - padding: 0 10px; - height: 30px; - line-height: 30px; -} -.popup .close:hover {background: #999;} -.popup .head { - background: #999; - color: #ddd; - padding: 0 10px; - height: 30px; - line-height: 30px; - text-transform: uppercase; - font-size: 0.9em; - font-weight: bold; - border-bottom: 2px solid green; -} -.popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;} -.popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;} -.popup input[type=submit] {padding: 5px 10px; background: #999; color: #ddd; text-transform: uppercase; font-size: 0.9em; font-weight: bold;} -.popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;} - -.changeFont {padding: 10px;} -.changeFont a {display: block; text-decoration: none; padding: 3px; color: #333;} -.changeFont a:hover {background: #ccc;} - -.highlightPopup {padding: 10px; text-align: center;} -.highlightPopup input[type=text] {display: block; width: 215px; text-align: left; margin-top: 5px;} -.highlightPopup input.highlightColor {background-color: #FFFF00;} -.highlightPopup input.highlightTermSubmit {margin-top: 5px;} - -/* ADMIN CONTEXT MENU */ -.contextMenu { - background-color: #ddd; - position: fixed; - margin: 2px; - width: 150px; -} -.contextMenu a { - display: block; - padding: 2px 5px; - text-decoration: none; - color: #333; -} - -.contextMenu a:hover { - background-color: #ccc; -} - -/* ADMIN FILTER MESSAGES MENU */ -.filterMessages {padding: 5px;} -.filterMessages div {padding: 2px 0;} -.filterMessages input {} -.filterMessages label {} - -.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;} - - -/***************************************** -* -* OUTPUT ACTUALLY RELATED TO MESSAGES -* -******************************************/ - -/* MOTD */ -.motd {color: #638500; font-family: Verdana, sans-serif;} -.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;} -.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;} - -/* ADD HERE FOR BOLD */ -.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;} - -/* ADD HERE FOR ITALIC */ -.italic, .italics, .emote {font-style: italic;} - -/* OUTPUT COLORS */ -.highlight {background: yellow;} - -h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;} -h1.alert, h2.alert {color: #000000;} - -em {font-style: normal; font-weight: bold;} - -.adminobserverooc {color: #0099cc; font-weight: bold;} -.adminooc {color: #b82e00; font-weight: bold;} -.adminobserver {color: #996600; font-weight: bold;} -.admin {color: #386aff; font-weight: bold;} -/* SAY CLASSES */ -.say {} -.deadsay {color: #5c00e6;} -.siliconsay {font-family: 'Courier New', Courier, monospace;} -/* RADIO CLASSES */ -.radio {color: #008000;} - -.syndradio {color: #6d3f40;} -.centradio {color: #686868;} - -.aiprivradio {color: #ff00ff;} -.comradio {color: #948f02;} - -.secradio {color: #a30000;} -.engradio {color: #fb5613;} -.medradio {color: #337296;} -.sciradio {color: #993399;} -.supradio {color: #a8732b;} -.servadio {color: #6eaa2c;} - -.attack {color: #ff0000;} -.disarm {color: #990000;} -.passive {color: #660000;} - -.selecteddna {color: #ffffff; background-color: #001B1B} -.alert {color: #ff0000;} -.userdanger {color: #ff0000; font-weight: bold; font-size: 3;} -.danger {color: #ff0000;} -.warning {color: #ff0000; font-style: italic;} -.boldwarning {color: #ff0000; font-style: italic; font-weight: bold} -.announce {color: #228b22; font-weight: bold;} -.boldannounce {color: #ff0000; font-weight: bold;} -.greenannounce {color: #00ff00; font-weight: bold;} -.rose {color: #ff5050;} -.info {color: #0000CC;} -.notice {color: #000099;} -.boldnotice {color: #000099; font-weight: bold;} -.adminnotice {color: #0000ff;} -.unconscious {color: #0000ff; font-weight: bold;} -.suicide {color: #ff5050; font-style: italic;} -.green {color: #03ff39;} -.shadowling {color: #3b2769;} -.cult {color: #960000;} -.cultitalic {color: #960000; font-style: italic;} -.cultlarge {color: #960000; font-weight: bold; font-size: 3;} -.narsie {color: #960000; font-weight: bold; font-size: 125px;} -.narsiesmall {color: #960000; font-weight: bold; font-size: 6;} -.colossus {color: #7F282A; font-size: 5;} -.hierophant {color: #660099; font-weight: bold; font-style: italic;} -.hierophant_warning {color: #660099; font-style: italic;} -.purple {color: #5e2d79;} -.holoparasite {color: #35333a;} -.holoparasitebold {color: #35333a; font-weight: bold;} - -.revennotice {color: #1d2953;} -.revenboldnotice {color: #1d2953; font-weight: bold;} -.revenbignotice {color: #1d2953; font-weight: bold; font-size: 3;} -.revenminor {color: #823abb} -.revenwarning {color: #760fbb; font-style: italic;} -.revendanger {color: #760fbb; font-weight: bold; font-size: 3;} -.umbra {color: #5000A0;} -.umbra_bold {color: #5000A0; font-weight: bold;} -.umbra_italics {color: #5000A0; font-style: italic;} -.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;} -.umbra_large {color: #5000A0; font-size: 3;} - -.brass {color: #BE8700;} -.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;} -.large_brass {color: #BE8700; font-size: 3;} -.big_brass {color: #BE8700; font-size: 3; font-weight: bold; font-style: italic;} -.ratvar {color: #BE8700; font-size: 6; font-weight: bold; font-style: italic;} -.alloy {color: #42474D;} -.heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;} -.large_alloy {color: #42474D; font-size: 3;} -.nezbere_large {color: #42474D; font-size: 3; font-weight: bold; font-style: italic;} -.nezbere {color: #42474D; font-weight: bold; font-style: italic;} -.nezbere_small {color: #42474D;} -.sevtug_large {color: #AF0AAF; font-size: 3; font-weight: bold; font-style: italic;} -.sevtug {color: #AF0AAF; font-weight: bold; font-style: italic;} -.sevtug_small {color: #AF0AAF;} -.inathneq_large {color: #1E8CE1; font-size: 3; font-weight: bold; font-style: italic;} -.inathneq {color: #1E8CE1; font-weight: bold; font-style: italic;} -.inathneq_small {color: #1E8CE1;} -.nzcrentr_large {color: #DAAA18; font-size: 3; font-weight: bold; font-style: italic;} -.nzcrentr {color: #DAAA18; font-weight: bold; font-style: italic;} -.nzcrentr_small {color: #DAAA18;} -.neovgre_large {color: #6E001A; font-size: 3; font-weight: bold; font-style: italic;} -.neovgre {color: #6E001A; font-weight: bold; font-style: italic;} -.neovgre_small {color: #6E001A;} - -.newscaster {color: #800000;} -.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} - -.alien {color: #543354;} -.noticealien {color: #00c000;} -.alertalien {color: #00c000; font-weight: bold;} -.borer {color: #543354; font-style: italic;} -.changeling {color: #800080; font-style: italic;} - -.interface {color: #330033;} - -.sans {font-family: "Comic Sans MS", cursive, sans-serif;} -.papyrus {font-family: "Papyrus", cursive, sans-serif;} -.robot {font-family: "Courier New", cursive, sans-serif;} - -.command_headset {font-weight: bold; font-size: 3;} -.big {font-size: 3;} -.reallybig {font-size: 4;} -.greentext {color: #00FF00; font-size: 3;} -.redtext {color: #FF0000; font-size: 3;} -.clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} - -big img.icon {width: 32px; height: 32px;} - -.memo {color: #638500; text-align: center;} -.memoedit {text-align: center; font-size: 2;} -.abductor {color: #800080; font-style: italic;} - -.connectionClosed, .fatalError {background: red; color: white; padding: 5px;} -.connectionClosed.restored {background: green;} -.internal.boldnshit {color: blue; font-weight: bold;} - -/* HELPER CLASSES */ -.text-normal {font-weight: normal; font-style: normal;} -.hidden {display: none; visibility: hidden;} \ No newline at end of file diff --git a/goon/browserassets/css/font-awesome.css b/goon/browserassets/css/font-awesome.css deleted file mode 100644 index cc99d7b337..0000000000 --- a/goon/browserassets/css/font-awesome.css +++ /dev/null @@ -1,788 +0,0 @@ -@font-face{font-family:'FontAwesome';src:url('fontawesome-webfont.eot');src:url('fontawesome-webfont.eot') format('embedded-opentype'),url('fontawesome-webfont.woff') format('woff'),url('fontawesome-webfont.ttf') format('truetype'),url('fontawesome-webfont.svg') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;} -[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none;} -.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;} -a [class^="icon-"],a [class*=" icon-"]{display:inline;} -[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:0.2857142857142857em;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em;} -.icons-ul{margin-left:2.142857142857143em;list-style-type:none;}.icons-ul>li{position:relative;} -.icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit;} -[class^="icon-"].hide,[class*=" icon-"].hide{display:none;} -.icon-muted{color:#eeeeee;} -.icon-light{color:#ffffff;} -.icon-dark{color:#333333;} -.icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;} -.pull-right{float:right;} -.pull-left{float:left;} -[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;} -[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;} -[class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;} -.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;} -.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;} -.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;} -.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;} -.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;} -.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;} -.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;} -.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;} -.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;} -.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;} -.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{line-height:inherit;} -.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;} -.icon-stack .icon-stack-base{font-size:2em;*line-height:1em;} -.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;} -a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none;} -@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);} -.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);} -.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);} -.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);} -.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);} -a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block;} -.icon-glass:before{content:"\f000";} -.icon-music:before{content:"\f001";} -.icon-search:before{content:"\f002";} -.icon-envelope-alt:before{content:"\f003";} -.icon-heart:before{content:"\f004";} -.icon-star:before{content:"\f005";} -.icon-star-empty:before{content:"\f006";} -.icon-user:before{content:"\f007";} -.icon-film:before{content:"\f008";} -.icon-th-large:before{content:"\f009";} -.icon-th:before{content:"\f00a";} -.icon-th-list:before{content:"\f00b";} -.icon-ok:before{content:"\f00c";} -.icon-remove:before{content:"\f00d";} -.icon-zoom-in:before{content:"\f00e";} -.icon-zoom-out:before{content:"\f010";} -.icon-power-off:before,.icon-off:before{content:"\f011";} -.icon-signal:before{content:"\f012";} -.icon-gear:before,.icon-cog:before{content:"\f013";} -.icon-trash:before{content:"\f014";} -.icon-home:before{content:"\f015";} -.icon-file-alt:before{content:"\f016";} -.icon-time:before{content:"\f017";} -.icon-road:before{content:"\f018";} -.icon-download-alt:before{content:"\f019";} -.icon-download:before{content:"\f01a";} -.icon-upload:before{content:"\f01b";} -.icon-inbox:before{content:"\f01c";} -.icon-play-circle:before{content:"\f01d";} -.icon-rotate-right:before,.icon-repeat:before{content:"\f01e";} -.icon-refresh:before{content:"\f021";} -.icon-list-alt:before{content:"\f022";} -.icon-lock:before{content:"\f023";} -.icon-flag:before{content:"\f024";} -.icon-headphones:before{content:"\f025";} -.icon-volume-off:before{content:"\f026";} -.icon-volume-down:before{content:"\f027";} -.icon-volume-up:before{content:"\f028";} -.icon-qrcode:before{content:"\f029";} -.icon-barcode:before{content:"\f02a";} -.icon-tag:before{content:"\f02b";} -.icon-tags:before{content:"\f02c";} -.icon-book:before{content:"\f02d";} -.icon-bookmark:before{content:"\f02e";} -.icon-print:before{content:"\f02f";} -.icon-camera:before{content:"\f030";} -.icon-font:before{content:"\f031";} -.icon-bold:before{content:"\f032";} -.icon-italic:before{content:"\f033";} -.icon-text-height:before{content:"\f034";} -.icon-text-width:before{content:"\f035";} -.icon-align-left:before{content:"\f036";} -.icon-align-center:before{content:"\f037";} -.icon-align-right:before{content:"\f038";} -.icon-align-justify:before{content:"\f039";} -.icon-list:before{content:"\f03a";} -.icon-indent-left:before{content:"\f03b";} -.icon-indent-right:before{content:"\f03c";} -.icon-facetime-video:before{content:"\f03d";} -.icon-picture:before{content:"\f03e";} -.icon-pencil:before{content:"\f040";} -.icon-map-marker:before{content:"\f041";} -.icon-adjust:before{content:"\f042";} -.icon-tint:before{content:"\f043";} -.icon-edit:before{content:"\f044";} -.icon-share:before{content:"\f045";} -.icon-check:before{content:"\f046";} -.icon-move:before{content:"\f047";} -.icon-step-backward:before{content:"\f048";} -.icon-fast-backward:before{content:"\f049";} -.icon-backward:before{content:"\f04a";} -.icon-play:before{content:"\f04b";} -.icon-pause:before{content:"\f04c";} -.icon-stop:before{content:"\f04d";} -.icon-forward:before{content:"\f04e";} -.icon-fast-forward:before{content:"\f050";} -.icon-step-forward:before{content:"\f051";} -.icon-eject:before{content:"\f052";} -.icon-chevron-left:before{content:"\f053";} -.icon-chevron-right:before{content:"\f054";} -.icon-plus-sign:before{content:"\f055";} -.icon-minus-sign:before{content:"\f056";} -.icon-remove-sign:before{content:"\f057";} -.icon-ok-sign:before{content:"\f058";} -.icon-question-sign:before{content:"\f059";} -.icon-info-sign:before{content:"\f05a";} -.icon-screenshot:before{content:"\f05b";} -.icon-remove-circle:before{content:"\f05c";} -.icon-ok-circle:before{content:"\f05d";} -.icon-ban-circle:before{content:"\f05e";} -.icon-arrow-left:before{content:"\f060";} -.icon-arrow-right:before{content:"\f061";} -.icon-arrow-up:before{content:"\f062";} -.icon-arrow-down:before{content:"\f063";} -.icon-mail-forward:before,.icon-share-alt:before{content:"\f064";} -.icon-resize-full:before{content:"\f065";} -.icon-resize-small:before{content:"\f066";} -.icon-plus:before{content:"\f067";} -.icon-minus:before{content:"\f068";} -.icon-asterisk:before{content:"\f069";} -.icon-exclamation-sign:before{content:"\f06a";} -.icon-gift:before{content:"\f06b";} -.icon-leaf:before{content:"\f06c";} -.icon-fire:before{content:"\f06d";} -.icon-eye-open:before{content:"\f06e";} -.icon-eye-close:before{content:"\f070";} -.icon-warning-sign:before{content:"\f071";} -.icon-plane:before{content:"\f072";} -.icon-calendar:before{content:"\f073";} -.icon-random:before{content:"\f074";} -.icon-comment:before{content:"\f075";} -.icon-magnet:before{content:"\f076";} -.icon-chevron-up:before{content:"\f077";} -.icon-chevron-down:before{content:"\f078";} -.icon-retweet:before{content:"\f079";} -.icon-shopping-cart:before{content:"\f07a";} -.icon-folder-close:before{content:"\f07b";} -.icon-folder-open:before{content:"\f07c";} -.icon-resize-vertical:before{content:"\f07d";} -.icon-resize-horizontal:before{content:"\f07e";} -.icon-bar-chart:before{content:"\f080";} -.icon-twitter-sign:before{content:"\f081";} -.icon-facebook-sign:before{content:"\f082";} -.icon-camera-retro:before{content:"\f083";} -.icon-key:before{content:"\f084";} -.icon-gears:before,.icon-cogs:before{content:"\f085";} -.icon-comments:before{content:"\f086";} -.icon-thumbs-up-alt:before{content:"\f087";} -.icon-thumbs-down-alt:before{content:"\f088";} -.icon-star-half:before{content:"\f089";} -.icon-heart-empty:before{content:"\f08a";} -.icon-signout:before{content:"\f08b";} -.icon-linkedin-sign:before{content:"\f08c";} -.icon-pushpin:before{content:"\f08d";} -.icon-external-link:before{content:"\f08e";} -.icon-signin:before{content:"\f090";} -.icon-trophy:before{content:"\f091";} -.icon-github-sign:before{content:"\f092";} -.icon-upload-alt:before{content:"\f093";} -.icon-lemon:before{content:"\f094";} -.icon-phone:before{content:"\f095";} -.icon-unchecked:before,.icon-check-empty:before{content:"\f096";} -.icon-bookmark-empty:before{content:"\f097";} -.icon-phone-sign:before{content:"\f098";} -.icon-twitter:before{content:"\f099";} -.icon-facebook:before{content:"\f09a";} -.icon-github:before{content:"\f09b";} -.icon-unlock:before{content:"\f09c";} -.icon-credit-card:before{content:"\f09d";} -.icon-rss:before{content:"\f09e";} -.icon-hdd:before{content:"\f0a0";} -.icon-bullhorn:before{content:"\f0a1";} -.icon-bell:before{content:"\f0a2";} -.icon-certificate:before{content:"\f0a3";} -.icon-hand-right:before{content:"\f0a4";} -.icon-hand-left:before{content:"\f0a5";} -.icon-hand-up:before{content:"\f0a6";} -.icon-hand-down:before{content:"\f0a7";} -.icon-circle-arrow-left:before{content:"\f0a8";} -.icon-circle-arrow-right:before{content:"\f0a9";} -.icon-circle-arrow-up:before{content:"\f0aa";} -.icon-circle-arrow-down:before{content:"\f0ab";} -.icon-globe:before{content:"\f0ac";} -.icon-wrench:before{content:"\f0ad";} -.icon-tasks:before{content:"\f0ae";} -.icon-filter:before{content:"\f0b0";} -.icon-briefcase:before{content:"\f0b1";} -.icon-fullscreen:before{content:"\f0b2";} -.icon-group:before{content:"\f0c0";} -.icon-link:before{content:"\f0c1";} -.icon-cloud:before{content:"\f0c2";} -.icon-beaker:before{content:"\f0c3";} -.icon-cut:before{content:"\f0c4";} -.icon-copy:before{content:"\f0c5";} -.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6";} -.icon-save:before{content:"\f0c7";} -.icon-sign-blank:before{content:"\f0c8";} -.icon-reorder:before{content:"\f0c9";} -.icon-list-ul:before{content:"\f0ca";} -.icon-list-ol:before{content:"\f0cb";} -.icon-strikethrough:before{content:"\f0cc";} -.icon-underline:before{content:"\f0cd";} -.icon-table:before{content:"\f0ce";} -.icon-magic:before{content:"\f0d0";} -.icon-truck:before{content:"\f0d1";} -.icon-pinterest:before{content:"\f0d2";} -.icon-pinterest-sign:before{content:"\f0d3";} -.icon-google-plus-sign:before{content:"\f0d4";} -.icon-google-plus:before{content:"\f0d5";} -.icon-money:before{content:"\f0d6";} -.icon-caret-down:before{content:"\f0d7";} -.icon-caret-up:before{content:"\f0d8";} -.icon-caret-left:before{content:"\f0d9";} -.icon-caret-right:before{content:"\f0da";} -.icon-columns:before{content:"\f0db";} -.icon-sort:before{content:"\f0dc";} -.icon-sort-down:before{content:"\f0dd";} -.icon-sort-up:before{content:"\f0de";} -.icon-envelope:before{content:"\f0e0";} -.icon-linkedin:before{content:"\f0e1";} -.icon-rotate-left:before,.icon-undo:before{content:"\f0e2";} -.icon-legal:before{content:"\f0e3";} -.icon-dashboard:before{content:"\f0e4";} -.icon-comment-alt:before{content:"\f0e5";} -.icon-comments-alt:before{content:"\f0e6";} -.icon-bolt:before{content:"\f0e7";} -.icon-sitemap:before{content:"\f0e8";} -.icon-umbrella:before{content:"\f0e9";} -.icon-paste:before{content:"\f0ea";} -.icon-lightbulb:before{content:"\f0eb";} -.icon-exchange:before{content:"\f0ec";} -.icon-cloud-download:before{content:"\f0ed";} -.icon-cloud-upload:before{content:"\f0ee";} -.icon-user-md:before{content:"\f0f0";} -.icon-stethoscope:before{content:"\f0f1";} -.icon-suitcase:before{content:"\f0f2";} -.icon-bell-alt:before{content:"\f0f3";} -.icon-coffee:before{content:"\f0f4";} -.icon-food:before{content:"\f0f5";} -.icon-file-text-alt:before{content:"\f0f6";} -.icon-building:before{content:"\f0f7";} -.icon-hospital:before{content:"\f0f8";} -.icon-ambulance:before{content:"\f0f9";} -.icon-medkit:before{content:"\f0fa";} -.icon-fighter-jet:before{content:"\f0fb";} -.icon-beer:before{content:"\f0fc";} -.icon-h-sign:before{content:"\f0fd";} -.icon-plus-sign-alt:before{content:"\f0fe";} -.icon-double-angle-left:before{content:"\f100";} -.icon-double-angle-right:before{content:"\f101";} -.icon-double-angle-up:before{content:"\f102";} -.icon-double-angle-down:before{content:"\f103";} -.icon-angle-left:before{content:"\f104";} -.icon-angle-right:before{content:"\f105";} -.icon-angle-up:before{content:"\f106";} -.icon-angle-down:before{content:"\f107";} -.icon-desktop:before{content:"\f108";} -.icon-laptop:before{content:"\f109";} -.icon-tablet:before{content:"\f10a";} -.icon-mobile-phone:before{content:"\f10b";} -.icon-circle-blank:before{content:"\f10c";} -.icon-quote-left:before{content:"\f10d";} -.icon-quote-right:before{content:"\f10e";} -.icon-spinner:before{content:"\f110";} -.icon-circle:before{content:"\f111";} -.icon-mail-reply:before,.icon-reply:before{content:"\f112";} -.icon-github-alt:before{content:"\f113";} -.icon-folder-close-alt:before{content:"\f114";} -.icon-folder-open-alt:before{content:"\f115";} -.icon-expand-alt:before{content:"\f116";} -.icon-collapse-alt:before{content:"\f117";} -.icon-smile:before{content:"\f118";} -.icon-frown:before{content:"\f119";} -.icon-meh:before{content:"\f11a";} -.icon-gamepad:before{content:"\f11b";} -.icon-keyboard:before{content:"\f11c";} -.icon-flag-alt:before{content:"\f11d";} -.icon-flag-checkered:before{content:"\f11e";} -.icon-terminal:before{content:"\f120";} -.icon-code:before{content:"\f121";} -.icon-reply-all:before{content:"\f122";} -.icon-mail-reply-all:before{content:"\f122";} -.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";} -.icon-location-arrow:before{content:"\f124";} -.icon-crop:before{content:"\f125";} -.icon-code-fork:before{content:"\f126";} -.icon-unlink:before{content:"\f127";} -.icon-question:before{content:"\f128";} -.icon-info:before{content:"\f129";} -.icon-exclamation:before{content:"\f12a";} -.icon-superscript:before{content:"\f12b";} -.icon-subscript:before{content:"\f12c";} -.icon-eraser:before{content:"\f12d";} -.icon-puzzle-piece:before{content:"\f12e";} -.icon-microphone:before{content:"\f130";} -.icon-microphone-off:before{content:"\f131";} -.icon-shield:before{content:"\f132";} -.icon-calendar-empty:before{content:"\f133";} -.icon-fire-extinguisher:before{content:"\f134";} -.icon-rocket:before{content:"\f135";} -.icon-maxcdn:before{content:"\f136";} -.icon-chevron-sign-left:before{content:"\f137";} -.icon-chevron-sign-right:before{content:"\f138";} -.icon-chevron-sign-up:before{content:"\f139";} -.icon-chevron-sign-down:before{content:"\f13a";} -.icon-html5:before{content:"\f13b";} -.icon-css3:before{content:"\f13c";} -.icon-anchor:before{content:"\f13d";} -.icon-unlock-alt:before{content:"\f13e";} -.icon-bullseye:before{content:"\f140";} -.icon-ellipsis-horizontal:before{content:"\f141";} -.icon-ellipsis-vertical:before{content:"\f142";} -.icon-rss-sign:before{content:"\f143";} -.icon-play-sign:before{content:"\f144";} -.icon-ticket:before{content:"\f145";} -.icon-minus-sign-alt:before{content:"\f146";} -.icon-check-minus:before{content:"\f147";} -.icon-level-up:before{content:"\f148";} -.icon-level-down:before{content:"\f149";} -.icon-check-sign:before{content:"\f14a";} -.icon-edit-sign:before{content:"\f14b";} -.icon-external-link-sign:before{content:"\f14c";} -.icon-share-sign:before{content:"\f14d";} -.icon-compass:before{content:"\f14e";} -.icon-collapse:before{content:"\f150";} -.icon-collapse-top:before{content:"\f151";} -.icon-expand:before{content:"\f152";} -.icon-euro:before,.icon-eur:before{content:"\f153";} -.icon-gbp:before{content:"\f154";} -.icon-dollar:before,.icon-usd:before{content:"\f155";} -.icon-rupee:before,.icon-inr:before{content:"\f156";} -.icon-yen:before,.icon-jpy:before{content:"\f157";} -.icon-renminbi:before,.icon-cny:before{content:"\f158";} -.icon-won:before,.icon-krw:before{content:"\f159";} -.icon-bitcoin:before,.icon-btc:before{content:"\f15a";} -.icon-file:before{content:"\f15b";} -.icon-file-text:before{content:"\f15c";} -.icon-sort-by-alphabet:before{content:"\f15d";} -.icon-sort-by-alphabet-alt:before{content:"\f15e";} -.icon-sort-by-attributes:before{content:"\f160";} -.icon-sort-by-attributes-alt:before{content:"\f161";} -.icon-sort-by-order:before{content:"\f162";} -.icon-sort-by-order-alt:before{content:"\f163";} -.icon-thumbs-up:before{content:"\f164";} -.icon-thumbs-down:before{content:"\f165";} -.icon-youtube-sign:before{content:"\f166";} -.icon-youtube:before{content:"\f167";} -.icon-xing:before{content:"\f168";} -.icon-xing-sign:before{content:"\f169";} -.icon-youtube-play:before{content:"\f16a";} -.icon-dropbox:before{content:"\f16b";} -.icon-stackexchange:before{content:"\f16c";} -.icon-instagram:before{content:"\f16d";} -.icon-flickr:before{content:"\f16e";} -.icon-adn:before{content:"\f170";} -.icon-bitbucket:before{content:"\f171";} -.icon-bitbucket-sign:before{content:"\f172";} -.icon-tumblr:before{content:"\f173";} -.icon-tumblr-sign:before{content:"\f174";} -.icon-long-arrow-down:before{content:"\f175";} -.icon-long-arrow-up:before{content:"\f176";} -.icon-long-arrow-left:before{content:"\f177";} -.icon-long-arrow-right:before{content:"\f178";} -.icon-apple:before{content:"\f179";} -.icon-windows:before{content:"\f17a";} -.icon-android:before{content:"\f17b";} -.icon-linux:before{content:"\f17c";} -.icon-dribbble:before{content:"\f17d";} -.icon-skype:before{content:"\f17e";} -.icon-foursquare:before{content:"\f180";} -.icon-trello:before{content:"\f181";} -.icon-female:before{content:"\f182";} -.icon-male:before{content:"\f183";} -.icon-gittip:before{content:"\f184";} -.icon-sun:before{content:"\f185";} -.icon-moon:before{content:"\f186";} -.icon-archive:before{content:"\f187";} -.icon-bug:before{content:"\f188";} -.icon-vk:before{content:"\f189";} -.icon-weibo:before{content:"\f18a";} -.icon-renren:before{content:"\f18b";} - -.icon-large{font-size:1.3333333333333333em;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;vertical-align:middle;} -.nav [class^="icon-"],.nav [class*=" icon-"]{vertical-align:inherit;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;}.nav [class^="icon-"].icon-large,.nav [class*=" icon-"].icon-large{vertical-align:-25%;} -.nav-pills [class^="icon-"].icon-large,.nav-tabs [class^="icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large{line-height:.75em;margin-top:-7px;padding-top:5px;margin-bottom:-5px;padding-bottom:4px;} -.btn [class^="icon-"].pull-left,.btn [class*=" icon-"].pull-left,.btn [class^="icon-"].pull-right,.btn [class*=" icon-"].pull-right{vertical-align:inherit;} -.btn [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large{margin-top:-0.5em;} -a [class^="icon-"],a [class*=" icon-"]{cursor:pointer;} -.icon-glass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-music{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-search{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-envelope-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-heart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-user{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-film{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-th-large{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-th{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-th-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ok{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-remove{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-zoom-in{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-zoom-out{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-power-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-signal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cog{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gear{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-trash{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-home{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-time{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-road{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-download-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-inbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-play-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-repeat{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rotate-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-refresh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-lock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-headphones{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-volume-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-volume-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-volume-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-qrcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-barcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tags{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-book{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bookmark{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-print{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-camera{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-font{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bold{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-italic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-text-height{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-text-width{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-center{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-align-justify{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-indent-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-indent-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-facetime-video{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-picture{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pencil{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-map-marker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-adjust{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tint{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-edit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-share{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-move{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-step-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fast-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pause{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-stop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fast-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-step-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eject{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-minus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-remove-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ok-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-question-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-info-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-screenshot{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-remove-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ok-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ban-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-share-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mail-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-small{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-asterisk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-exclamation-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gift{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-leaf{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fire{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eye-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eye-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-warning-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plane{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-calendar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-random{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comment{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-magnet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-retweet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-shopping-cart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-resize-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bar-chart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-twitter-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-facebook-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-camera-retro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-key{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cogs{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gears{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comments{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-up-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-down-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-half{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-heart-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-signout{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-linkedin-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pushpin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-external-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-signin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-trophy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-github-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-upload-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-lemon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unchecked{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bookmark-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-phone-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-twitter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-facebook{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-github{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unlock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-credit-card{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rss{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hdd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bullhorn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bell{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-certificate{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hand-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-globe{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-wrench{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tasks{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-filter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-briefcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fullscreen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-group{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cloud{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-beaker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cut{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-copy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-paper-clip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-paperclip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-save{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sign-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-reorder{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list-ul{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-list-ol{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-strikethrough{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-underline{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-table{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-magic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-truck{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pinterest{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-pinterest-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-google-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-google-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-money{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-caret-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-columns{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-envelope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-linkedin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-undo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rotate-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-legal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dashboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comment-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-comments-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bolt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sitemap{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-umbrella{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-paste{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-lightbulb{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-exchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cloud-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cloud-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-user-md{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-stethoscope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-suitcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bell-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-coffee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-food{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file-text-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-building{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-hospital{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ambulance{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-medkit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fighter-jet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-beer{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-h-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-plus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-double-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-desktop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-laptop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tablet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mobile-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-quote-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-quote-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-spinner{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mail-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-github-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-close-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-folder-open-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-expand-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-collapse-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-smile{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-frown{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-meh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gamepad{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-keyboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flag-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flag-checkered{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-terminal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-code{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-mail-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-half-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-star-half-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-location-arrow{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-crop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-code-fork{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unlink{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-question{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-info{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-exclamation{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-superscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-subscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eraser{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-puzzle-piece{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-microphone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-microphone-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-shield{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-calendar-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-fire-extinguisher{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rocket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-maxcdn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-chevron-sign-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-html5{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-css3{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-anchor{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-unlock-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bullseye{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ellipsis-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ellipsis-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rss-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-play-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-ticket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-minus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-level-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-level-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-check-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-edit-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-external-link-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-share-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-compass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-collapse{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-collapse-top{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-expand{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-eur{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-euro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gbp{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-usd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dollar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-inr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-rupee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-jpy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-yen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-cny{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-renminbi{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-krw{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-won{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-btc{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bitcoin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-file-text{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-alphabet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-alphabet-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-attributes{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-attributes-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-order{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sort-by-order-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-thumbs-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-youtube-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-youtube{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-xing{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-xing-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-youtube-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dropbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-stackexchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-instagram{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-flickr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-adn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bitbucket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bitbucket-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tumblr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-tumblr-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-long-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-apple{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-windows{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-android{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-linux{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-dribbble{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-skype{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-foursquare{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-trello{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-female{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-male{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-gittip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-sun{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-moon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-archive{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-bug{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-vk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-weibo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} -.icon-renren{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} \ No newline at end of file diff --git a/goon/browserassets/html/browserOutput.html b/goon/browserassets/html/browserOutput.html deleted file mode 100644 index 74212fd815..0000000000 --- a/goon/browserassets/html/browserOutput.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - Chat - - - - - - - - -
- -
- Loading...

- If this takes longer than 30 seconds, it will automatically reload a maximum of 5 times.
- If it still doesn't work, use the bug report button at the top right of the window. -
-
-
- -
- - - - \ No newline at end of file diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js deleted file mode 100644 index 0fb7386dd8..0000000000 --- a/goon/browserassets/js/browserOutput.js +++ /dev/null @@ -1,908 +0,0 @@ -/***************************************** -* -* FUNCTION AND VAR DECLARATIONS -* -******************************************/ - -//DEBUG STUFF -var escaper = encodeURIComponent || escape; -var decoder = decodeURIComponent || unescape; -window.onerror = function(msg, url, line, col, error) { - if (document.location.href.indexOf("proc=debug") <= 0) { - var extra = !col ? '' : ' | column: ' + col; - extra += !error ? '' : ' | error: ' + error; - extra += !navigator.userAgent ? '' : ' | user agent: ' + navigator.userAgent; - var debugLine = 'Error: ' + msg + ' | url: ' + url + ' | line: ' + line + extra; - window.location = '?_src_=chat&proc=debug¶m[error]='+escaper(debugLine); - } - return true; -}; - -//Globals -window.status = 'Output'; -var $messages, $subOptions, $contextMenu, $filterMessages; -var opts = { - //General - 'messageCount': 0, //A count...of messages... - 'messageLimit': 2053, //A limit...for the messages... - 'scrollSnapTolerance': 5, //If within x pixels of bottom - 'clickTolerance': 10, //Keep focus if outside x pixels of mousedown position on mouseup - 'popups': 0, //Amount of popups opened ever - 'wasd': false, //Is the user in wasd mode? - 'chatMode': 'default', //The mode the chat is in - 'priorChatHeight': 0, //Thing for height-resizing detection - 'restarting': false, //Is the round restarting? - - //Options menu - 'subOptionsLoop': null, //Contains the interval loop for closing the options menu - 'suppressOptionsClose': false, //Whether or not we should be hiding the suboptions menu - 'highlightTerms': [], - 'highlightLimit': 5, - 'highlightColor': '#FFFF00', //The color of the highlighted message - 'pingDisabled': false, //Has the user disabled the ping counter - - //Ping display - 'lastPang': 0, //Timestamp of the last response from the server. - 'pangLimit': 35000, - 'pingTime': 0, //Timestamp of when ping sent - 'pongTime': 0, //Timestamp of when ping received - 'noResponse': false, //Tracks the state of the previous ping request - 'noResponseCount': 0, //How many failed pings? - - //Clicks - 'mouseDownX': null, - 'mouseDownY': null, - 'preventFocus': false, //Prevents switching focus to the game window - - //Client Connection Data - 'clientDataLimit': 5, - 'clientData': [], - -}; - -function outerHTML(el) { - var wrap = document.createElement('div'); - wrap.appendChild(el.cloneNode(true)); - return wrap.innerHTML; -} - -//Polyfill for fucking date now because of course IE8 and below don't support it -if (!Date.now) { - Date.now = function now() { - return new Date().getTime(); - }; -} -//Polyfill for trim() (IE8 and below) -if (typeof String.prototype.trim !== 'function') { - String.prototype.trim = function () { - return this.replace(/^\s+|\s+$/g, ''); - }; -} - -//Shit fucking piece of crap that doesn't work god fuckin damn it -function linkify(text) { - var rex = /((?:'+$0+''; - } - else { - return $1 ? $0: ''+$0+''; - } - }); -} - -//Actually turns the highlight term match into appropriate html -function addHighlightMarkup(match) { - var extra = ''; - if (opts.highlightColor) { - extra += ' style="background-color: '+opts.highlightColor+'"'; - } - return ''+match+''; -} - -//Highlights words based on user settings -function highlightTerms(el) { - if (el.children.length > 0) { - for(var h = 0; h < el.children.length; h++){ - highlightTerms(el.children[h]); - } - } - - var hasTextNode = false; - for (var node = 0; node < el.childNodes.length; node++) - { - if (el.childNodes[node].nodeType === 3) - { - hasTextNode = true; - break; - } - } - - if (hasTextNode) { //If element actually has text - var newText = ''; - for (var c = 0; c < el.childNodes.length; c++) { //Each child element - if (el.childNodes[c].nodeType === 3) { //Is it text only? - var words = el.childNodes[c].data.split(' '); - for (var w = 0; w < words.length; w++) { //Each word in the text - var newWord = null; - for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term - if (opts.highlightTerms[i] && words[w].toLowerCase().indexOf(opts.highlightTerms[i].toLowerCase()) > -1) { //If a match is found - newWord = words[w].replace("<", "<").replace(new RegExp(opts.highlightTerms[i], 'gi'), addHighlightMarkup); - break; - } - console.log(newWord) - } - newText += newWord || words[w].replace("<", "<"); - newText += w >= words.length ? '' : ' '; - } - } else { //Every other type of element - newText += outerHTML(el.childNodes[c]); - } - } - el.innerHTML = newText; - } -} -//Send a message to the client -function output(message, flag) { - if (typeof message === 'undefined') { - return; - } - if (typeof flag === 'undefined') { - flag = ''; - } - - if (flag !== 'internal') - opts.lastPang = Date.now(); - - // Basically we url_encode twice server side so we can manually read the encoded version and actually do UTF-8. - // The replace for + is because FOR SOME REASON, BYOND replaces spaces with a + instead of %20, and a plus with %2b. - // Marvelous. - message = message.replace(/\+/g, "%20") - message = decoder(message) - - //The behemoth of filter-code (for Admin message filters) - //Note: This is proooobably hella inefficient - var filteredOut = false; - if (opts.hasOwnProperty('showMessagesFilters') && !opts.showMessagesFilters['All'].show) { - //Get this filter type (defined by class on message) - var messageHtml = $.parseHTML(message), - messageClasses; - if (opts.hasOwnProperty('filterHideAll') && opts.filterHideAll) { - var internal = false; - messageClasses = (!!$(messageHtml).attr('class') ? $(messageHtml).attr('class').split(/\s+/) : false); - if (messageClasses) { - for (var i = 0; i < messageClasses.length; i++) { //Every class - if (messageClasses[i] == 'internal') { - internal = true; - break; - } - } - } - if (!internal) { - filteredOut = 'All'; - } - } else { - //If the element or it's child have any classes - if (!!$(messageHtml).attr('class') || !!$(messageHtml).children().attr('class')) { - messageClasses = $(messageHtml).attr('class').split(/\s+/); - if (!!$(messageHtml).children().attr('class')) { - messageClasses = messageClasses.concat($(messageHtml).children().attr('class').split(/\s+/)); - } - var tempCount = 0; - for (var i = 0; i < messageClasses.length; i++) { //Every class - var thisClass = messageClasses[i]; - $.each(opts.showMessagesFilters, function(key, val) { //Every filter - if (key !== 'All' && val.show === false && typeof val.match != 'undefined') { - for (var i = 0; i < val.match.length; i++) { - var matchClass = val.match[i]; - if (matchClass == thisClass) { - filteredOut = key; - break; - } - } - } - if (filteredOut) return false; - }); - if (filteredOut) break; - tempCount++; - } - } else { - if (!opts.showMessagesFilters['Misc'].show) { - filteredOut = 'Misc'; - } - } - } - } - - //Stuff we do along with appending a message - var atBottom = false; - if (!filteredOut) { - var bodyHeight = $('body').height(); - var messagesHeight = $messages.outerHeight(); - var scrollPos = $('body,html').scrollTop(); - - //Should we snap the output to the bottom? - if (bodyHeight + scrollPos >= messagesHeight - opts.scrollSnapTolerance) { - atBottom = true; - if ($('#newMessages').length) { - $('#newMessages').remove(); - } - //If not, put the new messages box in - } else { - if ($('#newMessages').length) { - var messages = $('#newMessages .number').text(); - messages = parseInt(messages); - messages++; - $('#newMessages .number').text(messages); - if (messages == 2) { - $('#newMessages .messageWord').append('s'); - } - } else { - $messages.after('1 new message '); - } - } - } - - //Url stuff - if (message.length && flag != 'preventLink') { - message = linkify(message); - } - - opts.messageCount++; - - //Pop the top message off if history limit reached - if (opts.messageCount >= opts.messageLimit) { - $messages.children('div.entry:first-child').remove(); - opts.messageCount--; //I guess the count should only ever equal the limit - } - - //Actually append the message - var entry = document.createElement('div'); - entry.className = 'entry'; - - if (filteredOut) { - entry.className += ' hidden'; - entry.setAttribute('data-filter', filteredOut); - } - - entry.innerHTML = message.trim(); - $messages[0].appendChild(entry); - - //Actually do the snap - if (!filteredOut && atBottom) { - $('body,html').scrollTop($messages.outerHeight()); - } - - //Stuff we can do after the message shows can go here, in the interests of responsiveness - if (opts.highlightTerms && opts.highlightTerms.length > 0) { - highlightTerms(entry); - } -} - -function internalOutput(message, flag) -{ - output(escaper(message), flag) -} - -//Runs a route within byond, client or server side. Consider this "ehjax" for byond. -function runByond(uri) { - window.location = uri; -} - -function setCookie(cname, cvalue, exdays) { - cvalue = escaper(cvalue); - var d = new Date(); - d.setTime(d.getTime() + (exdays*24*60*60*1000)); - var expires = 'expires='+d.toUTCString(); - document.cookie = cname + '=' + cvalue + '; ' + expires; -} - -function getCookie(cname) { - var name = cname + '='; - var ca = document.cookie.split(';'); - for(var i=0; i < ca.length; i++) { - var c = ca[i]; - while (c.charAt(0)==' ') c = c.substring(1); - if (c.indexOf(name) === 0) { - return decoder(c.substring(name.length,c.length)); - } - } - return ''; -} - -function rgbToHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B);} -function toHex(n) { - n = parseInt(n,10); - if (isNaN(n)) return "00"; - n = Math.max(0,Math.min(n,255)); - return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16); -} - -function changeMode(mode) { - switch (mode) { - case 'geocities': - //switch in stylesheet - opts.chatMode = mode; - break; - case 'console': - - opts.chatMode = mode; - break; - case 'default': - default: - //remove loaded stylesheet/s - opts.chatMode = 'default'; - } -} - -function handleClientData(ckey, ip, compid) { - //byond sends player info to here - var currentData = {'ckey': ckey, 'ip': ip, 'compid': compid}; - if (opts.clientData && !$.isEmptyObject(opts.clientData)) { - runByond('?_src_=chat&proc=analyzeClientData¶m[cookie]='+JSON.stringify({'connData': opts.clientData})); - - for (var i = 0; i < opts.clientData.length; i++) { - var saved = opts.clientData[i]; - if (currentData.ckey == saved.ckey && currentData.ip == saved.ip && currentData.compid == saved.compid) { - return; //Record already exists - } - } - - if (opts.clientData.length >= opts.clientDataLimit) { - opts.clientData.shift(); - } - } else { - runByond('?_src_=chat&proc=analyzeClientData¶m[cookie]=none'); - } - - //Update the cookie with current details - opts.clientData.push(currentData); - setCookie('connData', JSON.stringify(opts.clientData), 365); -} - -//Server calls this on ehjax response -//Or, y'know, whenever really -function ehjaxCallback(data) { - opts.lastPang = Date.now(); - if (data == 'softPang') { - return; - } else if (data == 'pang') { - opts.pingCounter = 0; //reset - opts.pingTime = Date.now(); - runByond('?_src_=chat&proc=ping'); - - } else if (data == 'pong') { - if (opts.pingDisabled) {return;} - opts.pongTime = Date.now(); - var pingDuration = Math.ceil((opts.pongTime - opts.pingTime) / 2); - $('#pingMs').text(pingDuration+'ms'); - pingDuration = Math.min(pingDuration, 255); - var red = pingDuration; - var green = 255 - pingDuration; - var blue = 0; - var hex = rgbToHex(red, green, blue); - $('#pingDot').css('color', '#'+hex); - - } else if (data == 'roundrestart') { - opts.restarting = true; - internalOutput('
The connection has been closed because the server is restarting. Please wait while you automatically reconnect.
', 'internal'); - } else if (data == 'stopaudio') { - $('.dectalk').remove(); - } else { - //Oh we're actually being sent data instead of an instruction - var dataJ; - try { - dataJ = $.parseJSON(data); - } catch (e) { - //But...incorrect :sadtrombone: - window.onerror('JSON: '+e+'. '+data, 'browserOutput.html', 327); - return; - } - data = dataJ; - - if (data.clientData) { - if (opts.restarting) { - opts.restarting = false; - $('.connectionClosed.restarting:not(.restored)').addClass('restored').text('The round restarted and you successfully reconnected!'); - } - if (!data.clientData.ckey && !data.clientData.ip && !data.clientData.compid) { - //TODO: Call shutdown perhaps - return; - } else { - handleClientData(data.clientData.ckey, data.clientData.ip, data.clientData.compid); - } - } else if (data.modeChange) { - changeMode(data.modeChange); - } else if (data.firebug) { - if (data.trigger) { - internalOutput('Loading firebug console, triggered by '+data.trigger+'...', 'internal'); - } else { - internalOutput('Loading firebug console...', 'internal'); - } - var firebugEl = document.createElement('script'); - firebugEl.src = 'https://getfirebug.com/firebug-lite-debug.js'; - document.body.appendChild(firebugEl); - } else if (data.dectalk) { - var message = ''; - if (data.decTalkTrigger) { - message = ' '+ - 'You hear a strange robotic voice...' + message; - } - internalOutput(message, 'preventLink'); - } - } -} - -function createPopup(contents, width) { - opts.popups++; - $('body').append(''); - - //Attach close popup event - var $popup = $('#popup'+opts.popups); - var height = $popup.outerHeight(); - $popup.css({'height': height+'px', 'margin': '-'+(height/2)+'px 0 0 -'+(width/2)+'px'}); - - $popup.on('click', '.close', function(e) { - e.preventDefault(); - $popup.remove(); - }); -} - -function toggleWasd(state) { - opts.wasd = (state == 'on' ? true : false); -} - -/***************************************** -* -* DOM READY -* -******************************************/ - -if (typeof $ === 'undefined') { - var div = document.getElementById('loading').childNodes[1]; - div += '

ERROR: Jquery did not load.'; -} - -$(function() { - $messages = $('#messages'); - $subOptions = $('#subOptions'); - - //Hey look it's a controller loop! - setInterval(function() { - if (opts.lastPang + opts.pangLimit < Date.now() && !opts.restarting) { //Every pingLimit - if (!opts.noResponse) { //Only actually append a message if the previous ping didn't also fail (to prevent spam) - opts.noResponse = true; - opts.noResponseCount++; - internalOutput('
You are either AFK, experiencing lag or the connection has closed.
', 'internal'); - } - } else if (opts.noResponse) { //Previous ping attempt failed ohno - $('.connectionClosed[data-count="'+opts.noResponseCount+'"]:not(.restored)').addClass('restored').text('Your connection has been restored (probably)!'); - opts.noResponse = false; - } - }, 2000); //2 seconds - - - /***************************************** - * - * LOAD SAVED CONFIG - * - ******************************************/ - var savedConfig = { - 'sfontSize': getCookie('fontsize'), - 'sfontType': getCookie('fonttype'), - 'spingDisabled': getCookie('pingdisabled'), - 'shighlightTerms': getCookie('highlightterms'), - 'shighlightColor': getCookie('highlightcolor'), - }; - - if (savedConfig.sfontSize) { - $messages.css('font-size', savedConfig.sfontSize); - internalOutput('Loaded font size setting of: '+savedConfig.sfontSize+'', 'internal'); - } - if (savedConfig.sfontType) { - $messages.css('font-family', savedConfig.sfontType); - internalOutput('Loaded font type setting of: '+savedConfig.sfontType+'', 'internal'); - } - if (savedConfig.spingDisabled) { - if (savedConfig.spingDisabled == 'true') { - opts.pingDisabled = true; - $('#ping').hide(); - } - internalOutput('Loaded ping display of: '+(opts.pingDisabled ? 'hidden' : 'visible')+'', 'internal'); - } - if (savedConfig.shighlightTerms) { - var savedTerms = $.parseJSON(savedConfig.shighlightTerms); - var actualTerms = ''; - for (var i = 0; i < savedTerms.length; i++) { - if (savedTerms[i]) { - actualTerms += savedTerms[i] + ', '; - } - } - if (actualTerms) { - actualTerms = actualTerms.substring(0, actualTerms.length - 2); - internalOutput('Loaded highlight strings of: ' + actualTerms+'', 'internal'); - opts.highlightTerms = savedTerms; - } - } - if (savedConfig.shighlightColor) { - opts.highlightColor = savedConfig.shighlightColor; - internalOutput('Loaded highlight color of: '+savedConfig.shighlightColor+'', 'internal'); - } - - (function() { - var dataCookie = getCookie('connData'); - if (dataCookie) { - var dataJ; - try { - dataJ = $.parseJSON(dataCookie); - } catch (e) { - window.onerror('JSON '+e+'. '+dataCookie, 'browserOutput.html', 434); - return; - } - opts.clientData = dataJ; - } - })(); - - - /***************************************** - * - * BASE CHAT OUTPUT EVENTS - * - ******************************************/ - - $('body').on('click', 'a', function(e) { - e.preventDefault(); - }); - - $('body').on('mousedown', function(e) { - var $target = $(e.target); - - if ($contextMenu && opts.hasOwnProperty('contextMenuTarget') && opts.contextMenuTarget) { - hideContextMenu(); - return false; - } - - if ($target.is('a') || $target.parent('a').length || $target.is('input') || $target.is('textarea')) { - opts.preventFocus = true; - } else { - opts.preventFocus = false; - opts.mouseDownX = e.pageX; - opts.mouseDownY = e.pageY; - } - }); - - $messages.on('mousedown', function(e) { - if ($subOptions && $subOptions.is(':visible')) { - $subOptions.slideUp('fast', function() { - $(this).removeClass('scroll'); - $(this).css('height', ''); - }); - clearInterval(opts.subOptionsLoop); - } - }); - - $('body').on('mouseup', function(e) { - if (!opts.preventFocus && - (e.pageX >= opts.mouseDownX - opts.clickTolerance && e.pageX <= opts.mouseDownX + opts.clickTolerance) && - (e.pageY >= opts.mouseDownY - opts.clickTolerance && e.pageY <= opts.mouseDownY + opts.clickTolerance) - ) { - opts.mouseDownX = null; - opts.mouseDownY = null; - runByond('byond://winset?mapwindow.map.focus=true'); - } - }); - - $messages.on('click', 'a', function(e) { - var href = $(this).attr('href'); - $(this).addClass('visited'); - if (href[0] == '?' || (href.length >= 8 && href.substring(0,8) == 'byond://')) { - runByond(href); - } else { - href = escaper(href); - runByond('?action=openLink&link='+href); - } - }); - - //Fuck everything about this event. Will look into alternatives. - $('body').on('keydown', function(e) { - if (e.target.nodeName == 'INPUT' || e.target.nodeName == 'TEXTAREA') { - return; - } - - if (e.ctrlKey || e.altKey || e.shiftKey) { //Band-aid "fix" for allowing ctrl+c copy paste etc. Needs a proper fix. - return; - } - - e.preventDefault() - - var k = e.which; - var command; // Command to execute through winset. - - // Hardcoded because else there would be no feedback message. - if (k == 113) { // F2 - runByond('byond://winset?screenshot=auto'); - internalOutput('Screenshot taken', 'internal'); - } - - var c = ""; - switch (k) { - case 8: - c = 'BACK'; - case 9: - c = 'TAB'; - case 13: - c = 'ENTER'; - case 19: - c = 'PAUSE'; - case 27: - c = 'ESCAPE'; - case 33: // Page up - c = 'NORTHEAST'; - case 34: // Page down - c = 'SOUTHEAST'; - case 35: // End - c = 'SOUTHWEST'; - case 36: // Home - c = 'NORTHWEST'; - case 37: - c = 'WEST'; - case 38: - c = 'NORTH'; - case 39: - c = 'EAST'; - case 40: - c = 'SOUTH'; - case 45: - c = 'INSERT'; - case 46: - c = 'DELETE'; - case 93: // That weird thing to the right of alt gr. - c = 'APPS'; - - default: - c = String.fromCharCode(k); - } - -// if(opts.macros.hasOwnProperty(c.toUpperCase())) - // command = opts.macros[c]; - - if (command) { - runByond('byond://winset?mapwindow.map.focus=true;command='+command); - return false; - } - else if (c.length == 0) { - if (!e.shiftKey) { - c = c.toLowerCase(); - } - runByond('byond://winset?mapwindow.map.focus=true;mainwindow.input.text='+c); - return false; - } else { - runByond('byond://winset?mapwindow.map.focus=true'); - return false; - } - }); - - //Mildly hacky fix for scroll issues on mob change (interface gets resized sometimes, messing up snap-scroll) - $(window).on('resize', function(e) { - if ($(this).height() !== opts.priorChatHeight) { - $('body,html').scrollTop($messages.outerHeight()); - opts.priorChatHeight = $(this).height(); - } - }); - - //Audio sound prevention - $messages.on('click', '.stopAudio', function() { - var $audio = $(this).parent().children('audio'); - if ($audio) { - $audio.remove(); - } - }); - - - /***************************************** - * - * OPTIONS INTERFACE EVENTS - * - ******************************************/ - - $('body').on('click', '#newMessages', function(e) { - var messagesHeight = $messages.outerHeight(); - $('body,html').scrollTop(messagesHeight); - $('#newMessages').remove(); - runByond('byond://winset?mapwindow.map.focus=true'); - }); - - $('#toggleOptions').click(function(e) { - if ($subOptions.is(':visible')) { - $subOptions.slideUp('fast', function() { - $(this).removeClass('scroll'); - $(this).css('height', ''); - }); - clearInterval(opts.subOptionsLoop); - } else { - $subOptions.slideDown('fast', function() { - var windowHeight = $(window).height(); - var toggleHeight = $('#toggleOptions').outerHeight(); - var priorSubHeight = $subOptions.outerHeight(); - var newSubHeight = windowHeight - toggleHeight; - $(this).height(newSubHeight); - if (priorSubHeight > (windowHeight - toggleHeight)) { - $(this).addClass('scroll'); - } - }); - opts.subOptionsLoop = setInterval(function() { - if (!opts.suppressOptionsClose && $('#subOptions').is(':visible')) { - $subOptions.slideUp('fast', function() { - $(this).removeClass('scroll'); - $(this).css('height', ''); - }); - clearInterval(opts.subOptionsLoop); - } - }, 5000); //Every 5 seconds - } - }); - - $('#subOptions, #toggleOptions').mouseenter(function() { - opts.suppressOptionsClose = true; - }); - - $('#subOptions, #toggleOptions').mouseleave(function() { - opts.suppressOptionsClose = false; - }); - - $('#decreaseFont').click(function(e) { - var fontSize = parseInt($messages.css('font-size')); - fontSize = fontSize - 1 + 'px'; - $messages.css({'font-size': fontSize}); - setCookie('fontsize', fontSize, 365); - internalOutput('Font size set to '+fontSize+'', 'internal'); - }); - - $('#increaseFont').click(function(e) { - var fontSize = parseInt($messages.css('font-size')); - fontSize = fontSize + 1 + 'px'; - $messages.css({'font-size': fontSize}); - setCookie('fontsize', fontSize, 365); - internalOutput('Font size set to '+fontSize+'', 'internal'); - }); - - $('#chooseFont').click(function(e) { - if ($('.popup .changeFont').is(':visible')) {return;} - var popupContent = '
Change Font
' + - ''; - createPopup(popupContent, 200); - }); - - $('body').on('click', '#changeFont a', function(e) { - var font = $(this).attr('data-font'); - $messages.css('font-family', font); - setCookie('fonttype', font, 365); - }); - - $('#togglePing').click(function(e) { - if (opts.pingDisabled) { - $('#ping').slideDown('fast'); - opts.pingDisabled = false; - } else { - $('#ping').slideUp('fast'); - opts.pingDisabled = true; - } - setCookie('pingdisabled', (opts.pingDisabled ? 'true' : 'false'), 365); - }); - - $('#saveLog').click(function(e) { - var saved = ''; - - if (window.XMLHtpRequest) { - xmlHttp = new XMLHttpRequest(); - } else { - xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); - } - xmlHttp.open('GET', 'browserOutput.css', false); - xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); - xmlHttp.send(); - saved += ''; - - saved += $messages.html(); - saved = saved.replace(/&/g, '&'); - saved = saved.replace(/'; - } - var popupContent = '
String Highlighting
' + - '
' + - '
Choose up to '+opts.highlightLimit+' strings that will highlight the line when they appear in chat.
' + - '
' + - termInputs + - '
' + - '
' + - '
' + - '
'; - createPopup(popupContent, 250); - }); - - $('body').on('keyup', '#highlightColor', function() { - var color = $('#highlightColor').val(); - color = color.trim(); - if (!color || color.charAt(0) != '#') return; - $('#highlightColor').css('background-color', color); - }); - - $('body').on('submit', '#highlightTermForm', function(e) { - e.preventDefault(); - - var count = 0; - while (count < opts.highlightLimit) { - var term = $('#highlightTermInput'+count).val(); - if (term) { - term = term.trim(); - if (term === '') { - opts.highlightTerms[count] = null; - } else { - opts.highlightTerms[count] = term.toLowerCase(); - } - } else { - opts.highlightTerms[count] = null; - } - count++; - } - - var color = $('#highlightColor').val(); - color = color.trim(); - if (color == '' || color.charAt(0) != '#') { - opts.highlightColor = '#FFFF00'; - } else { - opts.highlightColor = color; - } - var $popup = $('#highlightPopup').closest('.popup'); - $popup.remove(); - - setCookie('highlightterms', JSON.stringify(opts.highlightTerms), 365); - setCookie('highlightcolor', opts.highlightColor, 365); - }); - - $('#clearMessages').click(function() { - $messages.empty(); - opts.messageCount = 0; - }); - - - /***************************************** - * - * KICK EVERYTHING OFF - * - ******************************************/ - - runByond('?_src_=chat&proc=doneLoading'); - if ($('#loading').is(':visible')) { - $('#loading').remove(); - } - $('#userBar').show(); - opts.priorChatHeight = $(window).height(); -}); \ No newline at end of file diff --git a/goon/browserassets/js/json2.min.js b/goon/browserassets/js/json2.min.js deleted file mode 100644 index d867407f26..0000000000 --- a/goon/browserassets/js/json2.min.js +++ /dev/null @@ -1 +0,0 @@ -"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(t){return 10>t?"0"+t:t}function this_value(){return this.valueOf()}function quote(t){return rx_escapable.lastIndex=0,rx_escapable.test(t)?'"'+t.replace(rx_escapable,function(t){var e=meta[t];return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'}function str(t,e){var r,n,o,u,f,a=gap,i=e[t];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(t)),"function"==typeof rep&&(i=rep.call(e,t,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,f=[],"[object Array]"===Object.prototype.toString.apply(i)){for(u=i.length,r=0;u>r;r+=1)f[r]=str(r,i)||"null";return o=0===f.length?"[]":gap?"[\n"+gap+f.join(",\n"+gap)+"\n"+a+"]":"["+f.join(",")+"]",gap=a,o}if(rep&&"object"==typeof rep)for(u=rep.length,r=0;u>r;r+=1)"string"==typeof rep[r]&&(n=rep[r],o=str(n,i),o&&f.push(quote(n)+(gap?": ":":")+o));else for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(o=str(n,i),o&&f.push(quote(n)+(gap?": ":":")+o));return o=0===f.length?"{}":gap?"{\n"+gap+f.join(",\n"+gap)+"\n"+a+"}":"{"+f.join(",")+"}",gap=a,o}}var rx_one=/^[\],:{}\s]*$/,rx_two=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,rx_three=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,rx_four=/(?:^|:|,)(?:\s*\[)+/g,rx_escapable=/[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,rx_dangerous=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},Boolean.prototype.toJSON=this_value,Number.prototype.toJSON=this_value,String.prototype.toJSON=this_value);var gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(t,e,r){var n;if(gap="",indent="","number"==typeof r)for(n=0;r>n;n+=1)indent+=" ";else"string"==typeof r&&(indent=r);if(rep=e,e&&"function"!=typeof e&&("object"!=typeof e||"number"!=typeof e.length))throw new Error("JSON.stringify");return str("",{"":t})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){function walk(t,e){var r,n,o=t[e];if(o&&"object"==typeof o)for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(n=walk(o,r),void 0!==n?o[r]=n:delete o[r]);return reviver.call(t,e,o)}var j;if(text=String(text),rx_dangerous.lastIndex=0,rx_dangerous.test(text)&&(text=text.replace(rx_dangerous,function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})),rx_one.test(text.replace(rx_two,"@").replace(rx_three,"]").replace(rx_four,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}(); \ No newline at end of file diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm deleted file mode 100644 index d928397728..0000000000 --- a/goon/code/datums/browserOutput.dm +++ /dev/null @@ -1,289 +0,0 @@ -/********************************* -For the main html chat area -*********************************/ - -//Precaching a bunch of shit -GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of icons for the browser output - -//On client, created on login -/datum/chatOutput - var/client/owner //client ref - var/loaded = FALSE // Has the client loaded the browser output area? - var/list/messageQueue //If they haven't loaded chat, this is where messages will go until they do - var/cookieSent = FALSE // Has the client sent a cookie for analysis - var/list/connectionHistory //Contains the connection history passed from chat cookie - var/broken = FALSE - -/datum/chatOutput/New(client/C) - owner = C - messageQueue = list() - connectionHistory = list() - // log_world("chatOutput: New()") - -/datum/chatOutput/proc/start() - //Check for existing chat - if(!owner) - return FALSE - - if(!winexists(owner, "browseroutput")) // Oh goddamnit. - alert(owner.mob, "Updated chat window does not exist. If you are using a custom skin file please allow the game to update.") - broken = TRUE - return FALSE - - if(winget(owner, "browseroutput", "is-disabled") == "false") //Already setup - doneLoading() - - else //Not setup - load() - - return TRUE - -/datum/chatOutput/proc/load() - set waitfor = FALSE - if(!owner) - return - - var/static/list/chatResources = list( - "code/modules/html_interface/js/jquery.min.js", - "goon/browserassets/js/json2.min.js", - "goon/browserassets/js/browserOutput.js", - "tgui/assets/fonts/fontawesome-webfont.eot", - "tgui/assets/fonts/fontawesome-webfont.svg", - "tgui/assets/fonts/fontawesome-webfont.ttf", - "tgui/assets/fonts/fontawesome-webfont.woff", - "goon/browserassets/css/font-awesome.css", - "goon/browserassets/css/browserOutput.css" - ) - - // to_chat(world.log, "chatOutput: load()") - for(var/attempts in 1 to 5) - for(var/asset in chatResources) - owner << browse_rsc(file(asset)) - - //log_world("Sending main chat window to client [owner.ckey]") - owner << browse(file("goon/browserassets/html/browserOutput.html"), "window=browseroutput") - sleep(14 + (chatResources.len * 7)) - if(!owner || loaded) - break - - if(owner && !loaded) - doneLoading() // try doing this manually - CRASH("[owner] failed to load chat. Attempting doneLoading() manually") - // log_world("chatOutput: [owner.ckey] load() completed") - -/datum/chatOutput/Topic(href, list/href_list) - if(usr.client != owner) - return TRUE - - // Build arguments. - // Arguments are in the form "param[paramname]=thing" - var/list/params = list() - for(var/key in href_list) - if(length(key) > 7 && findtext(key, "param")) // 7 is the amount of characters in the basic param key template. - var/param_name = copytext(key, 7, -1) - var/item = href_list[key] - - params[param_name] = item - - var/data // Data to be sent back to the chat. - switch(href_list["proc"]) - if("doneLoading") - data = doneLoading(arglist(params)) - - if("debug") - data = debug(arglist(params)) - - if("ping") - data = ping(arglist(params)) - - if("analyzeClientData") - data = analyzeClientData(arglist(params)) - - if(data) - ehjax_send(data = data) - -//Called on chat output done-loading by JS. -/datum/chatOutput/proc/doneLoading() - if(loaded) - return - - loaded = TRUE - winset(owner, "browseroutput", "is-disabled=false") - for(var/message in messageQueue) - to_chat(owner, message) - - messageQueue = null - sendClientData() - - pingLoop() - -/datum/chatOutput/proc/pingLoop() - set waitfor = FALSE - - while (owner) - ehjax_send(data = owner.is_afk(29) ? "softPang" : "pang") // SoftPang isn't handled anywhere but it'll always reset the opts.lastPang. - sleep(30) - -/datum/chatOutput/proc/ehjax_send(client/C = owner, window = "browseroutput", data) - if(islist(data)) - data = json_encode(data) - C << output("[data]", "[window]:ehjaxCallback") - -//Sends client connection details to the chat to handle and save -/datum/chatOutput/proc/sendClientData() - //Get dem deets - var/list/deets = list("clientData" = list()) - deets["clientData"]["ckey"] = owner.ckey - deets["clientData"]["ip"] = owner.address - deets["clientData"]["compid"] = owner.computer_id - var/data = json_encode(deets) - ehjax_send(data = data) - -//Called by client, sent data to investigate (cookie history so far) -/datum/chatOutput/proc/analyzeClientData(cookie = "") - if(!cookie) - return - - if(cookie != "none") - var/list/connData = json_decode(cookie) - if (connData && islist(connData) && connData.len > 0 && connData["connData"]) - connectionHistory = connData["connData"] //lol fuck - var/list/found = new() - for(var/i in connectionHistory.len to 1 step -1) - var/list/row = src.connectionHistory[i] - if (!row || row.len < 3 || (!row["ckey"] && !row["compid"] && !row["ip"])) //Passed malformed history object - return - if (world.IsBanned(row["ckey"], row["compid"], row["ip"])) - found = row - break - - //Uh oh this fucker has a history of playing on a banned account!! - if (found.len > 0) - //TODO: add a new evasion ban for the CURRENT client details, using the matched row details - message_admins("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") - log_admin("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") - - cookieSent = TRUE - -//Called by js client every 60 seconds -/datum/chatOutput/proc/ping() - return "pong" - -//Called by js client on js error -/datum/chatOutput/proc/debug(error) - log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]") - -#ifdef TESTING -/client/verb/debug_chat() - set hidden = TRUE - chatOutput.ehjax_send(data = list("firebug" = TRUE)) -#endif -//Global chat procs - -GLOBAL_LIST_EMPTY(bicon_cache) - -//Converts an icon to base64. Operates by putting the icon in the iconCache savefile, -// exporting it as text, and then parsing the base64 from that. -// (This relies on byond automatically storing icons in savefiles as base64) -/proc/icon2base64(icon/icon, iconKey = "misc") - if (!isicon(icon)) - return FALSE - GLOB.iconCache[iconKey] << icon - var/iconData = GLOB.iconCache.ExportText(iconKey) - var/list/partial = splittext(iconData, "{") - return replacetext(copytext(partial[2], 3, -5), "\n", "") - -/proc/bicon(obj) - if (!obj) - return - - if (isicon(obj)) - //Icons get pooled constantly, references are no good here. - /*if (!bicon_cache["\ref[obj]"]) // Doesn't exist yet, make it. - bicon_cache["\ref[obj]"] = icon2base64(obj) - return ""*/ - return "" - - // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with. - var/atom/A = obj - var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]" - if (!GLOB.bicon_cache[key]) // Doesn't exist, make it. - var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1) - if (ishuman(obj)) // Shitty workaround for a BYOND issue. - var/icon/temp = I - I = icon() - I.Insert(temp, dir = SOUTH) - GLOB.bicon_cache[key] = icon2base64(I, key) - - return "" - -//Costlier version of bicon() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. -/proc/costly_bicon(obj) - if (!obj) - return - - if (isicon(obj)) - return bicon(obj) - - var/icon/I = getFlatIcon(obj) - return bicon(I) - -/proc/to_chat(target, message) - if(isnull(target)) - return - //Ok so I did my best but I accept that some calls to this will be for shit like sound and images - //It stands that we PROBABLY don't want to output those to the browser output so just handle them here - if (istype(message, /image) || istype(message, /sound) || istype(target, /savefile) || !(ismob(target) || islist(target) || istype(target, /client) || istype(target, /datum/log) || target == world)) - target << message - if (!istype(target, /atom)) // Really easy to mix these up, and not having to make sure things are mobs makes the code cleaner. - CRASH("DEBUG: Boutput called with invalid message") - return - - //Otherwise, we're good to throw it at the user - else if (istext(message)) - if (istext(target)) - return - - //Some macros remain in the string even after parsing and fuck up the eventual output - if (findtext(message, "\improper")) - message = replacetext(message, "\improper", "") - if (findtext(message, "\proper")) - message = replacetext(message, "\proper", "") - - //Grab us a client if possible - var/client/C = grab_client(target) - - if (C && C.chatOutput) - if(C.chatOutput.broken) // A player who hasn't updated his skin file. - to_chat(C, message) - return TRUE - if(!C.chatOutput.loaded && C.chatOutput.messageQueue && islist(C.chatOutput.messageQueue)) - //Client sucks at loading things, put their messages in a queue - C.chatOutput.messageQueue.Add(message) - return - - if(istype(target, /datum/log)) - var/datum/log/L = target - L.log += (message + "\n") - return - - message = replacetext(message, "\n", "
") - message = replacetext(message, "\t", "    ") - - // url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. - target << output(url_encode(url_encode(message)), "browseroutput:output") - -/proc/grab_client(target) - if(istype(target, /client)) - return target - else if(istype(target, /mob)) - var/mob/M = target - if(M.client) - return M.client - else if(istype(target, /datum/mind)) - var/datum/mind/M = target - if(M.current && M.current.client) - return M.current.client - -/datum/log //exists purely to capture to_chat() output - var/log = "" \ No newline at end of file From 2845428c03a093a2e4d051ea50c7017333d76f4d Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Mon, 17 Jun 2019 20:18:28 +0200 Subject: [PATCH 14/18] ports "Improve efficiency of SSmapping init" (#8651) --- code/controllers/subsystem/mapping.dm | 11 +++++++---- code/game/area/areas.dm | 4 +++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 9eb71c9059..a365405ce6 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -256,10 +256,13 @@ GLOBAL_LIST_EMPTY(the_station_areas) /datum/controller/subsystem/mapping/proc/generate_station_area_list() var/list/station_areas_blacklist = typecacheof(list(/area/space, /area/mine, /area/ruin, /area/asteroid/nearstation)) for(var/area/A in world) - var/turf/picked = safepick(get_area_turfs(A.type)) - if(picked && is_station_level(picked.z)) - if(!(A.type in GLOB.the_station_areas) && !is_type_in_typecache(A, station_areas_blacklist)) - GLOB.the_station_areas.Add(A.type) + if (is_type_in_typecache(A, station_areas_blacklist)) + continue + if (!A.contents.len || !A.unique) + continue + var/turf/picked = A.contents[1] + if (is_station_level(picked.z)) + GLOB.the_station_areas += A.type if(!GLOB.the_station_areas.len) log_world("ERROR: Station areas list failed to generate!") diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 099b1b2f9c..dfbb59811b 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -76,7 +76,9 @@ GLOBAL_LIST_EMPTY(teleportlocs) continue if(GLOB.teleportlocs[AR.name]) continue - var/turf/picked = safepick(get_area_turfs(AR.type)) + if (!AR.contents.len) + continue + var/turf/picked = AR.contents[1] if (picked && is_station_level(picked.z)) GLOB.teleportlocs[AR.name] = AR From 95dc8084f1c3ce67309a772ab998b95461cda744 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Mon, 17 Jun 2019 20:18:49 +0200 Subject: [PATCH 15/18] Moving some tablecrafting recipes to the appropriate categories (#8658) * Moving some recipes to the appropriate categories * Fixes the not-a-sandwich recipe being M.I.A. --- code/__DEFINES/construction.dm | 2 +- code/modules/crafting/craft.dm | 2 +- code/modules/crafting/recipes.dm | 44 ++++++++--------- .../recipes/tablecraft/recipes_meat.dm | 31 ------------ .../recipes/tablecraft/recipes_pastry.dm | 12 +---- .../recipes/tablecraft/recipes_sandwich.dm | 12 ++++- .../recipes/tablecraft/recipes_sushi.dm | 49 +++++++++++++++---- 7 files changed, 76 insertions(+), 76 deletions(-) diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index aa9c5cf34e..ee51fb6909 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -102,7 +102,7 @@ #define CAT_SANDWICH "Sandwiches" #define CAT_SOUP "Soups" #define CAT_SPAGHETTI "Spaghettis" -#define CAT_SUSHI "Fish" +#define CAT_FISH "Fish" #define CAT_ICE "Frozen" #define RCD_FLOORWALL 1 diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index ba2a27af77..3e96512bb8 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -21,7 +21,7 @@ CAT_BURGER, CAT_CAKE, CAT_EGG, - CAT_SUSHI, //Called Fish + CAT_FISH, CAT_ICE, //Called Frozen CAT_MEAT, CAT_MISCFOOD, diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 2f26c1e200..c1cc6d856e 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -365,28 +365,6 @@ parts = list(/obj/item/camera = 1) category = CAT_MISC -/datum/crafting_recipe/lizardhat - name = "Lizard Cloche Hat" - result = /obj/item/clothing/head/lizard - time = 10 - reqs = list(/obj/item/organ/tail/lizard = 1) - category = CAT_MISC - -/datum/crafting_recipe/lizardhat_alternate - name = "Lizard Cloche Hat" - result = /obj/item/clothing/head/lizard - time = 10 - reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1) - category = CAT_MISC - -/datum/crafting_recipe/kittyears - name = "Kitty Ears" - result = /obj/item/clothing/head/kitty/genuine - time = 10 - reqs = list(/obj/item/organ/tail/cat = 1, - /obj/item/organ/ears/cat = 1) - category = CAT_MISC - /datum/crafting_recipe/skateboard name = "Skateboard" result = /obj/vehicle/ridden/scooter/skateboard @@ -681,6 +659,28 @@ tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) category = CAT_MISC +/datum/crafting_recipe/lizardhat + name = "Lizard Cloche Hat" + result = /obj/item/clothing/head/lizard + time = 10 + reqs = list(/obj/item/organ/tail/lizard = 1) + category = CAT_CLOTHING + +/datum/crafting_recipe/lizardhat_alternate + name = "Lizard Cloche Hat" + result = /obj/item/clothing/head/lizard + time = 10 + reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1) + category = CAT_CLOTHING + +/datum/crafting_recipe/kittyears + name = "Kitty Ears" + result = /obj/item/clothing/head/kitty/genuine + time = 10 + reqs = list(/obj/item/organ/tail/cat = 1, + /obj/item/organ/ears/cat = 1) + category = CAT_CLOTHING + /datum/crafting_recipe/hudsunsec name = "Security HUDsunglasses" result = /obj/item/clothing/glasses/hud/security/sunglasses diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index c16c7268b9..7eff2820c5 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -38,37 +38,6 @@ // see code/module/crafting/table.dm -////////////////////////////////////////////////FISH//////////////////////////////////////////////// - -/datum/crafting_recipe/food/cubancarp - name = "Cuban carp" - reqs = list( - /datum/reagent/consumable/flour = 5, - /obj/item/reagent_containers/food/snacks/grown/chili = 1, - /obj/item/reagent_containers/food/snacks/carpmeat = 1 - ) - result = /obj/item/reagent_containers/food/snacks/cubancarp - subcategory = CAT_MEAT - -/datum/crafting_recipe/food/fishandchips - name = "Fish and chips" - reqs = list( - /obj/item/reagent_containers/food/snacks/fries = 1, - /obj/item/reagent_containers/food/snacks/carpmeat = 1 - ) - result = /obj/item/reagent_containers/food/snacks/fishandchips - subcategory = CAT_MEAT - -/datum/crafting_recipe/food/fishfingers - name = "Fish fingers" - reqs = list( - /datum/reagent/consumable/flour = 5, - /obj/item/reagent_containers/food/snacks/bun = 1, - /obj/item/reagent_containers/food/snacks/carpmeat = 1 - ) - result = /obj/item/reagent_containers/food/snacks/fishfingers - subcategory = CAT_MEAT - ////////////////////////////////////////////////MR SPIDER//////////////////////////////////////////////// /datum/crafting_recipe/food/spidereggsham diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index 4b76ca120b..ba6c0120e1 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -22,7 +22,7 @@ ) result = /obj/item/reagent_containers/food/snacks/donut subcategory = CAT_PASTRY - + /datum/crafting_recipe/food/donut time = 15 name = "Semen donut" @@ -205,16 +205,6 @@ datum/crafting_recipe/food/donut/meat ////////////////////////////////////////////OTHER//////////////////////////////////////////// -/datum/crafting_recipe/food/hotdog - name = "Hot dog" - reqs = list( - /datum/reagent/consumable/ketchup = 5, - /obj/item/reagent_containers/food/snacks/bun = 1, - /obj/item/reagent_containers/food/snacks/sausage = 1 - ) - result = /obj/item/reagent_containers/food/snacks/hotdog - subcategory = CAT_PASTRY - /datum/crafting_recipe/food/meatbun name = "Meat bun" reqs = list( diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm index 0f1c40da3f..133713ac75 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm @@ -52,7 +52,7 @@ result = /obj/item/reagent_containers/food/snacks/notasandwich subcategory = CAT_SANDWICH -/datum/crafting_recipe/food/notasandwich +/datum/crafting_recipe/food/tunasandwich name = "Tuna sandwich" reqs = list( /obj/item/reagent_containers/food/snacks/breadslice/plain = 2, @@ -62,3 +62,13 @@ ) result = /obj/item/reagent_containers/food/snacks/tuna_sandwich subcategory = CAT_SANDWICH + +/datum/crafting_recipe/food/hotdog + name = "Hot dog" + reqs = list( + /datum/reagent/consumable/ketchup = 5, + /obj/item/reagent_containers/food/snacks/bun = 1, + /obj/item/reagent_containers/food/snacks/sausage = 1 + ) + result = /obj/item/reagent_containers/food/snacks/hotdog + subcategory = CAT_SANDWICH diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm index 99d48cf69d..9dbf1d684b 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm @@ -7,7 +7,7 @@ /datum/reagent/consumable/rice = 10 ) result = /obj/item/reagent_containers/food/snacks/sushi_rice - subcategory = CAT_SUSHI + subcategory = CAT_FISH /datum/crafting_recipe/food/sea_weed name = "Sea Weed Sheet" @@ -17,7 +17,7 @@ /obj/item/reagent_containers/food/snacks/grown/kudzupod = 1, ) result = /obj/item/reagent_containers/food/snacks/sea_weed - subcategory = CAT_SUSHI + subcategory = CAT_FISH /datum/crafting_recipe/food/tuna_can name = "Can of Tuna" @@ -27,7 +27,7 @@ /obj/item/reagent_containers/food/snacks/carpmeat = 1, ) result = /obj/item/reagent_containers/food/snacks/tuna - subcategory = CAT_SUSHI + subcategory = CAT_FISH //////////////////////////Sushi///////////////////////////////// @@ -39,7 +39,7 @@ /obj/item/reagent_containers/food/snacks/carpmeat = 1 ) result = /obj/item/reagent_containers/food/snacks/sashimi - subcategory = CAT_SUSHI + subcategory = CAT_FISH /datum/crafting_recipe/food/riceball name = "Onigiri" @@ -49,7 +49,7 @@ /obj/item/reagent_containers/food/snacks/sushi_rice = 1 ) result = /obj/item/reagent_containers/food/snacks/riceball - subcategory = CAT_SUSHI + subcategory = CAT_FISH /datum/crafting_recipe/food/sushie_egg name = "Tobiko" @@ -59,7 +59,7 @@ /obj/item/reagent_containers/food/snacks/sea_weed = 2, ) result = /obj/item/reagent_containers/food/snacks/tobiko - subcategory = CAT_SUSHI + subcategory = CAT_FISH /datum/crafting_recipe/food/sushie_basic name = "Funa Hosomaki" @@ -70,7 +70,7 @@ /obj/item/reagent_containers/food/snacks/sea_weed = 3, ) result = /obj/item/reagent_containers/food/snacks/sushie_basic - subcategory = CAT_SUSHI + subcategory = CAT_FISH /datum/crafting_recipe/food/sushie_adv name = "Funa Nigiri" @@ -80,7 +80,7 @@ /obj/item/reagent_containers/food/snacks/carpmeat = 1 ) result = /obj/item/reagent_containers/food/snacks/sushie_adv - subcategory = CAT_SUSHI + subcategory = CAT_FISH /datum/crafting_recipe/food/sushie_pro name = "Well made Funa Nigiri" @@ -91,4 +91,35 @@ /obj/item/reagent_containers/food/snacks/sea_weed = 1 ) result = /obj/item/reagent_containers/food/snacks/sushie_pro - subcategory = CAT_SUSHI + subcategory = CAT_FISH + +///////////////Gaijin junk///////////////////////////////////// + +/datum/crafting_recipe/food/fishfingers + name = "Fish fingers" + reqs = list( + /datum/reagent/consumable/flour = 5, + /obj/item/reagent_containers/food/snacks/bun = 1, + /obj/item/reagent_containers/food/snacks/carpmeat = 1 + ) + result = /obj/item/reagent_containers/food/snacks/fishfingers + subcategory = CAT_FISH + +/datum/crafting_recipe/food/cubancarp + name = "Cuban carp" + reqs = list( + /datum/reagent/consumable/flour = 5, + /obj/item/reagent_containers/food/snacks/grown/chili = 1, + /obj/item/reagent_containers/food/snacks/carpmeat = 1 + ) + result = /obj/item/reagent_containers/food/snacks/cubancarp + subcategory = CAT_FISH + +/datum/crafting_recipe/food/fishandchips + name = "Fish and chips" + reqs = list( + /obj/item/reagent_containers/food/snacks/fries = 1, + /obj/item/reagent_containers/food/snacks/carpmeat = 1 + ) + result = /obj/item/reagent_containers/food/snacks/fishandchips + subcategory = CAT_FISH \ No newline at end of file From 27c4288e5de61b13923e2dc46e1213d65128562d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 17 Jun 2019 13:18:52 -0500 Subject: [PATCH 16/18] Automatic changelog generation for PR #8658 [ci skip] --- html/changelogs/AutoChangeLog-pr-8658.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8658.yml diff --git a/html/changelogs/AutoChangeLog-pr-8658.yml b/html/changelogs/AutoChangeLog-pr-8658.yml new file mode 100644 index 0000000000..ad35118c3f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8658.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "Moving some tablecrafting recipes to the appropriate categories: Kitty ears and lizard cloche hats to \"clothing\"; Hot dogs to \"Sandwichs\"; Cuban carb, fish and chips and fish fingers to \"Fish\"." + - bugfix: "Fixes the not-a-sandwich recipe being M.I.A." From bf991cd2da28a034e036b2dd16a76aa93625a7b7 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Mon, 17 Jun 2019 13:20:25 -0500 Subject: [PATCH 17/18] Underwear overlays Gentials, can toggle each seperately (#8602) * Gentials layered under underclothes * screm --- code/modules/client/preferences.dm | 3 ++ code/modules/mob/living/carbon/human/human.dm | 1 + .../mob/living/carbon/human/species.dm | 12 +++++++ .../code/modules/arousal/arousal.dm | 31 ++++++++++++++++++ .../code/modules/arousal/organs/genitals.dm | 4 ++- .../icons/obj/genitals/breasts_onmob.dmi | Bin 4932 -> 4864 bytes .../icons/obj/genitals/penis_onmob.dmi | Bin 3880 -> 3885 bytes .../icons/obj/genitals/testicles_onmob.dmi | Bin 762 -> 759 bytes .../icons/obj/genitals/vagina_onmob.dmi | Bin 1076 -> 1070 bytes 9 files changed, 50 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index a0eea344a3..501e9fc7cc 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2236,8 +2236,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.hair_style = hair_style character.facial_hair_style = facial_hair_style character.underwear = underwear + character.saved_underwear = underwear character.undershirt = undershirt + character.saved_undershirt = undershirt character.socks = socks + character.saved_socks = socks character.backbag = backbag diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 129e600b00..c03c0fc0a9 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -8,6 +8,7 @@ /mob/living/carbon/human/Initialize() verbs += /mob/living/proc/mob_sleep verbs += /mob/living/proc/lay_down + verbs += /mob/living/carbon/human/proc/underwear_toggle //fwee //initialize limbs first create_bodyparts() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 62a4d42672..0a00bab3f4 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -490,11 +490,19 @@ GLOBAL_LIST_EMPTY(roundstart_races) //Underwear, Undershirts & Socks if(!(NO_UNDERWEAR in species_traits)) if(H.underwear) + if(H.hidden_underwear) + H.underwear = "Nude" + else + H.underwear = H.saved_underwear var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[H.underwear] if(underwear) standing += mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER) if(H.undershirt) + if(H.hidden_undershirt) + H.undershirt = "Nude" + else + H.undershirt = H.saved_undershirt var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[H.undershirt] if(undershirt) if(H.dna.species.sexes && H.gender == FEMALE) @@ -503,6 +511,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER) if(H.socks && H.get_num_legs(FALSE) >= 2) + if(H.hidden_socks) + H.socks = "Nude" + else + H.socks = H.saved_socks var/datum/sprite_accessory/socks/socks = GLOB.socks_list[H.socks] if(socks) if(DIGITIGRADE in species_traits) diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index 846a8cff62..27f7576e7f 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -14,6 +14,10 @@ var/saved_underwear = ""//saves their underwear so it can be toggled later var/saved_undershirt = "" + var/saved_socks = "" + var/hidden_underwear = FALSE + var/hidden_undershirt = FALSE + var/hidden_socks = FALSE /mob/living/carbon/human/New() ..() @@ -29,6 +33,33 @@ var/list/femcum_fluids = list("femcum") //Mob procs +/mob/living/carbon/human/proc/underwear_toggle() + set name = "Toggle undergarments" + set category = "Object" + if(ishuman(src)) + var/mob/living/carbon/human/humz = src + var/confirm = input(src, "Select what part of your form to alter", "Undergarment Toggling", "Cancel") in list("Top", "Bottom", "Socks", "All", "Cancel") + if(confirm == "Top") + humz.hidden_undershirt = !humz.hidden_undershirt + + if(confirm == "Bottom") + humz.hidden_underwear = !humz.hidden_underwear + + if(confirm == "Socks") + humz.hidden_socks = !humz.hidden_socks + + if(confirm == "All") + humz.hidden_undershirt = !humz.hidden_undershirt + humz.hidden_underwear = !humz.hidden_underwear + humz.hidden_socks = !humz.hidden_socks + + if(confirm == "Cancel") + return + src.update_body() + + else + to_chat(src, "Humans only. How the fuck did you get this verb anyway.") + /mob/living/proc/handle_arousal() diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 52508d7803..63d6834409 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -73,7 +73,7 @@ owner.exposed_genitals += src if("Hidden by clothes") through_clothes = FALSE - hidden = FALSE + hidden = TRUE if(src in owner.exposed_genitals) owner.exposed_genitals -= src if("Always hidden") @@ -303,6 +303,8 @@ for(var/obj/item/organ/O in H.internal_organs) if(isgenital(O)) var/obj/item/organ/genital/G = O + if(G.hidden) + return //we're gunna just hijack this for updates. if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes genitals_to_add += H.getorganslot(G.slot) //Now we added all genitals that aren't internal and should be rendered diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index 69a531bd11511356b8a89b4057a1fc243f3e078e..c4b75b1172d112edf090c7b56d8b02a7745e7be4 100644 GIT binary patch delta 347 zcmV-h0i^!KCV(c8ZGS|1R9JLGWpiV4X>fFDZ*Bkpc%0SPy-ve090c$=ehRCdK`pQ{ zfKs6%(N~C^_z$tfN3mVt@kxo*x&y=AQfG^Y%Wt`yrOfsH>S4Xn_0w8?i4X4MUEk`P z%Y~}GosIo)xV}iHBN7Y8k0xq>hm+BiXVgVI(PAG8cjB`4D58&S@>Db)435n&mV*1x+|j3fDe& z#=<+FLWG3wd^ t9LvtD_`PwgAFtwzer6S4_mgOW>Rhij_1}-BU%erw-nXyUwX^;KMiKNiwb%dv delta 416 zcmV;R0bl-rCd4L?ZGVV*R9JLGWpiV4X>fFDZ*Bkpc$}q}%}#?r7)96c6r^2iT6OED zDJlywG49F0d=(OZDl=6dUkZc{CMM3A9V{*aHtaOiyvK3{lDfX&q3stO&n}5fL{Am$Kx@pbvD{-`I z)vFwz*MG*=Bvvw7$!Ha$Rg9(?O>^2Nz02~gKaS*twG-A(U^{{B)R}=h=z?qslvq+? zMTr$9YD&~$M6`<@iOw8tDYT{FmO@&79Fzv07-PN-`fFDZ*Bkpc$}@6!A`lXf6MgGlS)gi>dV1S6?v6p`;9D;Nq;gVUx0L0wfx$E# zj1yvcIv6L!5_K?0sO3(T@b}ZEC>@rkO;I{5O`C#rtF^?lv>--?C22v749n4iuun}D zTE4DTcaWlfRe!DJSABUksvjp$=}c()>y**yYWhM0j_S-2Jm+sE9f$RVn7TM4AjV8V zhQjJIGYO%r$wFaRjaHXOFw?9V3MGtvU_d|WI0gFgljq3I zZr@y|$?fw~{DR%qUsTL8aG;oVfYODmPEb05>)O@^3V&UWTMbAh5o+61NhJ}i>Byk- z7f7xNtdt1XOaoR*#M{mi(CKpA%0McKXxk}9Dv4l^BM>w?7_~ldLL$`T=;egWceNec z-OBR^clSBSD$)CHko$mtE2}@`vloi`Bx0qYC;?LT45bzel0)lsCK9(^upnBh-QKAs mgXGXUtr&L6tQs8FTjVg9$I;fFDZ*Bkpc$}@7K~KU!5QWd}uV~+zqiG(-6etLJ&BiM^369q$&3^F(PZ{GPonAbJp58sU2Mwe zJ{sQ+!{EEfbl$uWaTw&P_{jC&i&{&qn#bN&l|`NAyR|ISQGYs2A6{RQw_X@zMOC*& z!eCj+wQ8S7r>V*8X`W0WET&{JCli!Rpt8?$qqWN5AZ?BkqG8$`B}4P7Mu+BUVT=w<)55U7 zo+`C`UnyUlqJR0VTFIa0@ov!koUG%?X?#>?aJnO3bU-OjnqZ~>HFa3$BWf=*lmMx2 zPjVdEWw*63&e}aBh<0l20SxTMIme-mcEc6p%#frov`aIzz&F>;tg|36v(DCm#sghR zuD84PIb)84o0>Z+_8fCokiwW13Q{O=p&5U$(j~bQgMXG1(VD?aONn^9sSR6?Q1aa1 zwM4|-#^AL?$Y$TbR+r>X4_ZnDY&IP&CE`7-N!aOt)EUAmiD(b&nN>2MTeI4I(#w~- zuM%>Sc;6B7zrqz8^GAL0VbWBhP7{(7FlTRB@<5?Uyjy2yv1ba8;tksifIL=c67SX; hsNBiIf)f|C+K*<*bpLh1FA9)H{*n*@$FqI{uMFYc5Y7Mq diff --git a/modular_citadel/icons/obj/genitals/testicles_onmob.dmi b/modular_citadel/icons/obj/genitals/testicles_onmob.dmi index 581bcb0583434fd91c3ba9b8adec45d8bbe9c3f5..33659cf13cb42239e1fc3a2e8ccf3c02ff42ea26 100644 GIT binary patch delta 249 zcmVqL|1P8X}c8K}=|)*B3Cd zH0IB)UA#`;^k>pk6y>q1g}zk$X~*CngV>ARHskE&+vui^lAJl~I~PBj5SwVHWfEc zRj8>#O%=gZ5lr(n!H&!HLg&8~FwsycK z5ANDoZ@lZ9&KhA-vpb*kC1z3W20xv|qT5j2?X(s@Q9(yjlNEyjqP!UBE9UWt~FZ@*v~=r>gRpKK?*(E0pvc>~Slv6bxDibwze0h38Y WK~#90?b*R?!axuOP#d#g0ha+bkcN!_ diff --git a/modular_citadel/icons/obj/genitals/vagina_onmob.dmi b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi index f5daa3fea1ba98eefe5f6bc9512d66a61ab9186a..c4cf891eacb33ec4b217986d85e5f9bf16ed0483 100644 GIT binary patch delta 286 zcmV+(0pb3%2(Ac_YJUfMR9JLGWpiV4X>fFDZ*Bkpc$~eIT?>LR6o#+euNZY(p)0%V zqA;SM{=zu4r2}2Dt)hS5>{F41O$cw!gy%dj?!`V{ELZCtPPS`w;Yy36#4|h@g($cR zW-@yi6BJ}zq?vghv;o8I*t*cN9Z5Kd9}gKc{VAM;OkD#QE)DE+-hpe$KKW*U29FzySh>i6tN)9&=t)iA{P-Z$ z&H2V&P>Z$+9nMN|=BoNoPA+`{=6s!R$i+0&UY)OC-CJ*$dG+3Mp3Se5-Mas`0@~1C k6|8cOKA##^uo6~VA1`;w<6nIT*!r)1O#Gu|vw#7#0@~ delta 292 zcmV+<0o(qr2($>0YJUxSR9JLGWpiV4X>fFDZ*Bkpc$~eI%L>9U5JlI`SA=$}($>e$ zjrhQY6~uiROl$)hC5cM^-qdF$SVp?0|RG0n{GR7gz4_n}Al!obeF;A90@_z^uvh0GqwSX-x>*y^O z)nPq-OE*yHG7cNv%NI9H4;kzk&+JVo$`!0O^eeLV1)b*$uJ*e|D^j*nVDI4x)>?>P zESQ4;CJKl7-LP6|6I&mIpu}G8!CC6bJrIZS-Z4A1rgTh01^h)GbUVjHXwo?ouk5#} q`0H9~>yC?AB^a$W-IlWgeozeXC>dV Date: Mon, 17 Jun 2019 13:20:28 -0500 Subject: [PATCH 18/18] Automatic changelog generation for PR #8602 [ci skip] --- html/changelogs/AutoChangeLog-pr-8602.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8602.yml diff --git a/html/changelogs/AutoChangeLog-pr-8602.yml b/html/changelogs/AutoChangeLog-pr-8602.yml new file mode 100644 index 0000000000..4974c1ae79 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8602.yml @@ -0,0 +1,5 @@ +author: "Poojawa" +delete-after: True +changes: + - rscadd: "Added an underwear toggle button under 'Object' tab" + - tweak: "Genitals now layer under underwear. Hide these if they're too obnoxious."